При разработке и внедрении внешних печатных форм (ВПФ) в среде «1С:Предприятие 8.3» программисты часто сталкиваются с ситуацией, когда штрихкод в макете отображается корректно при тестировании через «Файл — Открыть», но бесследно исчезает после регистрации обработки в справочнике «Дополнительные отчеты и обработки». Разберем подробно причины этого поведения, связанные с механизмами безопасности платформы, и рассмотрим способы решения данной проблемы.
Рассмотрим стандартный подход к выводу штрихкода, который использует автор темы. В современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), для генерации изображения штрихкода чаще всего применяется функционал подсистемы «Библиотека подключаемого оборудования».
Типичный программный код для формирования картинки штрихкода выглядит следующим образом:
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", Окр(ОбластьДанных.Рисунки.ШтрихкодТовара.Ширина / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Высота", Окр(ОбластьДанных.Рисунки.ШтрихкодТовара.Высота / КоличествоМиллиметровВПикселе));
ПараметрыШтрихкода.Вставить("Штрихкод", ШК);
ПараметрыШтрихкода.Вставить("ТипКода", 1); // EAN13
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Ложь);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 6);
// Получение картинки через менеджер оборудования
ОбластьДанных.Рисунки.ШтрихкодТовара.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
В этом фрагменте используется метод МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(). Этот метод обращается к внешней компоненте (обычно AddIn.Barcode), которая и выполняет отрисовку графических полос штрихкода. Именно здесь кроется корень проблемы.
Проанализируем поведение системы. Когда мы подключаем внешнюю обработку через стандартный интерфейс БСП, по умолчанию для нее устанавливается признак БезопасныйРежим = Истина. Это штатный механизм защиты, предназначенный для предотвращения выполнения потенциально опасного кода (обращение к файловой системе, реестру, загрузка бинарных файлов и т.д.).
Почему штрихкод исчезает в безопасном режиме?
ПолучитьКартинкуШтрихкода() возвращает пустое значение, и в макете вместо штрихкода мы видим пустое поле.Интересен феномен, описанный автором: если один раз открыть обработку через Файл — Открыть и распечатать документ, то штрихкод начинает выводиться и через стандартный механизм ВПФ до момента перерегистрации. Это объясняется тем, что при прямом открытии файла система запрашивает у пользователя разрешение на использование «опасных действий». После подтверждения компонента загружается в кэш сеанса и становится доступной для использования другими модулями в рамках этого же сеанса работы.
Самый быстрый способ восстановить работоспособность печати — это явное указание платформе на то, что обработку не нужно запускать в безопасном режиме. Для этого необходимо внести изменения в функцию СведенияОВнешнейОбработке() в модуле объекта обработки.
Найдем строку формирования параметров регистрации и установим свойство БезопасныйРежим в значение Ложь:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
// ... другие параметры ...
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
Возврат ПараметрыРегистрации;
КонецФункции
После этого необходимо обновить обработку в справочнике «Дополнительные отчеты и обработки». При сохранении система может выдать предупреждение безопасности, с которым нужно согласиться.
В крупных корпоративных системах полное отключение безопасного режима может быть запрещено политикой ИТ-безопасности. В этом случае мы рекомендуем использовать механизм разрешений БСП. Вместо того чтобы полностью открывать доступ ко всем ресурсам, мы можем точечно разрешить использование конкретной внешней компоненты.
Рассмотрим, как прописать разрешение в функции СведенияОВнешнейОбработке():
1С:Печать штрихкодов.Пример кода добавления разрешений:
ТаблицаРазрешений = Новый Массив;
// Добавляем разрешение на работу с компонентой печати штрихкода
ТаблицаРазрешений.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеВнешнейКомпоненты("AddIn.Barcode"));
ПараметрыРегистрации.Вставить("Разрешения", ТаблицаРазрешений);
При использовании такого подхода обработка остается в безопасном режиме, но получает легальный доступ к необходимому бинарному модулю. Обратите внимание, что для работы этого метода в базе должны быть корректно настроены профили безопасности.
Начиная с версий платформы 8.3.9 и 8.3.10, появилось дополнительное окно подтверждения: «Защита от опасных действий». Даже если вы установили БезопасныйРежим = Ложь, пользователь может увидеть предупреждение при попытке системы подключить компоненту штрихкода.
Чтобы минимизировать количество таких окон, проанализируем следующие варианты:
DisableDefinedDangerousActionsSupport для управления этим механизмом на уровне всей инсталляции 1С.Мы выяснили, что основной причиной «пропадания» штрихкода является блокировка внешней компоненты механизмом защиты платформы. Рассмотрим краткий чек-лист для исправления ситуации:
1C:Печать штрихкодов (или используется встроенная в БСП).БезопасныйРежим = Ложь.ТаблицаРазрешений.Применяя эти методы, вы обеспечите стабильную печать штрихкодов в любых внешних формах, сохраняя при этом необходимый уровень безопасности вашей информационной системы.