Как изменить признак или комментарий в проведенном документе без прав на отражение в регламентированном учете?

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

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

Разберем подробнее, почему возникают подобные ошибки, почему использование привилегированного модуля не всегда помогает и какие архитектурные решения позволяют обойти это ограничение.

Выясним причину: почему не работает привилегированный режим?

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


Процедура УстановитьПризнакТОРГ12(Документ) Экспорт
    ДокОбъект = Документ.ПолучитьОбъект();
    ДокОбъект.ОбменДанными.Загрузка = Истина;
    
    Если Документ.Метаданные().Реквизиты.Найти("ФлагТОРГ12") <> Неопределено Тогда
        ДокОбъект.ФлагТОРГ12 = НЕ Документ.ФлагТОРГ12;
    КонецЕсли;
    
    Попытка
        ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    Исключение
        Сообщить("Не удалось установить признак ТОРГ12. " + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Однако при вызове метода Записать() платформа все равно выдает ошибку прав. Проанализируем, почему так происходит:

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

Способ 1. Хранение пользовательских данных в независимом регистре сведений

Наиболее корректным и безопасным архитектурным решением является вынос дополнительных реквизитов (флагов, признаков печатных форм, пользовательских заметок) из объекта документа в отдельный независимый Регистр сведений.

Рассмотрим порядок реализации этого способа:

  1. Создаем новый независимый регистр сведений, например ПризнакиТорг12 (или используем типовой механизм дополнительных сведений).
  2. В качестве измерения указываем реквизит Документ с типом ДокументСсылка.РеализацияТоваровУслуг.
  3. В качестве ресурса добавляем булево поле Установлен или текстовое поле Комментарий.
  4. Назначаем пользователю права на запись в этот регистр сведений.

Для установки или сброса значения в этом случае не требуется вызывать метод Записать() самого документа и изменять проведенный объект. Пример кода записи в регистр:


Процедура УстановитьПризнакВРегистре(СсылкаНаДокумент, ЗначениеФлага)
    МенеджерЗаписи = РегистрыСведений.ПризнакиТорг12.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Документ = СсылкаНаДокумент;
    МенеджерЗаписи.Прочитать();
    
    МенеджерЗаписи.Документ = СсылкаНаДокумент;
    МенеджерЗаписи.Установлен = ЗначениеФлага;
    МенеджерЗаписи.Записать(Истина);
КонецПроцедуры

Преимущества: Сам документ не перезаписывается, его проведения и движения по учету не затрагиваются, а проверка прав на отражение в регламентированном учете полностью отсутствует.

Способ 2. Настройка дополнительных прав пользователя в конфигурации

В конфигурации Управление производственным предприятием редакции 1.3 проверка разрешения на проведение и изменение документов регл. учета помимо ролей регулируется специальным регистром сведений дополнительных прав.

Посмотрим на порядок настройки прав без предоставления полных бухгалтерских ролей:

  1. Переходим в раздел меню Сервис — Пользователи — Настройка пользователей.
  2. Открываем форму настройки прав нужного пользователя (или группы пользователей).
  3. Заходим в папку Документы.
  4. Устанавливаем флаг напротив пункта Разрешить отражать в регламентированном учете.
  5. Сохраняем настройки.

Это дает возможность пользователю записывать и редактировать документы, имеющие признаки отражения в БУ и НУ, в рамках предоставленных ему основных прав доступа.

Способ 3. Выполнение записи через фоновое задание

Если проект требует обязательно изменить реквизит непосредственно внутри самого документа (например, реквизит Комментарий), а давать пользователю дополнительные права нельзя, операцию записи можно вынести в Фоновое задание.

Фоновое задание запускается в отдельном сеансе на сервере под именем указанного пользователя с административными правами или от имени системного пользователя, у которого присутствуют необходимые роли:


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

Внутри процедуры фонового задания выполняется получение объекта, изменение текстового поля и запись объекта без проведения. Так как фоновый сеанс обладает правами администратора, программная проверка ролей успешно завершится.

← На главную