При интеграции различных конфигураций 1С часто используется механизм COM-соединения (через объект V83.ComConnector). Один из распространенных сценариев — когда база-приемник подключается к базе-источнику для выполнения тяжелых серверных процедур, таких как формирование печатных форм. Однако при попытке вывести штрихкод во внешней печатной форме (ВПФ) на стороне источника разработчики регулярно сталкиваются с ошибкой:
«Произошла исключительная ситуация: Ошибка при вызове метода контекста (ПодключитьВнешнююКомпоненту): Установлен безопасный режим. Выполнение операции запрещено».
В этой статье мы подробно разберем, почему возникает данная проблема, как устроена работа платформы в безопасном режиме при COM-подключении и как правильно настроить программный код для обхода этого ограничения.
Когда база-приемник обращается к базе-источнику по COM, все операции выполняются в контексте привилегированного или обычного пользователя на сервере источника. Если печатная форма в базе-источнике является встроенной (входит в состав метаданных конфигурации), ее код выполняется с правами текущего сеанса COM. Но если печатная форма является внешней (хранится в справочнике «Дополнительные отчеты и обработки» или «Внешние обработки»), платформа 1С по умолчанию подключает ее в безопасном режиме.
В безопасном режиме платформой накладываются жесткие ограничения:
ЗагрузитьВнешнююКомпоненту и ПодключитьВнешнююКомпоненту.Так как компонента печати штрихкодов (1CBarCode или современная КомпонентаПечатиШтрихкодов) является внешним программным модулем по отношению к платформе, ее инициализация в безопасном режиме прерывается ошибкой.
Дополнительную сложность накладывает механизм Защиты от опасных действий, появившийся в платформе 1С начиная с версии 8.3.9. При попытке программного открытия внешней обработки система пытается выдать предупреждение пользователю. Но в COM-сессии отсутствует интерактивный интерфейс, поэтому любая попытка открыть обработку без явного отключения этой защиты приводит к аварийному завершению сеанса.
Для того чтобы обойти данное ограничение, нам необходимо выполнить две задачи:
Рассмотрим подробнее реализацию этого механизма.
Перед тем как вносить изменения в код, убедитесь, что у пользователя, под которым осуществляется COM-подключение в базе-источнике, отключена защита от опасных действий на уровне СУБД/Конфигуратора. Для этого откройте список пользователей в конфигураторе базы-источника, найдите учетную запись для 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-соединение без каких-либо ошибок прав доступа.