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