Разбираем новое ЭДО от 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
НСтр.ПолныйПуть = «дор_ОбъектУчета»;
«дор_ОбъектУчета»; Подскажите, что это за переменная и где создана
Это не переменная. Это просто еще одна строка в дереве, у нее для уникальности используется имя дор_ОбъектУчета, которое не будет использовать 1С, можно использовать любое другое имя или GUID.