Добавляем свой текст в печати этикеток и ценников БПО
Возникла потребность в новой обработке печати ценников ПечатьЭтикетокИЦенниковБПО печатать свои поля в УНФ.
Я уже писал об этой новой обработке печати ценников — ничего хорошего. Посмотрим, что у нее под капотом.
Типовой код 1С — это сон разума программиста, поэтому находим процедуру формирования табличного документа этикетки замером производительности. Это процедура ЗаполненныйТабличныйДокумент модуля менеджера обработки ПечатьЭтикетокИЦенниковБПО.

Но как это обычно у 1С, в данных этикеток только финальные значения полей, без контекста. Да и сами поля именованы с помощью GUID, что не дает понимания, что это за поля:

На дворе 2025 год, а 1С всё также не умеет передавать контекст вниз по стеку.
Так как я не люблю режим «Изменения и контроль», расширения сделанные на нем, не живут долго, поэтому выбрал более сложный способ восстановления контекста:
&Вместо("ДанныеДляПечатиЭтикеток") Функция АнтШК_ДанныеДляПечатиЭтикеток(ДанныеНоменклатурыДляФормированияПечатныхФорм, СоответствиеПолейИШаблонов) ДанныеДляПечатныхФорм = ПродолжитьВызов(ДанныеНоменклатурыДляФормированияПечатныхФорм, СоответствиеПолейИШаблонов); //Осипов 25-0-25 добавляем свои данные //Дополняем параметры сч1 = 0; Для Каждого ДанныеДляШаблона Из ДанныеНоменклатурыДляФормированияПечатныхФорм Цикл ТаблицаРезультата = ДанныеДляШаблона.ТаблицаНоменклатуры; // ТаблицаЗначений ДанныеДляПечатиЭтикеток = ДанныеДляПечатныхФорм[Сч1].ДанныеДляПечатиЭтикеток; Сч1 = Сч1 + 1; Сч2 = 0; Для каждого Товар Из ТаблицаРезультата Цикл Попытка ТекСтруктура = ДанныеДляПечатиЭтикеток[Сч2]; Исключение Сообщить("Доработка не может определить позиции номенклатуры!"); Возврат ДанныеДляПечатныхФорм; КонецПопытки; ТекСтруктура.Вставить("Номенклатура", Товар.Номенклатура); ТекСтруктура.Вставить("ПараметрыПечати", ДанныеДляШаблона.ПараметрыПечати); Сч2 = Сч2 + 1; КонецЦикла; КонецЦикла; Возврат ДанныеДляПечатныхФорм; КонецФункции
Как видно из кода, на каждый шаблон создается отдельная строка ДанныеДляШаблона в ДанныеНоменклатурыДляФормированияПечатныхФорм, а на каждый товар — структура в массиве ДанныеДляПечатиЭтикеток.
Также для задачи мне надо передавать исходную таблицу товаров. Поэтому я сохраняю в каждой строке ПараметрыПечати. Для этого расширяю модуль ПечатьДокументовУНФ:
&Вместо("ДанныеДляФормированияПечатныхФорм") Функция АнтШК_ДанныеДляФормированияПечатныхФорм(ПараметрыПечати, ПоляДляЗаполнения) // Вставить содержимое метода. ДанныеДляФормированияПечатныхФорм = ПродолжитьВызов(ПараметрыПечати, ПоляДляЗаполнения); Для Каждого Строка ИЗ ДанныеДляФормированияПечатныхФорм Цикл Строка.Вставить("ПараметрыПечати", ПараметрыПечати); //Товары КонецЦикла; Возврат ДанныеДляФормированияПечатныхФорм; КонецФункции
После этого в каждой структуре уже гарантированно присутствуют номенклатура и параметры печати:

Поля макета я задаю как текст:

Остается только обработать поля макета:
&Вместо("ЗаполненныйТабличныйДокумент") Функция АнтШК_ЗаполненныйТабличныйДокумент(Разрешение, ДанныеЭтикетки, СообщениеОбОшибке) ТабличныйДокумент = ПродолжитьВызов(Разрешение, ДанныеЭтикетки, СообщениеОбОшибке); //Осипов 25-0-25 обрабатываем табличный документ после вывода Товары = ДанныеЭтикетки.ПараметрыПечати.Товары; Номенклатура = ДанныеЭтикетки.Номенклатура; ИскСтрока = НайтиВМассивеСтруктур(Товары, "НоменклатураБПО", Номенклатура); Если ИскСтрока <> Неопределено Тогда //Начинаем замену по маркерам Шаблоны = Новый Соответствие(); Шаблоны.Вставить("$НаименованиеДляПлощадки$", ИскСтрока.АнтШК_НаименованиеДляПлощадки); Шаблоны.Вставить("$АртикулДляПлощадки$", ИскСтрока.АнтШК_АртикулДляПлощадки); Шаблоны.Вставить("$ЕдиницаИзмеренияДляПлощадки$", ИскСтрока.АнтШК_ЕдиницаИзмеренияДляПлощадки); ЗаменитьВТабличномДокументеПоШаблонам(ТабличныйДокумент, Шаблоны); КонецЕсли; Возврат ТабличныйДокумент; КонецФункции Функция НайтиВМассивеСтруктур(М, Поле, Значение) Экспорт Для Каждого С ИЗ М Цикл Если С[Поле] = Значение Тогда Возврат С; КонецЕсли; КонецЦикла; КонецФункции Функция ЗаменитьВТабличномДокументеПоШаблонам(ТД, Шаблоны) Для Каждого Шаблон ИЗ Шаблоны Цикл Искомое = Шаблон.Ключ; Замена = Шаблон.Значение; Начало = Неопределено; Пока Истина Цикл ИскОбласть = ТД.НайтиТекст(Искомое, Начало); Если ИскОбласть = Неопределено Тогда Прервать; КонецЕсли; Если Замена = "[УДАЛИТЬСТРОКУ]" Тогда ТД.УдалитьОбласть(ТД.Область(ИскОбласть.Верх,,ИскОбласть.Верх)); КонецЕсли; ИскОбласть.Текст = СтрЗаменить(ИскОбласть.Текст, Искомое, Замена); КонецЦикла; КонецЦикла; КонецФункции
В общем в очередной раз 1С умудрилась сделать противоположность конфетки — негибкое, не расширяемое решение для печати ценников. Всё как всегда, ничего нового. Под капотом тоже хлам.
Среда: УНФ 3.0.11.142 Платформа: 8.3.25.1546 Объем: 2 час.

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