Синхронизация справочников или импорт данных через HTTP-сервис

16.03.22

Интеграция - Перенос данных 1C

Решение для синхронизации справочников базы 1С со справочниками другой базы. 1С или любой другой, доступ к данным которой можно получить через внешние источники данных. Синхронизация может осуществляться с использованием HTTP-сервиса. Для программистов.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Синхронизация справочников: Расширение "ОбменИсточник"
.cfe 10,57Kb
16
16 Скачать (1 SM) Купить за 1 850 руб.
Синхронизация справочников: Расширение "ОбменПриемник"
.cfe 18,03Kb
15
15 Скачать (1 SM) Купить за 1 850 руб.
Синхронизация справочников: Обработка "Обмен"
.epf 10,76Kb
15
15 Скачать (1 SM) Купить за 1 850 руб.

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

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

Затем потребовалась синхронизация с таблицами сторонних баз, которые можно было привязать как внешние источники. Тогда я понял, что для обмена со всем что основано на использовании SQL этот код тоже подходит. Конечно, в этом случае не удалось обойтись только расширениями. Источники пришлось честно привязать к конфигурации приемнику. Но это не критичное изменение конфигурации, которое всех устроило. Еще потребовалось предусмотреть регистрацию изменений в источнике. Код обработки также пришлось немного изменить и сама обработка уже запускалась в приемнике. В этом случае использование сервиса стало не актуальным, но его обработчик прекрасно справился со своей задачей. В целом, схема с минимальными изменениями заработала и показала хорошие результаты. Стало возможным организовать синхронизацию с таблицами внешнего источника, просто написав запросы к ним.

Это не решение для пользователя. Скорее, небольшая адаптируемая библиотечка, с помощью которой опытный программист может очень быстро создать сложный обмен по справочникам. Поэтому заранее извиняюсь перед неискушенными читателями. Ниже будет приведено подробное описание и текст будет изобиловать техническими подробностями. Дальнейшее предназначено исключительно для программистов. 

 

Краткое описание:


В приведенном примере, для простоты, представлен обмен между двумя конфигурациями 1С. Демонстрация работы с внешним источником требует наличие оного. Писать запросы для него и поставлять сам источник в виде файла хлопотно. Код используется, практически тот же, но ситуация 1С->1С проще для понимания механизма работы с данным кодом.

В качестве источника, выступает свежая конфигурация Документооборот 3.0.4.41, а приемником является УНФ - старая учебная конфигурация 1.6.19.150. Синхронизируются два справочника ДО - "Контрагенты" и "ДокументыПредприятия" со справочниками УНФ, соответственно, "Контрагенты" и "ДоговорыКонтрагентов". Синхронизация справочников "Организации" не проводилась, т.к. эти справочники проще и надежнее синхронизировать руками. В данном примере предполагается, что они синхронизированы по коду.

Естественно, перед запуском реальной синхронизации требуется первоначальное сопоставление объектов, но это тема отдельной беседы. Для демонстрации возможностей движка это не требуется. Если будет проявлен интерес к этой теме и у меня будет свободное от работы время - сделаю отдельную публикацию.

 

1. Регистрация изменений


Для накопления информации об изменениях используется план обмена "ОбменСправочниками", который находится в расширении "ОбменИсточник". Узел обмена с кодом "ОбменУНФ" создается автоматически при первом запуске обработки. Указанные справочники уже добавлены в состав плана обмена в расширении. Регистрация изменений в простом случае может производиться автоматически. В случае справочника ДО "ДокументыПредприятия" возникла необходимость в выборочной регистрации с использованием дополнительного реквизита. Регистрация реализована в расширении "ОбменИсточник" для события "ПриЗаписи". В обработчике события также есть ссылка на имя узла "ОбменУНФ" - прошу обратить внимание.

 

2. Обработка пакета:


Движком является HTTP-сервис "StartCreateNewRecords", реализованный в расширении "ОбменПриемник". Он принимает запрос в формате JSON определенной структуры. Читает JSON, извлекая пакет в виде структуры, из которой узнает имя справочника и получает массив структур с новыми значениями реквизитов элементов.

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

