Поэтому было принято решение — попробовать написать свою ВК.
Общая информация
По долгу службы занимаюсь поддержкой и развитием корпоративной ИС — самописная конфигурация на 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.2025) По пожеланиям товарища shatalov_ms опубликованы дополнительные свойства компоненты (ранее были только Высота и Ширина).
Нативная компонента из БСП умеет генерить PDF417 уже давненько.
(1) Если почитать публикацию, то можно и про это тоже там увидеть.
Во всей этой истории забавно другое — ГНИВЦ x64-версию своего модуля печати двумерных штрихкодов PDF417 выпускать даже не планируют.
В конце 2016 года я им задавал вопрос о том, планируется хоть как-то решать данный вопрос, и они мне написали (цитата):
«Здравствуйте! Выпуск «Модуля печати PDF417» в 64-разрядном варианте не планируется.
В ближайшее время (через 2-3 недели) планируется выпуск вспомогательной программы, позволяющей выполнять печать из 64-х разрядных программ с использованием 32-разрядного пакета «Модуля печати PDF417».
Если Вам требуются дополнительные разъяснения, просим Вас ответить на данное письмо, полностью сохранив тему письма.
Ответ просим направлять именно с того адреса (e-mail), который Вы указали в заявке.
Служба технической поддержки сервисов ФНС России
(АО «ГНИВЦ»)»
Ответ был дан 05 декабря 2016 года, «вот только воз и ныне там» — ничего они с тех пор так и не выпустили, да я так думаю, что и не выпустят до тех пор, пока в самой ИФНС не появятся x64-версии их продуктов (Декларация 3НДФЛ, Налогоплательщик ЮЛ и т.д.), а с этим они явно не спешат, т.к. даже и планов таких нет.
Так что если вашу компоненту есть возможность использовать как альтернативу компоненте от ГНИВЦ для печати двумерных штрихкодов на регламентированных отчетах без доработки конфигурации, и при этом будет получен аналогичный ГНИВЦ двумерный штрихкод, то, по сути, ваша компонента будет тем самым краеугольным камнем. который позволит большинству бухгалтеров перейти на использование x64-версии 1С:Предприятия, т.к. зачастую, кроме данного модуля при работе с бухгалтерией иные ВК не используются.
ЗЫ: Странно, что в 1С этим не заинтересовались — видимо при обращении к ним не было акцентировано внимание на факте работы компоненты из под x64-версии платформы, хотя, возможно, у них в приоритете всё же использование компоненты именно от ГНИВЦ, тогда всё становится на свои места…
Вот засада! Ка всегда!
Автор а исходники можно?
(5) Писал в статье — нельзя.
При установке на win 10 x64 вылезает такая ошибка. Людям необходима эта штука для заполнения деклараций 3-НДФЛ в программе от ФНС и дальнейшей печати, но сносить x64 и ставить x32? Повторюсь, к 1С не имею абсолютно никакого отношения, мне тупо надо вернуть 13% с обучения, для этого надо заполнить декларацию, а без программы и двухмерника никак (см.скрин), вручную заполнить не представляется возможным, т.к. ленивые тетки ФНС берут за услугу 500 рублей за одну декларацию, а тут вы еще ставите ограничение на скачивание x64 и ставите цены 1500-1700. Что за абсурд?
Кто-то чего-то не понимает:)
1. Моей ВК никакие доп.шрифты не требуются. А исходя из скрина, ошибка именно в отсутствии шрифта
2. Что за суммы «1500-1700. Что за абсурд?» — мне тоже неясно. Ибо суммы именно здесь — 1-2 sm.
Возможно, вам нужно внимательнее почитать документацию к «3-НДФЛ в программе от ФНС» — там, скорее всего, написано, какой шрифт нужно установить.
А есть такое же, и чтобы работало в Linux?
(9) Собиралось на Delphi XE6. Она под Linux не компилляет. Соответственно, собрать под Linux — нет возможности.