Внешние источники данных: Синхронизация с внешними мастер-данными

Пример использования <Внешних источников данных>. Использование Запросов к таблицам внешнего источника, использование полученных данных для синхронизации справочников.

Мат. часть (ссылки):

  1. Статья на 1c-ei.ru
  2. Раздел из AddDoc
  3. ЖЖ им. Comol

Кратко: начиная с 8.2.14 появился новый объект метаданных «Внешние источники данных», пока доступно только чтение (в том числе просмотр данных в пользовательском интерфейсе, работа с данными через механизм запросов), обещана поддержка основных СУБД.

Вводная: необходимо организовать загрузку мастер-данных в 1С из справочных данных некой системы, последняя данные хранит в СУБД MS SQL. Под мастер-данными следует понимать, что эти данные при загрузке имеют приоритет перед уже существующими на стороне приемника: новые данные добавляются; существующие, если отличны, обновляются; существующие на стороне приемника, но не в новых данных, считать устаревшими, иметь возможность пометить на удаление.

Так как задача не предусматривает изменения мастер-данных, т.е. предполагает только чтение — это хороший пример для «Внешних источников».

Моё решение следующее:

  1. Считать данные из Внешнего источника. Необходимые поля интерпретировать к данным на стороне приемника. 
  2. Сравнить считанные данные с данными приемника согласно набору ключей (чаще всего такие поля id).
  3. Добавить новые данные, не найденные при сравнении.
  4. Обновить найденные данные, если они отличны.
  5. Пометить на удаление не найденные данные при сравнении (последний шаг опционально)

Следует оговорить одно из замечаний к существующей реализации «Внешних источников», а именно: нет возможности считать данные непосредственно во временную таблицу и работать с данными дальше (что логично, так как временные таблицы создаются на стороне СУБД, обслуживающей 1С, а при работе с Внешними источниками это сторонняя СУБД).

Функция ВыполнитьОбновлениеСправочникаИзВнешнегоИсточника(
ИмяСправочника,
ИмяИсточника,
ИмяТаблицыИсточника,
СтруктураКлючи,
СтруктураПоля,
знач СоздаватьНовые = Истина,
знач СниматьПометкуУдаления = Истина,
знач ПомечатьНаУдаление = Истина)
...
КонецФункции

текст метода на snipt.org

Подробнее о методе и его параметрах:

  • ИмяСправочника — название справочника приемника данных
  • ИмяИсточника — название источника из «Внешние источники»
  • ИмяТаблицыИсточника — название целевой таблицы
  • СтруктураКлючи — Структура, где ключ — поле таблицы источника, значение — поле справочника (приемника данных).
  • СтруктураПоля — Структура, где ключ — поле источника, значение — тип данных к которому нужно привести поле источника.
  • необязательные параметры (опции) функции (СоздаватьНовые, СниматьПометкуУдаления, ПомечатьНаУдаление ) — нужны на тот случай, когда мастер-данные соответствуют помеченному на удаление объекту данных 1С (см. описание задачи).

Пример вызова метода

ИмяИсточника = "MSSQL";
ИмяСправочника = "Кварталы";
ИмяТаблицыИсточника = "dbo_Quarter";

СтруктураДополнительноеПоле = Новый Структура();
СтруктураДополнительноеПоле.Вставить("Имя","Владелец");
СтруктураДополнительноеПоле.Вставить("Источник","Справочник.УчастковыеЛесничества");
СтруктураДополнительноеПоле.Вставить("ИсточникПоле","Ссылка");
СтруктураДополнительноеПоле.Вставить("СвязьПолеИсточник","КодВнешний");

СтруктураКлючи = Новый Структура("OID", "КодВнешний");
СтруктураПоля  = Новый Структура("OrdinalNumber,DivisionalForestry_OID", "Наименование", Новый Структура("Владелец", СтруктураДополнительноеПоле));

// DivisionalForestry_OID будет замещён на Владельца
ВыполнитьОбновлениеСправочникаИзВнешнегоИсточника( ИмяСправочника, ИмяИсточника, ИмяТаблицыИсточника, СтруктураКлючи, СтруктураПоля);

В примере показан момент, когда в мастер-данных реализована свзяь «отец-сын», для 1С принято понятие «владелец». Для описания такого поля используется <СтруктураДополнительноеПоле>, обязательные свойства структуры: Имя (как будет приставлено поле в источнике); Источник, таблица на стороне 1С с данными для сопоставления; ИсточникПоле, имя поля таблицы (см. Источник ранее); СвязьПолеИсточник, имя поля таблицы (Источник) для сопоставления с данными из Внешнего источника. 
Для хранения внешних ключей (id из мастер данных) было принято решение использовать реквизиты справочников, т.е. во всех участвующих в синхронизации справочниках был добавлен реквизит <КодВнешний>. В примере вызова это видно

СтруктураКлючи = Новый Структура("OID", "КодВнешний");

При такой реализации прежде всего следует строго соблюдать типизацию, т.е. типы данных полей внешнего источника и реквизитов справочников должны совпадать.
Метод может быть использован как метод Общего модуля, или методом тела обработки.

Задачи, которые необходимо решить следом: регламентные задание, управление регламентным заданием, формирование сообщения о выполнении, или не выполнении с причиной ошибки.

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *