Разбираем новое ЭДО от 1С в БП3. Июнь 2021, БП 3.0.93.20

Обновились на 3.0.93.20 и все мои расширения под ЭДО перестали работать. Разберем, где вообще искать код, который выводит данные электронного документа в XML, где вмешиваться в ход этого вывода?

Как отлаживать код?

Итак, начинаем кропотливую работу, чтобы найти участок кода, который формирует электронный документооборот.

Работаем в копии базы. Используем запуск с параметром «РежимОтладки», чтобы легко отлавливать фоновые задания:

Электронный документ получаем следующим образом:

Однако документ может не переформировываться, если он сохранился в регистре «Актуальные документы ЭДО», поэтому находим там запись по документу реализации и удаляем ее:

Также нужно очистить регистр «Состояния документов ЭДО» от записей по этому документу.

Визуальная проверка файла

Для визуальной проверки файла, чтобы увидеть файл, нам надо его выгрузить.

Для этого нажимаем дискетку:

Статус документа меняется:

И теперь его можно выгрузить в файл:

После этого придется очищать два регистра ЭДО по этому документу, как я уже писал выше.

Добавление ссылки в дерево данных

Есть небольшая проблемка, в дереве данных для заполнения электронного документа нет ссылки на объект, а нам нужны данные из него. Раньше ссылка была, но по расовым соображениям совершенного кода, чтобы усложнить жизнь сопровождающим разработчикам, 1С её варварски удалила из дерева.

Поэтому добавляем ссылку принудительно в модуле «ФорматыЭДО»:

&Вместо(«СформироватьДанныеОсновногоТитулаПоОбъектуУчета»)
Функция эдодп_СформироватьДанныеОсновногоТитулаПоОбъектуУчета(ОбъектУчета, Настройки, Данные)
   
Результат = ПродолжитьВызов(ОбъектУчета, Настройки, Данные);
   
//Осипов — добавляем ссылку в дерево
   
НСтр = Данные.ДанныеДокумента.Строки.Добавить();
   
НСтр.ПолныйПуть = «дор_ОбъектУчета»;
   
НСтр.Значение = ОбъектУчета;

    Возврат
Результат;
КонецФункции

Проверяем, ссылка появилась под именем дор_ОбъектУчета:

Добавление данных в сведения продавца

Путем поиска «СвПрод» и расстановкой точек останова находим, что электронный документ формируется в функции СформироватьДокумент модуля ФорматыЭДО_ФНС:

И далее ветвлением в функции ЗаполнитьДокумент:

И наконец, попадаем в процедуру ЗаполнитьДокумент_ПередачаТоваров_ИнформацияПродавца модуля ФорматыЭДО_ФНС:

Оказывается, формирование документа переехало сюда из процедуры СформироватьПередачаТоваровПродавецCML модуля ОбменСКонтрагентамиВнутренний, где было ранее.

В принципе, можно было найти проще, поиском «Файл.Документ.СвДокПТПрКроме.СвДокПТПр.СодФХЖ1.ИнфПолФХЖ1«.

Код моего расширения для модуля ФорматыЭДО_ФНС выглядит так :

&ИзменениеИКонтроль(«ЗаполнитьДокумент_ПередачаТоваров_ИнформацияПродавца»)
Функция эдодп_ЗаполнитьДокумент_ПередачаТоваров_ИнформацияПродавца(Знач Данные)

   
СодФХЖ1 = ПолучитьОбъектТипаCML(«Файл.Документ.СвДокПТПрКроме.СвДокПТПр.СодФХЖ1», ПространствоИмен);

#Вставка
   
//Осипов 2021-02-06 на новом релизе БП3 сюда
    //Осипов — добавляем ФХЖ1 +++
    //Потом можно будет убрать если данные будут передаваться по УПД а не товарной накладной
   
СведСФХЖ = ПолучитьОбъектТипаCML(«Файл.Документ.СвДокПТПрКроме.СвДокПТПр.СодФХЖ1.ИнфПолФХЖ1», ПространствоИмен);
   
СодФХЖ1.ИнфПолФХЖ1 = СведСФХЖ;
   
СведТекстИнф = ПолучитьОбъектТипаCML(«Файл.Документ.СвДокПТПрКроме.СвДокПТПр.СодФХЖ1.ИнфПолФХЖ1.ТекстИнф», ПространствоИмен);
   
СведТекстИнф.Идентиф = «Код»;
   
