Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 18:46

Печать штрихкода в управляемом приложении

Автор Fomania, 03 мая 2012, 09:58

0 Пользователей и 1 гость просматривают эту тему.

Fomania

Добрый день!
Пишу конфигурацию в управляемом приложении 8.2. Доки требуется печатать со штрихкодом. В макете документа я добавила объект-рисунок ШК: таблица-рисунки-вставить объект, элемент управления "1С.V8.Печать штрих-кодов". В свойствах рисунка имя изменила на Штрихкод. К документу прикручена команда Печать, в модуле команды происходит следущее:

ОбластьШтрихкод = Макет.ПолучитьОбласть("ОбластьШтрихкод");
СтрокаШК = ПолучитьШтрихКодОбъекта(ТекДокумент);
ОбластьШтрихкод.Рисунки.Штрихкод.Объект.ТипКода = 1;
ОбластьШтрихкод.Рисунки.Штрихкод.Объект.Сообщение = СтрокаШК;
РезДок.Вывести(ОбластьШтрихкод);

ПолучитьШтрихКодОбъекта() возвращает строку штрихкода, до этого момента все нормально отрабатывает. Но потом на третьей строке вылезает ошибка:

Документ.ПоступлениеИнвестиций.Команда.Печать.МодульКоманды(29)}: Значение не является значением объектного типа (ТипКода)

В отладчике смотрю, ОбластьШтрихкод.Рисунки.Штрихкод у меня типа РисунокТабличногоДокумента, его свойство Объект типа Неопределено, а у свойства ЭлементУправления значение Недоступно для чтения. У подобной строки в УТ 10.3 ЭтикеткаОбласть.Рисунки.Штрихкод.Объект имеет тип ActiveX. В чем может быть причина, почему мой рисунок не хочет становиться объектом ШК? Установлена компонента 1CBarCode. Правда, УТ 10.3 обычное приложение, а у меня управляемое. В чем может быть загвоздка?

Помогите пожалуйста, может кто сталкивался с подобным!

Dethmontt

Советую почитать как это делается в Управляемом приложении
http://programna1c.narod.ru/docs/Articles/BarcodeUprApp/BarcodeUprApp.html

Печать штрихкода в управляемом приложении 8.2

Печать штрихкода в управляемом приложении 8.2

Программируя под 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") = Истина Тогда
// Выбираем его как шрифт для формирования картинки
ВнешняяКомпонента.Шрифт = "Tahoma";
Иначе

// Шрифт Tahoma в системе отсутствует
// Обойдем все доступные компоненте шрифты
Для Сч = 0 По ВнешняяКомпонента.КоличествоШрифтов -1 Цикл
// Получим очередной шрифт, доступный компоненте
ТекущийШрифт = ВнешняяКомпонента.ШрифтПоИндексу(Сч);
// Если шрифт доступен
Если ТекущийШрифт <> Неопределено Тогда
// Они и будет шрифтом для формирования штри-кода
ВнешняяКомпонента.Шрифт = ТекущийШрифт;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;

// Утановим размер шрифта
ВнешняяКомпонента.РазмерШрифта = 10;

Возврат ВнешняяКомпонента;

КонецЕсли;

КонецФункции


В коде выше все компоненты загружены в макеты обработки «ПечатьЭтикетокИЦенников». В принципе ничто не мешает поместить их в любое иное место. Вызов функции осуществляется командой:

ВнешняяКомпонента = ПодключитьВнешнююКомпонентуПечатиШтрихкода();


Если что-то не получилось - возвращает НЕОПРЕДЕЛЕНО.

Далее опишем функцию, которая, получив данные, сформирует нужную нам картинку с штрихкодом:

Функция ПолучитьКартинкуШтрихкода(ВнешняяКомпонента, Штрихкод, Ширина, Высота) Экспорт

// Зададим размер картинки
ВнешняяКомпонента.Ширина =Ширина;
ВнешняяКомпонента.Высота =Высота;

// Разрешим компоненте самой определять тип кода
ВнешняяКомпонента.АвтоТип = истина;

// Если код содержит контрольный символ, обязательно указываем
ВнешняяКомпонента.СодержитКС = СтрДлина(Штрихкод) = 13;

// Если отображать контрольный символ не нужно
// ВнешняяКомпонента.ВидимостьКС = Ложь;

// Формируем картинку штрихкода
ВнешняяКомпонента.ЗначениеКода = Штрихкод;

// Если установленная нами ширина меньше минимально допустимой для этого штрихкода
Если ВнешняяКомпонента.Ширина < ВнешняяКомпонента.МинимальнаяШиринаКода Тогда
// Скорректируем ширину
ВнешняяКомпонента.Ширина = ВнешняяКомпонента.МинимальнаяШиринаКода + 10;
КонецЕсли;

// Сформируем картинку
ДвоичныеДанныеКартинки = ВнешняяКомпонента.ПолучитьШтрихкод();

// Если картинка сформировалась
Если ДвоичныеДанныеКартинки <> Неопределено Тогда
// Формируем из двоичных данных
Возврат Новый Картинка(ДвоичныеДанныеКартинки);
КонецЕсли;

Возврат Неопределено;

КонецФункции


В данной функции используется автоопределение типа штрихкода командой

ВнешняяКомпонента.АвтоТип = истина;


Можно тип штрихкода указать вручную:

ВнешняяКомпонента.АвтоТип = Ложь;
ВнешняяКомпонента.ТипКода = 1; // указан тип EAN13


ТипКода - число от 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. Возникает вопрос, а нельзя ли размеры требуемой картинки получить из картинки на макете? Конечно можно:

ОбластьЗначение.Рисунки.Штрихкод.Ширина
ОбластьЗначение.Рисунки.Штрихкод.Высота


К сожалению, цифры получаемые этими командами почему-то слишком малы. Как получить реальный видимый размер картинки я пока не знаю, может кто подскажет?

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск