При разработке сложных отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с необходимостью обогащения данных из внешних СУБД (например, MS SQL Server, PostgreSQL или Oracle). Традиционным и распространенным способом решения этой задачи является использование COM-соединения через библиотеку ActiveX Data Objects (ADO). Однако при попытке интегрировать такой отчет в справочник Дополнительные отчеты и обработки под управлением Библиотеки Стандартных Подсистем (БСП) разработчики неизбежно сталкиваются с жесткой системой безопасности платформы «1С:Предприятие 8».
В этой статье мы подробно разберем, почему возникает блокировка создания COM-объектов, как работают механизмы безопасности платформы и БСП, а также рассмотрим три практических способа обхода и решения данной проблемы.
Проанализируем ситуацию: когда вы запускаете внешний отчет интерактивно через меню Файл — Открыть, платформа 1С исполняет код в контексте клиента. Если отчет пытается выполнить потенциально опасное действие (например, создать COM-объект), на экране появляется стандартное предупреждение безопасности. Пользователь может нажать кнопку «Да» (разрешить действие), и отчет продолжит работу. Но когда этот же отчет загружается в справочник дополнительных обработок БСП, его компоновка и выполнение происходят на сервере в фоновом задании. На сервере интерактивный диалог невозможен, поэтому платформа молча блокирует операцию и возвращает ошибку, не давая отчету сформироваться.
Выясним причины такого поведения и рассмотрим детальные сценарии решения этой задачи.
---
Если политика безопасности вашей организации требует, чтобы все внешние обработки выполнялись строго в безопасном режиме (когда параметр БезопасныйРежим в структуре регистрации равен Истина), нам необходимо явно запросить у платформы права на создание конкретных COM-классов. Для этого используется специализированный механизм БСП.
Рассмотрим, как правильно настроить функцию СведенияОВнешнейОбработке в модуле объекта нашего внешнего отчета. Нам нужно не просто зарегистрировать отчет, но и сформировать массив разрешений на создание трех ключевых COM-объектов ADODB:
ADODB.Connection — для инициализации подключения к внешней СУБД.ADODB.Command — для подготовки и выполнения SQL-запросов.ADODB.Recordset — для чтения и итерации по полученным наборам данных.Для создания объектов разрешений БСП предоставляет функцию РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса(). Этой функции требуются два обязательных параметра: идентификатор программы (ProgID) и уникальный идентификатор класса (CLSID). Выясним, как узнать эти значения.
Идентификаторы CLSID хранятся в системном реестре операционной системы Windows на сервере, где запущен рабочий процесс 1С. Их можно найти по следующим путям:
ADODB.Connection: ветка реестра HKEY_LOCAL_MACHINE\Software\CLASSES\ADODB.Connection\CLSID (значение по умолчанию: {00000514-0000-0010-8000-00AA006D2EA4}).ADODB.Command: ветка реестра HKEY_LOCAL_MACHINE\Software\CLASSES\ADODB.Command\CLSID (значение по умолчанию: {00000507-0000-0010-8000-00AA006D2EA4}).Напишем правильный шаблон функции СведенияОВнешнейОбработке. Обратите внимание, что мы обязательно должны инициализировать структуру параметров через стандартный метод БСП ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(), передав туда версию БСП конфигурации, чтобы система корректно обработала свойства структуры.
Функция СведенияОВнешнейОбработке() Экспорт
// Инициализируем параметры регистрации с указанием версии БСП нашей конфигурации
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("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-объектов. В таких ситуациях нам следует перейти ко второму способу решения.
---
Если в вашей системе не используются профили безопасности кластера 1С, наиболее простым и быстрым способом обхода ограничений является перевод внешнего отчета в небезопасный режим работы с одновременным отключением защиты от опасных действий для учетной записи, под которой запускается этот отчет.
Разберем этот процесс по шагам:
В модуле объекта нашего отчета в функции СведенияОВнешнейОбработке необходимо явно отключить безопасный режим, установив флаг в значение Ложь:
ПараметрыРегистрации.БезопасныйРежим = Ложь;
После изменения кода обновите файл внешнего отчета в справочнике дополнительных обработок в режиме 1С:Предприятие. При обновлении программа может вывести предупреждение о том, что отчет запрашивает небезопасный режим работы — подтвердите действие и разрешите публикацию.
Защита от опасных действий — это встроенный механизм платформы (появившийся начиная с версии 8.3.9), который блокирует программное выполнение потенциально опасных операций без интерактивного согласия пользователя. Поскольку регламентные задания и фоновые процессы на сервере выполняются в неинтерактивном режиме, защита заблокирует наш отчет.
Чтобы отключить ее для конкретного пользователя, выполните следующие действия:
Если в базе работает большое количество пользователей и администрировать права каждого из них нецелесообразно, администратор системы может отключить защиту глобально для всей базы или всего сервера 1С.
Для этого на сервере, где установлен рабочий процесс 1С, найдите конфигурационный файл платформы conf.cfg. Обычно он располагается по пути C:\Program Files\1cv8\conf\conf.cfg (или в каталоге установки соответствующей версии платформы). Откройте его в текстовом редакторе и добавьте следующую строку:
DisableUnsafeActionProtection=.*;
Символ звездочки .* означает, что защита будет полностью отключена для всех информационных баз на данном сервере. Если вам требуется отключить защиту только для конкретной базы, укажите ее имя (или шаблон имени) вместо звездочки.
---
Использование технологии COM (ActiveX / ADODB) в современной экосистеме «1С:Предприятие 8» постепенно переходит в разряд устаревших подходов (legacy). COM-соединения имеют множество архитектурных недостатков:
Рассмотрим, как сделать интеграцию правильно и надежно с помощью стандартного механизма платформы — Внешних источников данных.
Внешние источники данных позволяют подключить стороннюю SQL-базу данных (MS SQL, PostgreSQL, MySQL и др.) непосредственно к метаданным вашей конфигурации 1С. Это дает потрясающие преимущества для построения отчетов в СКД:
Проанализируем по шагам процесс настройки интеграции через Внешние источники данных:
Чтобы не снимать типовую конфигурацию с поддержки, создайте новое Расширение конфигурации. В дереве метаданных расширения найдите ветку Внешние источники данных, нажмите правую кнопку мыши и выберите команду Добавить.
В свойствах добавленного внешнего источника данных укажите строку подключения к вашей SQL-базе. Строка подключения выглядит стандартным образом для ODBC. Например, для MS SQL Server:
Driver={SQL Server};Server=MyServerAddress;Database=MyDatabaseName;Uid=MyUsername;Pwd=MyPassword;
Дважды кликните по внешнему источнику данных, перейдите на вкладку Таблицы и нажмите кнопку Конструктор таблиц (или кнопку импорта). Платформа подключится к внешней СУБД и отобразит список доступных таблиц и представлений. Выберите необходимые таблицы, которые вы планируете использовать в отчете, и перенесите их в проект. Платформа автоматически создаст описание полей и типов данных.
Теперь откройте схему компоновки вашего отчета. В конструкторе запроса перейдите к выбору таблиц. Вы увидите новую ветку Внешние источники данных. Просто перетащите нужную таблицу в список выбранных таблиц, настройте связи с вашими стандартными данными 1С и получайте готовый результат без написания громоздкого кода инициализации ADO-соединений на встроенном языке.
Использование внешних источников данных является наиболее стабильным, безопасным и производительным решением, которое раз и навсегда избавит вас от необходимости борьбы со встроенными механизмами защиты платформы «1С:Предприятие 8».