Общая информация
По долгу службы занимаюсь поддержкой и развитием корпоративной ИС - самописная конфигурация на 8.2.
Достаточно давно возникла потребность печатать двумерные штрих-коды на некоторых документах. Какое-то время использовали для этого шрифтовую отрисовку ШК. Минусы этого решения - необходимость иметь установленный специальный шрифт, неустойчивость чтения платежными терминалами.
Поэтому было принято решение - попробовать написать свою ВК. Дело было в начале 2012 г.
Спустя пару недель был готов вариант, который используем и по сей день. Велосипедов при этом изобретено не было. Используется небезызвестный модуль для Дельфи n8api.pas и модуль из состава генератора отчетов FastReport (BarcodeBase). По причине того, что используется модуль из FR, выложить в виде исходников не могу. Но в виде dll - авторы/владельцы FR любезно разрешили опубликовать.
Порядок использования, интерфейс компоненты
Хранить ВК в конфигурации можно различными способами. Мы храним в виде отдельных общих макетов.
Пример подключения:
Функция ПодключитьКомпонентуPDF417() Экспорт
СистемнаяИнформация = Новый СистемнаяИнформация;
Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту( "ОбщийМакет.PDF417_32", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту( "ОбщийМакет.PDF417_64", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);
Иначе
ПодключениеВыполнено = Ложь;
КонецЕсли;
Если Не ПодключениеВыполнено Тогда
ВызватьИсключение("Не подключились по макету!");
КонецЕсли;
Возврат Новый("AddIn.КартинкаШтрихкода.Pdf417Imager");
КонецФункции;
Свойства компоненты (чтение/запись):
- Ширина (Число) - ширина в пикселях
- Высота (Число) - высота в пикселях
- КодоваяСтраница (Число) Опубликовал это свойство из Delphi-компоненты, но не экспериментировал с ним. По умолчанию =0.
- КоличествоСтрок (Число) Вроде как должно регулировать высоту компоненты. Но, похоже, не работает.
- КоличествоКолонок (Число) Изменяет количество столбцов.
- АвтоРазмер (Булево) Компонента сама определит размеры ШК.
- УровеньКоррекцииОшибок (Число) 0 - авто (по умолчанию), 1-9 заданный
- РежимУпаковки (Число) 0 - авто (по умолчанию), 1 - текстовые данные, 2 - цифровые, 3 - бинарные
- КоэффициентМасштабирования (вещественное число) - масштабирование при отрисовке ШК. Похоже, что не работает при формировании картинки.
Как правило, вывод картинки со штрих-кодом требуется в рисунок табличного документа. Экспериментально подобран оптимальный множитель для перевода размеров рисунка в пиксели для компоненты (=3.725).
Сама картинка возвращается выполнением функции ПолучитьКартинку(Ширина, Высота, Текст).
- Ширина - ширина картинки в пикселях
- Высота - высота картинки в пикселях
- Текст - штрихкодируемый текст
- Результат функции - объект ДвоичныеДанные
Итого, примерно так:
Функция ПолучитьКартинку( пВнешКомпонента, пШиринаПикс, пВысотаПикс, пТекст, пВызыватьИсключениеПриОшибке ) Экспорт
Если пВнешКомпонента <> Неопределено Тогда
Если пВызыватьИсключениеПриОшибке Тогда
ПолучитьКартинкуВнутр( пВнешКомпонента, пШиринаПикс, пВысотаПикс, пТекст );
Иначе
Попытка
ПолучитьКартинкуВнутр( пВнешКомпонента, пШиринаПикс, пВысотаПикс, пТекст );
Исключение
ОбщегоНазначения.СообщитьОбОшибке( "Ошибка при формировании изображения штрих-кода: " + ОписаниеОшибки() );
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецФункции
Процедура УстановитьКартинкуДляРисунка( пВнешКомпонента, пРисунок, пТекст, пВызыватьИсключениеПриОшибке ) Экспорт
лМножПикс = 3.725;
Если пВнешКомпонента <> Неопределено Тогда
Если пВызыватьИсключениеПриОшибке Тогда
пРисунок.Картинка = ПолучитьКартинкуВнутр( пВнешКомпонента, пРисунок.Ширина * лМножПикс, пРисунок.Высота * лМножПикс, пТекст );
Иначе
Попытка
пРисунок.Картинка = ПолучитьКартинкуВнутр( пВнешКомпонента, пРисунок.Ширина * лМножПикс, пРисунок.Высота * лМножПикс, пТекст );
Исключение
ОбщегоНазначения.СообщитьОбОшибке( "Ошибка при формировании изображения штрих-кода: " + ОписаниеОшибки() );
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьКартинкуВнутр(пВнешКомпонента, пШиринаПикс, пВысотаПикс, пТекст )
Возврат Новый Картинка( пВнешКомпонента.ПолучитьКартинку( пШиринаПикс, пВысотаПикс, пТекст ));
КонецФункции
Причины появления этой публикации
Недавно решили попробовать перенести конфигурацию на платформу 8.3 (64-бит). До этой попытки, на 64-бит я и не испытывал работоспособность компоненты. А тут она сбойнула с ошибкой "некорректная работа компоненты с памятью". Что ж делать?... Попробовал использовать ВК из типовой торговли (общий макет КомпонентаПечатиШтрихкодов). Результат - неудовлетворителен. Похоже, "внутри" эта ВК отрисовывает шрифтом - потенциально плохо будет читаться. И кириллицу отрисовывает в юникоде - это приводит к прочитыванию управляющих символов.
Тогда решил таки обновить свою ВК. Нашел, что в n8api уже достаточно давно ошибка "некорректная работа компоненты с памятью" исправлена. После скачивания новой версии модуля и перекомпилляции все нормально заработало.
На текущий момент компонента успешно работает в продуктиве на платформе 8.2.17.157 (32-бит) и в тестовом режиме 8.3.7.2008 (64-бит).
Учитывая свой отрицательный опыт использования компоненты от 1С и положительный опыт продолжения эксплуатации своей компоненты, думаю, что компонента может быть полезна и кому-то еще. И, кстати, 1С никак не заинтересовались моей разработкой. Для FR компонента тоже неинтересна.
Что далее...
Особых планов по развитию компоненты - нет. Что мы от нее требуем - она успешно выполняет.
Но замечания/пожелания - вполне себе рассматриваются.
UPD (13.10.2018) По пожеланиям товарища shatalov_ms опубликованы дополнительные свойства компоненты (ранее были только Высота и Ширина).