При организации обмена данными между конфигурациями «Зарплата и управление персоналом, редакция 3» (ЗУП 3) и «Управление производственным предприятием» (УПП) технические специалисты часто сталкиваются со следующей ситуацией: интерактивный ручной обмен через универсальную обработку проходит абсолютно гладко и без ошибок, но при запуске автоматической синхронизации (в режиме онлайн или по расписанию) процесс аварийно завершается.
В журнале регистрации фиксируется критическая ошибка следующего вида:
Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(17338)}: Ошибка при отправке данных:
{Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(4351)}: Ошибка в обработчике события ПередВыгрузкойОбъекта
ПКО = ОтражениеЗарплатыВРеглУчете (Документ: Отражение зарплаты в бухучете)
Объект = Отражение зарплаты в бухучете ПГЗК-000010 от 31.10.2018 (Документ объект)
Обработчик = ПередВыгрузкойОбъекта
ОписаниеОшибки = Поле объекта не обнаружено (Ссылка)
ПозицияМодуля = Обработка.КонвертацияОбъектовИнформационныхБаз.МодульОбъекта(11939)
Проанализируем ситуацию, выясним глубинную причину этой проблемы и рассмотрим подробные варианты ее решения.
Для того чтобы понять природу ошибки, разберем разницу в механизмах работы двух движков выгрузки:
УниверсальныйОбменДаннымиXML. Этот движок работает в более мягком режиме. При возникновении неопределенных типов данных или пустых значений он зачастую их просто игнорирует, не прерывая выполнение всего процесса выгрузки.КонвертацияОбъектовИнформационныхБаз на стороне сервера 1С. Этот механизм функционирует в строгом режиме, так как он тесно интегрирован с планами обмена, транзакциями регистрации изменений и механизмами сопоставления ссылок. В процессе сериализации объектов БСП жестко проверяет типы и пытается получить уникальные идентификаторы. Если движок встречает непредвиденный тип данных или пустое значение там, где ожидается ссылка, он принудительно обращается к свойству Ссылка объекта-источника, что мгновенно приводит к аварийной остановке обмена с ошибкой «Поле объекта не обнаружено (Ссылка)».Посмотрим на строку кода в обработчике «Перед выгрузкой» документа ОтражениеЗарплатыВБухучете, которая вызывает сбой:
ВыгрузитьПоПравилу(Выб.ВидНачисленияОплатыТрудаДляНУ, , , , "ВидыНачисленийОплатыТрудаПоСт255НК");
Здесь переменная Выб.ВидНачисленияОплатыТрудаДляНУ хранит значение перечисления, которое должно быть выгружено по определенному правилу конвертации объектов (ПКО). Ошибка возникает по двум ключевым причинам:
Ссылка, возвращающего самого себя (в отличие от справочников, где СправочникОбъект.Ссылка вернет СправочникСсылка). Если механизм БСП ошибочно определяет переданное значение как сложный объект и пытается прочитать у него свойство Ссылка, платформа выдает исключение.ВидНачисленияОплатыТрудаДляНУ заполняется далеко не во всех строках табличной части. Например, для страховых взносов, пособий или начислений, не относящихся к расходам на оплату труда по статье 255 НК РФ, это поле остается пустым. При обходе строк табличной части запросом незаполненное поле возвращает значение NULL или Неопределено. Передача такого значения в функцию ВыгрузитьПоПравилу заставляет движок БСП безуспешно пытаться определить его тип, обращаясь к свойству Ссылка.Рассмотрим несколько способов исправления этой ошибки в правилах обмена (через конфигурацию «Конвертация данных 2.1» или путем прямого редактирования XML-файла правил).
Самый простой и эффективный метод решения проблемы — гарантировать, что в функцию выгрузки никогда не попадет пустое или неопределенное значение. Для этого добавим проверку с использованием системной функции ЗначениеЗаполнено().
Изменим исходный код в обработчике «Перед выгрузкой» документа следующим образом:
Если ЗначениеЗаполнено(Выб.ВидНачисленияОплатыТрудаДляНУ) Тогда
ВыгрузитьПоПравилу(Выб.ВидНачисленияОплатыТрудаДляНУ, , , , "ВидыНачисленийОплатыТрудаПоСт255НК");
КонецЕсли;
Как это работает: теперь, если строка табличной части документа не содержит заполненного вида начисления по статье 255 НК РФ, функция выгрузки для этой строки просто пропускается. Движок БСП не получает пустое значение и синхронизация проходит без ошибок.
Если ошибка возникает даже при заполненных значениях, необходимо проанализировать настройки самого правила конвертации объектов ВидыНачисленийОплатыТрудаПоСт255НК:
ВидыНачисленийОплатыТрудаПоСт255НК.ПеречислениеСсылка.ВидыНачисленийОплатыТрудаДляНУ.Ссылка. Явное указание типа источника-перечисления решает эту проблему на уровне метаданных.Программный вызов функции ВыгрузитьПоПравилу() в обработчиках событий документов для выгрузки перечислений часто становится источником проблем при обновлении конфигураций. Платформа 1С динамически меняет состав метаданных, что приводит к неработоспособности жестко закодированных скриптов.
Более правильным решением будет перенос сопоставления на уровень ПКС (Правил конвертации свойств) табличной части документа:
ОтражениеЗарплатыВРеглУчете.ВидыНачисленийОплатыТрудаПоСт255НК.При таком подходе платформа выполнит сериализацию стандартными механизмами. Если значение реквизита окажется пустым, конвертатор корректно обработает это на системном уровне, не вызывая исключений и аварийной остановки синхронизации.
После внесения изменений в правила обмена не забудьте сохранить их, загрузить обновленный XML-файл правил в настройки синхронизации данных ЗУП 3 и выполнить тестовую отправку данных.