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