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