Почему объекты не записываются при загрузке в 1С:УПП 1.3 после создания нового плана обмена?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При настройке обмена данными в конфигурации «Управление производственным предприятием, редакция 1.3» (УПП) разработчики часто сталкиваются с ситуацией, когда новый план обмена, созданный по аналогии с типовым, ведет себя непредсказуемо. Объекты успешно регистрируются на узлах, процесс выгрузки и загрузки проходит без системных ошибок, журнал регистрации в базе-приемнике бодро сообщает: «Загружено объектов: 1», но при проверке базы данных выясняется, что объект либо не создался, либо не обновился. Проанализируем причины этой проблемы и разберем по шагам, как добиться корректной записи данных.

Анализ структуры обмена и поиск «пустых» сообщений

Первым делом нам необходимо выяснить, на каком этапе происходит потеря данных. Если система сообщает о загрузке одного объекта, но в базе он не появляется, это может означать, что выгрузился только «заголовок» сообщения обмена (служебная информация о номерах сообщений), а само тело данных оказалось пустым. Рассмотрим ситуацию подробнее.

Проанализируем файл выгрузки (XML). Для этого откроем его любым текстовым редактором или браузером. Если в файле присутствует информация о номере сообщения и узле-отправителе, но отсутствует секция с данными самого объекта (например, документа РеализацияТоваровУслуг), значит, проблема локализована на стороне базы-источника. Система «думает», что она что-то выгрузила, но программные фильтры отсекли объект в последний момент перед записью в XML.

Разбор программной логики модуля плана обмена

В конфигурации УПП 1.3 большинство планов обмена используют универсальный механизм, работа которого описана в модуле объекта самого плана обмена. Типичная ошибка — копирование кода из типового плана обмена ОбменУППУПП в новый план обмена без адаптации внутренних вызовов функций. Выясним причину, заглянув в процедуру ОпределитьТипОтправкиДанных.

В этой процедуре обычно вызывается функция из общих модулей, которая определяет, для каких именно узлов предназначен конкретный объект. Рассмотрим пример кода, который часто становится камнем преткновения:


Процедура ОпределитьТипОтправкиДанных(ЭлементДанных, ОтправкаЭлемента)
    // Определение массива узлов, для которых нужно выполнить выгрузку
    МассивУзловДляПереноса = ПроцедурыОбменаУПП.ОпределитьМассивУзловДляРегистрацииПроизвольногоТипа(
        ЭлементДанных, 
        ИмяБазовогоТипа, 
        ТипОбъекта, 
        , 
        ВыгружатьДляВсехУзлов, 
        Ложь, 
        мСоответствиеОрганизацийИУзлов, 
        ЛОЖЬ
    );
    
    // Если наш узел не попал в массив, выгрузка произведена не будет
    Если МассивУзловДляПереноса.Найти(ЭтотОбъект.Ссылка) = Неопределено Тогда
        ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
    КонецЕсли;
КонецПроцедуры

Проблема заключается в функции ПроцедурыОбменаУПП.ОпределитьМассивУзловДляРегистрацииПроизвольногоТипа. В типовой конфигурации УПП 1.3 многие функции в общих модулях содержат жесткую проверку (hardcode) на принадлежность к конкретным метаданным. Если функция внутри себя проверяет, является ли текущий план обмена типовым ОбменУППУПП, то ваш новый план обмена просто игнорируется, и функция возвращает пустой массив узлов. В результате ОтправкаЭлемента устанавливается в значение Удалить, и данные не попадают в файл.

Корректная настройка фильтрации узлов

Чтобы решить эту проблему, необходимо убедиться, что логика определения узлов понимает ваш новый план обмена. Рассмотрим два варианта решения:

  1. Ручная корректировка массива узлов: В модуле объекта вашего плана обмена после вызова типовой функции добавьте проверку. Если массив пуст, но объект должен быть выгружен для вашего плана обмена, добавьте ссылку на узел вручную.
  2. Использование собственных процедур: Вместо вызова ПроцедурыОбменаУПП, напишите упрощенную логику регистрации, которая будет учитывать специфику именно вашего обмена, не опираясь на сложные типовые механизмы фильтрации по организациям, если они вам не требуются.

