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