Внешняя компонента (Native) для печати двумерного штрих-кода PDF417

Достаточно давно возникла потребность печатать двумерные штрих-коды на некоторых документах. Какое-то время использовали для этого шрифтовую отрисовку ШК. Минусы этого решения — необходимость иметь установленный специальный шрифт, неустойчивость чтения платежными терминалами.

Поэтому было принято решение — попробовать написать свою ВК.

Общая информация

По долгу службы занимаюсь поддержкой и развитием корпоративной ИС — самописная конфигурация на 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.2024) По пожеланиям товарища shatalov_ms опубликованы дополнительные свойства компоненты (ранее были только Высота и Ширина).

10 Comments

  1. starik-2005

    Нативная компонента из БСП умеет генерить PDF417 уже давненько.

    Reply
  2. ImHunter

    (1) Если почитать публикацию, то можно и про это тоже там увидеть.

    Reply
  3. oops!

    Во всей этой истории забавно другое — ГНИВЦ x64-версию своего модуля печати двумерных штрихкодов PDF417 выпускать даже не планируют.

    В конце 2016 года я им задавал вопрос о том, планируется хоть как-то решать данный вопрос, и они мне написали (цитата):

    «Здравствуйте! Выпуск «Модуля печати PDF417» в 64-разрядном варианте не планируется.

    В ближайшее время (через 2-3 недели) планируется выпуск вспомогательной программы, позволяющей выполнять печать из 64-х разрядных программ с использованием 32-разрядного пакета «Модуля печати PDF417».

    Если Вам требуются дополнительные разъяснения, просим Вас ответить на данное письмо, полностью сохранив тему письма.

    Ответ просим направлять именно с того адреса (e-mail), который Вы указали в заявке.

    Служба технической поддержки сервисов ФНС России

    (АО «ГНИВЦ»)»

    Ответ был дан 05 декабря 2016 года, «вот только воз и ныне там» — ничего они с тех пор так и не выпустили, да я так думаю, что и не выпустят до тех пор, пока в самой ИФНС не появятся x64-версии их продуктов (Декларация 3НДФЛ, Налогоплательщик ЮЛ и т.д.), а с этим они явно не спешат, т.к. даже и планов таких нет.

    Так что если вашу компоненту есть возможность использовать как альтернативу компоненте от ГНИВЦ для печати двумерных штрихкодов на регламентированных отчетах без доработки конфигурации, и при этом будет получен аналогичный ГНИВЦ двумерный штрихкод, то, по сути, ваша компонента будет тем самым краеугольным камнем. который позволит большинству бухгалтеров перейти на использование x64-версии 1С:Предприятия, т.к. зачастую, кроме данного модуля при работе с бухгалтерией иные ВК не используются.

    ЗЫ: Странно, что в 1С этим не заинтересовались — видимо при обращении к ним не было акцентировано внимание на факте работы компоненты из под x64-версии платформы, хотя, возможно, у них в приоритете всё же использование компоненты именно от ГНИВЦ, тогда всё становится на свои места…

    Reply
  4. annagolinskaya

    Вот засада! Ка всегда!

    Reply
  5. zavedeev

    Автор а исходники можно?

    Reply
  6. ImHunter

    (5) Писал в статье — нельзя.

    Reply
  7. Гость

    При установке на win 10 x64 вылезает такая ошибка. Людям необходима эта штука для заполнения деклараций 3-НДФЛ в программе от ФНС и дальнейшей печати, но сносить x64 и ставить x32? Повторюсь, к 1С не имею абсолютно никакого отношения, мне тупо надо вернуть 13% с обучения, для этого надо заполнить декларацию, а без программы и двухмерника никак (см.скрин), вручную заполнить не представляется возможным, т.к. ленивые тетки ФНС берут за услугу 500 рублей за одну декларацию, а тут вы еще ставите ограничение на скачивание x64 и ставите цены 1500-1700. Что за абсурд?

    Reply
  8. ImHunter

    Кто-то чего-то не понимает:)

    1. Моей ВК никакие доп.шрифты не требуются. А исходя из скрина, ошибка именно в отсутствии шрифта

    2. Что за суммы «1500-1700. Что за абсурд?» — мне тоже неясно. Ибо суммы именно здесь — 1-2 sm.

    Возможно, вам нужно внимательнее почитать документацию к «3-НДФЛ в программе от ФНС» — там, скорее всего, написано, какой шрифт нужно установить.

    Reply
  9. linuxmaster

    А есть такое же, и чтобы работало в Linux?

    Reply
  10. ImHunter

    (9) Собиралось на Delphi XE6. Она под Linux не компилляет. Соответственно, собрать под Linux — нет возможности.

    Reply

Leave a Comment

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