Добавляем свой текст в печати этикеток и ценников БПО

Возникла потребность в новой обработке печати ценников ПечатьЭтикетокИЦенниковБПО печатать свои поля в УНФ.

Я уже писал об этой новой обработке печати ценников — ничего хорошего. Посмотрим, что у нее под капотом.

Типовой код 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 час.

fixin

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

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

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

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