Как просто вывести GUID документа в виде штрихкода в печатной форме 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При автоматизации складского учета, интеграции с внешними системами или внедрении штрихкодирования документов часто возникает необходимость выводить уникальный идентификатор (GUID) документа прямо на его печатную форму. Это позволяет однозначно идентифицировать бумажный оригинал при его сканировании.

В этой статье мы подробно разберем, как решить эту задачу в конфигурациях на управляемых формах (например, в «1С:Бухгалтерии 3.0» на базе БСП 3.x), выясним причину возможных ошибок при переносе кода из других систем и рассмотрим по шагам наиболее оптимальные и безопасные способы реализации.

Выясним причину: почему готовые решения из УТ или ERP не всегда работают

Часто разработчики пытаются скопировать программный код генерации штрихкода из тяжелых ERP-решений или «Управления торговлей 11». При этом они сталкиваются со следующей проблемой: эти конфигурации используют встроенную библиотеку подключаемого оборудования (БПО), функции которой отсутствуют в «1С:Бухгалтерии» или чистой БСП. Попытка вызвать методы вроде МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода() приводит к ошибкам компиляции на сервере.

Однако расстраиваться не стоит. В современных версиях БСП (3.x) присутствует собственный встроенный механизм для работы со штрихкодами, использующий Native-компоненту платформы 1С. Он позволяет генерировать качественные изображения штрихкодов (как линейных, так и двумерных QR-кодов) без привлечения сторонних библиотек и торгового оборудования.

Способ 1. Использование встроенного механизма БСП «ГенерацияШтрихкода» (Рекомендуемый)

Проанализируем ситуацию. Чтобы вывести GUID в макет печатной формы, нам нужно решить две задачи: преобразовать GUID в строку нужного формата и сформировать картинку штрихкода стандартными средствами БСП.

Для генерации изображения мы будем использовать общий модуль ГенерацияШтрихкода. Ниже представлен готовый пример кода, который решает эту задачу:


// Функция формирует картинку штрихкода на основании переданной ссылки на документ
Функция ПолучитьКартинкуШтрихкодаДляДокумента(СсылкаНаДокумент, ШиринаВысотаКартинки = Неопределено) Экспорт

    // 1. Извлекаем GUID документа и очищаем его от дефисов для уменьшения плотности кода
    ИдентификаторСтрокой = СтрЗаменить(Строка(СсылкаНаДокумент.УникальныйИдентификатор()), "-", "");

    // 2. Инициализируем стандартную структуру параметров генерации штрихкода БСП
    ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
    
    // Задаем физические размеры картинки (в пикселях)
    Если ШиринаВысотаКартинки <> Неопределено Тогда
        ПараметрыШтрихкода.Ширина = ШиринаВысотаКартинки.Ширина;
        ПараметрыШтрихкода.Высота = ШиринаВысотаКартинки.Высота;
    Иначе
        ПараметрыШтрихкода.Ширина = 300; // Значения по умолчанию
        ПараметрыШтрихкода.Высота = 100;
    КонецЕсли;

    // 3. Выбираем тип штрихкода. 
    // Для текстово-цифрового GUID идеально подходит стандарт Code128 (ТипКода = 4).
    ПараметрыШтрихкода.ТипКода = 4; 
    ПараметрыШтрихкода.Штрихкод = ИдентификаторСтрокой;
    ПараметрыШтрихкода.ОтображатьТекст = Ложь; // Текст под кодом выводить не нужно, так как GUID слишком длинный

    // 4. Генерируем изображение штрихкода
    РезультатГенерации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);

    Если РезультатГенерации.Результат Тогда
        Возврат РезультатГенерации.Картинка;
    Иначе
        ВызватьИсключение "Ошибка генерации штрихкода: " + РезультатГенерации.ОписаниеОшибки;
    КонецЕсли;

КонецФункции

Обратите внимание: мы очистили GUID от дефисов при помощи функции СтрЗаменить(). Длина GUID составляет 36 символов с дефисами или 32 символа без них. Формат Code128 легко кодирует латинские буквы и цифры, поэтому такой штрихкод без проблем считается любым стандартным 1D-сканером.

Способ 2. Преобразование GUID в десятичное число (Для числовых штрихкодов вроде EAN13)

Рассмотрим подробнее альтернативный вариант. Что делать, если на предприятии используются старые типы сканеров или требуется закодировать 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-коды.

Способ 3. Использование двумерного QR-кода

Если у вас на рабочих местах установлены современные 2D-сканеры (или терминалы сбора данных), отличным решением будет использование QR-кода вместо линейного штрихкода. QR-код гораздо устойчивее к повреждениям бумаги и легко считывается даже при сильном замятии или загрязнении этикетки.

