Как отключить безопасный режим при вызове внешней печатной формы через COM-соединение в 1С?

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

При интеграции различных конфигураций 1С часто используется механизм COM-соединения (через объект V83.ComConnector). Один из распространенных сценариев — когда база-приемник подключается к базе-источнику для выполнения тяжелых серверных процедур, таких как формирование печатных форм. Однако при попытке вывести штрихкод во внешней печатной форме (ВПФ) на стороне источника разработчики регулярно сталкиваются с ошибкой:

«Произошла исключительная ситуация: Ошибка при вызове метода контекста (ПодключитьВнешнююКомпоненту): Установлен безопасный режим. Выполнение операции запрещено».

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

Выясняем причину: почему блокируется подключение компоненты?

Когда база-приемник обращается к базе-источнику по COM, все операции выполняются в контексте привилегированного или обычного пользователя на сервере источника. Если печатная форма в базе-источнике является встроенной (входит в состав метаданных конфигурации), ее код выполняется с правами текущего сеанса COM. Но если печатная форма является внешней (хранится в справочнике «Дополнительные отчеты и обработки» или «Внешние обработки»), платформа 1С по умолчанию подключает ее в безопасном режиме.

В безопасном режиме платформой накладываются жесткие ограничения:

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

Дополнительную сложность накладывает механизм Защиты от опасных действий, появившийся в платформе 1С начиная с версии 8.3.9. При попытке программного открытия внешней обработки система пытается выдать предупреждение пользователю. Но в COM-сессии отсутствует интерактивный интерфейс, поэтому любая попытка открыть обработку без явного отключения этой защиты приводит к аварийному завершению сеанса.


Решение проблемы по шагам

Для того чтобы обойти данное ограничение, нам необходимо выполнить две задачи:

  1. Отключить безопасный режим при программном подключении обработки на стороне базы-источника.
  2. Подавить предупреждение защиты от опасных действий в неинтерактивном COM-сеансе.

Рассмотрим подробнее реализацию этого механизма.

Шаг 1. Настройка пользователя в базе-источнике

Перед тем как вносить изменения в код, убедитесь, что у пользователя, под которым осуществляется COM-подключение в базе-источнике, отключена защита от опасных действий на уровне СУБД/Конфигуратора. Для этого откройте список пользователей в конфигураторе базы-источника, найдите учетную запись для COM и снимите флажок «Защита от опасных действий».

Шаг 2. Программное отключение безопасного режима и защиты в COM-сессии

Для подключения внешней обработки используется метод менеджера ВнешниеОбработки.Подключить(). Посмотрим на сигнатуру этого метода:

ВнешниеОбработки.Подключить(<ПутьКФайлу>, <ИмяПодключения>, <БезопасныйРежим>, <БезопасныйРежимИлиОписаниеЗащиты>)

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

Также важно правильно инициализировать четвертый параметр — объект защиты. В контексте COM-соединения этот объект создается через фабрику COM-соединения.

Проанализируем пример кода на стороне базы-приемника, который извлекает двоичные данные печатной формы из источника, отключает безопасный режим и формирует печатный лист:


// 1. Инициализируем COM-соединение с базой-источником (например, УПП)
ПараметрыПодключения = "Srvr=""MyServer"";Ref=""UPP_Source"";Usr=""COM_User"";Pwd=""Password123"";";
COMConnector = Новый COMОбъект("V83.COMConnector");
Соединение = COMConnector.Connect(ПараметрыПодключения);

// 2. Находим внешнюю обработку в справочнике источника
СсылкаНаВПФ = Соединение.Справочники.ВнешниеОбработки.НайтиПоНаименованию("Печать штрихкодов");

Если Не СсылкаНаВПФ.Пустая() Тогда
    // Извлекаем двоичные данные файла обработки из ХранилищаЗначения базы-источника
    ДвоичныеДанныеОбработки = СсылкаНаВПФ.ХранилищеВнешнейОбработки.Получить();
    
    // Помещаем данные во временное хранилище внутри COM-сессии
    АдресВХранилище = Соединение.ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);
    
    // 3. Создаем описание защиты от опасных действий в контексте COM-сессии
    ОписаниеЗащиты = Соединение.NewObject("ОписаниеЗащитыОтОпасныхДействий");
    ОписаниеЗащиты.ПредупреждатьОбОпасныхДействиях = Ложь;
    
    // 4. Подключаем внешнюю обработку
    // Параметр 3 = Ложь (выключает Безопасный режим)
    // Параметр 4 = ОписаниеЗащиты (отключает предупреждения)
    ИмяОбработки = Соединение.ВнешниеОбработки.Подключить(АдресВХранилище, , Ложь, ОписаниеЗащиты);
    
    // 5. Создаем экземпляр обработки и вызываем процедуру печати
    ОбъектОбработки = Соединение.ВнешниеОбработки.Создать(ИмяОбработки);
    
    // Передаем ссылку на документ в базе-источнике
    СсылкаНаДокумент = Соединение.Документы.РеализацияТоваровУслуг.НайтиПоНомеру("УП000125", '20231231');
    ТабличныйДокумент = ОбъектОбработки.Печать(СсылкаНаДокумент);
    
    // Теперь сформированный ТабличныйДокумент со штрихкодом можно открыть или сохранить
КонецЕсли;

Важный нюанс: почему штрихкод может выводиться пустым?

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

Штрихкодирование в старых конфигурациях (таких как УПП 1.3) часто завязано на Active-X компоненту 1CBarCode.dll. Эта компонента является 32-разрядной (x86).

Если сервер 1С:Предприятия базы-источника работает под управлением 64-разрядной (x64) версии платформы, то при выполнении кода формирования печатной формы на сервере 32-битная библиотека физически не сможет загрузиться в адресное пространство 64-битного рабочего процесса сервера (rphost.exe).

Как решить проблему с разрядностью?

Для стабильной работы штрихкодов в любой среде (как x86, так и x64) необходимо отказаться от использования устаревшей компоненты 1CBarcode и перейти на современную Native-компоненту печати штрихкодов от фирмы 1С (КомпонентаПечатиШтрихкодов). Она входит в состав большинства современных БСП-конфигураций (например, БП 3.0, ERP, УНФ) в виде общего макета.

Внедрить ее в код вашей внешней печатной формы базы-источника можно следующим образом:


// Пример подключения Native-компоненты штрихкодирования в коде ВПФ
УстановитьПривилегированныйРежим(Истина); // Понадобится при работе без безопасного режима
РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "КартинкаШтрихкода", ТипВнешнейКомпоненты.Native);

Если РезультатПодключения Тогда
    КомпонентаШтрихкода = Новый("АддитивныйОбъект.КартинкаШтрихкода");
    // Настройка параметров штрихкода и получение картинки...
Иначе
    ВызватьИсключение "Не удалось подключить Native-компоненту печати штрихкодов на сервере!";
КонецЕсли;

Использование связки из отключения безопасного режима в методе ВнешниеОбработки.Подключить() и современной Native-компоненты гарантирует стабильную печать документов со штрихкодами через COM-соединение без каких-либо ошибок прав доступа.

← На главную