Как полностью запретить редактирование, добавление и удаление строк табличной части в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При разработке интерфейсных решений в 1С:Предприятии 7.7 разработчики нередко сталкиваются с необходимостью заблокировать табличную (многострочную) часть документа от любых изменений пользователем. При использовании популярной внешней компоненты FormEx логичной первой попыткой кажется программное отключение доступности элемента диалога, отвечающего за табличную часть.

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

Проблема: свойство Доступность и поведение табличной части

Проанализируем типичный пример кода с использованием объекта РасширениеФормы компоненты FormEx:


РасшФормы = СоздатьОбъект("РасширениеФормы");
РасшФормы.ПолучитьАтрибут("МногострочнаяЧасть").Доступность = 0;

Или циклический обход всех элементов формы документа:


Для инд = 0 По РасширениеФормы.КоличествоАтрибутов() - 1 Цикл
    РасширениеФормы.ПолучитьАтрибут(инд).Доступность = 0;
КонецЦикла;

При выполнении этого кода визуальное редактирование значений в ячейках строк действительно блокируется. Однако табличная часть продолжает реагировать на команды добавления новой строки (по клавише Insert) или удаления существующей (по клавише Delete), а также на соответствующие пункты контекстного меню и командного интерфейса.

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

Способ 1. Использование стандартных предопределенных событий модуля формы

Разберем по шагам наиболее надежный и проверенный способ блокировки изменений строк, который не требует сторонних библиотек и полностью опирается на штатные возможности платформы 1С 7.7.

Для предотвращения модификации состава строк достаточно перехватить системные события в модуле формы документа и вернуть признак отмены операции с помощью процедуры СтатусВозврата(0).

  1. Запрет добавления новых строк: используем предопределенную процедуру ПриВводеНовойСтроки().
  2. Запрет удаления строк: перехватываем операцию в процедуре ПриУдаленииСтроки().
  3. Запрет редактирования существующих строк: блокируем вход в режим редактирования ячеек через процедуру ПриНачалеРедактированияСтроки().

Посмотрим на практический пример реализации в модуле формы документа:


Перем ЗапретитьИзменениеТЧ;

Процедура ПриВводеНовойСтроки()
    Если ЗапретитьИзменениеТЧ = 1 Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Процедура ПриУдаленииСтроки()
    Если ЗапретитьИзменениеТЧ = 1 Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Процедура ПриНачалеРедактированияСтроки()
    Если ЗапретитьИзменениеТЧ = 1 Тогда
        СтатусВозврата(0);
        Возврат;
    КонецЕсли;
КонецПроцедуры

Такой механизм гарантирует, что пользователь не сможет ни добавить строку по клавише Insert, ни удалить строку по клавише Delete, ни войти в режим изменения по нажатию Enter или двойному клику мыши. При этом табличная часть остается читаемой, и по ней сохраняется возможность прокрутки и навигации.

Способ 2. Перевод всей формы в режим только для чтения

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

Форма.ТолькоПросмотр(1);

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

Способ 3. Перехват горячих клавиш и действий через FormEx

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

Через объект Сервис компоненты FormEx доступно управление клавиатурными событиями:

  1. Включаем глобальный перехват клавиатуры методами сервиса FormEx при открытии формы.
  2. В предопределенной процедуре компоненты ПриНажатииКлавиши() отслеживаем коды клавиш Insert (вставка строки) и Delete (удаление строки), когда фокус находится на многострочной части, и блокируем их дальнейшую обработку.
  3. При необходимости перехватываем нажатия правой кнопки мыши для подавления стандартного контекстного меню таблицы.

Тем не менее, в подавляющем большинстве прикладных задач комбинирование процедур ПриВводеНовойСтроки(), ПриУдаленииСтроки() и ПриНачалеРедактированияСтроки() с вызовом СтатусВозврата(0) является самым надежным решением, работающим штатно и предсказуемо во всех версиях 1С:Предприятия 7.7.

← На главную