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