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