В отличие от современных версий платформы 1С 8.3, где генерация штрихкодов и QR-кодов встроена в платформу или реализуется через стандартные библиотеки, в «старой доброй» 1С 7.7 эта задача требует творческого подхода и использования внешних инструментов. Рассмотрим подробно несколько проверенных способов реализации этой задачи: от использования специализированных ActiveX-компонент до работы с консольными утилитами.
Одним из наиболее стабильных решений для 1С 7.7 является использование компоненты Ocvita Barcode ActiveX (основанной на библиотеке Zint). Главное преимущество этого метода заключается в том, что QR-код становится объектом макета, которым можно управлять программно.
Шаг 1: Регистрация компоненты в операционной системе
Прежде чем приступать к написанию кода, необходимо зарегистрировать файл OcvitaBarcode.ocx в системе. Разберем особенности этого процесса для разных версий Windows:
OcvitaBarcode.ocx в системную папку (например, C:\Windows\System32 или в каталог базы данных).regsvr32 OcvitaBarcode.ocx.regsvr32 из папки SysWOW64: c:\windows\syswow64\regsvr32.exe OcvitaBarcode.ocx.Шаг 2: Вставка объекта в таблицу (макет)
В 1С 7.7 часто возникает проблема: компонента не отображается в списке доступных объектов при выборе меню «Таблица — Вставить рисунок — Объект». Проанализируем обходной путь:
QRКод.Шаг 3: Программное управление
Теперь рассмотрим, как передать данные в этот объект при формировании печатной формы. Выясним причину, по которой иногда не отображается текст: важно правильно установить кодовую страницу для кириллицы.
Процедура ПечатьQR()
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица"); // Имя вашего макета
Таб.ВывестиСекцию("Шапка");
// Получаем объект из секции макета
Попытка
ОбъектQR = Таб.ТекущийОбъект;
// Устанавливаем кодировку 1251 для корректной работы с русским языком
ОбъектQR.code_page = 1251;
// Задаем тип штрихкода (для QR обычно используется индекс или константа компоненты)
ОбъектQR.symbology = 58; // 58 - это QR Code в библиотеке Zint
// Передаем данные
ОбъектQR.barcode = "Название: " + СокрЛП(ТекстДляКодирования);
Исключение
Сообщить("Ошибка обращения к компоненте QR-кода!");
КонецПопытки;
Таб.ТолькоПросмотр(1);
Таб.Показать();
КонецПроцедуры
Если вариант с 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С, используя метод ТекущийОбъект.Загрузить(ВремФайлКартинки).
Если компьютер имеет доступ к интернету, мы можем существенно упростить задачу, переложив генерацию на веб-сервис. Проанализируем этот современный подход.
Мы можем сформировать 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();
Возврат ИмяФайла;
КонецЕсли;
Возврат "";
КонецФункции
При массовой печати (например, ценников для 2000 товаров) могут возникнуть технические сложности. Разберем основные моменты:
C++ Runtime Error. Чтобы избежать этого, рекомендуется периодически закрывать и открывать таблицу или использовать метод генерации через временные файлы картинок, которые менее требовательны к памяти при выводе в Moxel.Таким образом, несмотря на почтенный возраст платформы 1С 7.7, задача генерации QR-кодов решается вполне успешно. Оптимальным выбором для локальной работы является Ocvita Barcode ActiveX с установленным параметром code_page = 1251, а для интеграции без регистрации библиотек — использование консольных утилит или внешних API.