gifts2017

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

Опубликовал Евгений Шабалин (xzorkiix) в раздел Обмен - Обмен с другими системами

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

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

  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", "КодВнешний");

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владимир (oberon355) 22.01.12 15:51
Статья классная. Но вопросы все равно есть. правда не к автору а так риторические: Если есть возможность подключиться к sql по com и поиметь всю мощь sql, то зачем 1с это все городило, и планирует ли развивать это дальше, что бы таки получить всю мощь sql?
2. Евгений Шабалин (xzorkiix) 23.01.12 17:08
(1) oberon355, запастись поп-корном и ждать разработчики платформы не дураки, разработчики типовых тоже не дураки. уверен, имеют место общие интересы тех и тех.

"подключиться к sql по com и поиметь всю мощь sql" требует определенных навыков. А с "Внешними источниками" работа с таблицами из различных СУБД ни чем не отличается от работы со Справочниками. Наверное, появиться запись. Так же не забываем и о том, что "Внешние источники" могут быть вынесены в пользовательский интерфейс, в том числе и на тонком клиенте (в том числе и Веб-клиенте) без "подключиться к sql по com и поиметь всю мощь sql", где это на стороне клиента в принципе не доступно.
3. Punker (Punker) 16.02.12 09:43
Хорошая статья, немного проясняет понятие о новом объекте. Было бы не плохо почитать полную документацию по данному объекту, если конечно таковая имеется. :)
4. Евгений Шабалин (xzorkiix) 16.02.12 12:01
"Хорошая статья" <> "немного проясняет"

>> "Было бы не плохо почитать полную документацию по данному объекту"

Приведенные ссылки в начале статьи, и немного текста в самой статье. Куда больше то? То в каком виде оно сейчас, многого там не напишешь.
5. apalon_pss (pavel_pss) 16.02.12 14:16
Спасибо, статья очень помогла
6. sws sws (Wladymyr) 18.06.12 18:01
очень много полозной информации, спасибо
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа