ЭДО: Добавление счета на оплату в основания. БП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 час

fixin

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

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

комментариев 6

  1. Bukvoed:

    Добрый день. Не совершали случаем такую доработку для 1С:ERP Управление предприятием 2 (2.5.16.74)? Хотим что бы заполнялось поле «Данные о транспортировке и грузе» (на 1 пункт ниже вашего), запускал мониторинг производительности, но так и не смог найти, где происходит заполнение ЭД. Спасибо)

    • Нет, я с ERP вообще редко работаю — не мой клиент.
      В статье описано, где вмешиваться в код.
      Если требуется, могу заняться по 3.500 в час, где-то на 2-3 часа объем работ.

  2. Иван:

    Здравствуйте. Случаем не попадалась Вам задача, где необходимо было в электронном документе в поле «количество» или «цена» сделать округление до 4-х цифр после запятой? Если да, то не могли бы подсказать в какую сторону смотреть?

    • Нет. Но думаю, где-то где делается запрос исходных данных из документа, 1С любит сейчас все запросами ковырять.
      Попробуйте замером производительности найти место в коде.

  3. Леонид:

    Спасибо. Реально помогло денег заработать 🙂
    Я, правда, поступил немного по-другому. Просто подменил что мне нужно в функции формирования текста запроса РНК

    &Вместо(«ТекстЗапросаДанныеДляПечатиСчетовФактур»)
    Функция тлв_ТекстЗапросаДанныеДляПечатиСчетовФактур(НомераТаблиц, ЕстьПередачаТоваровВСоставеРабот)
    // Вставить содержимое метода.
    Результат = ПродолжитьВызов(НомераТаблиц, ЕстьПередачаТоваровВСоставеРабот);
    Результат = СтрЗаменить(Результат, «Реквизиты.ДоговорКонтрагента.Номер», «ВЫБОР КОГДА Реквизиты.Контрагент.ИНН = «»6670555555″» ТОГДА ПОДСТРОКА(Реквизиты.Комментарий, 1, 10) ИНАЧЕ Реквизиты.ДоговорКонтрагента.Номер КОНЕЦ»);
    Возврат Результат;
    КонецФункции

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

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