При ведении учета в нескольких базах 1С:Бухгалтерия предприятия 3.0 (БП 3.0) рано или поздно возникает задача консолидации данных. Например, когда необходимо настроить одностороннюю или двустороннюю выгрузку данных из двух второстепенных баз (источников) в одну центральную (приемник). При этом базы уже существуют, активно ведутся пользователями и содержат большой объем накопленных данных.
В этой статье мы подробно разберем, какие механизмы синхронизации предлагает платформа 1С, проанализируем риски использования распределенных информационных баз (РИБ) для уже существующих конфигураций, детально изучим современный формат EnterpriseData и выясним, как настроить автоматический обмен без дублирования нормативно-справочной информации (НСИ).
---
Первое решение, которое часто приходит на ум разработчикам, — настроить распределенную информационную базу (РИБ). Однако здесь кроется серьезная методологическая и техническая ошибка.
Механизм РИБ изначально проектировался для создания структуры «сверху вниз». Это означает, что периферийный узел должен создаваться как «начальный образ» из главного узла. В этом случае базы имеют абсолютно идентичную структуру метаданных, а главное — одинаковые уникальные идентификаторы (UUID/GUID) для всех предопределенных элементов, справочников и документов, которые были созданы до разделения баз.
Рассмотрим ситуацию, когда базы создавались независимо:
GUID_А.GUID_Б.GUID_В.Если попытаться принудительно связать такие базы через РИБ (например, программно вызвав метод ПланыОбмена.УстановитьГлавныйУзел() в подчиненной базе), механизм синхронизации начнет сопоставлять объекты исключительно по их внутренним идентификаторам (UUID). Поскольку UUID у одного и того же контрагента в базах различаются, система не поймет, что это один и тот же объект. В результате в Главной базе появятся три дублирующих элемента «ООО Вектор».
Программное принудительное назначение главного узла выглядит следующим образом (настоятельно не рекомендуется применять этот код для объединения уже наполненных баз):
// Пример принудительного установления связи, опасный для наполненных баз
УзелГлавный = ПланыОбмена.УдалитьНастройкаОбменаДанными.НайтиПоКоду("ЦБ");
Если ЗначениеЗаполнено(УзелГлавный) Тогда
ПланыОбмена.УстановитьГлавныйУзел(УзелГлавный);
ЗаписьЖурналаРегистрации("Синхронизация", УровеньЖурналаРегистрации.Информация, , , "Установлен главный узел РИБ");
КонецЕсли;
Вывод: Для связывания ранее независимых, уже наполненных баз данных стандартный механизм РИБ использовать категорически нельзя.
---
Современные версии конфигурации «1С:Бухгалтерия предприятия 3.0», построенные на базе Библиотеки стандартных подсистем (БСП), содержат мощный встроенный инструмент — универсальный формат обмена EnterpriseData (формат XML). Этот формат позволяет настроить обмен между любыми базами, поддерживающими стандарт, включая сценарий БП 3.0 <-> БП 3.0.
Рассмотрим преимущества интеграции через EnterpriseData:
---
Выполним настройку синхронизации между подчиненной базой БП_2 (источник) и Главной БП (приемник) через универсальный формат.
Перед началом настройки убедимся, что в обеих базах включена возможность синхронизации. Перейдем в раздел Администрирование -> Синхронизация данных и установим флаг «Синхронизация данных».
Перейдем по ссылке «Настройки синхронизации данных» и нажмем кнопку «Новая синхронизация данных» (или «Создать»). Из предложенного списка выберем пункт «Другая программа» (в некоторых релизах он называется «Синхронизация данных через универсальный формат»):
.xml) для базы-приемника. Сохраним его.Запустим Главную БП, перейдем в раздел настроек синхронизации данных и создадим новое подключение, выбрав импорт настроек из сохраненного на предыдущем шаге XML-файла:
---
Самый критический момент при объединении независимых баз — предотвращение появления дублей справочников. Как было сказано ранее, сопоставление по UUID не сработает. Однако БСП предоставляет разработчикам и администраторам встроенный инструмент решения этой проблемы.
Проанализируем работу Помощника сопоставления данных, который автоматически запускается при первом сеансе синхронизации:
ИНН + КПП. Для «Номенклатуры» — по полям: Артикул или Наименование.После того как связь между объектами установлена (автоматически или вручную), информация об этом записывается в специальный технический регистр сведений «Соответствия объектов информационных баз» (РегистрСведений.СоответствияОбъектовИнформационныхБаз). При всех последующих обменах система будет обращаться сначала к этому регистру. Если запись найдена, обновление произойдет по уже существующей ссылке, полностью исключая дублирование.
Для понимания логики работы приведем пример кода, выполняющего поиск сопоставления в регистре БСП:
Функция ПолучитьСопоставленныйОбъект(УзелИнформационнойБазы, ИсходнаяСсылкаСсылка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Соответствия.СобственнаяСсылка КАК СобственнаяСсылка
|ИЗ
| РегистрСведений.СоответствияОбъектовИнформационныхБаз КАК Соответствия
|ГДЕ
| Соответствия.УзелИнформационнойБазы = &УзелИнформационнойБазы
| И Соответствия.УникальныйИдентификаторИсточника = &УникальныйИдентификаторИсточника";
Запрос.УстановитьПараметр("УзелИнформационнойБазы", УзелИнформационнойБазы);
Запрос.УстановитьПараметр("УникальныйИдентификаторИсточника", Строка(ИсходнаяСсылкаСсылка.УникальныйИдентификатор()));
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.СобственнаяСсылка;
КонецЕсли;
Возврат Неопределено;
КонецФункции
---
Если стандартных правил обмена через универсальный формат недостаточно (например, требуется сложная трансформация данных «на лету», перенос самописных реквизитов или специфическая фильтрация документов), придется прибегнуть к кастомизации правил синхронизации.
В экосистеме 1С существуют две версии конфигурации «Конвертация данных»:
EnterpriseData. Вместо прямого сопоставления метаданных вы настраиваете сопоставление вашей конфигурации с универсальным XDTO-пакетом. Плюс этого подхода в том, что даже при обновлении релизов «1С:Бухгалтерии», пока формат обмена остается неизменным, ваши правила продолжат успешно функционировать без вмешательства программиста.Посмотрим на пример логики настройки поиска в КД 2.0, если вы все же решили использовать этот инструмент. Чтобы избежать дублей, в ПКО (Правилах конвертации объектов) для справочника «Контрагенты» необходимо отключить поиск по УИД и установить флаги поиска по ИНН и КПП:
// Пример обработчика "Поля поиска" в правилах КД 2.0
Если СвойстваПоиска["ИНН"] <> Неопределено Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН";
Запрос.УстановитьПараметр("ИНН", СвойстваПоиска["ИНН"]);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
СсылкаНаОбъект = Выборка.Ссылка;
ПрекратитьПоиск = Истина;
КонецЕсли;
КонецЕсли;
При использовании КД 3.0 аналогичная логика поиска настраивается в модуле менеджера обмена через переопределение алгоритмов сопоставления объектов формата и объектов ИБ, что гораздо более технологично и отказоустойчиво.
---
Чтобы настроить регулярный автоматический обмен без участия пользователей, выполним следующие шаги:
Для мониторинга работы автоматического обмена всегда используйте встроенный «Журнал регистрации» с отбором по событию «Синхронизация данных», чтобы оперативно отслеживать ошибки транспорта или блокировки объектов при параллельной работе пользователей.