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

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

При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача ограничить возможность редактирования документа пользователем. Это может быть связано с бизнес-процессом согласования, переходом документа в статус «Утвержден» (поможет система согласования с механизмом блокировки документов по статусам) или просто необходимостью защитить данные от случайного изменения после определенного момента. В данной статье мы подробно разберем, как реализовать механизм блокировки реквизитов на форме, рассмотрим плюсы и минусы различных подходов и научимся выбирать оптимальное решение для ваших задач.

Способ 1. Использование свойства формы «ТолькоПросмотр»

Это самый быстрый и простой способ, предоставляемый платформой «из коробки». Если нам нужно заблокировать сразу все элементы формы, мы можем обратиться к свойству ЭтаФорма.ТолькоПросмотр. Рассмотрим, как это работает программно в модуле управляемой формы.

Допустим, у нас на форме есть флажок (реквизит типа Булево), при установке которого форма должна «замереть»:


&НаКлиенте
Процедура ФлагБлокировкиПриИзменении(Элемент)
    УстановитьСостояниеДоступности();
КонецПроцедуры

&НаСервере
Процедура УстановитьСостояниеДоступности()
    // Если флаг установлен, переводим форму в режим только просмотра
    Если Объект.ФлагБлокировки Тогда
        ЭтаФорма.ТолькоПросмотр = Истина;
    Иначе
        ЭтаФорма.ТолькоПросмотр = Ложь;
    КонецЕсли;
КонецПроцедуры

Особенности этого метода:

  1. Простота: Одной строкой кода мы блокируем все поля ввода, таблицы и большинство команд.
  2. Блокировка стандартных кнопок: Обратите внимание, что при ТолькоПросмотр = Истина кнопки «Записать» и «Провести и закрыть» обычно становятся недоступными. Если пользователю нужно иметь возможность снять флаг блокировки, сама кнопка или флажок должны быть исключены из этого режима, либо управление должно идти через отдельную команду.
  3. Копирование данных: В этом режиме пользователи сохраняют возможность выделять текст в полях и копировать его (Ctrl+C), что крайне удобно для работы.

Способ 2. Программный обход коллекции «Элементы»

Иногда требуется заблокировать все реквизиты, но оставить доступными определенные кнопки (например, «Печать» или специальную кнопку «Разблокировать»). В этом случае режим «Только просмотр» для всей формы нам не подходит, и мы проанализируем ситуацию, используя цикл по элементам формы — для этого есть управление доступом к формам и элементам без программирования.

Разберем пример кода, который делает поля недоступными для редактирования, но сохраняет активность командного интерфейса:


&НаСервере
Процедура ЗаблокироватьРеквизитыПрограммно()
    Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
        // Проверяем, является ли элемент полем ввода или таблицей
        Если ТипЗнч(Элемент) = Тип("ПолеФормы") 
            Или ТипЗнч(Элемент) = Тип("ТаблицаФормы") Тогда
            
            // Исключаем сам флаг блокировки, чтобы его можно было нажать
            Если Элемент.Имя <> "ФлагБлокировки" Тогда
                Элемент.ТолькоПросмотр = Истина;
            КонецЕсли;
            
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Способ 3. Механизм «Условное оформление» управляемой формы

Рассмотрим современный декларативный подход. В управляемых формах 1С есть мощный инструмент — Условное оформление. Его преимущество в том, что оно работает на уровне платформы и не требует написания кода в процедурах «ПриИзменении» каждого реквизита.

Посмотрим на алгоритм настройки:

  1. Откроем редактор формы и перейдем на закладку «Условное оформление».
  2. Добавим новый элемент оформления.
  3. В «Оформлении» выберем свойство ТолькоПросмотр и установим значение Истина.
  4. В «Условии» укажем: Объект.ФлагБлокировки Равно Истина.
  5. В «Оформляемых полях» выберем все реквизиты объекта, которые нужно блокировать.

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

Способ 4. Использование механизмов БСП (Библиотеки стандартных подсистем)

Если ваша конфигурация построена на базе современных типовых решений (например, УТ 11, ERP 2, КА 2), то в них уже встроен профессиональный механизм блокировки реквизитов. Он позволяет выводить кнопку «Разрешить редактирование» в меню «Еще».

Проанализируем шаги для интеграции этого механизма:

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

Пример кода в модуле менеджера:


Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт
    Результат = Новый Массив;
    Результат.Добавить("Организация");
    Результат.Добавить("Дата");
    Результат.Добавить("СуммаДокумента");
    Результат.Добавить("Контрагент");
    // Если нужно заблокировать всё, придется перечислить основные реквизиты
    Возврат Результат;
КонецФункции

Также необходимо зарегистрировать документ в общем модуле ЗапретРедактированияРеквизитовОбъектовПереопределяемый в процедуре ПриОпределенииОбъектовСЗаблокированнымиРеквизитами. Это позволит системе автоматически подтягивать логику защиты при открытии формы.

Способ 5. Защита на уровне данных (Событие «ПередЗаписью»)

Важно понимать, что блокировка на форме — это лишь визуальное средство. Опытный пользователь или внешняя обработка могут изменить данные в обход формы. Выясним причину, почему одного визуального запрета недостаточно: целостность данных должна контролироваться на уровне сервера приложений — для этого подойдёт расширение для блокировки записи объектов и контроля заполнения реквизитов.

Поэтому обязательно дублируем проверку в модуле объекта (поможет инструмент автоматизации запрета проведения и контроля реквизитов без кода):


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Если включен режим загрузки данных, проверки обычно пропускаются
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

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

Способ 6. Роли и права доступа (RLS)

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

Рассмотрим два варианта:

  1. Дата запрета редактирования: В типовых решениях через раздел «Администрирование» можно установить дату, ранее которой документы изменять нельзя. Это работает для всех объектов сразу.
  2. Ограничение доступа на уровне записей (RLS): В настройках роли можно прописать условие на право «Изменение». Например: ГДЕ ФлагБлокировки = ЛОЖЬ. В этом случае сама платформа не даст записать объект, если условие нарушено, и автоматически сделает форму недоступной для редактирования.

Итоги

Мы разобрали несколько методов решения задачи. Для простых «костылей» подойдет ЭтаФорма.ТолькоПросмотр. Для гибкого интерфейса лучше использовать Условное оформление. Если же вы работаете в крупной типовой системе, правильным путем будет использование механизмов БСП и настройка прав доступа. Помните, что качественная разработка в 1С всегда подразумевает защиту данных не только на форме, но и в модуле объекта.

← На главную