При работе с распределенными информационными базами (РИБ) на современной платформе 1С:Предприятие (8.3.15 и выше) разработчики часто сталкиваются с парадоксальной ситуацией. В центральной базе создается расширение, которое добавляет новый объект (например, РегистрСведений). При этом в свойствах расширения намеренно снимается флаг Используется в РИБ, а в плане обмена также не устанавливается признак Включать расширения конфигурации. Казалось бы, расширение должно остаться локальным, но при первой же попытке синхронизации подчиненный узел выдает критическую ошибку.
Рассмотрим подробнее это поведение, выясним истинные причины возникновения ошибки и проанализируем возможные пути решения данной задачи.
Проанализируем типичный сценарий: в главном узле РИБ (платформа 8.3.18.1334) активно расширение. Оно добавляет в структуру базы данных новый объект конфигурации. Несмотря на то, что в настройках обмена указано не передавать расширения, при загрузке сообщения в подчиненном узле возникает ошибка:
«Ошибка при чтении сообщения обмена: Данные принимаются от узла с другим набором расширений, меняющих структуру данных. Необходимо произвести перенос расширений конфигурации в узел.»
Многие специалисты задаются вопросом: почему платформа требует переноса расширения, если мы явно указали ей этого не делать? Давайте разберемся в механизмах проверки целостности данных.
Выясним причину такого поведения платформы. Основной принцип работы РИБ — это требование идентичности структуры таблиц базы данных во всех узлах. Это необходимо для корректной десериализации данных и работы механизмов регистрации изменений.
Когда мы добавляем в расширение объект (справочник, документ или регистр), платформа создает реальные физические таблицы в СУБД. С этого момента структура метаданных центрального узла меняется. Платформа 1С формирует определенную «контрольную сумму» (хеш) всех метаданных, которые влияют на структуру хранения.
Рассмотрим, что происходит в момент обмена:
Важно понимать различие: флаг Используется в РИБ отвечает исключительно за автоматическую транспортировку расширения. Если флаг снят, платформа просто не упакует расширение в файл обмена. Но она не игнорирует факт его наличия! Получается патовая ситуация: расширение нужно для идентичности структуры, но мы запретили его передачу.
Проанализируем ситуацию глубже. Не каждое расширение вызывает подобную проблему. Платформа разделяет их на две категории:
Справочники, Документы, Регистры) или добавляют новые реквизиты к существующим объектам основной конфигурации.Если ваше расширение содержит только исправление логики проведения документа в МодулеОбъекта через &Вместо, то отсутствие такого расширения в подчиненном узле не вызовет ошибки обмена. Структура таблиц СУБД остается прежней. Но как только появляется новый РегистрСведений, требования к идентичности становятся жесткими.
Начиная с версии 8.3.15, контроль целостности в РИБ был существенно усилен. В более ранних версиях платформы иногда удавалось совершать обмены, если добавленные объекты не были задействованы в миграции данных. В современных реалиях проверка происходит на этапе чтения заголовка сообщения. Это гарантирует, что база данных не будет повреждена попыткой загрузить данные в несовместимую структуру.
Если вам необходимо хранить данные в новом регистре только в центральной базе, у вас есть несколько путей решения.
Это самый надежный способ, который выбрал автор обсуждаемой темы. Мы добавляем нужный регистр не в расширение, а непосредственно в основную конфигурацию центрального узла.
Алгоритм действий:
В этом случае таблицы будут существовать везде, что обеспечит идентичность структуры, но в подчиненных узлах они всегда будут оставаться пустыми.
Если вы принципиально хотите использовать расширение, необходимо разрешить его передачу.
Пошаговая настройка:
Важный нюанс: при этом подходе расширение будет работать и в узле. Если там не должно быть никакой логики, можно обернуть код в модулях расширения в проверку:
Если НЕ ПланыОбмена.ПоМестуУстановки.ЭтоГлавныйУзел() Тогда
Возврат;
КонецЕсли;
Если вам критично не менять структуру подчиненных узлов (например, они очень большие или находятся на слабом оборудовании), рассмотрите возможность хранения «локальных» данных центра вне базы 1С. Для этих целей подойдут:
ВнешниеИсточникиДанных для связи с другой базой SQL.Мы выяснили, что ошибка обмена РИБ при использовании расширений — это не баг, а защитный механизм платформы. Любое расширение, добавляющее физические таблицы (объекты или реквизиты), обязано присутствовать во всех узлах распределенной системы. Игнорирование этого правила через снятие флагов в плане обмена приводит к остановке синхронизации. Оптимальным выходом для создания «центральных» регистров остается их добавление в основную конфигурацию с исключением из состава плана обмена.