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

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

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

Причины неявной блокировки формы платформой

Проанализируем, почему возникает такое несоответствие между свойствами в отладчике и реальным поведением интерфейса. Когда документ проведен, платформа 1С автоматически включает внутренний механизм защиты целостности данных.

Если у пользователя нет права Интерактивное изменение проведенных (в сочетании с правом Интерактивное проведение), платформа принудительно запрещает интерактивную модификацию данных, связанных с реквизитом Объект (тип ДокументОбъект). При этом свойства элементов управления в кодовой модели формы не меняются: проверка прав доступа выполняется ядром платформы на более низком уровне при попытке передать изменения в объект данных.

Дополнительно на поведение влияет свойство расширения формы ПриЗаписиПерепроводить. Если оно установлено в значение Истина, любая интерактивная запись формы автоматически инициирует повторное проведение документа. Если у пользователя отсутствует право на проведение, платформа превентивно блокирует ввод данных, чтобы не допустить расхождения между реквизитами документа и уже сформированными движениями в регистрах.

Попытки разблокировать форму программно через код (например, перебором элементов в цикле или установкой ЭтаФорма.ТолькоПросмотр = Ложь) не дадут результата, так как платформенная проверка прав доступа имеет безусловный приоритет перед свойствами элементов формы.

Способ 1. Корректировка прав доступа в роли пользователя

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

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

После назначения этих прав платформа снимет автоматическую блокировку, и реквизиты объекта станут доступны для интерактивного редактирования.

Способ 2. Использование независимых реквизитов формы

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

  1. Добавим в саму форму отдельный реквизит (например, КомментарийПользователя с типом Строка).
  2. Разместим на форме поле ввода и свяжем его путь к данным с добавленным реквизитом формы, а не с реквизитом объекта.
  3. В обработчике ПриСозданииНаСервере заполним этот реквизит формы значением из объекта базы.

Поскольку реквизит принадлежит форме, платформа не станет его блокировать даже при полном отсутствии прав на проведение документа.

Способ 3. Запись изменений в привилегированном режиме

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


&НаСервере
Процедура СохранитьСлужебныеДанныеНаСервере()
    
    УстановитьПривилегированныйРежим(Истина);
    
    ДокументСсылка = Объект.Ссылка;
    ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
    
    // Заполняем реквизит из данных формы
    ДокументОбъект.Комментарий = КомментарийПользователя;
    
    // Записываем документ без перепроведения и движений
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    
КонецПроцедуры

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

Способ 4. Предварительная отмена проведения

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

  1. Пользователь с правом Интерактивная отмена проведения отменяет проведение документа.
  2. Документ переходит в статус непроведенного. Платформенное ограничение на проведенные документы перестает действовать.
  3. Форма документа разблокируется для обычного редактирования (при наличии стандартного права Изменение).
  4. После внесения изменений документ передается на повторное проведение уполномоченному сотруднику.
← На главную