Как устранить ошибку безопасности в СКД при работе с COM-объектами во внешних отчетах БСП

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

При разработке сложных отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с необходимостью обогащения данных из внешних СУБД (например, MS SQL Server, PostgreSQL или Oracle). Традиционным и распространенным способом решения этой задачи является использование COM-соединения через библиотеку ActiveX Data Objects (ADO). Однако при попытке интегрировать такой отчет в справочник Дополнительные отчеты и обработки под управлением Библиотеки Стандартных Подсистем (БСП) разработчики неизбежно сталкиваются с жесткой системой безопасности платформы «1С:Предприятие 8».

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

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

Выясним причины такого поведения и рассмотрим детальные сценарии решения этой задачи.

---

Способ 1. Программное объявление разрешений в безопасном режиме БСП

Если политика безопасности вашей организации требует, чтобы все внешние обработки выполнялись строго в безопасном режиме (когда параметр БезопасныйРежим в структуре регистрации равен Истина), нам необходимо явно запросить у платформы права на создание конкретных COM-классов. Для этого используется специализированный механизм БСП.

Рассмотрим, как правильно настроить функцию СведенияОВнешнейОбработке в модуле объекта нашего внешнего отчета. Нам нужно не просто зарегистрировать отчет, но и сформировать массив разрешений на создание трех ключевых COM-объектов ADODB:

  1. ADODB.Connection — для инициализации подключения к внешней СУБД.
  2. ADODB.Command — для подготовки и выполнения SQL-запросов.
  3. ADODB.Recordset — для чтения и итерации по полученным наборам данных.

Для создания объектов разрешений БСП предоставляет функцию РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(). Этой функции требуются два обязательных параметра: идентификатор программы (ProgID) и уникальный идентификатор класса (CLSID). Выясним, как узнать эти значения.

Идентификаторы CLSID хранятся в системном реестре операционной системы Windows на сервере, где запущен рабочий процесс 1С. Их можно найти по следующим путям:

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


Функция СведенияОВнешнейОбработке() Экспорт

    // Инициализируем параметры регистрации с указанием версии БСП нашей конфигурации
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.2.53");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет;
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Наименование = ЭтотОбъект.Метаданные.Синоним;
    ПараметрыРегистрации.Информация = ЭтотОбъект.Метаданные.Синоним;
    
    // Включаем безопасный режим
    ПараметрыРегистрации.БезопасныйРежим = Истина;
    
    // Формируем массив запрашиваемых разрешений на внешние ресурсы
    МассивРазрешений = Новый Массив;
    
    // Разрешение на создание ADODB.Connection
    РазрешениеConnection = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(
        "ADODB.Connection", 
        "{00000514-0000-0010-8000-00AA006D2EA4}"
    );
    МассивРазрешений.Добавить(РазрешениеConnection);
    
    // Разрешение на создание ADODB.Command
    РазрешениеCommand = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(
        "ADODB.Command", 
        "{00000507-0000-0010-8000-00AA006D2EA4}"
    );
    МассивРазрешений.Добавить(РазрешениеCommand);
    
    // Разрешение на создание ADODB.Recordset
    РазрешениеRecordset = РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(
        "ADODB.Recordset", 
        "{00000535-0000-0010-8000-00AA006D2EA4}"
    );
    МассивРазрешений.Добавить(РазрешениеRecordset);
    
    ПараметрыРегистрации.Разрешения = МассивРазрешений;
    
    // Заполняем таблицу команд
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Открыть отчет " + ЭтотОбъект.Метаданные.Синоним;
    НоваяКоманда.Идентификатор = "ОткрытьОтчет";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    НоваяКоманда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;

КонецФункции

Важное примечание: Программное добавление разрешений в коде обработки будет успешно обработано платформой 1С только в том случае, если в кластере серверов 1С для данной информационной базы настроены и включены Профили безопасности. Если профили безопасности в вашей системе не используются, то при установке свойства БезопасныйРежим = Истина платформа проигнорирует указанный массив разрешений и жестко заблокирует создание COM-объектов. В таких ситуациях нам следует перейти ко второму способу решения.

