ЭДО: Добавление счета на оплату в основания. БП3
Клиент поставил задачу — добавлять в основание документа не только документ но и счет на оплату (основание реализации).
Сначала я смотрю, где выводится основание передачи, там действительно указан договор:

Выгружаю в файл, нахожу, где это в тегах XML:

Запускаем монитор производительности и смотрим, где заполняется ОснПер (ищем поиском в логе кода ОснПер), находим что это процедура ЗаполнитьДокумент_УПД2019_ИнформацияПродавца модуля ФорматыЭДО_ФНС:

Если в отладчике поправить значения:

То можно убедиться, что отображение тоже меняется:

Не хочется добавлять весь длинный код формирования кода ЭДО в директиву «Изменение и контроль». Но тут встречается проблема. В этом длинном коде после окончания формирования нет ни одной функции, куда передавались бы одновременно Документ и ДеревоДанных, увы. Есть только вызов ЗаполнитьСведенияОПодписантах, но он вызывается не всегда (внутри Если):

Сначала я хотел использовать доработки в функцию ПроверитьОбъектXDTO модуля ФорматыЭДО_ФНС, но увы, туда не передается ДеревоДанных.
Поэтому буду использовать свой метод спуска параметра в стек. Сначала я хотел вставить ссылку на документ в дерево данных, как написано в моей статье. Но раз использую параметры сеанса, это уже не требуется (код вставки ссылки в дерево закомментирован):
&Вместо("СформироватьДанныеОсновногоТитулаПоОбъектуУчета") Функция эдоко_СформироватьДанныеОсновногоТитулаПоОбъектуУчета(ОбъектУчета, Настройки, Данные) // https://geniy1s.ru/razbiraem-novoe-edo-ot-1s-v-bp3-iyun-2021/ //Не буду использовать, помещаю сразу в параметры сеанса //Использовать: ТекСсылкаНаОбъект = ДеревоЭлектронногоДокументаБЭД.ЗначениеРеквизитаВДереве(ДеревоДанных, "дор_ОбъектУчета"); //НСтр = Данные.ДанныеДокумента.Строки.Добавить(); //НСтр.ПолныйПуть = "дор_ОбъектУчета"; //НСтр.Значение = ОбъектУчета; УстановитьПривилегированныйРежим(Истина); //Чтобы работать с параметров сеанса, на который не назначены права ПараметрыСеанса.эдоко_ДанныеДляЗаполнения = Новый ФиксированнаяСтруктура(); //Очищаем Если ТипЗнч(ОбъектУчета) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда Если ЗначениеЗаполнено(ОбъектУчета.СчетНаОплатуПокупателю) Тогда Структура = Новый Структура(); Номер = ""; ЭлектронноеВзаимодействиеПереопределяемый.ПолучитьПечатныйНомерДокумента(ОбъектУчета.СчетНаОплатуПокупателю, Номер); Дата = Формат(ОбъектУчета.СчетНаОплатуПокупателю.Дата, "ДФ=dd.MM.yyyy"); Структура.Вставить("Номер", Номер); Структура.Вставить("Дата", Дата); Структура.Вставить("Представление", "Счет на оплату № " + Номер + " от " + Дата); ПараметрыСеанса.эдоко_ДанныеДляЗаполнения = Новый ФиксированнаяСтруктура(Структура); КонецЕсли; КонецЕсли; Результат = ПродолжитьВызов(ОбъектУчета, Настройки, Данные); //формирвоание титула после добавления ссылки, т.к. там все и происходит Возврат Результат; КонецФункции
К тому же, этот код будет работать намного дольше и в разных релизах, т.к. не привязан к длинному исходному коду через «Изменение и контроль».
Теперь осталось только добавить элемент в список оснований:
&Вместо("ПроверитьОбъектXDTO") Функция эдоко_ПроверитьОбъектXDTO(Знач ОбъектXDTO, Ошибки) //Добавляем УстановитьПривилегированныйРежим(Истина); //Чтобы работать с параметров сеанса, на который не назначены права Если ТипЗнч(ПараметрыСеанса.эдоко_ДанныеДляЗаполнения) = Тип("ФиксированнаяСтруктура") Тогда ДопДанные = Новый Структура(ПараметрыСеанса.эдоко_ДанныеДляЗаполнения); Номер = ""; Дата = ""; Представление = ""; Если ДопДанные.Свойство("Представление", Представление) И ДопДанные.Свойство("Дата", Дата) И ДопДанные.Свойство("Номер", Номер) Тогда Попытка СписокXDTO = ОбъектXDTO.Получить("Документ/СвПродПер/СвПер").ПолучитьСписок("ОснПер"); ПространствоИмен = ПространствоИмен_УПД2019_ИнформацияПродавца(); ОснПер = ПолучитьОбъектТипаCML("Файл.Документ.СвПродПер.СвПер.ОснПер", ПространствоИмен); ОснПер.НаимОсн = Представление; ОснПер.НомОсн = Номер; ОснПер.ДатаОсн = Дата; СписокXDTO.Добавить(ОснПер); Исключение КонецПопытки; КонецЕсли; КонецЕсли; Результат = ПродолжитьВызов(ОбъектXDTO, Ошибки); Возврат Результат; КонецФункции
В отладчике проверяю, как вы глядит добавляемый элемент списка XDTO со счетом-основанием:

В печатной форме 1С выводит эти теги так:

В XML-формате список оснований выглядит так:

Клиент говорил, что выгрузку счета можно сделать не программно, а через настройки ЭДО с контрагентом — через дополнительные поля. Но некоторые системы ЭДО игнорируют дополнительные поля, поэтому пока они вне стандарта, приходится делать программную доработку.
Думал уложусь в 1 час, но потратил 2, т.к. не хотел использовать «Изменение и контроль» и пришлось писать хитрый код по спуску контекста в стеку. Такой код проживет дольше при обновлениях 1С.
Среда: 3.0.116.32 Объем: 2 час

Свежие комментарии