ТекСсылкаНаОбъект = ДеревоЭлектронногоДокументаБЭД.ЗначениеРеквизитаВДереве(ДеревоДанных, «дор_ОбъектУчета»);
   
СведТекстИнф.Значен = эдодп_КодМаршрута(ТекСсылкаНаОбъект);
   
СодФХЖ1.ИнфПолФХЖ1.ТекстИнф.Добавить(СведТекстИнф);
   
//—
#КонецВставки

КонецФункции

Добавляем данные по счет-фактуре

Теперь нужно сделать доработки по ДопДанныеСчетаФактуры. Запускаем глобальный поиск

Для Счет-фактуры формат электронного документа Форматы.УПД2019.ИнформацияПродавца (ON_NSCHFDOPPR_1_997_01_05_01).

Счет-фактура заполняется здесь:

Код по замене для модуля ФорматыЭДО_ФНС имеет вид:

Функция эдодп_ЗаполнитьДокумент_УПД2019_ИнформацияПродавца(Знач Данные)

    Если
ЗначениеЗаполнено(ДеревоЭлектронногоДокументаБЭД.ЗначениеРеквизитаВДереве(ДеревоДанных, «ДопДанныеСчетаФактуры»)) Тогда


#Вставка
               
//Осипов 2021-04-02
               
Если ДеревоЭлектронногоДокументаБЭД.ЗначениеРеквизитаВДереве(Информация, «ДопДанныеСчетаФактуры.ТекстоваяИнформация.НомерСтроки.Идентификатор») = «Кол-во» Тогда
                   
ТекСсылкаНаОбъект = ДеревоЭлектронногоДокументаБЭД.ЗначениеРеквизитаВДереве(ДеревоДанных, «дор_ОбъектУчета»);
                   
РаботаСФайламиБЭД.ЗаполнитьСвойствоXDTO(ТекстИнфТип, «Значен»,
                   
Формат(ТекСсылкаНаОбъект.Товары.Итог(«Количество»), «ЧДЦ=3; ЧРД=.; ЧН=0; ЧГ=»)
                    , Истина,
Ошибки);
                КонецЕсли;
#КонецВставки
               
ИнфПолФХЖ1.ТекстИнф.Добавить(ТекстИнфТип);


КонецФункции

Отключаем контроль нулевой суммы счет-фактуры

Для тары используется нулевая стоимость. Отключаем навязчивый контроль в модуле ДеревоЭлектронногоДокументаБЭД:

&Вместо(«ДобавитьОшибкуПроверкиДереваДанных»)
Процедура эдодп_ДобавитьОшибкуПроверкиДереваДанных(Ошибки, СтрокаДерева, ТекстОшибки, ПодставлятьИмяРеквизита, НомерСтрокиДанных, ПрикладноеПредставлениеРеквизита)
   
//2021-06-02 — функция переехала сюда
    //Осипов — отключаем ошубку нулевой суммы
   
Если СтрокаДерева.ПолныйПуть = «СведенияОТоварах.НомерСтроки.СтоимостьТоваровБезНалога» Тогда
        Возврат;
    КонецЕсли;
   
ПродолжитьВызов(Ошибки, СтрокаДерева, ТекстОшибки, ПодставлятьИмяРеквизита, НомерСтрокиДанных, ПрикладноеПредставлениеРеквизита);
КонецПроцедуры

Выводим итог у счет-фактуры в табличном документе

Запускаем монитор производительности и запускаем в нем поиск по «Табличный документ». Находим код, который отображает табличный документ:

К сожалению, текст правила является кодом XSLT-преобразования. 1С отступила от старого доброго 1С и пользуется преобразованием XML в XSLT:

Теоретически можно обработать макет после его формирования, но там отображаются данные файла XML, без его ссылки, т.е. посчитать итог проблематично, только если бежать по всем строкам XML.

Поэтому доработку макета я отложил заказчику в отдельную задачу и оценил ее в 1.5 часа.

Объем факт: 3.5 час. БП 3.0.93.20

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 3

  1. Юрий:

    НСтр.ПолныйПуть = «дор_ОбъектУчета»;
    «дор_ОбъектУчета»; Подскажите, что это за переменная и где создана

    • Это не переменная. Это просто еще одна строка в дереве, у нее для уникальности используется имя дор_ОбъектУчета, которое не будет использовать 1С, можно использовать любое другое имя или GUID.

  1. 17.08.2022

    […] ссылку на документ в дерево данных, как написано в моей статье. Но раз использую параметры сеанса, это уже не […]

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *