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