Программируя под 8.2, работающем в режиме управляемого приложения, я столкнулся с проблемой печати штрихкода. Для платформы 8.1 и платформы 8.2 в режиме обычного приложения такой проблемы не было: устанавливаем элемент «1С:Печать штрихкодов» в макет и наслаждаемся вертикальными черточками. В режиме управляемого приложения вываливается ошибка:
ОбластьВывода.Рисунки.ШтрихКод.Объект – неопределено
то же случилось?
Дело в том, что для управляемого приложения внешние компоненты разрабатываются по другой технологии. Пример внешней компоненты для печати штрих-кода в 8.2 есть в демонстрационной конфигурации "Управляемое приложение" в макетах справочника Товары либо в конфигурации «1С:Управление торговлей» версии 11, макеты обработки «Печать этикеток и ценников».
Данная компонента, получив в качестве параметра строку штрихкода, возвращает
картинку – штрихкод, которую программисту предлагается поместить в любое удобное место печатной формы.
Теперь как это сделать.
Всего обработок аж четыре штуки:
КомпонентаПечатиШтрихкодовWindows32
КомпонентаПечатиШтрихкодовWindows64
КомпонентаПечатиШтрихкодовLinux32
КомпонентаПечатиШтрихкодовLinux64
Все они загружены в одноименные макеты. Функция, подключающая внешнюю компоненту в зависимости от платформы может выглядеть так:
Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
СистемнаяИнформация = Новый СистемнаяИнформация;
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовWindows32", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовWindows64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовLinux32", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
Иначе
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту("Обработка.ПечатьЭтикетокИЦенников.Макет.КомпонентаПечатиШтрихкодовLinux64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
КонецЕсли;
Если ПодключениеВыполнено Тогда
ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
Иначе
Возврат Неопределено;
КонецЕсли;
Если НЕ ВнешняяКомпонента.ГрафикаУстановлена Тогда
Возврат Неопределено;
Иначе
Если ВнешняяКомпонента.НайтиШрифт("Tahoma") = Истина Тогда
ВнешняяКомпонента.Шрифт = "Tahoma";
Иначе
Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл
ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч);
Если ТекущийШрифт <> Неопределено Тогда
ВнешняяКомпонента.Шрифт = ТекущийШрифт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ВнешняяКомпонента.РазмерШрифта = 10;
Возврат ВнешняяКомпонента;
КонецЕсли;
КонецФункции
В коде выше все компоненты загружены в макеты обработки «ПечатьЭтикетокИЦенников». В принципе ничто не мешает поместить их в любое иное место. Вызов функции осуществляется командой:
ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();
Если что-то не получилось – возвращает НЕОПРЕДЕЛЕНО.
Далее опишем функцию, которая, получив данные, сформирует нужную нам картинку с штрихкодом:
Функция ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Штрихкод, Ширина, Высота) Экспорт
ВнешняяКомпонента.Ширина =Ширина;
ВнешняяКомпонента.Высота =Высота;
ВнешняяКомпонента.АвтоТип = истина;
ВнешняяКомпонента.СодержитКС = СтрДлина(Штрихкод) = 13;
ВнешняяКомпонента.ЗначениеКода = Штрихкод;
Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда
ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода + 10;
КонецЕсли;
ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;
Возврат Неопределено;
КонецФункции
В данной функции используется автоопределение типа штрихкода командой
ВнешняяКомпонента.АвтоТип = истина;
Можно тип штрихкода указать вручную:
ВнешняяКомпонента.АвтоТип = Ложь;
ВнешняяКомпонента.ТипКода = 1;
ТипКода - число от 0 до 15: 0 - EAN8, 1 - EAN13, 2 - EAN128. Вот полный список типов по порядку:
EAN8, EAN13, EAN128, Code39, Code128, Code16k, PDF417, Standart (Industrial) 2 of 5, Interleaved 2 of 5, Расширение Code39, Code93, ITF14, RSS14, CodaBar, EAN13 AddOn 2, EAN13 AddOn 5.
Кроме типа штрихкода, компонента имеет ряд других свойств, например ВнешняяКомпонента.ОтображатьТекст, ВнешняяКомпонента.РазмерШрифта и прочие, можно посмотреть в свойствах.
Наконец последнее - вывод штрихкода. Для этого в макет поместим картинку с именем «Штрихкод». Получаем и выводим штрихкод в область командой:
ОбластьЗначение.Рисунки.Штрихкод.Картинка = ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Штрихкод, 50, 30);
Где Штрихкод – переменная, содержащая строку штрихкода номенклатуры, 50 – требуемая ширина, 30 – высота картинки. В макете размер картинки лучше всего поставить «Реальный размер».
Замечание. Сразу бросается в глаза то, что я вручную указываю размер требуемой картинки – 50 на 30. Возникает вопрос, а нельзя ли размеры требуемой картинки получить из картинки на макете? Конечно можно:
ОбластьЗначение.Рисунки.Штрихкод.Ширина
ОбластьЗначение.Рисунки.Штрихкод.Высота
К сожалению, цифры получаемые этими командами почему-то слишком малы. Как получить реальный видимый размер картинки я пока не знаю, может кто подскажет?
[необходимо зарегистрироваться для просмотра ссылки]