При настройке обмена данными в конфигурации «Управление производственным предприятием, редакция 1.3» (УПП) разработчики часто сталкиваются с ситуацией, когда новый план обмена, созданный по аналогии с типовым, ведет себя непредсказуемо. Объекты успешно регистрируются на узлах, процесс выгрузки и загрузки проходит без системных ошибок, журнал регистрации в базе-приемнике бодро сообщает: «Загружено объектов: 1», но при проверке базы данных выясняется, что объект либо не создался, либо не обновился. Проанализируем причины этой проблемы и разберем по шагам, как добиться корректной записи данных.
Первым делом нам необходимо выяснить, на каком этапе происходит потеря данных. Если система сообщает о загрузке одного объекта, но в базе он не появляется, это может означать, что выгрузился только «заголовок» сообщения обмена (служебная информация о номерах сообщений), а само тело данных оказалось пустым. Рассмотрим ситуацию подробнее.
Проанализируем файл выгрузки (XML). Для этого откроем его любым текстовым редактором или браузером. Если в файле присутствует информация о номере сообщения и узле-отправителе, но отсутствует секция с данными самого объекта (например, документа РеализацияТоваровУслуг), значит, проблема локализована на стороне базы-источника. Система «думает», что она что-то выгрузила, но программные фильтры отсекли объект в последний момент перед записью в XML.
В конфигурации УПП 1.3 большинство планов обмена используют универсальный механизм, работа которого описана в модуле объекта самого плана обмена. Типичная ошибка — копирование кода из типового плана обмена ОбменУППУПП в новый план обмена без адаптации внутренних вызовов функций. Выясним причину, заглянув в процедуру ОпределитьТипОтправкиДанных.
В этой процедуре обычно вызывается функция из общих модулей, которая определяет, для каких именно узлов предназначен конкретный объект. Рассмотрим пример кода, который часто становится камнем преткновения:
Процедура ОпределитьТипОтправкиДанных(ЭлементДанных, ОтправкаЭлемента)
// Определение массива узлов, для которых нужно выполнить выгрузку
МассивУзловДляПереноса = ПроцедурыОбменаУПП.ОпределитьМассивУзловДляРегистрацииПроизвольногоТипа(
ЭлементДанных,
ИмяБазовогоТипа,
ТипОбъекта,
,
ВыгружатьДляВсехУзлов,
Ложь,
мСоответствиеОрганизацийИУзлов,
ЛОЖЬ
);
// Если наш узел не попал в массив, выгрузка произведена не будет
Если МассивУзловДляПереноса.Найти(ЭтотОбъект.Ссылка) = Неопределено Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
КонецПроцедуры
Проблема заключается в функции ПроцедурыОбменаУПП.ОпределитьМассивУзловДляРегистрацииПроизвольногоТипа. В типовой конфигурации УПП 1.3 многие функции в общих модулях содержат жесткую проверку (hardcode) на принадлежность к конкретным метаданным. Если функция внутри себя проверяет, является ли текущий план обмена типовым ОбменУППУПП, то ваш новый план обмена просто игнорируется, и функция возвращает пустой массив узлов. В результате ОтправкаЭлемента устанавливается в значение Удалить, и данные не попадают в файл.
Чтобы решить эту проблему, необходимо убедиться, что логика определения узлов понимает ваш новый план обмена. Рассмотрим два варианта решения:
ПроцедурыОбменаУПП, напишите упрощенную логику регистрации, которая будет учитывать специфику именно вашего обмена, не опираясь на сложные типовые механизмы фильтрации по организациям, если они вам не требуются.Пример модифицированного кода в модуле плана обмена:
МассивУзловДляПереноса = ПроцедурыОбменаУПП.ОпределитьМассивУзловДляРегистрацииПроизвольногоТипа(...);
// Добавляем принудительную регистрацию для нашего узла,
// если типовой механизм его проигнорировал
Если МассивУзловДляПереноса.Найти(УзелОбменаСсылка) = Неопределено Тогда
МассивУзловДляПереноса.Добавить(УзелОбменаСсылка);
КонецЕсли;
Посмотрим на ситуацию шире. Даже если код выгрузки исправлен, объекты должны попадать в таблицу изменений автоматически. В УПП 1.3 за это отвечают ПодпискиНаСобытия. Если вы создали новый план обмена, он автоматически не включается в существующие подписки типа ПриЗаписиОбъектаДляОбмена.
Проанализируем состав подписок. Вам необходимо найти подписки, отвечающие за регистрацию изменений для тех объектов, которые вы включили в состав плана обмена (например, документы, справочники, регистры). В свойстве Источник каждой такой подписки должен быть указан ваш новый план обмена (если регистрация идет через него) или сами объекты метаданных, а в обработчике подписки должна быть логика, вызывающая ПланыОбмена.ЗарегистрироватьИзменения().
Важный момент: Если вы используете обмен по правилам (XML), убедитесь, что в обработке «Универсальный обмен данными в формате XML» или в настройках автоматического обмена правильно указаны Правила выгрузки данных (ПВД). Если в ПВД стоит фильтр или условие, которое не выполняется в контексте нового плана обмена, объект также не будет выгружен.
Выясним, почему база-приемник может игнорировать входящие данные, даже если они есть в файле. При загрузке данных 1С устанавливает свойство ОбменДанными.Загрузка = Истина. Это отключает большинство прикладных проверок в модулях объектов. Однако, если в базе-приемнике существуют кастомные подписки на события или код в модулях ПередЗаписью / ПриЗаписи, который не учитывает это свойство, запись может быть заблокирована или отменена без вывода ошибки в Журнал Регистрации (например, через Отказ = Истина).
Проанализируем типичный блок проверки в модуле объекта:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат; // Важно, чтобы загрузка не прерывалась проверками
КонецЕсли;
// Прикладные проверки, которые могут вызвать Отказ = Истина
Если Не ЗначениеЗаполнено(Организация) Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Если в вашем коде отсутствует проверка ОбменДанными.Загрузка, то любой незаполненный реквизит (который, возможно, не передается через обмен) приведет к тихому отказу от записи. Всегда проверяйте наличие этого флага в критических узлах конфигурации.
Для успешного функционирования нового плана обмена в УПП 1.3 выполните следующие действия:
v8msg:Object пуста — проблема в источнике.ОпределитьТипОтправкиДанных ваш узел попадает в массив получателей и ОтправкаЭлемента не устанавливается в значение Удалить.Отказ = Истина при установленном флаге ОбменДанными.Загрузка.Используя комплексный подход к диагностике — от анализа XML-файла до отладки типовых функций фильтрации в ПроцедурыОбменаУПП — вы сможете оперативно найти причину «исчезновения» объектов и обеспечить стабильную работу синхронизации данных.