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