Как закрыть от редактирования отдельные ячейки табличного документа?

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

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

Анализ стандартного механизма защиты

Стандартный механизм платформы 1С предлагает свойство Защита для ячеек и всего табличного документа. Однако при использовании БСП и стандартной кнопки редактирования на форме «Печать документов», включение режима редактирования обычно снимает защиту со всего документа целиком. Чтобы реализовать «умную» блокировку, нам потребуется использовать событийную модель табличного документа.

Проанализируем ситуацию: когда пользователь пытается изменить ячейку, возникают определенные события. Нам нужно перехватить эти события и, если область является «запретной», отменить действие пользователя.

Способ 1: Перехват события Выбор (Selection)

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

Для этого в модуле формы, где отображается печатная форма, создадим обработчик события:


&НаКлиенте
Процедура ТекущаяПечатнаяФормаВыбор(Элемент, Область, СтандартнаяОбработка)
    // Проверяем, относится ли область к защищаемым
    Если Область.ЦветФона = WebЦвета.СветлоСерый Тогда 
        // Если мы пометили ячейку цветом как "нередактируемую"
        СтандартнаяОбработка = Ложь;
        Состояние("Редактирование этой области запрещено администратором.");
    КонецЕсли;
КонецПроцедуры

В данном примере мы используем проверку по цвету фона, но это лишь один из вариантов. СтандартнаяОбработка = Ложь предотвращает переход ячейки в режим ввода текста при двойном клике или нажатии Enter.

Способ 2: Использование события ПриНачалеРедактирования

Более надежный метод — использование события ПриНачалеРедактирования. Оно срабатывает непосредственно перед тем, как в ячейке появится курсор для ввода. Это позволяет заблокировать даже попытки редактирования через клавишу F2.

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


&НаКлиенте
Процедура РезультатПриНачалеРедактирования(Элемент, СтандартнаяОбработка)
    ТекущаяОбласть = Элемент.ТекущаяОбласть;
    
    // Проверяем имя области, заданное в макете
    Если Найти(ТекущаяОбласть.Имя, "Запрет") > 0 Тогда
        СтандартнаяОбработка = Ложь;
        Предупреждение("Данная область заполнена автоматически из базы данных и недоступна для правки.");
    КонецЕсли;
КонецПроцедуры

Способ 3: Идентификация областей через параметры расшифровки

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

Шаг 1. При формировании печатной формы на сервере:


ОбластьМакета = Макет.ПолучитьОбласть("СтрокаДанных");
// Заполняем данные...
ОбластьМакета.Параметры.Цена = Данные.Цена;
// Устанавливаем маркер защиты в расшифровку
ОбластьМакета.Область().ПараметрРасшифровки = "Блокировка_Редактирования";
ТабДок.Вывести(ОбластьМакета);

Шаг 2. В обработчике события на клиенте:


&НаКлиенте
Процедура РезультатВыбор(Элемент, Область, СтандартнаяОбработка)
    // Извлекаем значение расшифровки
    Если Область.Расшифровка = "Блокировка_Редактирования" Тогда
        СтандартнаяОбработка = Ложь;
    КонецЕсли;
КонецПроцедуры

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

Способ 4: Программное управление свойством «Защита»

Если мы хотим использовать штатный механизм 1С, нам нужно программно установить свойство Защита для конкретных ячеек и убедиться, что у самого ТабличногоДокумента свойство Защита установлено в Истина.

Рассмотрим ситуацию с БСП: когда пользователь нажимает кнопку «Редактирование», БСП устанавливает ТабличныйДокумент.ТолькоПросмотр = Ложь. Однако, если мы принудительно оставим ТабличныйДокумент.Защита = Истина, то ячейки, у которых флаг Защита включен, останутся недоступными, а остальные (где флаг снят) — можно будет править.

Посмотрим на пример установки защиты при выводе:


// В модуле менеджера при формировании документа
ОбластьВсего = ТабДок.Область("R10C1:R10C5");
ОбластьВсего.Защита = Истина; // Эти ячейки нельзя будет менять

ОбластьКомментарий = ТабДок.Область("R11C1:R11C5");
ОбластьКомментарий.Защита = Ложь; // Эту область пользователь сможет редактировать

Важно помнить: чтобы этот метод работал, после формирования документа нужно выполнить команду ТабличныйДокумент.Защита = Истина;. Если стандартная кнопка БСП её отключает, нам может потребоваться переопределить поведение этой кнопки или добавить проверку в событие ПриОбновленииСоставаКнопок.

Визуальная индикация заблокированных зон

Для улучшения пользовательского опыта крайне важно визуально выделить те области, которые нельзя редактировать. Если пользователь видит белое поле, он ожидает, что сможет в нем писать. Если же ячейка залита светло-серым цветом, это интуитивно сигнализирует о её «заблокированном» статусе.

Рекомендуем при формировании макета использовать следующие стили для защищенных ячеек:

  1. Цвет фона: Устанавливайте неяркий серый или бежевый оттенок.
  2. Подсказка: Используйте свойство ячейки Примечание или ТекстПодсказки, чтобы при наведении курсора пользователь видел сообщение: «Данное поле заполняется автоматически».
  3. Шрифт: Можно изменить цвет текста на темно-серый, чтобы подчеркнуть неизменяемость данных.

Резюме

Мы проанализировали несколько способов защиты данных в табличном документе. Наиболее гибким и современным является комбинированный подход: использование параметров расшифровки для маркировки критичных данных и перехват события ПриНачалеРедактирования для отмены стандартной обработки. Это позволяет сохранить функциональность кнопки «Редактирование» для второстепенных полей (адреса, примечания), при этом гарантируя целостность финансовых и юридических данных в печатной форме.

← На главную