При разработке внешних обработок для работы в облачном сервисе 1С:Fresh разработчики часто сталкиваются со специфическими ограничениями безопасности. Одной из самых коварных проблем является ошибка доступа к справочнику Справочник.ПоставляемыеДополнительныеОтчетыИОбработки при попытке выполнить длительную операцию в фоновом задании. Рассмотрим подробно, почему это происходит и как правильно настроить код, чтобы избежать этой блокировки.
Ситуация обычно выглядит следующим образом: внешняя обработка успешно загружена в информационную базу через раздел «Дополнительные отчеты и обработки». Форма обработки открывается без проблем, однако при нажатии на кнопку запуска загрузки данных (или любой другой длительной операции) система выдает критическую ошибку прав доступа. Важно отметить, что ошибка возникает не в пользовательском коде напрямую, а глубоко внутри механизмов Библиотеки стандартных подсистем (БСП).
Разберем причину возникновения этого конфликта. В архитектуре 1С:Предприятие, работающей в модели сервиса (SaaS), данные разделены по областям (тенентам). Однако существуют системные справочники, которые являются неразделенными. К таким относится Справочник.ПоставляемыеДополнительныеОтчетыИОбработки. Доступ к нему на уровне СУБД имеют только администраторы всего сервиса, а не конкретной организации (области данных).
Когда мы запускаем фоновое задание через модуль ДлительныеОперации, система инициализирует новый сеанс. В процессе инициализации программные механизмы БСП пытаются определить параметры запускаемой обработки, проверяя её публикацию и версию. Метод ДополнительныеОтчетыИОбработкиВМоделиСервиса.ПроверитьВозможностьВыполнения() ошибочно инициирует обращение к таблице поставляемых обработок, даже если ваша обработка является «дополнительной». Поскольку у фонового задания в облаке права жестко ограничены профилем безопасности, попытка чтения «чужого» системного справочника приводит к немедленному прерыванию операции.
Чтобы понять, в какой момент «падает» система, проанализируем типичный стек вызовов, характерный для этой проблемы:
{ОбщийМодуль.ОбщегоНазначения.Модуль(577)}: Выборка = Запрос.Выполнить().Выбрать();
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиВМоделиСервиса.Модуль(1828)}: ПараметрыПубликацииПоставляемойОбработки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПоставляемаяОбработка, "Публикация, ПричинаОтключения, Версия");
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(335)}: ВнешнийОбъект = ОбъектВнешнейОбработки(ПараметрыКоманды.ДополнительнаяОбработкаСсылка);
Как мы видим, проблема локализована в методе ЗначенияРеквизитовОбъекта. Система пытается получить реквизиты объекта, на чтение которого у текущего сеанса фонового задания нет физических прав в модели сервиса.
Самый эффективный способ решить проблему — исключить обращение фонового задания к метаданным самой обработки. Выясним, как это сделать. Вместо того чтобы передавать в фоновое задание ссылку на внешнюю обработку и позволять БСП самой инициализировать объект, мы должны подготовить все данные заранее.
Рассмотрим правильный алгоритм запуска:
ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(), так как именно они инициируют проверку прав.Пример кода для запуска фоновой операции без обращения к системным справочникам:
&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
ПараметрыВыполнения = Новый Структура;
ПараметрыВыполнения.Вставить("ДанныеДляЗагрузки", ПолучитьДанныеДляФона());
// Запускаем через ДлительныеОперации напрямую, минуя подсистему ДопОбработок
РезультатФона = ДлительныеОперации.ВыполнитьВФоне("МойОбщийМодульСервер.ЗагрузитьДокументы",
ПараметрыВыполнения,
НаименованиеЗадания);
КонецПроцедуры
Проанализируем настройки безопасности. В 1С:Fresh все внешние обработки работают в безопасном режиме. Если в функции СведенияОВнешнейОбработке() вы указали использование профиля безопасности, убедитесь, что все необходимые разрешения добавлены.
Однако часто ошибка возникает из-за того, что разработчик пытается программно отключить безопасный режим внутри фонового задания или использует методы, которые требуют привилегированного режима. В облаке 1С:Fresh это запрещено. Выясним основные правила:
БезопасныйРежим в функции СведенияОВнешнейОбработке должен иметь значение Истина.Разрешения в той же функции СведенияОВнешнейОбработке.УстановитьПривилегированныйРежим(Истина) только там, где это жизненно необходимо для работы с данными вашей области, но помните, что это не даст прав на чтение неразделенных справочников типа ПоставляемыеДополнительныеОтчетыИОбработки.Если специфика вашей задачи требует глубокой интеграции с механизмами БСП и стандартные способы обхода не помогают, рассмотрим вариант переноса логики в расширение конфигурации. В 1С:Fresh расширения проходят аудит (как и обработки), но они имеют более стабильный доступ к контексту выполнения. В расширении вы можете создать собственный общий модуль, который будет выполнять загрузку без посредничества справочника дополнительных обработок.
Поскольку во Фреше невозможно использовать стандартную отладку через конфигуратор, разберем методы диагностики:
ЗаписьЖурналаРегистрации(). Записывайте состояние переменных перед запуском фонового задания и в самом начале его выполнения.ПравоДоступа("Чтение", Метаданные.Справочники.ПоставляемыеДополнительныеОтчетыИОбработки) внутри кода, чтобы точно определить, в какой момент «теряются» права.Подведем итог: ошибка вызвана тем, что системный код БСП в облаке пытается проверить «легитимность» фонового задания, обращаясь к таблице, доступной только глобальным администраторам. Чтобы обойти это ограничение, минимизируйте зависимость фонового кода от объектов метаданных обработки и передавайте все необходимые для работы данные через параметры фонового задания или временное хранилище.