Для синхронизации ссылочных реквизитов используется дополнительное свойство "ЗначениеИдентификатораИсточника". Оно также будет автоматически создано в приемнике при первом запуске обмена. Да простят меня любители более традиционных способов с использованием регистра "СоответствияОбъектовИнформационныхБаз" или подобных. Обмен с помощью правил, при данной постановке задачи, не планируется и о совместимости со стандартным обменом переживать не приходится. Синхронизация же с помощью свойства показалась мне безобидной, простой и эффективной. Уникальность значения свойства обеспечивается в пределах конкретного справочника. Кроме поиска по значению свойства идентификатора также поддерживается поиск по коду и наименованию.

В случае наличия, для поиска будут использоваться значения реквизитов "ИНН" и "КПП". Это небольшой элемент кастомизации. Вообще, если ваша конфигурация-приемник не использует библиотеку интернет-поддержки пользователей, то некоторые вещи из кода придется выкинуть.

Если подключена поддержка, то также будет производиться работа с банками, валютами и странами мира без необходимости отдельной синхронизации классификаторов. Также, при необходимости, будет запрашиваться из внешнего сервиса наименование и адрес контрагента по ИНН. Опять же, для этого использование БИПП в приемнике обязательно.

Переданные из источника значения с ключами, которые не совпадают с именами реквизитов приемника, будут использованы для заполнения контактной информации (при наличии соответствующей табличной части у справочника). Для этого ключи переданных значений должны совпадать с именами предопределенных видов контактной информации.

Все, что осталось после заполнения реквизитов и контактов будет записано в автоматически созданные дополнительные реквизиты строкового типа. Если, конечно, соответствующая табличная часть у справочника имеется.

В случае возникновения проблем при заполнении реквизитов элемент справочника не записывается. Создается достаточно подробная диагностика, которая, в последствии, выводится обработкой в журнал регистрации источника.

 

3. Собственно, обмен:


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

Например, функция для инициации обмена по договорам из ДО в УНФ в данном примере выглядит так:

