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

fixin

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

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

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

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