Вмешиваемся в печать этикеток на принтере этикеток в УНФ 3.0

У меня хорошо работало замещение дополнительных параметров при печати на обычном принтере, но не работало на принтере этикеток.

Пришлось еще раз препарировать нелюбимую мною обработку печати этикетов в УНФ. Увы, 1С — не та система, где содержание и оборудование разделены.

Расширяю модуль ОборудованиеПринтерыЭтикеток:


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

	Результат = ПродолжитьВызов(МассивЭтикеток, МакетЭтикетки, РевизияИнтерфейса);
	Возврат Результат;
КонецФункции

При этом функции для поиска строки:

Функция ПолучитьСтрокуДанныхЭтикеток(ДанныеЭтикетки) Экспорт
	//Осипов 25-0-25 обрабатываем табличный документ после вывода    
	Товары = ДанныеЭтикетки.ПараметрыПечати.Товары;	
	Номенклатура = ДанныеЭтикетки.Номенклатура;
	ИскСтрока = НайтиВМассивеСтруктур(Товары, "НоменклатураБПО", Номенклатура);
	Возврат ИскСтрока;
КонецФункции	


Функция НайтиВМассивеСтруктур(М, Поле, Значение) Экспорт
	Для Каждого С ИЗ М Цикл
		Если С[Поле] = Значение Тогда
			Возврат С;
		КонецЕсли;
	КонецЦикла;
КонецФункции

Надо заметить, что таблицу товаров в параметры я добавляю отдельным кодом, об этом писал ранее.

UPD 25.09.07: 1С оптимизирует, в итоге считает текстовую константу одним полем и выводит его один раз:

В XML это выглядит так:

Пришлось доработать код:


&Вместо("СформироватьДанныеДляПринтераЭтикеток")
Функция АнтШК_СформироватьДанныеДляПринтераЭтикеток(МассивЭтикеток, МакетЭтикетки, РевизияИнтерфейса)
	//Тут надо подменить значения полей...           

	СЧ = 0; //Счетчик полей
	
	Для Каждого ДанныеЭтикетки ИЗ МассивЭтикеток Цикл
		
		//Осипов 25-0-25 обрабатываем табличный документ после вывода    
		ИскСтрока = АнтШК_С.ПолучитьСтрокуДанныхЭтикеток(ДанныеЭтикетки);
		Если ИскСтрока = Неопределено Тогда  Продолжить; КонецЕсли;  
		
			
		Для Каждого ТекЭлемент Из МакетЭтикетки.Поля Цикл
			
			ИмяПоля = ТекЭлемент.Значение;
			Если ИмяПоля = "$НаименованиеДляПлощадки$" ИЛИ
				ИмяПоля = "$АртикулДляПлощадки$" ИЛИ
				ИмяПоля = "$ЕдиницаИзмеренияДляПлощадки$" Тогда
				
				//Приводим к виду: АнтШК_АртикулДляПлощадки;
				ИмяПоля = СтрЗаменить(ИмяПоля, "$", "");
				ИмяПоля = "АнтШК_" + ИмяПоля;
				//ТекЭлемент.Значение = ИскСтрока[ИмяПоля];
				ТекЗначение = ИскСтрока[ИмяПоля];
				
				//Переименовываем                      
				Сч = Сч + 1;
				
				НовоеИмяПоля = ИмяПоля + XMLСтрока(Сч);   
				НовыйИД = Строка(Новый УникальныйИдентификатор());
				
				//ТекЭлемент.Значение = НовоеИмяПоля;
				
				//Меняем в полях этикетки
				ИскСтрокаПоля = НайтиВМассивеСтруктур(ДанныеЭтикетки.Поля, "ИмяПоля", ТекЭлемент.Наименование);
				ИскСтрокаПоля.ИмяПоля = НовыйИД;
				ИскСтрокаПоля.Значение = НовоеИмяПоля; 
				
				//Меняем в списке всех полей
				ИскСтрокаПоля = НайтиВМассивеСтруктур(МакетЭтикетки.Поля, "Наименование", ТекЭлемент.Наименование);
				//Создаем новое поле копией имеющегося
				НоваяСтрокаПоля = СкопироватьСтруктуру(ИскСтрокаПоля);
				МакетЭтикетки.Поля.Добавить(НоваяСтрокаПоля);
				//Присваиваем новый ИД новому полю
				НоваяСтрокаПоля.Наименование = НовыйИД;
				НоваяСтрокаПоля.Значение = ТекЗначение;
				
			КонецЕсли;                                 
			
		КонецЦикла;        
			
	КонецЦикла;      
	
	УдалитьПоле(МакетЭтикетки.Поля, "$НаименованиеДляПлощадки$");
	УдалитьПоле(МакетЭтикетки.Поля, "$АртикулДляПлощадки$");
	УдалитьПоле(МакетЭтикетки.Поля, "$ЕдиницаИзмеренияДляПлощадки$");


	Результат = ПродолжитьВызов(МассивЭтикеток, МакетЭтикетки, РевизияИнтерфейса);
	Возврат Результат;
