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

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

Часто возникает задача ограничить возможности пользователя при работе с табличными частями документов — для этого подойдёт модуль управления доступом к формам и контроля ввода данных. Например, когда данные загружаются из внешней системы, нужно разрешить пользователю менять только цену, но запретить изменять номенклатуру, количество, а также добавлять или удалять строки. Рассмотрим несколько способов решения этой задачи на управляемых формах 1С, от самых простых до более гибких и функциональных.

Способ 1. Настройка свойств элементов формы

Это самый простой и быстрый способ, который подходит для статических ограничений, когда правила редактирования не меняются в зависимости от данных — для настройки прав без изменения конфигурации есть инструмент настройки прав доступа и запрета редактирования форм. Ограничения можно установить как интерактивно в конфигураторе, так и программно. Если же вы хотите протестировать настройки свойств без входа в конфигуратор, можно использовать редактор форм в режиме предприятия.

Шаг 1. Запрещаем изменение состава строк.

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

  1. Откройте нужную форму в конфигураторе.
  2. В дереве элементов формы найдите таблицу, соответствующую вашей табличной части (например, "Товары").
  3. В палитре свойств для этого элемента найдите свойство ИзменениеСоставаСтрок и установите его в значение Ложь.

После этого стандартные кнопки "Добавить", "Скопировать", "Удалить" станут неактивными для этой таблицы.

Шаг 2. Блокируем нужные колонки.

Теперь нужно сделать недоступными для редактирования конкретные колонки. Для этого используется свойство ТолькоПросмотр.

  1. В дереве элементов формы раскройте вашу таблицу и найдите элементы, соответствующие колонкам, которые нужно заблокировать (например, "ТоварыНоменклатура" и "ТоварыКоличество").
  2. Для каждого такого элемента в палитре свойств установите свойство ТолькоПросмотр в значение Истина.

Колонка, которую нужно оставить для редактирования (в нашем примере "Цена"), остается без изменений.

Программная реализация

Те же самые действия можно выполнить программно. Это предпочтительный способ, так как он не требует ручного изменения свойств каждого элемента и более нагляден. Для ускорения написания кода разработчики часто применяют конструктор управляемых форм или готовые библиотеки для программного изменения форм. Код следует размещать в обработчике события формы ПриСозданииНаСервере.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Запрещаем пользователю добавлять и удалять строки из ТЧ "Товары"
    Элементы.Товары.ИзменениеСоставаСтрок = Ложь;

    // Запрещаем редактирование колонок "Номенклатура" и "Количество"
    Элементы.ТоварыНоменклатура.ТолькоПросмотр = Истина;
    Элементы.ТоварыКоличество.ТолькоПросмотр = Истина;
    
    // Колонку "Цена" оставляем доступной для редактирования
    // Элементы.ТоварыЦена.ТолькоПросмотр = Ложь; // Это значение по умолчанию
КонецПроцедуры

Этот подход идеально подходит, если правила доступа едины для всего документа и не зависят от его состояния или прав пользователя. Также он может служить основой, если требуется более сложное добавление реквизитов и элементов формы без использования визуального редактора.

Способ 2. Условное оформление

Это более мощный и гибкий механизм, который позволяет управлять доступностью элементов формы в зависимости от данных. Он не требует написания кода и настраивается в режиме конфигуратора. Условное оформление идеально подходит, когда нужно заблокировать строку или ячейку при выполнении какого-либо условия (например, если строка имеет определенный статус).

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

  1. В дереве элементов формы найдите и выберите ветку "Условное оформление".
  2. Нажмите кнопку "Добавить", чтобы создать новое правило оформления.
  3. На вкладке "Оформление" установите флажок напротив свойства "Только просмотр" и убедитесь, что его значение — Истина.
  4. На вкладке "Условие" задайте правило, при котором будет срабатывать блокировка. Например, чтобы блокировать уже заполненные строки:
    • Добавьте новый элемент отбора.
    • Левое значение: выберите поле данных, например, Объект.Товары.Номенклатура.
    • Вид сравнения: установите Не заполнено.
    • Условие будет выглядеть так: Объект.Товары.Номенклатура НЕ ЗАПОЛНЕНО. Но нам нужно обратное, поэтому мы будем блокировать поля, если номенклатура заполнена. Для этого изменим вид сравнения на Заполнено.
  5. На вкладке "Оформляемые поля" выберите поля, к которым будет применяться это правило. В нашем случае это "Номенклатура" и "Количество".

Теперь, как только в строке будет заполнена номенклатура, поля "Номенклатура" и "Количество" в этой строке станут недоступны для редактирования. Этот метод очень удобен для создания динамических правил без единой строчки кода.

Способ 3. Программное управление в событиях формы

Для реализации сложных сценариев, которые невозможно описать через условное оформление, используются обработчики событий формы.

Событие `ПриАктивизацииСтроки`

Это событие срабатывает на клиенте каждый раз, когда пользователь переходит на новую строку в таблице. Здесь можно анализировать данные текущей строки и динамически менять доступность элементов.

Посмотрим на пример: предположим, у строки есть реквизит "Статус". Если статус "Обработана", то менять цену в этой строке нельзя.


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

Событие `ПередНачаломИзменения`

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

Например, запретим любое редактирование табличной части, если документ проведен.


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

&НаСервереБезКонтекста
Функция ПроверенНаСервере()
    // Здесь должна быть логика получения состояния документа,
    // например, через чтение реквизита "Проведен"
    Возврат Объект.Проведен; 
КонецФункции

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

Способ 4. Управление через Роли

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

Чтобы запретить редактирование табличной части "Товары" для определенной роли, нужно в конфигураторе найти объект метаданных (например, Документ.РеализацияТоваровУслуг), перейти на вкладку "Права", найти нужную роль и снять для нее право "Изменение" у реквизита "Товары".

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

← На главную