Обновление распределенных информационных баз (РИБ) в экосистеме «1С:Предприятие 8.3» — это всегда ответственный процесс, требующий повышенного внимания. Особую сложность представляют многоуровневые структуры (например: Центральный офис → Магазин → Кассовое рабочее место). При переходе конфигурации 1С:Розница с версии 2.3.2.28 на 2.3.2.33 системные администраторы и разработчики часто сталкиваются с целым комплексом блокирующих ошибок.
В этой статье мы подробно разберем причины возникновения двух наиболее критичных сбоев на подчиненных узлах РИБ и пошагово реализуем их надежное техническое решение.
---
При обновлении периферийного узла РИБ по рабочему месту (кассовый узел) процесс аварийно завершается со следующим системным сообщением:
{ERR} При выполнении обновления информационной базы произошла ошибка: Ошибка загрузки приоритетных данных из сообщения обмена. См. подробности в журнале регистрации. {ОбщийМодуль.ОбменДаннымиСервер.Модуль(1778)}...
Давайте проанализируем ситуацию и выясним истинную причину этого поведения платформы. В конфигурации 1С:Розница 2.3 кассовые узлы РИБ по рабочему месту функционируют в максимально «урезанном» режиме для экономии дискового пространства и снижения трафика. Согласно правилам регистрации планов обмена, документы типа ДокументСсылка.ПеремещениеТоваров в кассовые узлы вообще не мигрируют. Их там физически нет.
Однако в обновлении 2.3.2.33 разработчики фирмы «1С» добавили новый обработчик в общий модуль ИнтеграцияЕГАИСРТ, который отвечает за связь ТТН ЕГАИС и документов перемещения. Давайте взглянем на оригинальный код этой процедуры (обратите внимание на опечатку в имени процедуры со стороны вендора):
Процедура ПриСозданииТТНВходящаяНаОснованииПеремещенеТоваровОбработчик(Источник) Экспорт
Если Не Источник.ДокументОснование = Неопределено И ТипЗнч(Источник.ДокументОснование) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
ПеремещениеСсылка = Источник.ДокументОснование;
УстановитьПривилегированныйРежим(Истина);
ПеремещениеОбъект = ПеремещениеСсылка.ПолучитьОбъект();
ПеремещениеОбъект.ТТНВходящаяЕГАИС = Источник.Ссылка;
ПеремещениеОбъект.Записать();
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
КонецПроцедуры
В чем заключается логическая ошибка кода? Разработчики проверили ссылку на равенство значению Неопределено, но не учли специфику РИБ. В подчиненном узле по рабочему месту ссылка на документ-основание перемещения является «битой» (объект не найден). Метод ПолучитьОбъект(), вызванный от несуществующей в базе ссылки, возвращает Неопределено. Соответственно, при попытке обратиться к свойству ПеремещениеОбъект.ТТНВходящаяЕГАИС платформа выбрасывает критическое исключение, полностью блокируя применение обновления.
Для исправления этой ошибки без снятия конфигурации с поддержки мы применим механизм расширений. Рассмотрим этот процесс по шагам:
Адаптация.УстановитьПривилегированныйРежим и попыток записи объектов.ИнтеграцияЕГАИСРТ.&Вместо:
&Вместо("ПриСозданииТТНВходящаяНаОснованииПеремещенеТоваровОбработчик")
Процедура Испр_ПриСозданииТТНВходящаяНаОснованииПеремещенеТоваровОбработчик(Источник)
Если Не Источник.ДокументОснование = Неопределено
И ТипЗнч(Источник.ДокументОснование) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
ПеремещениеСсылка = Источник.ДокументОснование;
УстановитьПривилегированныйРежим(Истина);
// Выполняем безопасное получение объекта
ПеремещениеОбъект = ПеремещениеСсылка.ПолучитьОбъект();
// Обязательная проверка: существует ли физически документ в текущей базе РИБ
Если ПеремещениеОбъект <> Неопределено Тогда
ПеремещениеОбъект.ТТНВходящаяЕГАИС = Источник.Ссылка;
ПеремещениеОбъект.Записать();
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецЕсли;
КонецПроцедуры
После сохранения расширения в главном узле выполните стандартный обмен данными. Расширение мигрирует на подчиненные кассовые узлы и позволит успешно завершить фазу обновления конфигурации базы данных.
---
Сразу после успешного преодоления первой ошибки при запуске периферийной базы в режиме «Предприятие» может возникнуть второй критический сбой обновления, связанный с Библиотекой подключаемого оборудования (БПО):
Предопределенный элемент не уникален {Справочник.ДрайверыОборудования.МодульМенеджера(96)}: Драйвер.Записать;... по причине: Предопределенный элемент не уникален
Рассмотрим подробнее физику этого процесса. Начиная с современных версий платформы 8.3, предопределенные элементы жестко связываются с записями базы данных посредством системного свойства ИмяПредопределенныхДанных. Если в кассовой базе элемент драйвера торгового оборудования (например, сканера штрихкодов) ранее уже был создан вручную, загружен по обмену как обычный элемент или имел другой уникальный идентификатор (UUID), то при обновлении БПО штатный механизм инициализации поставляемых драйверов пытается создать предопределенный элемент с тем же внутренним именем. Происходит коллизия уникальности имен предопределенных данных.
Разберем три практических сценария решения этой проблемы.
Если база данных позволяет войти в режим «1С:Предприятие» (например, при временном пропуске отложенных обработчиков):
Драйверы оборудования.Драйвер1СУстройстваВводаNative).Если конфликт носит исключительно ссылочный характер в индексах базы данных, может помочь стандартная процедура тестирования:
Очищать объекты.Если база на кассовом узле окончательно заблокирована процессом обновления при запуске и не дает выполнить никакие действия, самым надежным решением будет её временный вывод из состава распределенной базы для автономного исправления.
"C:\Program Files\1cv8\8.3.15.1700\bin\1cv8.exe" ENTERPRISE /F "ПутьКВашейБазе" /ResetMasterNode
Драйверы оборудования, пометить конфликтующий дубль на удаление и полностью его удалить.
ПланыОбмена.УстановитьГлавныйУзел(СсылкаНаГлавныйУзел);
Где вместо параметра укажите ссылку на узел вышестоящего магазина из плана обмена.
Применяя данные подходы, мы гарантированно восстанавливаем работоспособность всей цепочки распределенной информационной базы 1С:Розница без потери накопленных торговых данных на кассовых точках.