При работе в конфигурациях на платформе 1С:Предприятие (например, Управление производственным предприятием) часто возникает ситуация, когда пользователю необходимо изменить текстовый комментарий или пользовательский флаг в документе, который уже проведен по бухгалтерскому и налоговому учету. Если у пользователя отсутствует специальная роль (например, ОтражениеВРегламентированномУчете), система блокирует попытку записи с сообщением: «Недостаточно прав для отражения в регламентированном учете. Изменения не могут быть записаны...».
Разберем подробнее, почему возникают подобные ошибки, почему использование привилегированного модуля не всегда помогает и какие архитектурные решения позволяют обойти это ограничение.
Начинающие разработчики часто пытаются решить задачу выносом кода записи документа в общий модуль с установленным свойством Привилегированный или вызовом функции УстановитьПривилегированныйРежим(Истина), а также установкой флага ОбменДанными.Загрузка = Истина:
Процедура УстановитьПризнакТОРГ12(Документ) Экспорт
ДокОбъект = Документ.ПолучитьОбъект();
ДокОбъект.ОбменДанными.Загрузка = Истина;
Если Документ.Метаданные().Реквизиты.Найти("ФлагТОРГ12") <> Неопределено Тогда
ДокОбъект.ФлагТОРГ12 = НЕ Документ.ФлагТОРГ12;
КонецЕсли;
Попытка
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Исключение
Сообщить("Не удалось установить признак ТОРГ12. " + Символы.ПС + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Однако при вызове метода Записать() платформа все равно выдает ошибку прав. Проанализируем, почему так происходит:
УстановитьПривилегированныйРежим() отключает платформенную проверку прав на таблицы базы данных и ограничения RLS (Record Level Security). Однако он не отменяет программные проверки в коде конфигурации (подписки на события, вызовы функции РольДоступна() или анализы настроек текущего пользователя).
ПередЗаписьюДокумента или ПриЗаписиДокумента конфигурация проверяет, является ли документ проведенным по бухгалтерскому или налоговому учету. Если документ проведен, программный код системы проверяет роли текущего интерактивного сеанса пользователя независимо от флага привилегированного режима.
ОбменДанными.Загрузка = Истина отключает выполнение стандартных обработчиков только в том случае, если в самом начале этих обработчиков разработчиками конфигурации зашито условие прекращения выполнения. В ряде сервисных модулей УПП проверки прав выполняются до анализа этого флага.
Наиболее корректным и безопасным архитектурным решением является вынос дополнительных реквизитов (флагов, признаков печатных форм, пользовательских заметок) из объекта документа в отдельный независимый Регистр сведений.
Рассмотрим порядок реализации этого способа:
ПризнакиТорг12 (или используем типовой механизм дополнительных сведений).Документ с типом ДокументСсылка.РеализацияТоваровУслуг.Установлен или текстовое поле Комментарий.Для установки или сброса значения в этом случае не требуется вызывать метод Записать() самого документа и изменять проведенный объект. Пример кода записи в регистр:
Процедура УстановитьПризнакВРегистре(СсылкаНаДокумент, ЗначениеФлага)
МенеджерЗаписи = РегистрыСведений.ПризнакиТорг12.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = СсылкаНаДокумент;
МенеджерЗаписи.Прочитать();
МенеджерЗаписи.Документ = СсылкаНаДокумент;
МенеджерЗаписи.Установлен = ЗначениеФлага;
МенеджерЗаписи.Записать(Истина);
КонецПроцедуры
Преимущества: Сам документ не перезаписывается, его проведения и движения по учету не затрагиваются, а проверка прав на отражение в регламентированном учете полностью отсутствует.
В конфигурации Управление производственным предприятием редакции 1.3 проверка разрешения на проведение и изменение документов регл. учета помимо ролей регулируется специальным регистром сведений дополнительных прав.
Посмотрим на порядок настройки прав без предоставления полных бухгалтерских ролей:
Это дает возможность пользователю записывать и редактировать документы, имеющие признаки отражения в БУ и НУ, в рамках предоставленных ему основных прав доступа.
Если проект требует обязательно изменить реквизит непосредственно внутри самого документа (например, реквизит Комментарий), а давать пользователю дополнительные права нельзя, операцию записи можно вынести в Фоновое задание.
Фоновое задание запускается в отдельном сеансе на сервере под именем указанного пользователя с административными правами или от имени системного пользователя, у которого присутствуют необходимые роли:
Процедура ЗаписатьДокументВФоне(СсылкаНаДокумент, НовыйКомментарий) Экспорт
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(СсылкаНаДокумент);
ПараметрыЗадания.Добавить(НовыйКомментарий);
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ИзменитьЗаписьДокументаНаСервере", ПараметрыЗадания);
КонецПроцедуры
Внутри процедуры фонового задания выполняется получение объекта, изменение текстового поля и запись объекта без проведения. Так как фоновый сеанс обладает правами администратора, программная проверка ролей успешно завершится.