ЭДО: Добавление счета на оплату в основания. БП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 час
Добрый день. Не совершали случаем такую доработку для 1С:ERP Управление предприятием 2 (2.5.16.74)? Хотим что бы заполнялось поле «Данные о транспортировке и грузе» (на 1 пункт ниже вашего), запускал мониторинг производительности, но так и не смог найти, где происходит заполнение ЭД. Спасибо)
Нет, я с ERP вообще редко работаю — не мой клиент.
В статье описано, где вмешиваться в код.
Если требуется, могу заняться по 3.500 в час, где-то на 2-3 часа объем работ.
Здравствуйте. Случаем не попадалась Вам задача, где необходимо было в электронном документе в поле «количество» или «цена» сделать округление до 4-х цифр после запятой? Если да, то не могли бы подсказать в какую сторону смотреть?
Нет. Но думаю, где-то где делается запрос исходных данных из документа, 1С любит сейчас все запросами ковырять.
Попробуйте замером производительности найти место в коде.
Спасибо. Реально помогло денег заработать 🙂
Я, правда, поступил немного по-другому. Просто подменил что мне нужно в функции формирования текста запроса РНК
&Вместо(«ТекстЗапросаДанныеДляПечатиСчетовФактур»)
Функция тлв_ТекстЗапросаДанныеДляПечатиСчетовФактур(НомераТаблиц, ЕстьПередачаТоваровВСоставеРабот)
// Вставить содержимое метода.
Результат = ПродолжитьВызов(НомераТаблиц, ЕстьПередачаТоваровВСоставеРабот);
Результат = СтрЗаменить(Результат, «Реквизиты.ДоговорКонтрагента.Номер», «ВЫБОР КОГДА Реквизиты.Контрагент.ИНН = «»6670555555″» ТОГДА ПОДСТРОКА(Реквизиты.Комментарий, 1, 10) ИНАЧЕ Реквизиты.ДоговорКонтрагента.Номер КОНЕЦ»);
Возврат Результат;
КонецФункции
Отлично.