КонецФункции     

Процедура УдалитьПоле(Коллекция, Значение)
	ИскСтрокаПоля = НайтиИндексВМассивеСтруктур(Коллекция, "Значение", Значение);
	Если ИскСтрокаПоля <> Неопределено Тогда
		Коллекция.Удалить(ИскСтрокаПоля);
	КонецЕсли;
КонецПроцедуры

Функция СкопироватьСтруктуру(С) Экспорт
	//Ф = Новый ФиксированнаяСтруктура(С);
	//НоваяСтруктура = Новый Структура(Ф);
	//Возврат НоваяСтруктура;
	Возврат ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(С));
КонецФункции

Функция НайтиВМассивеСтруктур(М, ИмяПоля, Значение) Экспорт
	Для Каждого Эл ИЗ М Цикл
		Если Эл[ИмяПоля] = Значение Тогда
			Возврат Эл;
		Конецесли;
	КонецЦикла;
КонецФункции    

Функция НайтиИндексВМассивеСтруктур(М, ИмяПоля, Значение) Экспорт
	Сч = 0;
	Для Каждого Эл ИЗ М Цикл
		Если Эл[ИмяПоля] = Значение Тогда
			Возврат Сч;
		Конецесли;     
		Сч = СЧ + 1;
	КонецЦикла;
КонецФункции

В XML (по формату 1С) это выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
	<Formatting Width="62" Height="23">
		<Text FieldName="ab6dcdf2-d5a6-41f0-bf60-a088aca6e394" Left="0.5" Top="12" Width="61" Height="9.5" Static="true" Value="$НаименованиеДляПлощадки$" FontName="Arial" FontSize="8" FontStyle="Bold" Align="Center" VAlign="Center" Multiline="true"/>
		<Barcode FieldName="2c68993a-dc9b-4820-a1e2-044bfed14bc1" Left="10" Top="1.5" Width="42" Height="9.5" Type="EAN13" PrintHRI="true" FontSize="8" CheckSymbol="true"/>
		<Text FieldName="79031c75-8eec-4172-a018-c6b661179a1a" Left="0.5" Top="12" Width="61" Height="9.5" Static="true" Value="Товар 1" FontName="Arial" FontSize="8" FontStyle="Bold" Align="Center" VAlign="Center" Multiline="true"/>
		<Text FieldName="5608a4a8-a0c6-43e5-8609-2d127abac8b0" Left="0.5" Top="12" Width="61" Height="9.5" Static="true" Value="Товар 2" FontName="Arial" FontSize="8" FontStyle="Bold" Align="Center" VAlign="Center" Multiline="true"/>
	</Formatting>
	<Labels>
		<Label Quantity="1">
			<Record FieldName="79031c75-8eec-4172-a018-c6b661179a1a" Value="АнтШК_НаименованиеДляПлощадки1"/>
			<Record FieldName="2c68993a-dc9b-4820-a1e2-044bfed14bc1" Value="200....."/>
		</Label>
		<Label Quantity="3">
			<Record FieldName="5608a4a8-a0c6-43e5-8609-2d127abac8b0" Value="АнтШК_НаименованиеДляПлощадки2"/>
			<Record FieldName="2c68993a-dc9b-4820-a1e2-044bfed14bc1" Value="46......"/>
		</Label>
	</Labels>