---

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

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

Разберем этот процесс по шагам:

  1. Изменение параметров регистрации внешнего отчета:

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

    ПараметрыРегистрации.БезопасныйРежим = Ложь;

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

  2. Отключение «Защиты от опасных действий» для пользователя:

    Защита от опасных действий — это встроенный механизм платформы (появившийся начиная с версии 8.3.9), который блокирует программное выполнение потенциально опасных операций без интерактивного согласия пользователя. Поскольку регламентные задания и фоновые процессы на сервере выполняются в неинтерактивном режиме, защита заблокирует наш отчет.

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

    • Запустите базу данных в режиме Конфигуратор.
    • Откройте список пользователей через меню Администрирование — Пользователи.
    • Найдите пользователя, под которым запускается и формируется данный отчет (если отчет открывается обычным пользователем, выберите его; если отчет формируется регламентным заданием, найдите служебного пользователя, под которым настроен запуск заданий).
    • Откройте форму свойств пользователя и перейдите на вкладку Основные.
    • Снимите флажок «Защита от опасных действий».
    • Сохраните изменения конфигурации.
  3. Глобальное отключение защиты на сервере 1С (альтернативный вариант):

    Если в базе работает большое количество пользователей и администрировать права каждого из них нецелесообразно, администратор системы может отключить защиту глобально для всей базы или всего сервера 1С.

    Для этого на сервере, где установлен рабочий процесс 1С, найдите конфигурационный файл платформы conf.cfg. Обычно он располагается по пути C:\Program Files\1cv8\conf\conf.cfg (или в каталоге установки соответствующей версии платформы). Откройте его в текстовом редакторе и добавьте следующую строку:

    DisableUnsafeActionProtection=.*;

    Символ звездочки .* означает, что защита будет полностью отключена для всех информационных баз на данном сервере. Если вам требуется отключить защиту только для конкретной базы, укажите ее имя (или шаблон имени) вместо звездочки.

---

Способ 3. Переход на Внешние источники данных (Рекомендуемый современный подход)

Использование технологии COM (ActiveX / ADODB) в современной экосистеме «1С:Предприятие 8» постепенно переходит в разряд устаревших подходов (legacy). COM-соединения имеют множество архитектурных недостатков:

Рассмотрим, как сделать интеграцию правильно и надежно с помощью стандартного механизма платформы — Внешних источников данных.

Внешние источники данных позволяют подключить стороннюю SQL-базу данных (MS SQL, PostgreSQL, MySQL и др.) непосредственно к метаданным вашей конфигурации 1С. Это дает потрясающие преимущества для построения отчетов в СКД:

  1. Таблицы внешней базы данных становятся видны в конструкторе схемы компоновки данных наряду со стандартными таблицами (справочниками, документами, регистрами) вашей базы 1С. Вы можете связывать их левым или внутренним соединением напрямую в запросе СКД!
  2. Для работы этого механизма не требуется создавать COM-объекты в коде, а значит, отчет без проблем будет формироваться в безопасном режиме без каких-либо дополнительных настроек и предупреждений.
  3. Этот способ полностью кроссплатформенный — он будет стабильно работать как на Windows-сервере, так и на Linux (через ODBC-драйверы СУБД).

Проанализируем по шагам процесс настройки интеграции через Внешние источники данных:

  1. Добавление источника в конфигурации или расширении:

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

  2. Настройка подключения:

    В свойствах добавленного внешнего источника данных укажите строку подключения к вашей SQL-базе. Строка подключения выглядит стандартным образом для ODBC. Например, для MS SQL Server:

    Driver={SQL Server};Server=MyServerAddress;Database=MyDatabaseName;Uid=MyUsername;Pwd=MyPassword;
  3. Импорт таблиц:

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

  4. Использование в СКД:

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

Использование внешних источников данных является наиболее стабильным, безопасным и производительным решением, которое раз и навсегда избавит вас от необходимости борьбы со встроенными механизмами защиты платформы «1С:Предприятие 8».

← На главную