Как сделать доступными элементы табличной части при запрете редактирования документа в 1С?

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

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

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

Особенность работы свойства формы ТолькоПросмотр

Свойство формы ТолькоПросмотр имеет наивысший приоритет над свойствами вложенных элементов управления. Если на уровне формы установлено ТолькоПросмотр = Истина, то попытка переопределить это состояние для отдельной колонки табличного поля через ТолькоПросмотр = Ложь или Доступность = Истина не даст результата — платформа принудительно сохранит режим просмотра для всех подчиненных элементов.

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

Способ 1. Управление доступностью конкретных кнопок и полей формы

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

Разберем по шагам, как заблокировать ключевые действия:

  1. Определим кнопки командной панели, отвечающие за проведение (Провести, Провести и закрыть, Отмена проведения), и установим для них свойство Доступность = Ложь (или Видимость = Ложь).
  2. Для реквизитов шапки, которые нельзя менять, установим режим ТолькоПросмотр = Истина или Доступность = Ложь.
  3. Для табличной части запретим добавление, удаление и изменение строк, но оставим доступными колонки со ссылочными данными.

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


// Оставляем форму интерактивной
ЭтаФорма.ТолькоПросмотр = Ложь;

// Отключаем кнопки проведения и отмены проведения
ЭлементыФормы.КнопкаПровести.Доступность = Ложь;
ЭлементыФормы.КнопкаОтменаПроведения.Доступность = Ложь;

// Блокируем изменение строк табличной части
ЭлементыФормы.Товары.ТолькоПросмотр = Истина;
ЭлементыФормы.Товары.АвтоВводНовыхСтрок = Ложь;

Если требуется запретить редактирование большинства полей шапки, можно обойти элементы формы в цикле, исключив из блокировки табличные части и разрешенные элементы:


Для Каждого Элемент Из ЭлементыФормы Цикл
    // Пропускаем табличные поля и системные панели
    Если ТипЗнч(Элемент) = Тип("ТабличноеПоле") Тогда
        Продолжить;
    КонецЕсли;

    // Для полей ввода выставляем ТолькоПросмотр
    Если ТипЗнч(Элемент) = Тип("ПолеВвода") Тогда
        Элемент.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецЦикла;

Способ 2. Открытие карточек объектов через событие Выбор табличного поля

Если по бизнес-логике на форму все же накладывается ТолькоПросмотр = Истина, стандартное нажатие на кнопку открытия внутри ячейки может не срабатывать. Однако платформа 1С продолжает вызывать событие Выбор при двойном клике мыши или нажатии клавиши Enter по ячейке таблицы.

Мы можем перехватить это событие и принудительно открыть форму объекта. Разберем реализацию обработчика события Выбор:


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

КонецПроцедуры

Использование метода ОткрытьЗначение() позволяет открыть карточку номенклатуры, договора или контрагента даже в том случае, если форма документа заблокирована для редактирования.

Способ 3. Проверка прав в событии ПередЗаписью

Для надежной защиты данных визуальных ограничений на форме недостаточно, так как проведение документа может быть вызвано сочетанием клавиш или внешними алгоритмами. Рекомендуется дополнять интерфейсные запреты проверкой в событии ПередЗаписью модуля формы или модуля объекта.

Рассмотрим пример проверки режима записи на клиенте в модуле формы:


Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
    
    Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение 
        ИЛИ ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
        
        Если Не ПравоДоступа("ИнтерактивноеПроведение", Метаданные.Документы.РеализацияТоваровУслуг) Тогда
            Отказ = Истина;
            Сообщить("У вас недостаточно прав для проведения данного документа!", СтатусСообщения.Важное);
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Способ 4. Разграничение прав с помощью ролей (рекомендуемый подход)

Вместо написания программного кода в формах каждого документа правильнее использовать стандартную ролевую модель платформы 1С:

  1. Права на проведение: В конфигураторе для соответствующей роли снимите флажки Интерактивное проведение, Интерактивное проведение неоперативное и Интерактивная отмена проведения. Платформа самостоятельно скроет или сделает недоступными команды проведения, не ломая навигацию по форме.
  2. Изменение проведенных документов: Снятие права Интерактивное изменение проведенных предотвратит случайное редактирование уже проведенных документов пользователями без необходимости ручной блокировки элементов формы.
  3. Даты запрета изменения: В типовых конфигурациях для ограничения редактирования старых периодов используется механизм «Даты запрета изменения данных», который гибко настраивается в пользовательском режиме без внесения правок в конфигурацию.
← На главную