При масштабировании распределенной информационной базы (РИБ) на базе конфигурации «1С:Управление торговлей 11» стандартная процедура создания нового филиала часто вызывает затруднения. Попытка просто скопировать центральную базу и указать ее в качестве периферийной приводит к ошибкам неуникальности кодов планов обмена, конфликтам блокировок при формировании начального образа и проблемам с регистрацией изменений. Разберем детально, как правильно подключить третий узел к работающей связке, какие методы платформы 1С для этого применить и как решить сопутствующие сбои обмена данными.
Рассмотрим классический вариант создания нового подчиненного узла средствами платформы 1С:Предприятие. Данный путь гарантирует целостность служебных таблиц и таблиц регистрации изменений, однако требует значительных ресурсов сервера.
У2 или ПБ2) и наименования нового узла.Обратите внимание на ограничения: процедура СоздатьНачальныйОбраз накладывает монопольные и разделяемые блокировки на таблицы метаданных. В рабочей базе с активными пользователями это неизбежно провоцирует ошибку «Конфликт блокировок при выполнении транзакции», а также может нарушить работу параллельных обменов (например, с «1С:Бухгалтерией предприятия»). Рекомендуем формировать начальный образ во внерабочее время, предварительно заблокировав регламентные задания и сеансы пользователей, либо выгружать образ из актуальной копии центральной базы на тестовом сервере.
Если объем информационной базы велик и создание начального образа штатным мастером занимает слишком много времени или аварийно прерывается, применим ускоренный инженерный подход. Мы можем развернуть копию центральной базы и программно перенастроить ее в подчиненный узел. Проанализируем этот алгоритм по шагам.
ЦБ (текущий/главный), ПБ1 (существующая периферия) и ПБ2 (новый узел).
ВыборкаУзлов = ПланыОбмена.Полный.Выбрать();
Пока ВыборкаУзлов.Следующий() Цикл
УзелОбъект = ВыборкаУзлов.ПолучитьОбъект();
ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбъект.Ссылка);
КонецЦикла;
ПБ1, так как периферийные базы в топологии «звезда» никогда не взаимодействуют напрямую друг с другом. Обмен должен идти исключительно по схеме «Центр — Периферия».ЦБ и ПБ2 напрямую не удастся — возникнет ошибка проверки уникальности. Выполним подмену через промежуточный код: сначала зададим узлу ЦБ временный код TEMP, затем узлу ПБ2 присвоим код ЦБ, а узлу TEMP назначим код периферийного узла ПБ2. Предопределенный узел «ЭтотУзел» в копии должен получить код новой периферии (ПБ2).ЦБ главным для текущей базы. Для этого выполним встроенный метод платформы:
СсылкаНаГлавный = ПланыОбмена.Полный.НайтиПоКоду("ЦБ");
Если ЗначениеЗаполнено(СсылкаНаГлавный) Тогда
ПланыОбмена.УстановитьГлавныйУзел(СсылкаНаГлавный);
КонецЕсли;
/C ЗапуститьОбновлениеИнформационнойБазы.Выясним причину этой распространенной ошибки. При передаче пакетов обмена РИБ в заголовке XML-файла указываются номера отправленного и принятого сообщений. Если счетчики в узлах рассинхронизировались, платформа блокирует чтение пакета для защиты от потери данных. Чтобы сбросить счетчики номеров сообщений в исходное состояние, откроем свойства узлов в плане обмена через встроенную обработку или выполним код в обеих базах для соответствующего узла-корреспондента:
УзелОбъект = ПланыОбмена.Полный.НайтиПоКоду("КодУзла").ПолучитьОбъект();
УзелОбъект.НомерПринятого = 0;
УзелОбъект.НомерОтправленного = 0;
УзелОбъект.Записать();
Механизм РИБ не имеет встроенного фильтра по периодам — он передает любые объекты, зафиксированные в таблицах регистрации изменений. Если в новую периферийную базу не попали документы за предыдущие дни, воспользуемся штатной обработкой РегистрацияИзмененийДляОбмена:
Рассмотрим ситуацию, когда центральная база выгружает сообщение с изменениями структуры конфигурации, а периферийная база при регламентном фоновом задании не может его применить. Часто это происходит из-за динамического обновления («демонического обновления») в центральном узле, из-за которого внутренние идентификаторы версии конфигурации БД расходятся. Решим проблему методом прямого обновления через файл конфигурации (.cf):
.cf).
ПланыОбмена.УстановитьГлавныйУзел(Неопределено);
СсылкаНаГлавный = ПланыОбмена.Полный.НайтиПоКоду("ЦБ");
ПланыОбмена.УстановитьГлавныйУзел(СсылкаНаГлавный);
Если после синхронизации документ (например, «Заказ клиента») в подчиненном узле не открывается с ошибкой неверного типа, а в базе-источнике работает корректно, проанализируем реквизитный состав. При открытии формы типовая конфигурация обращается к связанным объектам и реквизитам: «Договор контрагента», «Соглашение», статусы партнера или банковские счета. Если был зарегистрирован и передан только сам документ или контрагент, но не перенесен связанный договор, чтение реквизита договора возвращает значение Неопределено. Попытка проверить булево свойство в коде вида Если Договор.ВестиРасчетыПоДоговору Тогда приводит к фатальному сбою. Для исправления ситуации достаточно найти все подчиненные справочники (договоры, соглашения) в базе-источнике, зарегистрировать их в обработке РегистрацияИзмененийДляОбмена и повторно выполнить сеанс выгрузки и загрузки данных.