При разработке интерфейсных решений в 1С:Предприятии 7.7 разработчики нередко сталкиваются с необходимостью заблокировать табличную (многострочную) часть документа от любых изменений пользователем. При использовании популярной внешней компоненты FormEx логичной первой попыткой кажется программное отключение доступности элемента диалога, отвечающего за табличную часть.
Рассмотрим, с чем именно сталкивается разработчик при таком подходе, выясним причину такого поведения платформы и подробно разберем правильные способы решения задачи.
Проанализируем типичный пример кода с использованием объекта РасширениеФормы компоненты FormEx:
РасшФормы = СоздатьОбъект("РасширениеФормы");
РасшФормы.ПолучитьАтрибут("МногострочнаяЧасть").Доступность = 0;
Или циклический обход всех элементов формы документа:
Для инд = 0 По РасширениеФормы.КоличествоАтрибутов() - 1 Цикл
РасширениеФормы.ПолучитьАтрибут(инд).Доступность = 0;
КонецЦикла;
При выполнении этого кода визуальное редактирование значений в ячейках строк действительно блокируется. Однако табличная часть продолжает реагировать на команды добавления новой строки (по клавише Insert) или удаления существующей (по клавише Delete), а также на соответствующие пункты контекстного меню и командного интерфейса.
Выясним причину: в архитектуре платформы 1С:Предприятие 7.7 управление составом строк и редактирование содержимого ячеек разделены на системном уровне. Свойство Доступность = 0 блокирует сам элемент управления диалога, но не отключает обработку системных команд работы с коллекцией строк документа. Поэтому для полноценного запрета редактирования требуется комплексный подход.
Разберем по шагам наиболее надежный и проверенный способ блокировки изменений строк, который не требует сторонних библиотек и полностью опирается на штатные возможности платформы 1С 7.7.
Для предотвращения модификации состава строк достаточно перехватить системные события в модуле формы документа и вернуть признак отмены операции с помощью процедуры СтатусВозврата(0).
ПриВводеНовойСтроки().ПриУдаленииСтроки().ПриНачалеРедактированияСтроки().Посмотрим на практический пример реализации в модуле формы документа:
Перем ЗапретитьИзменениеТЧ;
Процедура ПриВводеНовойСтроки()
Если ЗапретитьИзменениеТЧ = 1 Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура ПриУдаленииСтроки()
Если ЗапретитьИзменениеТЧ = 1 Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Процедура ПриНачалеРедактированияСтроки()
Если ЗапретитьИзменениеТЧ = 1 Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
Такой механизм гарантирует, что пользователь не сможет ни добавить строку по клавише Insert, ни удалить строку по клавише Delete, ни войти в режим изменения по нажатию Enter или двойному клику мыши. При этом табличная часть остается читаемой, и по ней сохраняется возможность прокрутки и навигации.
Рассмотрим ситуацию, когда требуется закрыть от изменений не только многострочную часть, но и весь документ целиком (например, при просмотре проведенного или закрытого периода). В этом случае наиболее простым и лаконичным решением является стандартный метод формы документа:
Форма.ТолькоПросмотр(1);
Данный вызов переводит диалог в системный режим «Только просмотр». В этом состоянии платформа автоматически отключает как редактирование любых реквизитов, так и интерактивные команды вставки, копирования и удаления строк в табличной части.
Если задача требует специфического интерфейсного поведения (например, выборочного отключения системных горячих клавиш при сохранении частичной доступности формы), рассмотрим возможности внешней компоненты FormEx.
Через объект Сервис компоненты FormEx доступно управление клавиатурными событиями:
ПриНажатииКлавиши() отслеживаем коды клавиш Insert (вставка строки) и Delete (удаление строки), когда фокус находится на многострочной части, и блокируем их дальнейшую обработку.Тем не менее, в подавляющем большинстве прикладных задач комбинирование процедур ПриВводеНовойСтроки(), ПриУдаленииСтроки() и ПриНачалеРедактированияСтроки() с вызовом СтатусВозврата(0) является самым надежным решением, работающим штатно и предсказуемо во всех версиях 1С:Предприятия 7.7.