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