Для вывода QR-кода достаточно изменить тип кодирования в параметрах БСП:


ПараметрыШтрихкода.ТипКода = 16; // 16 соответствует стандарту QR-кода в БСП
ПараметрыШтрихкода.Штрихкод = Строка(СсылкаНаДокумент.УникальныйИдентификатор());

В QR-код можно закодировать не просто очищенный GUID, а полноценную навигационную ссылку на документ в базе 1С. При сканировании такого кода мобильным телефоном или ТСД пользователь сможет мгновенно открыть документ в веб-клиенте.

Разберем по шагам: Интеграция штрихкода без снятия конфигурации с поддержки

Чтобы сохранить возможность автоматического обновления «1С:Бухгалтерии 3.0», мы не будем вносить изменения непосредственно в типовые макеты и модули документов. Вместо этого мы создадим Расширение конфигурации и воспользуемся возможностями переопределяемого модуля БСП.

  1. Создайте расширение конфигурации. В режиме конфигуратора добавьте новое расширение, снимите флажки «Безопасный режим» и «Защита от опасных действий» (это необходимо для корректного подключения внешних компонент печати).
  2. Заимствуйте макет печатной формы. Найдите документ, печатную форму которого вы хотите доработать (например, Документ.ПеремещениеТоваров), добавьте его в расширение вместе с нужным макетом печатной формы.
  3. Разместите область штрихкода в макете. Откройте заимствованный макет. Добавьте в него новую секцию (область) или отредактируйте существующую (например, область «Заголовок»). Вставьте в выбранную область графический рисунок типа «Картинка» (через меню Таблица -> Рисунки -> Вставить рисунок, выбрав пустую картинку). Задайте этому рисунку уникальное имя в свойствах, например, КартинкаШтрихкода.
  4. Используйте механизм перехвата печати. В БСП все печатные формы проходят через общие механизмы формирования табличных документов. Мы можем перехватить печатную форму в общем модуле УправлениеПечатьюПереопределяемый в процедуре ПриПечати. Добавьте данный модуль в расширение и пропишите обработку заполнения картинки штрихкода:

&После("ПриПечати")
Процедура Расш1_ПриПечати(ИмяВыводимыхОбластей, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
    
    Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
        
        // Проверяем, что выводится именно интересующая нас печатная форма
        Если ПечатнаяФорма.ИмяМакета = "Накладная" Тогда
            
            ТабличныйДокумент = ПечатнаяФорма.ТабличныйДокумент;
            
            // Обходим объекты печати (документы, которые отправлены на принтер)
            Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
                
                СсылкаНаДокумент = ОбъектПечати.Значение;
                
                // Проверяем тип документа
                Если ТипЗнч(СсылкаНаДокумент) = Тип("ДокументСсылка.ПеремещениеТоваров") Тогда
                    
                    // Задаем параметры штрихкода
                    ПараметрыШтрихкода = ГенерацияШтрихкода.ПараметрыГенерацииШтрихкода();
                    ПараметрыШтрихкода.Ширина = 120;
                    ПараметрыШтрихкода.Высота = 40;
                    ПараметрыШтрихкода.ТипКода = 4; // Code128
                    ПараметрыШтрихкода.Штрихкод = СтрЗаменить(Строка(СсылкаНаДокумент.УникальныйИдентификатор()), "-", "");
                    ПараметрыШтрихкода.ОтображатьТекст = Ложь;
                    
                    РезультатГенерации = ГенерацияШтрихкода.ИзображениеШтрихкода(ПараметрыШтрихкода);
                    
                    Если РезультатГенерации.Результат Тогда
                        // Ищем рисунок в сформированном табличном документе по имени
                        РисунокШтрихкода = ТабличныйДокумент.Рисунки.Найти("КартинкаШтрихкода");
                        Если РисунокШтрихкода <> Неопределено Тогда
                            РисунокШтрихкода.Картинка = РезультатГенерации.Картинка;
                        КонецЕсли;
                    КонецЕсли;
                    
                КонецЕсли;
                
            КонецДля;
            
        КонецЕсли;
        
    КонецДля;

КонецПроцедуры

Использование этого метода гарантирует, что при обновлении типовой конфигурации ваши доработки не затрутся, а печать штрихкода продолжит работать стабильно, так как обработка происходит на уровне готового сформированного документа.

Таким образом, мы рассмотрели различные способы генерации штрихкодов на основе GUID документов и научились внедрять их в печатные формы наиболее технологичным и безопасным способом с сохранением поддержки конфигурации.

← На главную