Почему не отображается штрихкод во внешней печатной форме 1С и как это исправить?

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

При разработке и внедрении внешних печатных форм (ВПФ) в среде «1С:Предприятие 8.3» программисты часто сталкиваются с ситуацией, когда штрихкод в макете отображается корректно при тестировании через «Файл — Открыть», но бесследно исчезает после регистрации обработки в справочнике «Дополнительные отчеты и обработки». Разберем подробно причины этого поведения, связанные с механизмами безопасности платформы, и рассмотрим способы решения данной проблемы.

Анализируем исходную ситуацию и код формирования штрихкода

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

Типичный программный код для формирования картинки штрихкода выглядит следующим образом:


ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьДанных.Рисунки.ШтрихкодТовара.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьДанных.Рисунки.ШтрихкодТовара.Высота / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", ШК);
ПараметрыШтрихкода.Вставить("ТипКода", 1); // EAN13
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 6);

// Получение картинки через менеджер оборудования
ОбластьДанных.Рисунки.ШтрихкодТовара.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

В этом фрагменте используется метод МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(). Этот метод обращается к внешней компоненте (обычно AddIn.Barcode), которая и выполняет отрисовку графических полос штрихкода. Именно здесь кроется корень проблемы.

Выясняем причину: Безопасный режим и внешние компоненты

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

Почему штрихкод исчезает в безопасном режиме?

  1. Генерация штрихкода требует использования внешней компоненты (DLL-файла).
  2. Платформа 1С воспринимает вызов внешней компоненты в безопасном режиме как нарушение политики безопасности.
  3. В результате попытка инициализации компоненты блокируется, метод ПолучитьКартинкуШтрихкода() возвращает пустое значение, и в макете вместо штрихкода мы видим пустое поле.

Интересен феномен, описанный автором: если один раз открыть обработку через Файл — Открыть и распечатать документ, то штрихкод начинает выводиться и через стандартный механизм ВПФ до момента перерегистрации. Это объясняется тем, что при прямом открытии файла система запрашивает у пользователя разрешение на использование «опасных действий». После подтверждения компонента загружается в кэш сеанса и становится доступной для использования другими модулями в рамках этого же сеанса работы.

Решение №1: Отключение безопасного режима (простой способ)

Самый быстрый способ восстановить работоспособность печати — это явное указание платформе на то, что обработку не нужно запускать в безопасном режиме. Для этого необходимо внести изменения в функцию СведенияОВнешнейОбработке() в модуле объекта обработки.

Найдем строку формирования параметров регистрации и установим свойство БезопасныйРежим в значение Ложь:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    // ... другие параметры ...
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
    Возврат ПараметрыРегистрации;
КонецФункции

После этого необходимо обновить обработку в справочнике «Дополнительные отчеты и обработки». При сохранении система может выдать предупреждение безопасности, с которым нужно согласиться.

Решение №2: Использование профилей безопасности (правильный способ для БСП)

В крупных корпоративных системах полное отключение безопасного режима может быть запрещено политикой ИТ-безопасности. В этом случае мы рекомендуем использовать механизм разрешений БСП. Вместо того чтобы полностью открывать доступ ко всем ресурсам, мы можем точечно разрешить использование конкретной внешней компоненты.

Рассмотрим, как прописать разрешение в функции СведенияОВнешнейОбработке():

  1. Создадим таблицу разрешений.
  2. Добавим в нее разрешение на использование внешней компоненты 1С:Печать штрихкодов.
  3. Передадим эту таблицу в параметры регистрации.

Пример кода добавления разрешений:


ТаблицаРазрешений = Новый Массив;
// Добавляем разрешение на работу с компонентой печати штрихкода
ТаблицаРазрешений.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты("AddIn.Barcode"));
ПараметрыРегистрации.Вставить("Разрешения", ТаблицаРазрешений);

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

Защита от опасных действий в платформе 8.3.10+

Начиная с версий платформы 8.3.9 и 8.3.10, появилось дополнительное окно подтверждения: «Защита от опасных действий». Даже если вы установили БезопасныйРежим = Ложь, пользователь может увидеть предупреждение при попытке системы подключить компоненту штрихкода.

Чтобы минимизировать количество таких окон, проанализируем следующие варианты:

Подведем итоги

Мы выяснили, что основной причиной «пропадания» штрихкода является блокировка внешней компоненты механизмом защиты платформы. Рассмотрим краткий чек-лист для исправления ситуации:

  1. Проверьте, установлена ли в системе компонента 1C:Печать штрихкодов (или используется встроенная в БСП).
  2. Убедитесь, что в модуле ВПФ в параметрах регистрации указано БезопасныйРежим = Ложь.
  3. Если используется серверный вызов (печать на сервере), убедитесь, что у пользователя, под которым запущен кластер 1С, есть права на доступ к временным папкам сервера.
  4. При использовании БСП 3.x и выше отдавайте предпочтение явной регистрации разрешений в структуре ТаблицаРазрешений.

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

← На главную