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