При работе с платформой 1С:Предприятие 8.3 нам часто требуется адаптировать существующие или создавать новые обработки для решения специфических задач. Одним из таких сценариев является необходимость подключения встроенной обработки, например, «Универсальный обмен данными в формате XML», как внешней. Это может быть вызвано различными причинами: от стандартизации рабочих процессов до обхода ограничений конфигурации. Однако, как показывает практика, этот процесс не всегда бывает простым и может сталкиваться с препятствиями, особенно связанными с режимами работы платформы, такими как безопасный режим, и клиент-серверным взаимодействием.
В нашем случае, мы рассмотрим ситуацию, когда при попытке подключить «Универсальный обмен данными в формате XML» в базу «Бухгалтерия БП 2.1 Локализация для Беларуси» как внешнюю обработку, система выдает ошибку, несмотря на, казалось бы, корректный код подключения. Основная причина кроется в том, что значительная часть кода этой обработки предназначена для работы на сервере или в толстом клиенте, а попытка запустить её в тонком клиенте или в условиях безопасного режима вызывает конфликт.
Прежде чем перейти к решениям, давайте разберем ключевые концепции, которые влияют на работу внешних обработок в 1С:Предприятии.
Безопасный режим исполнения кода
В 1С:Предприятии существует механизм безопасного режима, который по умолчанию активируется для всех внешних отчетов и обработок. Его основная задача — обеспечить безопасность информационной базы, предотвращая выполнение потенциально опасного кода. В этом режиме действуют строгие ограничения, которые могут блокировать функциональность нашей обработки:
Если наша обработка пытается выполнить любое из этих запрещенных действий, мы получим ошибку, указывающую на нарушение безопасного режима.
Привилегированный режим работы
Для выполнения операций, которые требуют расширенных прав или обхода контроля доступа (например, на уровне записей - RLS), существует привилегированный режим. Он позволяет коду временно отключить проверку прав пользователя и RLS. Однако, как мы уже отметили, в безопасном режиме привилегированный режим игнорируется. Чтобы наша обработка могла использовать привилегированный режим, нам потребуется явно разрешить это действие.
Важно отметить, что привилегированный режим не будет установлен, если у пользователя активна защита от опасных действий или если в консоли кластера серверов для информационной базы выбран профиль безопасности без соответствующего флага.
Тонкий и толстый клиент
Архитектура 1С:Предприятия предусматривает различные типы клиентов, каждый из которых имеет свои особенности:
В нашем случае, поскольку обработка изначально содержала код для сервера или толстого клиента, это создает дополнительные сложности при её запуске в тонком клиенте, так как директивы компиляции (например, #Если ТонкийКлиент Тогда) могут приводить к тому, что часть функциональности просто не будет доступна.
Функция СведенияОВнешнейОбработке()
Ключевым элементом при регистрации любой внешней обработки является экспортная функция СведенияОВнешнейОбработке(), которая должна находиться в модуле объекта обработки. Эта функция возвращает структуру, содержащую все необходимые параметры для корректной регистрации и работы обработки в системе. Именно здесь мы можем управлять режимами безопасности и другими важными настройками.
Основные параметры, которые мы будем рассматривать:
Вид: Тип обработки (например, "ДополнительнаяОбработка").Наименование: Представление обработки для администратора и пользователя.Версия: Версия нашей обработки.БезопасныйРежим: Флаг, управляющий безопасным режимом. По умолчанию Истина.Разрешения: Массив дополнительных разрешений, которые позволяют выполнять определенные действия, запрещенные в безопасном режиме.Команды: Таблица команд, которые будут доступны пользователю для запуска обработки.Наш первоначальный запрос указывает, что система "не пропускает" обработку и "пишет ошибку". Это типичное поведение при конфликте с безопасным режимом. Автор подтверждает, что права доступа пользователя проверены и достаточны для подключения других самостоятельно написанных обработок, что исключает проблему с базовыми полномочиями. Это укрепляет нашу гипотезу о проблемах с безопасным режимом или специфическими требованиями встроенной обработки.
Также, автор упомянул, что через функции для технического специалиста обработка "открывается без проблем". Это важный индикатор, так как запуск через "Все функции" или "Функции для технического специалиста" часто осуществляется в более привилегированном или менее ограниченном режиме, что позволяет обойти некоторые ограничения, накладываемые при подключении как внешней дополнительной обработки.
Для более точной диагностики в подобных ситуациях всегда полезно использовать отладчик. Запуск 1С в режиме отладки с остановкой по ошибке позволяет нам точно определить место и причину возникновения проблемы в коде обработки. Это дает подробную информацию, которая критически важна для выбора правильного решения.
Если наша обработка требует выполнения операций, которые попадают под ограничения безопасного режима, но при этом мы хотим сохранить некоторую степень контроля и не отключать безопасный режим полностью, мы можем явно разрешить использование привилегированного режима для данной обработки. Это позволит коду выполняться с повышенными правами, обходя RLS и другие проверки.
Для этого нам необходимо добавить соответствующее разрешение в массив Разрешения, который возвращается функцией СведенияОВнешнейОбработке() в модуле объекта нашей обработки. Рассмотрим, как это можно сделать:
Функция СведенияОВнешнейОбработкеЭкспорт
РегистрационныеДанные = РегистрационныеДанные;
РегистрационныеДанные.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка;
// Добавим Разрешения
МассивРазрешений = РегистрационныеДанные.Разрешения;
// Пример добавления разрешения на создание COM-класса (если требуется)
// МассивРазрешений.Добавить(РаботаВБезопасномРежиме.РазрешениеНаСозданиеCOMКласса("Excel.Application", "{00024500-0000-0000-C000-000000000046}"));
// Добавляем разрешение на использование привилегированного режима
Разрешение = РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима;
МассивРазрешений.Добавить(Разрешение);
Возврат РегистрационныеДанные;
КонецФункции
В этом примере мы сначала получаем существующую структуру РегистрационныеДанные, затем обращаемся к её массиву Разрешения. Создаем новое разрешение с помощью РаботаВБезопасномРежиме.РазрешениеНаИспользованиеПривилегированногоРежима и добавляем его в массив. После этого, когда обработка будет загружена, она сможет использовать привилегированный режим для выполнения необходимых операций.
Важно помнить, что после внесения изменений в код обработки и её повторного подключения в базу данных, требуется перезапустить сеанс 1С для того, чтобы новые разрешения вступили в силу.
В некоторых случаях, особенно когда мы уверены в безопасности кода обработки или когда требуется максимальная гибкость, самым простым и эффективным решением может быть полное отключение безопасного режима для нашей внешней обработки. Это снимает все ограничения, накладываемые безопасным режимом, позволяя обработке работать так же, как если бы она была частью конфигурации или запускалась в толстом клиенте.
Для отключения безопасного режима нам нужно установить параметр БезопасныйРежим в значение Ложь в структуре, возвращаемой функцией СведенияОВнешнейОбработке(). Рассмотрим полный пример такой функции:
/////////////////////////////////////////////////////////////////////////////
// РЕГИСТРАЦИЯ ВНЕШНЕЙ ОБРАБОТКИ
Функция СведенияОВнешнейОбработкеЭкспорт
ИмяОтчета = ЭтотОбъект.Метаданные.Имя;
Синоним = ЭтотОбъект.Метаданные.Синоним + " " + ЭтотОбъект.Метаданные.Комментарий;
Синоним = ?(ЗначениеЗаполнено(Синоним), Синоним, ИмяОтчета);
РегистрационныеДанные = Новый Структура;
РегистрационныеДанные.Вставить("Вид", "ДополнительнаяОбработка");
РегистрационныеДанные.Вставить("Наименование", Синоним);
РегистрационныеДанные.Вставить("Версия", "1.0");
// Ключевое изменение: отключаем безопасный режим
РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);
РегистрационныеДанные.Вставить("Информация", "Обработка " + Синоним);
ТаблицаКоманд = ПолучитьТаблицуКоманд;
// Добавим команду в таблицу
ДобавитьКоманду(ТаблицаКоманд, Синоним, "1", "ОткрытиеФормы", Истина); // Последний параметр Модификатор можно не заполнять, если он не нужен
// Сохраним таблицу команд в параметры регистрации обработки
РегистрационныеДанные.Вставить("Команды", ТаблицаКоманд);
Возврат РегистрационныеДанные;
КонецФункции
// Вспомогательная функция для создания таблицы команд
Функция ПолучитьТаблицуКоманд
// Создадим пустую таблицу команд и колонки в ней
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); // Как будет выглядеть описание печатной формы для пользователя
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); // Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); // Тут задается, как должна вызваться команда обработки
// Возможные варианты:
// - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
// - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
// - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); // Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); // Для печатной формы должен содержать строку ПечатьMXL
Возврат Команды;
КонецФункции
// Вспомогательная процедура для добавления команды
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ОткрытиеФормы", ПоказыватьОповещение = Ложь, Модификатор = "") // Добавлен параметр Модификатор со значением по умолчанию
// Добавляем команду в таблицу команд по переданному описанию.
// Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
В этом примере мы видим, как в структуру РегистрационныеДанные добавляется строка РегистрационныеДанные.Вставить("БезопасныйРежим", Ложь);. Это недвусмысленно указывает системе на то, что данная внешняя обработка должна работать вне безопасного режима. Остальные параметры, такие как Вид, Наименование, Версия, и определение команд, настраиваются согласно стандартным требованиям к внешним обработкам.
Обратите внимание, что отключение безопасного режима — это мощный, но потенциально опасный шаг, так как он делает обработку полностью доверенной. Мы должны быть абсолютно уверены в источнике и содержимом кода, прежде чем применять это решение.
При работе с внешними обработками, особенно такими комплексными, как «Универсальный обмен данными в формате XML», необходимо учитывать несколько дополнительных моментов:
Совместимость версий
Убедитесь, что версия платформы и конфигурации 1С, в которую вы подключаете обработку, совместима с кодом самой обработки. Иногда достаточно не заполнять поле "Версия" в параметрах регистрации, чтобы избежать потенциальных конфликтов, если система жестко проверяет соответствие версий.
Адаптация кода под тип клиента
Если в коде обработки активно используются директивы компиляции, такие как #Если ТонкийКлиент Тогда, #Если ТолстыйКлиент Тогда, #Если Сервер Тогда, необходимо внимательно проанализировать, какой код выполняется в каждом режиме. Возможно, придется адаптировать серверные или толстоклиентские участки кода для корректной работы в тонком клиенте. Например, заменить операции с файловой системой на серверные вызовы, если обработка запускается через тонкий клиент.
Права пользователя и профили безопасности кластера
Даже если мы добавили разрешения или отключили безопасный режим, убедитесь, что у пользователя, подключающего и запускающего обработку, есть соответствующие права. Кроме того, на уровне кластера серверов 1С для информационной базы может быть настроен профиль безопасности, который запрещает использование привилегированного режима. В таких случаях изменения в коде обработки могут быть недостаточны, и потребуется настройка на уровне сервера.
Отладка как основной инструмент
При любых возникающих проблемах активно используйте отладчик 1С с остановкой по ошибке. Он предоставит точную информацию о месте возникновения проблемы, что значительно упростит её решение. Для «Универсального обмена данными в формате XML» часто присутствует хорошее логирование, и текст ошибки может указывать на конкретные объекты или свойства.
Перезапуск сеанса
После любых изменений в коде функции СведенияОВнешнейОбработке() или в конфигурации базы данных, всегда перезапускайте сеанс 1С. Это гарантирует, что система применит новые параметры и разрешения.
Подключение встроенной обработки «Универсальный обмен данными в формате XML» как внешней в 1С:Бухгалтерии, особенно в локализованных версиях, требует внимательного подхода к вопросам безопасности и совместимости. Как мы выяснили, основной причиной проблем чаще всего является включенный безопасный режим и особенности работы серверного/толстоклиентского кода в условиях тонкого клиента.
Мы рассмотрели два основных пути решения:
Выбор конкретного решения зависит от требований к безопасности и специфики выполняемых обработкой задач. Всегда проводите тщательное тестирование и используйте отладчик для выявления скрытых проблем. Применяя эти подходы, мы сможем успешно адаптировать и использовать сложные встроенные обработки как внешние, расширяя функциональность нашей системы 1С:Предприятие.