В этом разделе мы рассмотрим примеры синхронизации данных между структурами хранения информации «1С:Предприятия» и внешними данными.
При работе с внешними источниками данных из встроенного языка есть возможность не только получать, но и записывать данные в эти источники. Ниже мы рассмотрим примеры заполнения справочника внешними данными, и, наоборот, при добавлении или изменении данных в прикладном решении эти же данные будут записываться и во внешнюю таблицу.
Таким образом, с помощью внешних источников данных могут решаться различные задачи интеграции прикладных решений «1С:Предприятия» с другими информационными системами.
Предположим, в нашей конфигурации есть справочник Товары, который должен программно пополняться новыми товарами, которые появляются в таблице goods внешней схемы goods. А при добавлении записей в справочник товаров нужно записывать их и во внешнюю таблицу.
Для решения этой задачи нам нужно добавить в конфигурацию две общие команды: ЗагрузитьТоварыИзВнешнегоИсточника и ВыгрузитьТоварыВоВнешнийИсточник. Первая команда будет читать новые товары, если они появились во внешней таблице, и записывать их в справочник. Вторая команда будет записывать новые товары, если они появились в справочнике, во внешнюю таблицу.
На самом деле алгоритм программной синхронизации данных может вызываться, например, регламентным заданием, которое запускается по расписанию, но мы для упрощения примера пока используем команды.
Связь со схемой goods устанавливается через внешний источник данных Товары, который мы описали в разделе «». Список товаров отображается в таблице goods этого источника данных.
Итак, добавим в нашу конфигурацию общую команду ЗагрузитьТоварыИзВнешнегоИсточника. Из обработчика этой команды будет вызываться процедура ЗагрузитьТоварыИзВнешнегоИсточника(). Заполним ее следующим образом (листинг 2.1).
Листинг 2.1. Процедура «ЗагрузитьТоварыИзВнешнегоИсточника»
&НаСервере
Процедура ЗагрузитьТоварыИзВнешнегоИсточника()
// Создать менеджер справочника Товары.
Товары = Справочники.Товары;
// Получить список товаров с помощью запроса к таблице goods внешнего источника данных Товары.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.id КАК Товар,
| Товары.description КАК Наименование
|ИЗ
| ВнешнийИсточникДанных.Товары.Таблица.goods КАК Товары
|
|УПОРЯДОЧИТЬ ПО
| Товар";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Добавить товары из таблицы goods в справочник Товары, если их там еще нет.
Пока Выборка.Следующий() Цикл
ТоварСсылка = Товары.НайтиПоНаименованию(Выборка.Наименование, Истина);
Если ТоварСсылка = Товары.ПустаяСсылка() ИЛИ ТоварСсылка = Неопределено Тогда
Товар = Товары.СоздатьЭлемент();
Иначе
Товар = ТоварСсылка.ПолучитьОбъект();
КонецЕсли;
Товар.Наименование = Выборка.Наименование;
Товар.Записать();
КонецЦикла;
КонецПроцедуры
В этой процедуре мы сначала создаем менеджер для обращения к справочнику Товары. Затем с помощью запроса к таблице goods внешнего источника данных Товары мы получаем список товаров, находящихся во внешней таблице. Таблица внешнего источника данных описывается в языке запросов как ВнешнийИсточникДанных.<Имя источника>.Таблица.<Имя таблицы>. Остальные конструкции в тексте запроса нам хорошо знакомы и не требуют пояснений.
По мере обхода выборки из результата запроса мы добавляем отсутствующие товары из таблицы goods в справочник Товары. Поиск товара в справочнике происходит по полному соответствию наименования товара в справочнике и во внешней таблице. Если же товар уже существует в справочнике, то от найденной ссылки на товар получается объект и данные этого товара синхронизируются между внешней таблицей и справочником.
Проверим, как это работает. Запустим «1С:Предприятие» и из меню Сервис выполним команду Загрузить товары из внешнего источника. В результате в справочник Товары (который пока пуст) будут скопированы все товары из таблицы goods внешнего источника данных (рис. 2.31).
Рис. 2.31. Программная синхронизация данных между справочником и внешним источником
Теперь создадим новый товар (с наименованием «Кондиционер») в списке товаров внешнего источника данных. После этого выполним еще раз команду Загрузить товары из внешнего источника. В результате новый товар появится в справочнике Товары (рис. 2.32).
Рис. 2.32. Программная синхронизация данных между справочником и внешним источником
ПРИМЕЧАНИЕ
Чтобы увидеть программно добавленные записи, нужно обновить данные в списках клавишей F5.
Теперь реализуем синхронизацию данных в обратную сторону – от справочника к внешнему источнику.
Итак, добавим в нашу конфигурацию общую команду ВыгрузитьТоварыВоВнешнийИсточник. Из обработчика этой команды будет вызываться процедура ВыгрузитьТоварыВоВнешнийИсточник(). Заполним ее следующим образом (листинг 2.2).
Листинг 2.2. Процедура «ВыгрузитьТоварыВоВнешнийИсточник»
&НаСервере
Процедура ВыгрузитьТоварыВоВнешнийИсточник()
// Создать менеджер таблицы goods внешнего источника данных Товары.
Товары = ВнешниеИсточникиДанных.Товары.Таблицы.goods;
// Получить список товаров с помощью запроса к справочнику Товары.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Код КАК Код,
| Товары.Наименование КАК Наименование
|ИЗ
| Справочник.Товары КАК Товары
|
|УПОРЯДОЧИТЬ ПО
| Код";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
// Добавить товары из справочника Товары во внешнюю таблицу goods, если их там еще нет.
Пока Выборка.Следующий() Цикл
ТоварСсылка = Товары.НайтиПоПолю("description", Выборка.Наименование);
Если ТоварСсылка = Товары.ПустаяСсылка() ИЛИ ТоварСсылка = Неопределено Тогда
Товар = Товары.СоздатьОбъект();
Иначе
Товар = ТоварСсылка.ПолучитьОбъект();
КонецЕсли;
Товар.id = Число(Выборка.Код);
Товар.description = Выборка.Наименование;
Товар.Записать();
КонецЦикла;
КонецПроцедуры
В этой процедуре мы сначала создаем менеджер таблицы goods внешнего источника данных Товары (ВнешниеИсточникиДанных.Товары.Таблицы.goods).
Затем с помощью запроса к справочнику Товары мы получаем список товаров, который нужно синхронизировать со списком товаров во внешней таблице.
По мере обхода выборки из результата запроса мы добавляем отсутствующие товары из справочника Товары в таблицу goods. Поиск товара во внешней таблице происходит методом менеджера таблицы НайтиПоПолю() по полному соответствию наименования товара в таблице goods (поле description) и в справочнике.
Если такого товара в таблице еще нет, то он добавляется методом менеджера таблицы СоздатьОбъект(). Если есть, то от найденной ссылки на товар получается объект и данные этого товара синхронизируются между внешней таблицей и справочником.
Запустим «1С:Предприятие», откроем справочник Товары и добавим новый элемент. Из меню Сервис выполним команду Выгрузить товары во внешний источник. В результате новый товар появится в таблице goods внешнего источника данных (рис. 2.33).
Рис. 2.33. Программная синхронизация данных между справочником и внешним источником