Как сохранить состояние блокировки формы документа в 1С?

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

При разработке интерфейса в 1С часто возникает задача управления доступностью формы. Например, создание кнопки «Заблокировать документ», которая переводит форму в режим ТолькоПросмотр. Однако начинающие разработчики часто сталкиваются с проблемой: после закрытия и повторного открытия документа состояние блокировки сбрасывается. Это происходит потому, что реквизиты формы очищаются при завершении сеанса или закрытии окна. Давайте разберемся, как сделать это состояние «постоянным» и сохраняемым в базе данных.

Почему блокировка не сохраняется автоматически?

Когда вы используете свойство ЭтаФорма.ТолькоПросмотр, вы управляете интерфейсом конкретного экземпляра формы в оперативной памяти. Как только форма закрывается, все изменения, не записанные в базу данных (в объект документа), исчезают. Чтобы состояние «заблокирован» стало «свойством» документа, нам необходимо хранить этот признак непосредственно в информационной базе.

Способ 1: Хранение статуса в реквизите объекта

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

  1. Добавьте реквизит: В дереве метаданных найдите ваш документ, перейдите на вкладку «Данные» и добавьте новый реквизит (например, ЗаблокированОтРедактирования) с типом Булево.
  2. Обновите код кнопки: Теперь при нажатии кнопки мы будем не просто менять свойство формы, но и записывать значение в объект.

&НаКлиенте
Процедура УстановитьСтатус(Команда)
    // Переключаем значение в объекте
    Объект.ЗаблокированОтРедактирования = НЕ Объект.ЗаблокированОтРедактирования;
    
    // Применяем блокировку к форме
    ЭтаФорма.ТолькоПросмотр = Объект.ЗаблокированОтРедактирования;
    
    // Записываем документ, чтобы сохранить изменения в базе
    Записать();
КонецПроцедуры

Не забудьте добавить в событие ПриСозданииНаСервере код, который будет проверять этот реквизит при открытии формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ЭтаФорма.ТолькоПросмотр = Объект.ЗаблокированОтРедактирования;
КонецПроцедуры

Способ 2: Использование регистра сведений

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

Преимущества этого подхода:

Как реализовать:

  1. Создайте непериодический регистр сведений.
  2. Добавьте измерение Документ (тип: Ссылка на ваш документ) и ресурс Заблокирован (тип: Булево).
  3. При открытии формы делайте запрос к этому регистру. Если по ссылке найдена запись с Истина — устанавливайте ТолькоПросмотр = Истина.
  4. При нажатии кнопки выполняйте запись в этот регистр (или удаление записи, если статус сбрасывается).

Важные рекомендации по безопасности

Помните, что использование свойства ТолькоПросмотр — это лишь способ «спрятать» кнопки и поля от пользователя в интерфейсе. Это не является полноценной защитой от записи данных программным путем. Если вам необходимо обеспечить строгую защиту документа от изменений, обязательно добавьте проверку в модуле объекта:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЗаблокированОтРедактирования Тогда
        Отказ = Истина;
        Сообщить("Документ заблокирован от редактирования!");
    КонецЕсли;
КонецПроцедуры

Подведем итоги

Мы выяснили, что данные, которые должны сохраняться между открытиями формы, необходимо хранить в базе данных. Выбирайте хранение в реквизите документа, если структура данных позволяет это сделать, или используйте регистр сведений, если нужно оставить объект «чистым». Оба метода позволяют корректно управлять состоянием документа и надежно фиксировать выбранный пользователем статус.

← На главную