Вмешиваемся в печать этикеток на принтере этикеток в УНФ 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 час.




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