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