В процессе разработки печатных форм в системе 1С:Предприятие 8.3, особенно при использовании Библиотеки Стандартных Подсистем (БСП), разработчики часто сталкиваются с дилеммой. С одной стороны, пользователям необходимо оставить возможность ручной корректировки печатной формы перед выводом на печать (кнопка «Редактирование»). С другой стороны, существуют критически важные данные — такие как ИНН организации, итоговые суммы или реквизиты банка, — изменение которых в печатной форме может привести к юридическим или финансовым ошибкам. Разберем, как точечно запретить правки в конкретных областях, не лишая пользователя общей возможности редактировать документ.
Стандартный механизм платформы 1С предлагает свойство Защита для ячеек и всего табличного документа. Однако при использовании БСП и стандартной кнопки редактирования на форме «Печать документов», включение режима редактирования обычно снимает защиту со всего документа целиком. Чтобы реализовать «умную» блокировку, нам потребуется использовать событийную модель табличного документа.
Проанализируем ситуацию: когда пользователь пытается изменить ячейку, возникают определенные события. Нам нужно перехватить эти события и, если область является «запретной», отменить действие пользователя.
Самый простой способ, который нашел автор темы, заключается в использовании события Выбор. Рассмотрим, как это реализовать на стороне клиента. Представим, что у нас есть табличный документ на форме, и мы хотим запретить вход в режим редактирования для определенных ячеек.
Для этого в модуле формы, где отображается печатная форма, создадим обработчик события:
&НаКлиенте
Процедура ТекущаяПечатнаяФормаВыбор(Элемент, Область, СтандартнаяОбработка)
// Проверяем, относится ли область к защищаемым
Если Область.ЦветФона = WebЦвета.СветлоСерый Тогда
// Если мы пометили ячейку цветом как "нередактируемую"
СтандартнаяОбработка = Ложь;
Состояние("Редактирование этой области запрещено администратором.");
КонецЕсли;
КонецПроцедуры
В данном примере мы используем проверку по цвету фона, но это лишь один из вариантов. СтандартнаяОбработка = Ложь предотвращает переход ячейки в режим ввода текста при двойном клике или нажатии Enter.
Более надежный метод — использование события ПриНачалеРедактирования. Оно срабатывает непосредственно перед тем, как в ячейке появится курсор для ввода. Это позволяет заблокировать даже попытки редактирования через клавишу F2.
Выясним причину, почему это удобнее: это событие дает более точный контроль над процессом интерактивного изменения данных. Рассмотрим пример кода:
&НаКлиенте
Процедура РезультатПриНачалеРедактирования(Элемент, СтандартнаяОбработка)
ТекущаяОбласть = Элемент.ТекущаяОбласть;
// Проверяем имя области, заданное в макете
Если Найти(ТекущаяОбласть.Имя, "Запрет") > 0 Тогда
СтандартнаяОбработка = Ложь;
Предупреждение("Данная область заполнена автоматически из базы данных и недоступна для правки.");
КонецЕсли;
КонецПроцедуры
Часто бывает неудобно привязываться к координатам (строка/колонка) или именам областей, если макет динамический. В таком случае мы можем использовать свойство ПараметрРасшифровки. Проанализируем этот подход: при формировании табличного документа в «запрещенные» ячейки мы записываем специальный маркер в расшифровку.
Шаг 1. При формировании печатной формы на сервере:
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаДанных");
// Заполняем данные...
ОбластьМакета.Параметры.Цена = Данные.Цена;
// Устанавливаем маркер защиты в расшифровку
ОбластьМакета.Область().ПараметрРасшифровки = "Блокировка_Редактирования";
ТабДок.Вывести(ОбластьМакета);
Шаг 2. В обработчике события на клиенте:
&НаКлиенте
Процедура РезультатВыбор(Элемент, Область, СтандартнаяОбработка)
// Извлекаем значение расшифровки
Если Область.Расшифровка = "Блокировка_Редактирования" Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что расшифровка не видна пользователю при печати, но отлично считывается программно при попытке взаимодействия с ячейкой.
Если мы хотим использовать штатный механизм 1С, нам нужно программно установить свойство Защита для конкретных ячеек и убедиться, что у самого ТабличногоДокумента свойство Защита установлено в Истина.
Рассмотрим ситуацию с БСП: когда пользователь нажимает кнопку «Редактирование», БСП устанавливает ТабличныйДокумент.ТолькоПросмотр = Ложь. Однако, если мы принудительно оставим ТабличныйДокумент.Защита = Истина, то ячейки, у которых флаг Защита включен, останутся недоступными, а остальные (где флаг снят) — можно будет править.
Посмотрим на пример установки защиты при выводе:
// В модуле менеджера при формировании документа
ОбластьВсего = ТабДок.Область("R10C1:R10C5");
ОбластьВсего.Защита = Истина; // Эти ячейки нельзя будет менять
ОбластьКомментарий = ТабДок.Область("R11C1:R11C5");
ОбластьКомментарий.Защита = Ложь; // Эту область пользователь сможет редактировать
Важно помнить: чтобы этот метод работал, после формирования документа нужно выполнить команду ТабличныйДокумент.Защита = Истина;. Если стандартная кнопка БСП её отключает, нам может потребоваться переопределить поведение этой кнопки или добавить проверку в событие ПриОбновленииСоставаКнопок.
Для улучшения пользовательского опыта крайне важно визуально выделить те области, которые нельзя редактировать. Если пользователь видит белое поле, он ожидает, что сможет в нем писать. Если же ячейка залита светло-серым цветом, это интуитивно сигнализирует о её «заблокированном» статусе.
Рекомендуем при формировании макета использовать следующие стили для защищенных ячеек:
Примечание или ТекстПодсказки, чтобы при наведении курсора пользователь видел сообщение: «Данное поле заполняется автоматически».Мы проанализировали несколько способов защиты данных в табличном документе. Наиболее гибким и современным является комбинированный подход: использование параметров расшифровки для маркировки критичных данных и перехват события ПриНачалеРедактирования для отмены стандартной обработки. Это позволяет сохранить функциональность кнопки «Редактирование» для второстепенных полей (адреса, примечания), при этом гарантируя целостность финансовых и юридических данных в печатной форме.