При автоматизации бизнес-процессов часто возникает задача «отзеркалить» справочник из одной базы в другую. Рассмотрим ситуацию, когда нам необходимо настроить полную синхронизацию нетипового справочника из 1С:Бухгалтерия предприятия (БП) в 1С:Документооборот 2.1 (ДО). Особенность задачи в том, что справочник простой (всего три реквизита), но конфигурация БП находится на поддержке, а использование механизмов РИБ в расширениях ограничено. Проанализируем несколько способов реализации этой задачи — от самых простых до технологичных.
Этот метод является наиболее современным и гибким. Он позволяет передавать данные в реальном времени или по расписанию, не изменяя основную конфигурацию, так как HTTP-сервис можно описать в расширении. Разберем этот подход подробнее.
Процесс состоит из двух этапов: создание поставщика данных (в БП) и создание потребителя данных (в ДО). Для передачи данных мы будем использовать формат JSON, так как он легок и нативно поддерживается платформой 1С.
Для реализации нам понадобятся встроенные функции ЗаписьJSON и XDTOСериализатор. Рассмотрим пример кода, который подготавливает данные для отправки:
// Пример формирования JSON для справочника
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ДанныеСправочника = Новый Структура("Код, Наименование, Реквизит1, Реквизит2");
// Заполнение структуры данными элемента справочника
// ...
XDTOСериализатор.ЗаписатьJSON(ЗаписьJSON, ДанныеСправочника);
СтрокаJSON = ЗаписьJSON.Закрыть();
На стороне приемника (в ДО) мы создаем регламентное задание, которое обращается к HTTP-сервису БП, получает JSON и десериализует его. Выясним причину, почему это удобно: такой подход не требует создания промежуточных файлов и работает через стандартные протоколы связи.
Проанализируем ситуацию, когда мы вообще не хотим писать код в базе-источнике (БП). Платформа 1С позволяет опубликовать базу и разрешить доступ к объектам через OData. Это «автоматический» HTTP-сервис, который предоставляет доступ к данным справочников по URL.
HTTPСоединение отправляет GET-запрос по адресу вида http://server/base/odata/standard.odata/Catalog_ИмяСправочника.Посмотрим на пример получения данных в ДО:
Соединение = Новый HTTPСоединение("server.com", , "Пользователь", "Пароль");
Запрос = Новый HTTPЗапрос("/base/odata/standard.odata/Catalog_МойСправочник?$format=json");
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 200 Тогда
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
Данные = ПрочитатьJSON(Чтение);
// Далее перебор полученных данных и создание/обновление элементов
КонецЕсли;
Если мы хотим, чтобы данные в ДО обновлялись сразу после записи в БП, нам нужно реализовать механизм регистрации изменений. Поскольку мы не можем использовать полноценный план обмена в расширении для автоматической регистрации, применим хитрость. Создадим в расширении БП Регистр сведений (например, ОчередьОбмена) и подписку на событие ПриЗаписи нужного справочника.
Рассмотрим алгоритм работы:
Ссылка или УникальныйИдентификатор элемента в наш регистр ОчередьОбмена.ОчередьОбмена удаляется.Это гарантирует, что даже при временном сбое связи данные не потеряются и будут переданы позже.
Если требования к оперативности невысокие, разберем самый простой в реализации метод — обмен через файл. Мы можем использовать стандартную обработку «Универсальный обмен данными в формате XML». Несмотря на опасения автора темы, для справочника из трех реквизитов правила обмена в Конвертации данных 2.0 создаются буквально за 5 минут с помощью мастера «Синхронизация объектов».
После создания правил процесс выглядит так:
Важно помнить, что при использовании файлового обмена необходимо обеспечить доступ обоих серверов приложений к общей сетевой папке или использовать FTP.
Если обе базы (БП и ДО) находятся в одной локальной сети и работают под управлением Windows, можно использовать COM-соединение. Это позволяет «подключиться» из ДО прямо к базе БП и прочитать справочник как родной объект.
Проанализируем пример кода для подключения:
// В базе ДО
Connector = Новый COMObject("V83.COMConnector");
ПутьКБазе = "Srvr='ServerName';Ref='BaseName';";
BaseBP = Connector.Connect(ПутьКБазе + "Usr='Login';Pwd='Password';");
СправочникБП = BaseBP.Catalogs.ИмяСправочника;
Выборка = СправочникБП.Select();
Пока Выборка.Next() Цикл
// Поиск или создание элемента в текущей базе ДО
ЭлементДО = Справочники.ИмяСправочника.НайтиПоНаименованию(Выборка.Description);
// ... логика синхронизации
КонецЦикла;
Важный момент: Технология COM считается устаревшей и имеет ограничения по производительности и безопасности, но для разовой синхронизации или простых задач на Windows-инфраструктуре она остается рабочей.
Мы рассмотрели несколько подходов к синхронизации. Если ваша задача — сделать максимально чисто и современно, рекомендуем Вариант 1 (HTTP + JSON) или Вариант 2 (OData). Они отлично работают с расширениями и не перегружают систему. Если же вы хотите минимизировать программирование и готовы работать с правилами обмена, то Вариант 4 (XML + КД 2.0) будет самым надежным решением с точки зрения контроля ссылочной целостности.