Почему не удается программно записать документ реализации в УТ 11 без полных прав и как это исправить?

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

При попытке программно изменить и записать документ РеализацияТоваровУслуг из внешней обработки под пользователем с ограниченными правами разработчики 1С часто сталкиваются с ошибкой доступа к служебному регистру обменов. Давайте подробно проанализируем причины этой проблемы и разберем проверенные способы ее решения.

Суть проблемы и причины возникновения ошибки

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

Поскольку права на изменение и чтение этого регистра по умолчанию есть только у роли ПолныеПрава или специализированных ролей обмена данными, возникает исключение вида:

Недостаточно прав для работы с таблицей "РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах"

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

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

Решение 1. Перенос кода записи в привилегированный общий модуль

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

Рассмотрим пошаговый алгоритм реализации этого решения:

  1. Создадим новый общий модуль (или добавим его в расширение) и укажем в его свойствах флаг Привилегированный, а также настройки Сервер и Вызов сервера.
  2. Разместим в нем экспортную процедуру для записи документа:
    
    // Модуль: МойРасширение_ПривилегированныйВызов
    Процедура ЗаписатьРеализациюПривилегированно(СсылкаНаДокумент, ЗначениеДопРеквизита) Экспорт
    
        ДокОб = СсылкаНаДокумент.ПолучитьОбъект();
        
        // Установка требуемого значения реквизита или дополнительного свойства
        // ДокОб.Реквизит = ЗначениеДопРеквизита;
        
        // Запись документа выполняется в привилегированном контексте,
        // что предотвращает ошибку прав доступа к регистру обменов
        ДокОб.Записать(РежимЗаписиДокумента.Запись);
    
    КонецПроцедуры
    
  3. Из внешней обработки вызовем эту процедуру, передав ссылку на документ:
    
    &НаСервере
    Процедура ОдобритьВыделенныеНаСервере()
    
        Для Каждого СтрокаТЧ Из Реализации Цикл
            Попытка
                МойРасширение_ПривилегированныйВызов.ЗаписатьРеализациюПривилегированно(СтрокаТЧ.Документ, НовоеЗначение);
            Исключение
                Сообщить("Не удалось обработать документ: " + ОписаниеОшибки());
            КонецПопытки;
        КонецЦикла;
    
    КонецПроцедуры
    

Решение 2. Назначение роли для выполнения синхронизации данных

Если нет возможности вносить изменения в конфигурацию или создавать расширение, проанализируем вариант с настройкой прав пользователя в режиме «1С:Предприятие».

В типовых конфигурациях (включая Управление торговлей 11) права на служебные таблицы регистрации изменений при обменах завязаны не только на полные права, но и на специализированную роль ВыполнениеСинхронизацииДанных (или НастройкаСинхронизацииДанных).

  1. Перейдем в раздел Администрирование — Настройки пользователей и прав — Группы доступа.
  2. Найдем профиль групп доступа, назначенный данному пользователю, либо создадим новый профиль.
  3. Включим в состав разрешенных ролей роль Выполнение синхронизации данных.
  4. Запишем изменения. После обновления прав у пользователя появится доступ к таблице РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах, и программная запись документа из внешней обработки пройдет успешно.

Решение 3. Отключение автозаполнения получателей обмена

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

Разберем пример кода для внешней обработки:


&НаСервере
Процедура ЗаписатьДокументБезРегистрацииВОбменах(СсылкаНаДокумент)

    ДокОб = СсылкаНаДокумент.ПолучитьОбъект();
    
    // Отключаем автоматическое определение получателей обмена
    ДокОб.ОбменДанными.Получатели.АвтоЗаполнение = Ложь;
    
    // Очищаем список получателей при необходимости
    ДокОб.ОбменДанными.Получатели.Очистить();
    
    Попытка
        ДокОб.Записать(РежимЗаписиДокумента.Запись);
    Исключение
        Сообщить("Ошибка при записи документа " + Строка(СсылкаНаДокумент) + ": " + ОписаниеОшибки());
    КонецПопытки;

КонецПроцедуры

Подводные камни использования флага ОбменДанными.Загрузка

Часто разработчики пытаются обойти проверки прав с помощью установки флага ДокОб.ОбменДанными.Загрузка = Истина. Однако проанализируем, почему этот способ может не сработать в данном случае:

Флаг Загрузка = Истина отключает проведение бизнес-логики и большинства проверок при записи, но в некоторых релизах БСП подписки на события синхронизации данных (в частности, модуль ОбменДаннымиСобытия) могут срабатывать до проверки этого флага или переопределять поведение при наличии дополнительных реквизитов. Кроме того, использование данного флага отключает важные подписки и проверки целостности данных, поэтому его применение должно быть строго обоснованным.

Итоги

Мы рассмотрели основные причины ошибки доступа к регистру обменов при программной записи документов в УТ 11 под пользователем без полных прав. Наиболее безопасным и рекомендуемым способом решения является использование привилегированного общего модуля в расширении конфигурации или добавление пользователю роли Выполнение синхронизации данных.

← На главную