Добавление поля итога по количеству в УПД ЭДО. БП3
Как я уже писал ранее, начиная с релиза БП 3.0.93.20, 1С начало формировать печатные формы документов ЭДО через XSLT преобразование на основе XML данных электронного документа. Поэтому просто так вмешаться во внешний вид формы не получится — разбираться и модифицировать XSLT то еще удовольствие:
Поэтому поступим проще — обработаем данные в табличном документе. По рабоче-крестьянски, так сказать.
Для начала нужно определить, что это за документ, чтобы не печатать итог во всех документах. УПД будем определять по ячейке с текстом «Универсальный передаточный документ» или «ТОВАРНАЯ НАКЛАДНАЯ».
Важно, что от ячейки с количеством надо отступить вниз не одну строку, а две, чтобы пропустить строку с номером колонки, потому что ячейка заголовка занимает две строки.
Данные будем суммировать от первой ячейки количество до строки с текстом «Всего к оплате» (не включая).
Результат разместим в строке, где находится текст «Всего к оплате». И обведем его в рамку.
Правда, текст в ячейках содержит переносы в разных местах и мы должны их точно воспроизвести. Но что поделать, нам нужен быстрый поиск в макете. Пусть даже в ущерб универсальности — если 1С расставит переносы по другому в визуальном оформлении, придется переписывать код.
Результат выглядит удовлетворительно:
Вот полученный код расширения для модуля КонвертацияЭДО:
&Вместо(«ПредставлениеПроизвольногоДокумента»)
Функция эдодп_ПредставлениеПроизвольногоДокумента(ФайлXML, ПараметрыДокумента, КонтекстДиагностики)
// Вставить содержимое метода.
Результат = ПродолжитьВызов(ФайлXML, ПараметрыДокумента, КонтекстДиагностики);
//Осипов 2021-02-04 Тут обработка данных
Если НЕ Результат.Успех ИЛИ ТипЗнч(Результат.ПредставлениеДокумента) <> Тип(«ТабличныйДокумент») Тогда
Возврат Результат; //Выход
КонецЕсли;
ТабДок = Результат.ПредставлениеДокумента;
//Сначала ищем название УПД
ТекОбласть = ТабДок.НайтиТекст(«Универсальный передаточный
|документ»);
Если ТекОбласть <> Неопределено Тогда
ТекстВсего = «Всего к оплате»;
ТекстКол = «Коли-
|чество
|(объем)»;
Иначе
ТекОбласть = ТабДок.НайтиТекст(«ТОВАРНАЯ НАКЛАДНАЯ»);
Если ТекОбласть = Неопределено Тогда
Возврат Результат; //Выход
КонецЕсли;
//Товарная накладная
ТекстВсего = «Всего к оплате»;
ТекстКол = «Коли-
|чество
|(объем)»;
КонецЕсли;
//Затем ищем область итогов
ТекОбластьВсего = ТабДок.НайтиТекст(ТекстВсего);
Если ТекОбластьВсего = Неопределено Тогда
Возврат Результат; //Выход
КонецЕсли;
ТекОбластьКол = ТабДок.НайтиТекст(ТекстКол);
Если ТекОбластьКол = Неопределено Тогда
Возврат Результат; //Выход
КонецЕсли;
//Теперь суммируем итог
НачальнаяСтрока = ТекОбластьКол.Верх + 3; //Пропускаем одну строку, там номер колонки
КонечнаяСтрока = ТекОбластьВсего.Верх — 1; //Область над итого
Колонка = ТекОбластьКол.Лево;
ТекСумма = 0;
Для ТекСтрока = НачальнаяСтрока По КонечнаяСтрока Цикл
ТекОбласть = ТабДок.Область(ТекСтрока, Колонка);
ТекСумма = ТекСумма + ЧислоИзСтроки(ТекОбласть.Текст);
КонецЦикла;
//Выводим итого
ТекОбласть = ТабДок.Область(ТекОбластьВсего.Верх, Колонка);
ТекОбласть.Текст = Формат(ТекСумма, «ЧДЦ=3; ЧРД=,; ЧН=0,000»);
ТекОбласть.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
//Для обведения
ТекЛиния = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1);
ТекОбласть.ГраницаСлева = ТекЛиния;
ТекОбласть.ГраницаСправа = ТекЛиния;
ТекОбласть.ГраницаСнизу = ТекЛиния;
ТекОбласть.ГраницаСверху = ТекЛиния;
Возврат Результат;
КонецФункции
Функция ЧислоИзСтроки(Знач С) Экспорт
С = СокрЛП(С);
С = СтрЗаменить(С, Символы.НПП, «»);
С = СтрЗаменить(С, «,», «.»);
Если С = «» Тогда
Возврат 0;
КонецЕсли;
Попытка
Возврат Число(С);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
В коде я использовал свою готовую функцию из библиотеки для преобразования строки в число.
Какие можно сделать выводы? Код сам по себе шедевр костыле-строения. Но увы, 1С не оставила нам никаких других шансов, чтобы сопровождать этот код быстро и дешево. Приходится выкручиваться максимально эффективным и недорогим способом.
Возможно, эти же XSLT преобразования 1С применяет в других своих продуктах, вроде «Мой склад», поэтому и перешла на эту методику. Но в итоге мы потеряли возможность менять макеты простыми способами. Увы. Хорошо что речь идет о простых правках. Если бы понадобилось что-то сложнее, проще было бы самому нарисовать на языке 1С этот макет на основе XML.
Объем план: 1.5 час. Среда: БП 3.0.93.20.
Свежие комментарии