При автоматизации складского учета, интеграции с внешними системами или внедрении штрихкодирования документов часто возникает необходимость выводить уникальный идентификатор (GUID) документа прямо на его печатную форму. Это позволяет однозначно идентифицировать бумажный оригинал при его сканировании.
В этой статье мы подробно разберем, как решить эту задачу в конфигурациях на управляемых формах (например, в «1С:Бухгалтерии 3.0» на базе БСП 3.x), выясним причину возможных ошибок при переносе кода из других систем и рассмотрим по шагам наиболее оптимальные и безопасные способы реализации.
Часто разработчики пытаются скопировать программный код генерации штрихкода из тяжелых ERP-решений или «Управления торговлей 11». При этом они сталкиваются со следующей проблемой: эти конфигурации используют встроенную библиотеку подключаемого оборудования (БПО), функции которой отсутствуют в «1С:Бухгалтерии» или чистой БСП. Попытка вызвать методы вроде МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода() приводит к ошибкам компиляции на сервере.
Однако расстраиваться не стоит. В современных версиях БСП (3.x) присутствует собственный встроенный механизм для работы со штрихкодами, использующий Native-компоненту платформы 1С. Он позволяет генерировать качественные изображения штрихкодов (как линейных, так и двумерных QR-кодов) без привлечения сторонних библиотек и торгового оборудования.
Проанализируем ситуацию. Чтобы вывести GUID в макет печатной формы, нам нужно решить две задачи: преобразовать GUID в строку нужного формата и сформировать картинку штрихкода стандартными средствами БСП.
Для генерации изображения мы будем использовать общий модуль ГенерацияШтрихкода. Ниже представлен готовый пример кода, который решает эту задачу:
// Функция формирует картинку штрихкода на основании переданной ссылки на документ
Функция ПолучитьКартинкуШтрихкодаДляДокумента(СсылкаНаДокумент, ШиринаВысотаКартинки = Неопределено) Экспорт
// 1. Извлекаем GUID документа и очищаем его от дефисов для уменьшения плотности кода
ИдентификаторСтрокой = СтрЗаменить(Строка(СсылкаНаДокумент.УникальныйИдентификатор()), "-", "");
// 2. Инициализируем стандартную структуру параметров генерации штрихкода БСП
ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
// Задаем физические размеры картинки (в пикселях)
Если ШиринаВысотаКартинки <> Неопределено Тогда
ПараметрыШтрихкода.Ширина = ШиринаВысотаКартинки.Ширина;
ПараметрыШтрихкода.Высота = ШиринаВысотаКартинки.Высота;
Иначе
ПараметрыШтрихкода.Ширина = 300; // Значения по умолчанию
ПараметрыШтрихкода.Высота = 100;
КонецЕсли;
// 3. Выбираем тип штрихкода.
// Для текстово-цифрового GUID идеально подходит стандарт Code128 (ТипКода = 4).
ПараметрыШтрихкода.ТипКода = 4;
ПараметрыШтрихкода.Штрихкод = ИдентификаторСтрокой;
ПараметрыШтрихкода.ОтображатьТекст = Ложь; // Текст под кодом выводить не нужно, так как GUID слишком длинный
// 4. Генерируем изображение штрихкода
РезультатГенерации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
Если РезультатГенерации.Результат Тогда
Возврат РезультатГенерации.Картинка;
Иначе
ВызватьИсключение "Ошибка генерации штрихкода: " + РезультатГенерации.ОписаниеОшибки;
КонецЕсли;
КонецФункции
Обратите внимание: мы очистили GUID от дефисов при помощи функции СтрЗаменить(). Длина GUID составляет 36 символов с дефисами или 32 символа без них. Формат Code128 легко кодирует латинские буквы и цифры, поэтому такой штрихкод без проблем считается любым стандартным 1D-сканером.
Рассмотрим подробнее альтернативный вариант. Что делать, если на предприятии используются старые типы сканеров или требуется закодировать GUID исключительно в числовом формате (например, для имитации структуры EAN-13 или использования специализированных числовых шрифтов)?
В этом случае нам потребуется преобразовать шестнадцатеричное представление GUID в десятичное число. Посмотрим на пример функции, которая выполняет такое математическое преобразование:
Функция ПреобразоватьGUIDВДесятичноеЧисло(СсылкаНаДокумент) Экспорт
// Получаем hex-строку GUID без разделителей
HexСтрока = ВРег(СтрЗаменить(Строка(СсылкаНаДокумент.УникальныйИдентификатор()), "-", ""));
// Инициализируем переменные для расчета
Результат = 0;
Основание = 1;
ДлинаСтроки = СтрДлина(HexСтрока);
// Переводим из 16-ричной системы в 10-ричную
Для Позиция = 1 По ДлинаСтроки Цикл
Символ = Сред(HexСтрока, ДлинаСтроки - Позиция + 1, 1);
КодСимвола = КодСимвола(Символ);
Если КодСимвола >= 48 И КодСимвола <= 57 Тогда // Символы '0'-'9'
ЗначениеЦифры = КодСимвола - 48;
ИначеЕсли КодСимвола >= 65 И КодСимвола <= 70 Тогда // Символы 'A'-'F'
ЗначениеЦифры = КодСимвола - 55;
Иначе
Продолжить;
КонецЕсли;
Результат = Результат + ЗначениеЦифры * Основание;
Основание = Основание * 16;
КонецЦикла;
Возврат Формат(Результат, "ЧГ=0");
КонецФункции
Важное предупреждение: Полученное десятичное число будет очень длинным (до 39 знаков). Линейный штрихкод, содержащий такое количество символов, получается чрезвычайно плотным. Для его уверенного считывания потребуется высококачественная печать и дорогой лазерный сканер. Поэтому для GUID настоятельно рекомендуется использовать именно Code128 или переходить на двумерные QR-коды.
Если у вас на рабочих местах установлены современные 2D-сканеры (или терминалы сбора данных), отличным решением будет использование QR-кода вместо линейного штрихкода. QR-код гораздо устойчивее к повреждениям бумаги и легко считывается даже при сильном замятии или загрязнении этикетки.
Для вывода QR-кода достаточно изменить тип кодирования в параметрах БСП:
ПараметрыШтрихкода.ТипКода = 16; // 16 соответствует стандарту QR-кода в БСП
ПараметрыШтрихкода.Штрихкод = Строка(СсылкаНаДокумент.УникальныйИдентификатор());
В QR-код можно закодировать не просто очищенный GUID, а полноценную навигационную ссылку на документ в базе 1С. При сканировании такого кода мобильным телефоном или ТСД пользователь сможет мгновенно открыть документ в веб-клиенте.
Чтобы сохранить возможность автоматического обновления «1С:Бухгалтерии 3.0», мы не будем вносить изменения непосредственно в типовые макеты и модули документов. Вместо этого мы создадим Расширение конфигурации и воспользуемся возможностями переопределяемого модуля БСП.
Документ.ПеремещениеТоваров), добавьте его в расширение вместе с нужным макетом печатной формы.КартинкаШтрихкода.
УправлениеПечатьюПереопределяемый в процедуре ПриПечати. Добавьте данный модуль в расширение и пропишите обработку заполнения картинки штрихкода:
&После("ПриПечати")
Процедура Расш1_ПриПечати(ИмяВыводимыхОбластей, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
// Проверяем, что выводится именно интересующая нас печатная форма
Если ПечатнаяФорма.ИмяМакета = "Накладная" Тогда
ТабличныйДокумент = ПечатнаяФорма.ТабличныйДокумент;
// Обходим объекты печати (документы, которые отправлены на принтер)
Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
СсылкаНаДокумент = ОбъектПечати.Значение;
// Проверяем тип документа
Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
// Задаем параметры штрихкода
ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
ПараметрыШтрихкода.Ширина = 120;
ПараметрыШтрихкода.Высота = 40;
ПараметрыШтрихкода.ТипКода = 4; // Code128
ПараметрыШтрихкода.Штрихкод = СтрЗаменить(Строка(СсылкаНаДокумент.УникальныйИдентификатор()), "-", "");
ПараметрыШтрихкода.ОтображатьТекст = Ложь;
РезультатГенерации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
Если РезультатГенерации.Результат Тогда
// Ищем рисунок в сформированном табличном документе по имени
РисунокШтрихкода = ТабличныйДокумент.Рисунки.Найти("КартинкаШтрихкода");
Если РисунокШтрихкода <> Неопределено Тогда
РисунокШтрихкода.Картинка = РезультатГенерации.Картинка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецДля;
КонецЕсли;
КонецДля;
КонецПроцедуры
Использование этого метода гарантирует, что при обновлении типовой конфигурации ваши доработки не затрутся, а печать штрихкода продолжит работать стабильно, так как обработка происходит на уровне готового сформированного документа.
Таким образом, мы рассмотрели различные способы генерации штрихкодов на основе GUID документов и научились внедрять их в печатные формы наиболее технологичным и безопасным способом с сохранением поддержки конфигурации.