</Data>

Одно поле лишнее, я доработал код, чтобы его убирать. Но не помогло, оказывается если static, то выводится всегда, в каждой этикетке.

UPD 25.09.09: Делал в выходной не мог проверить на принтере, пришлось убирать static поля, потому что они выводятся всегда! Такой «милый» undocumented подгон от 1С.

Итоговый код получился проще:

&Вместо("СформироватьДанныеДляПринтераЭтикеток")
Функция АнтШК_СформироватьДанныеДляПринтераЭтикеток(МассивЭтикеток, МакетЭтикетки, РевизияИнтерфейса)
	//Тут надо подменить значения полей...           

	СЧ = 0; //Счетчик полей
	
	Для Каждого ДанныеЭтикетки ИЗ МассивЭтикеток Цикл
		
		//Осипов 25-0-25 обрабатываем табличный документ после вывода    
		ИскСтрока = АнтШК_С.ПолучитьСтрокуДанныхЭтикеток(ДанныеЭтикетки);
		Если ИскСтрока = Неопределено Тогда  Продолжить; КонецЕсли;  
		
			
		Для Каждого ТекЭлемент Из МакетЭтикетки.Поля Цикл
			
			ИмяПоля = ТекЭлемент.Значение;
			Если ИмяПоля = "$НаименованиеДляПлощадки$" ИЛИ
				ИмяПоля = "$АртикулДляПлощадки$" ИЛИ
				ИмяПоля = "$ЕдиницаИзмеренияДляПлощадки$" Тогда
				
				//Приводим к виду: АнтШК_АртикулДляПлощадки;
				ИмяПоля = СтрЗаменить(ИмяПоля, "$", "");
				ИмяПоля = "АнтШК_" + ИмяПоля;
				ТекЗначение = ИскСтрока[ИмяПоля];    
				
				
				//Меняем в списке всех полей
				ТекЭлемент.ТипЗаполнения = "Parameter";
				
				ИскСтрокаПоля = НайтиВМассивеСтруктур(ДанныеЭтикетки.Поля, "ИмяПоля", ТекЭлемент.Наименование);
				ИскСтрокаПоля.Значение = ТекЗначение; 

				
			КонецЕсли;                                 
			
		КонецЦикла;        
			
	КонецЦикла;      
	


	Результат = ПродолжитьВызов(МассивЭтикеток, МакетЭтикетки, РевизияИнтерфейса);
	Возврат Результат;
КонецФункции   

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Data>
	<Formatting Width="62" Height="23">
		<Text FieldName="ab6dcdf2-d5a6-41f0-bf60-a088aca6e394" Left="0.5" Top="12" Width="61" Height="9.5" FontName="Arial" FontSize="8" FontStyle="Bold" Align="Center" VAlign="Center" Multiline="true"/>
		<Barcode FieldName="2c68993a-dc9b-4820-a1e2-044bfed14bc1" Left="10" Top="1.5" Width="42" Height="9.5" Type="EAN13" PrintHRI="true" FontSize="8" CheckSymbol="true"/>
	</Formatting>
	<Labels>
		<Label Quantity="1">
			<Record FieldName="ab6dcdf2-d5a6-41f0-bf60-a088aca6e394" Value="Товар 1"/>
			<Record FieldName="2c68993a-dc9b-4820-a1e2-044bfed14bc1" Value="200.........."/>
		</Label>
		<Label Quantity="1">
			<Record FieldName="ab6dcdf2-d5a6-41f0-bf60-a088aca6e394" Value="Товар 2"/>
			<Record FieldName="2c68993a-dc9b-4820-a1e2-044bfed14bc1" Value="465.........."/>
		</Label>
	</Labels>
</Data>

Среда: УНФ 3.0.12.114 Объем: 4 час.

image_pdfimage_print

fixin

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

Вам может также понравиться...

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

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