Пример модифицированного кода в модуле плана обмена:


МассивУзловДляПереноса = ПроцедурыОбменаУПП.ОпределитьМассивУзловДляРегистрацииПроизвольногоТипа(...);

// Добавляем принудительную регистрацию для нашего узла, 
// если типовой механизм его проигнорировал
Если МассивУзловДляПереноса.Найти(УзелОбменаСсылка) = Неопределено Тогда
    МассивУзловДляПереноса.Добавить(УзелОбменаСсылка);
КонецЕсли;

Проверка подписок на события и регистрации изменений

Посмотрим на ситуацию шире. Даже если код выгрузки исправлен, объекты должны попадать в таблицу изменений автоматически. В УПП 1.3 за это отвечают ПодпискиНаСобытия. Если вы создали новый план обмена, он автоматически не включается в существующие подписки типа ПриЗаписиОбъектаДляОбмена.

Проанализируем состав подписок. Вам необходимо найти подписки, отвечающие за регистрацию изменений для тех объектов, которые вы включили в состав плана обмена (например, документы, справочники, регистры). В свойстве Источник каждой такой подписки должен быть указан ваш новый план обмена (если регистрация идет через него) или сами объекты метаданных, а в обработчике подписки должна быть логика, вызывающая ПланыОбмена.ЗарегистрироватьИзменения().

Важный момент: Если вы используете обмен по правилам (XML), убедитесь, что в обработке «Универсальный обмен данными в формате XML» или в настройках автоматического обмена правильно указаны Правила выгрузки данных (ПВД). Если в ПВД стоит фильтр или условие, которое не выполняется в контексте нового плана обмена, объект также не будет выгружен.

Особенности работы в режиме «Загрузка»

Выясним, почему база-приемник может игнорировать входящие данные, даже если они есть в файле. При загрузке данных 1С устанавливает свойство ОбменДанными.Загрузка = Истина. Это отключает большинство прикладных проверок в модулях объектов. Однако, если в базе-приемнике существуют кастомные подписки на события или код в модулях ПередЗаписью / ПриЗаписи, который не учитывает это свойство, запись может быть заблокирована или отменена без вывода ошибки в Журнал Регистрации (например, через Отказ = Истина).

Проанализируем типичный блок проверки в модуле объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ОбменДанными.Загрузка Тогда
        Возврат; // Важно, чтобы загрузка не прерывалась проверками
    КонецЕсли;
    
    // Прикладные проверки, которые могут вызвать Отказ = Истина
    Если Не ЗначениеЗаполнено(Организация) Тогда
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Если в вашем коде отсутствует проверка ОбменДанными.Загрузка, то любой незаполненный реквизит (который, возможно, не передается через обмен) приведет к тихому отказу от записи. Всегда проверяйте наличие этого флага в критических узлах конфигурации.

Итоговый чек-лист для проверки обмена

Для успешного функционирования нового плана обмена в УПП 1.3 выполните следующие действия:

  1. Проверьте XML-файл выгрузки. Если секция v8msg:Object пуста — проблема в источнике.
  2. Убедитесь, что в модуле плана обмена в процедуре ОпределитьТипОтправкиДанных ваш узел попадает в массив получателей и ОтправкаЭлемента не устанавливается в значение Удалить.
  3. Проверьте, включен ли ваш план обмена в состав Источников для соответствующих Подписок на события, отвечающих за регистрацию изменений.
  4. В базе-приемнике убедитесь, что нет кода, который принудительно устанавливает Отказ = Истина при установленном флаге ОбменДанными.Загрузка.
  5. Если используется синхронизация по Уникальному Идентификатору (GUID), проверьте, что в правилах обмена (КД 2.1) корректно настроены поля поиска, иначе объект может «сопоставиться» с чем-то неожиданным или не создаться вовсе из-за конфликта уникальности.

Используя комплексный подход к диагностике — от анализа XML-файла до отладки типовых функций фильтрации в ПроцедурыОбменаУПП — вы сможете оперативно найти причину «исчезновения» объектов и обеспечить стабильную работу синхронизации данных.

← На главную