Как исправить ошибку «Недостаточно прав для работы с таблицей "ПоставляемыеДополнительныеОтчетыИОбработки"» при запуске фонового задания в 1С:Fresh?

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

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

Проанализируем ситуацию: почему возникает ошибка доступа?

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

Разберем причину возникновения этого конфликта. В архитектуре 1С:Предприятие, работающей в модели сервиса (SaaS), данные разделены по областям (тенентам). Однако существуют системные справочники, которые являются неразделенными. К таким относится Справочник.ПоставляемыеДополнительныеОтчетыИОбработки. Доступ к нему на уровне СУБД имеют только администраторы всего сервиса, а не конкретной организации (области данных).

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

Разбор стека ошибки

Чтобы понять, в какой момент «падает» система, проанализируем типичный стек вызовов, характерный для этой проблемы:

{ОбщийМодуль.ОбщегоНазначения.Модуль(577)}: Выборка = Запрос.Выполнить().Выбрать();
{ОбщийМодуль.ДополнительныеОтчетыИОбработкиВМоделиСервиса.Модуль(1828)}: ПараметрыПубликацииПоставляемойОбработки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПоставляемаяОбработка, "Публикация, ПричинаОтключения, Версия");
{ОбщийМодуль.ДополнительныеОтчетыИОбработки.Модуль(335)}: ВнешнийОбъект = ОбъектВнешнейОбработки(ПараметрыКоманды.ДополнительнаяОбработкаСсылка);

Как мы видим, проблема локализована в методе ЗначенияРеквизитовОбъекта. Система пытается получить реквизиты объекта, на чтение которого у текущего сеанса фонового задания нет физических прав в модели сервиса.

Решение 1: Оптимизация передачи параметров в фоновое задание

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

Рассмотрим правильный алгоритм запуска:

  1. В модуле формы обработки соберите все необходимые данные для работы в структуру.
  2. Поместите необходимые файлы во временное хранилище.
  3. Вызывайте метод фонового задания, передавая только адрес временного хранилища и структуру параметров.
  4. Важно: Не вызывайте внутри фонового задания методы ДополнительныеОтчетыИОбработки.ВыполнитьКоманду(), так как именно они инициируют проверку прав.

Пример кода для запуска фоновой операции без обращения к системным справочникам:


&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
    ПараметрыВыполнения = Новый Структура;
    ПараметрыВыполнения.Вставить("ДанныеДляЗагрузки", ПолучитьДанныеДляФона());
    
    // Запускаем через ДлительныеОперации напрямую, минуя подсистему ДопОбработок
    РезультатФона = ДлительныеОперации.ВыполнитьВФоне("МойОбщийМодульСервер.ЗагрузитьДокументы", 
        ПараметрыВыполнения, 
        НаименованиеЗадания);
КонецПроцедуры

Решение 2: Проверка режима безопасной работы

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

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

Решение 3: Использование расширений вместо внешних обработок

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

Практические советы по отладке в облаке

Поскольку во Фреше невозможно использовать стандартную отладку через конфигуратор, разберем методы диагностики:

  1. Журнал регистрации: Щедро расставляйте вызовы ЗаписьЖурналаРегистрации(). Записывайте состояние переменных перед запуском фонового задания и в самом начале его выполнения.
  2. Проверка прав программно: Используйте метод ПравоДоступа("Чтение", Метаданные.Справочники.ПоставляемыеДополнительныеОтчетыИОбработки) внутри кода, чтобы точно определить, в какой момент «теряются» права.
  3. Локальная копия: Создайте локальную базу с включенным режимом разделения данных (как во Фреше). Это позволит воспроизвести ошибку на своем компьютере и отладить её стандартными средствами.

Подведем итог: ошибка вызвана тем, что системный код БСП в облаке пытается проверить «легитимность» фонового задания, обращаясь к таблице, доступной только глобальным администраторам. Чтобы обойти это ограничение, минимизируйте зависимость фонового кода от объектов метаданных обработки и передавайте все необходимые для работы данные через параметры фонового задания или временное хранилище.

← На главную