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