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