При разработке управляемых форм разработчики нередко сталкиваются с ситуацией, когда на форму выносится реквизит с типом СписокЗначений, но в режиме «1С:Предприятие» пользователь не может ввести данные в строки списка вручную с клавиатуры. При попытке ввода ничего не происходит, либо при нажатии клавиши ввода форма сразу закрывается без сохранения значения. Разберем по шагам, почему это происходит и как правильно организовать ввод данных.
Проанализируем две основные причины, которые блокируют интерактивное редактирование элементов списка значений на форме:
СписокЗначений свойство Тип значения является составным (включает все доступные в конфигурации типы) либо неопределенным. В этом случае платформа 1С не знает, какое именно поле ввода (строку, число, дату или ссылку на справочник) нужно предоставить пользователю. Прямой ввод текста блокируется, и платформа ожидает предварительного выбора конкретного типа данных.Enter, Insert или двойной клик мыши расцениваются платформой как завершение подбора. В результате форма закрывается, пытаясь вернуть текущую пустую строку, так и не дав пользователю отредактировать ячейку.Если в список планируется вводить текстовые или числовые значения определенного типа, необходимо жестко ограничить состав типов реквизита. Выполним следующие действия:
СписокЗначений.Строка (при необходимости укажем фиксированную или переменную длину).ПолеВвода, а свойство ТолькоПросмотр отключено.После явного задания типа данных ячейка колонки «Значение» превращается в стандартное поле ввода, и пользователь может вводить текст напрямую с клавиатуры без вызова дополнительных диалогов.
Если при попытке добавить или изменить строку форма сразу закрывается, разберем настройку таблицы формы:
ВходПриВводе или Непосредственно.Посмотрим на пример программного возврата заполненного списка из формы выбора:
&НаКлиенте
Процедура КомандаВыбрать(Команда)
ОповеститьОВыборе(СписокЗначенийРеквизит);
КонецПроцедуры
Если задача заключается исключительно в том, чтобы дать пользователю возможность интерактивно заполнить или отредактировать список значений произвольного типа, создавать отдельную форму вручную не обязательно. Платформа предоставляет штатную процедуру ПоказатьРедактированиеСпискаЗначений.
Рассмотрим пример использования стандартного асинхронного окна редактирования списка значений:
&НаКлиенте
Процедура РедактироватьСписок(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеРедактированияСписка", ЭтотОбъект);
ПоказатьРедактированиеСпискаЗначений(Оповещение, МойСписокЗначений, "Заполните список значений");
КонецПроцедуры
&НаКлиенте
Процедура ПослеРедактированияСписка(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Обработка отредактированного списка значений
МойСписокЗначений = Результат;
КонецЕсли;
КонецПроцедуры
Если для бизнес-логики требуется создание сложной табличной формы с ручным вводом нескольких реквизитов, рекомендуется использовать реквизит формы с типом ТаблицаЗначений вместо типа СписокЗначений. Элемент управления, связанный со списком значений, имеет жестко предопределенный набор системных полей (Значение, Представление, Пометка, Картинка), что ограничивает возможности кастомизации интерфейса.
Создание таблицы значений с явно типизированной строковой колонкой позволяет избежать любых системных блокировок и обеспечивает привычный пользователю табличный ввод.