При разработке интеграций между различными информационными базами 1С:Предприятия программисты часто используют механизм COM-соединения с помощью объекта V83.COMConnector. Однако при попытке инициализировать этот объект в коде внешней обработки пользователи часто сталкиваются с неприятной ошибкой: «Установлен безопасный режим. Выполнение операции запрещено». Эта ошибка блокирует создание COM-объекта и останавливает процесс обмена данными.
В этой статье мы подробно разберем, почему возникает эта проблема, как функционирует безопасный режим в 1С, и по шагам настроим систему так, чтобы COM-соединение создавалось без сбоев и без нарушения общей безопасности системы. Для изучения базовых принципов взаимодействия баз подойдет руководство с примерами работы с COM-объектами в 1С.
Для начала проанализируем ситуацию и поймем логику работы платформы 1С:Предприятие. Безопасный режим — это специальный режим работы программного кода, при котором платформа накладывает жесткие ограничения на выполнение потенциально опасных операций. Это сделано для того, чтобы запущенный из внешнего источника код (например, скачанная из интернета обработка) не мог навредить операционной системе сервера, украсть данные или повредить файлы.
В безопасном режиме действуют следующие критические ограничения:
V83.COMConnector, работу с Excel, Word и т.д.).Именно поэтому попытка вызвать конструктор Новый COMОбъект("V83.COMConnector") внутри безопасного кода приводит к немедленной ошибке выполнения.
Часто разработчики пытаются запустить обработку через стандартное меню Файл -> Открыть. При таком интерактивном запуске платформа автоматически помещает код обработки в безопасный режим, и обойти его программными методами вроде УстановитьОтключениеБезопасногоРежима(Истина) напрямую из кода этой обработки невозможно. Если бы это было дозволено, то само существование безопасного режима не имело бы практического смысла.
Рассмотрим по шагам, как правильно зарегистрировать внешнюю обработку в информационной базе с отключением безопасного режима:
СведенияОВнешнейОбработке(), которая отвечает за параметры регистрации обработки в справочнике «Дополнительные отчеты и обработки».БезопасныйРежим и установим его в значение Ложь.Посмотрим на пример кода функции регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Загрузка данных через COM");
ПараметрыРегистрации.Вставить("Версия", "1.0");
// Отключаем безопасный режим для этой обработки
ПараметрыРегистрации.Вставить("БезопасныйРежим", Ложь);
// Создаем команду для запуска
ТаблицаКоманд = ПолучитьТаблицуКоманд();
ДобавитьКоманду(ТаблицаКоманд, "Запустить загрузку", "ЗапуститьЗагрузку", "ВызовСерверногоМетода", Истина);
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
После внесения изменений выполним следующие действия:
V83.COMConnector пройдет успешно, так как ограничения безопасного режима сняты.Полное отключение безопасного режима для внешней обработки (установка параметра в Ложь) решает проблему, но создает потенциальную уязвимость для системы. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) правильным и безопасным подходом считается использование Профилей безопасности. Для более глубокого понимания механизмов библиотеки можно использовать справочник по методам БСП с примерами кода.
Этот механизм позволяет оставить обработку в безопасном режиме, но выдать ей точечное персональное разрешение на создание конкретного COM-класса. Разберем, как это реализовать:
В функции СведенияОВнешнейОбработке() мы можем явно запросить разрешение на использование COM-соединения без полного отключения защиты. Для этого используется следующий алгоритм:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка");
ПараметрыРегистрации.Вставить("Наименование", "Безопасный импорт данных");
ПараметрыРегистрации.Вставить("Версия", "1.1");
// Оставляем безопасный режим включенным!
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
// Запрашиваем точечное разрешение на COM-соединение
Разрешения = Новый Массив;
// Идентификатор класса V83.COMConnector в реестре Windows (CLSID)
// По умолчанию можно использовать имя класса
РазрешениеCOM = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("V83.COMConnector", "");
Разрешения.Добавить(РазрешениеCOM);
ПараметрыРегистрации.Вставить("Разрешения", Разрешения);
Возврат ПараметрыРегистрации;
КонецФункции
При загрузке такой обработки в справочник «Дополнительные отчеты и обработки» система автоматически распознает запрос на специальное разрешение. Администратору базы данных будет предложено автоматически настроить профиль безопасности для этой обработки, разрешив только создание объекта V83.COMConnector, при этом все остальные защитные механизмы безопасного режима продолжат оберегать систему.
Даже если COM-объект успешно создается в коде базы-источника, при попытке авторизоваться и подключиться к базе-приемнику вы можете получить отказ в доступе. Выясним, какие права должны быть у учетных записей в обеих базах.
В базе-источнике (откуда подключаемся):
Пользователь, под которым запущена текущая сессия 1С, должен иметь права на выполнение кода внешней обработки. Если код выполняется в фоновом задании на сервере, у системной учетной записи службы сервера 1С должны быть физические права на чтение файлов платформы и запуск библиотек.
В базе-приемнике (куда подключаемся):
Пользователь, учетные данные которого (логин и пароль) передаются в строке подключения COM-соединения, должен обладать специфическим набором ролей в своей базе:
Если код инициализации COM-соединения выполняется на стороне сервера 1С (например, в регламентном задании), то вызовы переадресуются операционной системе от лица пользователя, под которым запущена служба сервера 1С (обычно это локальный пользователь USR1CV8). Это накладывает дополнительные требования к окружению ОС Windows:
regsvr32 "C:\Program Files\1cv8\8.3.XX.XXXX\bin\comcntr.dll"
(где 8.3.XX.XXXX — точный номер версии вашей платформы 1С).
dcomcnfg в строке выполнения).V83_COMConnector. Укажем тип активации: Серверное приложение.comcntr.dll из папки актуальной платформы 1С.Проанализировав все сложности настройки COM-соединений, важно упомянуть современные тенденции в разработке систем автоматизации. Фирма «1С» активно рекомендует отказываться от COM-соединений в пользу веб-технологий по следующим причинам:
comcntr.dll, что часто приводит к временной неработоспособности обменов в других базах на этом сервере.Рассмотрим использование HTTP-сервисов как наиболее быструю и современную альтернативу COM-соединениям. На стороне базы-приемника разворачивается простой HTTP-сервис, а база-источник отправляет обычные POST или GET запросы, передавая данные в формате JSON или XML. Такой обмен работает кратно быстрее, не требует настройки Windows-компонентов и абсолютно безопасен.