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

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

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

Метод 1: Использование условного оформления (декларативный подход)

Условное оформление — это наиболее предпочтительный способ, так как он работает автоматически при обновлении данных в таблице. Важно помнить, что механизм условного оформления не поддерживает обращение к подчиненным реквизитам через точку (например, Номенклатура.Артикул). Для обхода этого ограничения мы добавим в таблицу вспомогательный реквизит.

  1. Создание вспомогательного реквизита: В табличную часть формы добавьте новую колонку (реквизит формы, не в метаданных), например, с именем РазрешеноРедактировать (тип Булево).
  2. Заполнение данных: При открытии формы или при изменении ключевых полей (например, колонки Номенклатура) вычисляйте значение этого реквизита и заполняйте его для каждой строки.
  3. Настройка условного оформления: Перейдите в свойства формы, найдите раздел Условное оформление и добавьте новый элемент:
    • Отбор: РазрешеноРедактировать равно Ложь.
    • Оформление: Установите параметр Доступность в значение Ложь.
    • Оформляемые поля: Выберите колонку, которую нужно заблокировать (например, ТоварыЦена).

Теперь, когда значение вспомогательного реквизита меняется, система сама «серит» или делает доступными нужные ячейки в зависимости от условий.

Метод 2: Событие «ПередНачаломИзменения» (процедурный подход)

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

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


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

&НаСервере
Функция ПроверитьВозможностьРедактированияНаСервере(Номенклатура)
    // Логика проверки условий, например, по артикулу
    Если Номенклатура.Артикул = "БТК01" Тогда
        Возврат Ложь;
    КонецЕсли;
    Возврат Истина;
КонецФункции

Почему важно правильно выбрать метод?

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

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

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

← На главную