Как сгенерировать и напечатать QR-коды в 1С 7.7

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В отличие от современных версий платформы 1С 8.3, где генерация штрихкодов и QR-кодов встроена в платформу или реализуется через стандартные библиотеки, в «старой доброй» 1С 7.7 эта задача требует творческого подхода и использования внешних инструментов. Рассмотрим подробно несколько проверенных способов реализации этой задачи: от использования специализированных ActiveX-компонент до работы с консольными утилитами.

Способ 1: Использование Ocvita Barcode ActiveX

Одним из наиболее стабильных решений для 1С 7.7 является использование компоненты Ocvita Barcode ActiveX (основанной на библиотеке Zint). Главное преимущество этого метода заключается в том, что QR-код становится объектом макета, которым можно управлять программно.

Шаг 1: Регистрация компоненты в операционной системе

Прежде чем приступать к написанию кода, необходимо зарегистрировать файл OcvitaBarcode.ocx в системе. Разберем особенности этого процесса для разных версий Windows:

  1. Скопируйте файл OcvitaBarcode.ocx в системную папку (например, C:\Windows\System32 или в каталог базы данных).
  2. Запустите командную строку от имени администратора.
  3. Выполните команду регистрации: regsvr32 OcvitaBarcode.ocx.
  4. Если вы используете 64-битную версию Windows, используйте версию regsvr32 из папки SysWOW64: c:\windows\syswow64\regsvr32.exe OcvitaBarcode.ocx.

Шаг 2: Вставка объекта в таблицу (макет)

В 1С 7.7 часто возникает проблема: компонента не отображается в списке доступных объектов при выборе меню «Таблица — Вставить рисунок — Объект». Проанализируем обходной путь:

  1. Откройте любой редактор, поддерживающий вставку ActiveX (например, Microsoft Word или Excel).
  2. Вставьте объект Ocvita Barcode в документ.
  3. Скопируйте этот объект (Ctrl+C) и вставьте его непосредственно в макет таблицы 1С (Ctrl+V).
  4. В свойствах вставленного объекта в 1С обязательно укажите идентификатор, например QRКод.

Шаг 3: Программное управление

Теперь рассмотрим, как передать данные в этот объект при формировании печатной формы. Выясним причину, по которой иногда не отображается текст: важно правильно установить кодовую страницу для кириллицы.


Процедура ПечатьQR()
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица"); // Имя вашего макета
    Таб.ВывестиСекцию("Шапка");
    
    // Получаем объект из секции макета
    Попытка
        ОбъектQR = Таб.ТекущийОбъект;
        // Устанавливаем кодировку 1251 для корректной работы с русским языком
        ОбъектQR.code_page = 1251; 
        // Задаем тип штрихкода (для QR обычно используется индекс или константа компоненты)
        ОбъектQR.symbology = 58; // 58 - это QR Code в библиотеке Zint
        // Передаем данные
        ОбъектQR.barcode = "Название: " + СокрЛП(ТекстДляКодирования);
    Исключение
        Сообщить("Ошибка обращения к компоненте QR-кода!");
    КонецПопытки;
    
    Таб.ТолькоПросмотр(1);
    Таб.Показать();
КонецПроцедуры

Способ 2: Генерация через консольную утилиту Zint

Если вариант с ActiveX по каким-то причинам не подходит (например, из-за ограничений прав пользователей на регистрацию DLL), можно воспользоваться консольной версией zint.exe. Этот метод заключается в генерации картинки во временный файл и последующей загрузке этой картинки в таблицу 1С.

Проблема кириллицы в Zint: Многие сталкиваются с тем, что Zint не понимает русские буквы при прямой передаче параметров. Разберем ситуацию: Zint ожидает входные данные в кодировке UTF-8. Рассмотрим функцию преобразования строки:


Функция ПреобразоватьВUTF8(Стр)
    // В 7.7 нет встроенного UTF-8, используем ADODB.Stream для надежности
    Stream = СоздатьОбъект("ADODB.Stream");
    Stream.Type = 2; // Text
    Stream.Charset = "windows-1251";
    Stream.Open();
    Stream.WriteText(Стр);
    Stream.Position = 0;
    Stream.Charset = "utf-8";
    Результат = Stream.ReadText();
    Stream.Close();
    Возврат Результат;
КонецФункции

Затем мы вызываем утилиту через КомандаСистемы. Посмотрим на пример формирования команды:


Процедура СгенерироватьФайлQR(Данные, ПутьКФайлу)
    ПутьКZint = "C:\Zint\zint.exe";
    ВремФайлКартинки = "C:\Temp\qr_code.png";
    
    // Формируем строку запуска: -b 58 (QR), -o (output file), -d (data)
    Команда = ПутьКZint + " -b 58 -o " + ВремФайлКартинки + " -d """ + Данные + """";
    
    КомандаСистемы(Команда);
КонецПроцедуры

После генерации картинку можно вставить в таблицу 1С, используя метод ТекущийОбъект.Загрузить(ВремФайлКартинки).

Способ 3: Использование внешних API (Google Charts)

Если компьютер имеет доступ к интернету, мы можем существенно упростить задачу, переложив генерацию на веб-сервис. Проанализируем этот современный подход.

Мы можем сформировать HTTP-запрос к Google Charts API, который вернет нам готовую картинку QR-кода. Для этого удобно использовать объект WinHttp.WinHttpRequest.5.1.


Функция ПолучитьQRЧерезИнтернет(ТекстКода)
    Соединение = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    URL = "https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=" + ТекстКода;
    
    Соединение.Open("GET", URL, 0);
    Соединение.Send();
    
    Если Соединение.Status = 200 Тогда
        // Сохраняем полученный бинарный поток в файл
        Stream = СоздатьОбъект("ADODB.Stream");
        Stream.Type = 1; // Binary
        Stream.Open();
        Stream.Write(Соединение.ResponseBody);
        ИмяФайла = КаталогВременныхФайлов() + "qr.png";
        Stream.SaveToFile(ИмяФайла, 2);
        Stream.Close();
        Возврат ИмяФайла;
    КонецЕсли;
    Возврат "";
КонецФункции

Важные рекомендации при работе с QR-кодами в 7.7

При массовой печати (например, ценников для 2000 товаров) могут возникнуть технические сложности. Разберем основные моменты:

  1. Утечка ресурсов (GDI): При использовании ActiveX-компонент в цикле 1С 7.7 может «съедать» графические ресурсы системы, что приведет к ошибкам C++ Runtime Error. Чтобы избежать этого, рекомендуется периодически закрывать и открывать таблицу или использовать метод генерации через временные файлы картинок, которые менее требовательны к памяти при выводе в Moxel.
  2. Размер и читаемость: Для надежного сканирования размер QR-кода на этикетке должен быть не менее 20x20 мм. В макете 1С 7.7 следите за тем, чтобы объект не растягивался пропорционально, иначе сканеры не смогут его распознать.
  3. Кодировка UTF-8 без BOM: Если вы используете внешние утилиты типа Zint, убедитесь, что передаваемый текст не содержит в начале метку BOM (Byte Order Mark), так как она может быть закодирована как часть данных и сделать ссылку нерабочей.

Таким образом, несмотря на почтенный возраст платформы 1С 7.7, задача генерации QR-кодов решается вполне успешно. Оптимальным выбором для локальной работы является Ocvita Barcode ActiveX с установленным параметром code_page = 1251, а для интеграции без регистрации библиотек — использование консольных утилит или внешних API.

← На главную