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