Функция ДоговорыКонтрагентов(КодУзла) 

    Запрос = Новый Запрос();
    Запрос.УстановитьПараметр("КодУзла", КодУзла);
    Запрос.УстановитьПараметр("Имя", "ВидДоговора");

    Запрос.Текст =
    "ВЫБРАТЬ
    |    ДокументыПредприятия.Ссылка КАК Источник,
    |    ДокументыПредприятия.Ссылка.Код КАК id_value,
    |    ДокументыПредприятия.Узел КАК Узел,
    |    ДокументыПредприятия.Ссылка.Наименование КАК Наименование,
    |    ДокументыПредприятия.Ссылка.Валюта.Наименование КАК Валюта,
    |    ДокументыПредприятия.Ссылка.ДатаНачалаДействия КАК ДатаДоговора,
    |    ДокументыПредприятия.Ссылка.ДатаОкончанияДействия КАК СрокДействия,
    |    ДокументыПредприятия.Ссылка.Контрагент.Код КАК Владелец,
    |    ДокументыПредприятия.Ссылка.Организация.Код КАК Организация,
    |    ВЫБОР
    |        КОГДА ДокументыПредприятия.Ссылка.РегистрационныйНомер = """"
    |            ТОГДА ДокументыПредприятия.Ссылка.ВременныйНомер
    |        ИНАЧЕ ДокументыПредприятия.Ссылка.РегистрационныйНомер
    |    КОНЕЦ КАК НомерДоговора,
    |    ДополнительныеРеквизиты.Значение.Наименование КАК ВидДоговора
    |ИЗ
    |    Справочник.ДокументыПредприятия.Изменения КАК ДокументыПредприятия
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДокументыПредприятия.ДополнительныеРеквизиты КАК ДополнительныеРеквизиты
    |        ПО ДокументыПредприятия.Ссылка = ДополнительныеРеквизиты.Ссылка
    |ГДЕ
    |    ДокументыПредприятия.Узел.Код = &КодУзла
    |    И ДополнительныеРеквизиты.Свойство.Имя = &Имя";

    Возврат Запрос;
    
КонецФункции

Обязательными полями в запросе являются:

- "Узел", "Источник" - ссылки на узел и измененный элемент для снятия с регистрации после удачного обмена. 

- "id_value" - идентификатор для поиска объекта и записи значения свойства в приемнике.

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

А процедура, задающая состав и последовательность обмена, в примере выглядит так:

Процедура ВыполнитьОбмен() Экспорт
    СоздатьНеобходимыеОбъектыПриОтсутствии();
    КодУзла = "ОбменУНФ";   
    ВыполнитьОбменПоСправочнику("Контрагенты", КодУзла);
    ВыполнитьОбменПоСправочнику("ДоговорыКонтрагентов", КодУзла);
КонецПроцедуры  

В теле процедуры должна быть последовательно запущена универсальная процедура "ВыполнитьОбменПоСправочнику"  для каждого справочника, участвующего в обмене. Эта процедура запрашивает данные, инициирует обмен, в случае удачи удаляет регистрацию изменений и записывает протокол. Из приведенного ниже кода процедуры очевидно, почему имя добавляемой Вами  функции запроса должно совпадать с именем справочника. Также понятно для чего в запросе нужны обязательные поля "Источник" и "Узел". Обращаю на это внимание. 

Процедура ВыполнитьОбменПоСправочнику(ИмяСправочника, КодУзла) Экспорт 
    
    Запрос = Неопределено;
    Выполнить("Запрос = " + ИмяСправочника + "(""" + КодУзла + """)"); 
    
    Результат = Запрос.Выполнить();
    ТаблицаДляПередачи = Результат.Выгрузить();
    ТаблицаДляПередачи.Колонки.Удалить(ТаблицаДляПередачи.Колонки["Источник"]);
    ТаблицаДляПередачи.Колонки.Удалить(ТаблицаДляПередачи.Колонки["Узел"]);
    СтруктураЗапроса = ПолучитьИсходнуюСтруктуру(ИмяСправочника, "Код", , , Истина, ТаблицаДляПередачи);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, СтруктураЗапроса);
    ЗапросДляПередачи = ЗаписьJSON.Закрыть();
    ЗапросДляПередачи = СтрЗаменить(ЗапросДляПередачи, "0001-01-01T00:00:00", "");
    Ответ = ПолучитьОтветОтСервиса(ЗапросДляПередачи);
    
    Если Ответ.КодСостояния = 200 Тогда
        Выборка = Результат.Выбрать();
        Пока Выборка.Следующий() Цикл 
            ПланыОбмена.УдалитьРегистрациюИзменений(Выборка.Узел, Выборка.Источник);
        КонецЦикла;
    КонецЕсли; 
    
    ТекстПротокола = Ответ.ПолучитьТелоКакСтроку() + Символы.ПС + ЗапросДляПередачи;
    // Здесь может быть запись в журнал регистрации или запись протокола в файл лога
    ЗаписьЖурналаРегистрации(КодУзла, УровеньЖурналаРегистрации.Информация, , , ТекстПротокола, РежимТранзакцииЗаписиЖурналаРегистрации.Транзакционная);

КонецПроцедуры  

Таким образом, создавая новые функции-запросы, раскручиваем дерево ссылок снизу вверх. От ссылочных реквизитов к головным справочникам. В запросе можно использовать простые типы данных, перечисления (в виде строки) и идентификаторы ссылок. В качестве идентификаторов используем ранее заполненные (при синхронизации) значения свойства-идентификатора для элементов соответствующих справочников. Прозвучало сложно, но в случае если обе базы - конфигурации 1С, как идентификатор и ссылку почти всегда можно использовать стандартный реквизит "Код".

В примере предоставлены запросы для обмена по основным реквизитам для справочников "Контрагенты" и "ДоговорыКонтрагентов". Для обмена пришлось создать в ДО дополнительный реквизит "ВидДоговора". Он создается автоматически при первом запуске обработки процедурой "СоздатьНеобходимыеОбъектыПриОтсутствии". Т. е., пример кода для подобной ситуации имеется.

Напоследок, чтобы было общее представление о структуре модуля обработчика сервиса, размещаю картинку. Модуль выглядит так (примерно 850 строк):

 

 

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

Кто-то может не согласиться с таким подходом или счесть его недостаточно профессиональным. На вкус и цвет, как известно, товарищей нет. Если так, то спасибо за внимание и извините за беспокойство. Надеюсь, найдутся и те, кто оценит этот скромный труд.

Вот, собственно, и все. Предложенный код структурирован и документирован, в меру сил. Прошу коллег не судить строго. Если чего не понятно, можно спрашивать. Консультации, как говорится, входят в стоимость. Пример рабочий и даже реально используется. На указанных конфигурациях должен завестись сразу. Файлы расширений и обработка прилагаются для скачивания. 

Буду очень рад, если данная статья и данный код окажутся для кого-то полезными на практике. Также буду благодарен за отзывы. В том числе и отрицательные.

интеграция синхронизация обмен план обмена справочник сервис http web расширение документооборот ДО контрагенты договоры SQL внешние импорт

См. также

SALE! 20%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен и синхронизацию в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

26280 22338 руб.

12.06.2017    141476    798    297    

419

SALE! 10%

Перенос данных 1C Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    166436    332    277    

373

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.234.x) и БП 3.0 (3.0.161.x). Правила подходят для версии ПРОФ и КОРП.

35000 31500 руб.

15.12.2021    23990    169    51    

127

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.88.x) и УТ 11.5 (11.5.19.x).

35000 31500 руб.

23.07.2020    51198    228    69    

185

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    36574    94    66    

89

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Программист Платформа 1С v8.3 Сложные периодические расчеты 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

55778 50200 руб.

29.10.2018    56195    59    105    

61

SALE! 10%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    171158    303    257    

378

SALE! 15%

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 Платформа 1C v8.2 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Управление производственным предприятием Россия Платные (руб)

Регулярный обмен, выгрузка, перенос из КА 1.1, УПП 1.3, УТ 10.3 для обмена с любыми конфигурациями, поддерживающими обмен в формате EnterpriseData (КД3) - БП 3.0, ERP, КА 2, УТ 11, Розница 2, УНФ 1.6 и другими. Правила для старых и доработанных конфигураций не требуют синхронного обновления и совместимы с новыми и будущими конфигурациями. Обмен по расписанию, через папку, FTP, почту.

15300 13005 руб.

18.02.2016    186857    589    509    

526
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. eeeio 126 12.05.22 15:47 Сейчас в теме
А табличные части умеет передавать? А независимые регистры сведений? А регистры накопления?
4. baracuda 2 15.05.23 10:05 Сейчас в теме
(1) что собственно мешает получить данные по регистру упаковать в json и передать?
2. user1374747 234 12.05.22 16:34 Сейчас в теме
Нет. Цели создать альтернативу конвертации не стояло. Одно из основных предназначений - использование при переходе с не 1С на 1С. Например - с аксапты на 1С КА. Или для обменов разных конфигураций с ДО, где, в основном, справочники.
Не судите строго. Для каждой цели - свои инструменты.
3. eeeio 126 13.05.22 11:06 Сейчас в теме
(2) Строго не сужу - просто подбираю инструмент под свои цели. Спасибо за ответ.
5. user1374747 234 15.05.23 10:57 Сейчас в теме
(4) День добрый. Ничего. Просто надо потрудиться немного. Если интересно, на следующей неделе расчитываю сделать побликацию. Предложу полноценный инструмент. Документы и справочники с табличными частями и регистры сведений. Минимум настроек и подчиненные ссылки сам раскручивает.
6. baracuda 2 15.05.23 12:31 Сейчас в теме
(5) да здравствуйте, было бы вообще круто Сейчас стоит такая задача, немного запутался и не знаю с какой стороны приступить.
7. user1374747 234 15.05.23 13:14 Сейчас в теме
(6) Скоро будет. Программа готова. Текст публикации немного правлю. Отложил публикацию до выходных, чтобы отстоялась..
Fominro; baracuda; +2 Ответить
Оставьте свое сообщение