Поля со списком значений в 1С: ввод, код и загрузка
Содержание
Поле со списком заполняют двумя путями: пользователь выбирает значение мышью или набирает часть наименования, а разработчик присваивает значение в коде. В интерфейсе за выбор отвечают справочники, перечисления и объект «Список значений», в коде — присваивание реквизиту и методы коллекции СписокЗначений.
Сложность в том, что «поле со списком» — это не один объект, а четыре разных механизма: справочник, перечисление, СписокЗначений и поле с фиксированным списком выбора. У каждого свой способ заполнения и свои причины, по которым значение «не встаёт». Разберём их по порядку — для платформы 8.3 с интерфейсом «Такси».
Чем отличаются типы полей-списков
Внешне «поле со списком» выглядит одинаково — строка со стрелкой или кнопкой выбора. Но под ней лежат разные механизмы, и заполняются они по-разному.
- 📗 Реквизит со ссылкой на справочник. Значение — элемент справочника (номенклатура, контрагент, организация). По кнопке выбора открывается форма списка справочника.
- 📘 Реквизит типа перечисления. Набор значений жёстко задан в конфигураторе (например, статус заказа, вид операции). Пользователь выбирает из выпадающего меню, добавить своё значение нельзя.
- 📙 Реквизит формы типа
СписокЗначений. Универсальная коллекция, которую разработчик наполняет на лету: отборы, параметры отчёта, множественный выбор. В базе не хранится — живёт только на форме. - 📒 Поле ввода со списком выбора. Обычное поле примитивного типа (строка, число), которому задан фиксированный
СписокВыбора— короткий перечень вариантов без отдельного справочника.
Первый шаг при любой задаче — понять, с каким из этих типов имеешь дело. От этого зависит и ручное заполнение, и код. Если поле ссылается на справочник, наполнять нужно справочник; если это перечисление — значения добавляют в конфигураторе; если СписокЗначений — заполняют в модуле формы.
| Тип поля | Где берутся значения | Как заполнить в коде | Можно добавить своё |
|---|---|---|---|
| Ссылка на справочник | Элементы справочника | Справочники.Имя.НайтиПо... | Да, записью в справочник |
| Перечисление | Задано в конфигураторе | Перечисления.Имя.Значение | Нет, только в конфигураторе |
СписокЗначений формы | Наполняет разработчик | метод Добавить / ЗагрузитьЗначения | Да, в модуле формы |
Поле со СписокВыбора | Фиксированный перечень | Элементы.Поле.СписокВыбора.Добавить | Да, в обработчике формы |
Таблица помогает быстро выбрать инструмент: если значения меняются пользователями — это справочник; если набор стабилен и влияет на логику — перечисление; если список формируется под конкретную форму — СписокЗначений.
Выбор значения вручную и ввод по строке
Самый частый сценарий — пользователь заполняет поле руками. Доступны три приёма, и работают они одновременно.
- Кнопка выбора. Справа в поле есть кнопка (три точки или стрелка). Нажатие открывает форму выбора: список справочника, дерево групп или выпадающее меню перечисления.
- Ввод по строке. Начните печатать в поле часть наименования или кода — платформа подставит подходящие варианты выпадающим списком. Выберите нужный клавишами или мышью.
- Выпадающий список. Для перечислений и полей с заданным
СписокВыборастрелка раскрывает готовый перечень — выбираете одним щелчком.
Ввод по строке экономит время на документах с десятками строк: наберите «моло» — и получите «Молоко 2,5%», не открывая справочник целиком.
Если ввод по строке не находит элемент, которого точно нет в выпадающем меню, дело в настройке объекта. В конфигураторе у справочника есть свойство «Ввод по строке» — там перечислены реквизиты (наименование, код, артикул), по которым идёт поиск. Поле, не включённое в этот список, при вводе не ищется.
Чтобы поле вообще нельзя было заполнить произвольным текстом (только выбором), в свойствах элемента формы включают «Режим выбора из списка». Тогда клавиатурный ввод работает как фильтр, а не как свободный текст.
Когда по одной строке подходит сразу несколько элементов (две номенклатуры с похожим названием), платформа не подставляет первый попавшийся, а раскрывает список совпадений — выбираете нужный вручную. Если совпадений слишком много и список каждый раз получается длинным, добавьте в поиск код или артикул: по ним совпадение обычно одно.
Отдельная кнопка «Показать все» (или открытие по кнопке выбора) полезна, когда наименование вспомнить трудно, а нужный элемент проще найти по группе или по дополнительному реквизиту в форме списка.
Как заполнить реквизит значением в коде
Программное заполнение сводится к присваиванию. Главное — положить в реквизит значение правильного типа.
Ссылку на элемент справочника получают поиском или менеджером объекта:
// По наименованию
Документ.Организация = Справочники.Организации.НайтиПоНаименованию("Ромашка");
// По коду
Документ.Склад = Справочники.Склады.НайтиПоКоду("ОСН-01");
// Предопределённый элемент
Документ.Валюта = Справочники.Валюты.Рубль;
НайтиПоНаименованию вернёт пустую ссылку, если элемент не найден. Проверяйте результат через Найденная.Пустая(), иначе в реквизит попадёт пустое значение и документ проведётся с ошибкой.
Значение перечисления берут у его менеджера по имени из конфигуратора:
// Шаблон: Перечисления.<ИмяПеречисления>.<ИмяЗначения>
Заказ.Статус = Перечисления.СтатусыЗаказов.ВРаботе;
Чтобы заполнить табличную часть, добавляют строку и присваивают её реквизиты:
НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
НоваяСтрока.Количество = 10;
НоваяСтрока.Цена = 150;
Объект СписокЗначений на форме наполняют методом Добавить — он принимает само значение, представление (текст для пользователя), пометку и картинку:
Список = Новый СписокЗначений;
Список.Добавить(1, "Низкий приоритет");
Список.Добавить(2, "Средний приоритет");
Список.Добавить(3, "Высокий приоритет");
Прочитать заполненный список обратно — обходом коллекции. Пример полностью читает значение и представление каждого элемента:
Для Каждого Элемент Из Список Цикл
Значение = Элемент.Значение;
Представление = Элемент.Представление;
Сообщить(СтрШаблон("%1 = %2", Представление, Значение));
КонецЦикла;
Обратите внимание: число со строкой здесь не склеивается напрямую — СтрШаблон сам приводит значение к строке, поэтому ошибки преобразования типов не будет.
Если поле ввода на форме привязано к реквизиту примитивного типа, короткий перечень вариантов задают через СписокВыбора в обработчике создания формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Приоритет.СписокВыбора.Добавить("Низкий");
Элементы.Приоритет.СписокВыбора.Добавить("Средний");
Элементы.Приоритет.СписокВыбора.Добавить("Высокий");
КонецПроцедуры
Когда одни и те же реквизиты нужно перенести из одного объекта в другой (скопировать шапку документа, перенести данные из формы в объект), вместо десятка строк присваивания применяют ЗаполнитьЗначенияСвойств — он копирует все одноимённые свойства разом:
ЗаполнитьЗначенияСвойств(НовыйДокумент, Образец);
Если список вариантов надо показать пользователю прямо из кода и дождаться его выбора, удобен вывод списка меню. На клиенте список значений показывают как меню, а результат разбирают в обработчике:
&НаКлиенте
Процедура ВыбратьПриоритет(Команда)
Меню = Новый СписокЗначений;
Меню.Добавить("Низкий");
Меню.Добавить("Средний");
Меню.Добавить("Высокий");
Оповещение = Новый ОписаниеОповещения("ПослеВыбораПриоритета", ЭтотОбъект);
ПоказатьВыборИзМеню(Оповещение, Меню);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПриоритета(ВыбранныйЭлемент, ДопПараметры) Экспорт
Если ВыбранныйЭлемент <> Неопределено Тогда
Объект.Приоритет = ВыбранныйЭлемент.Значение;
КонецЕсли;
КонецПроцедуры
ВыбранныйЭлемент будет Неопределено, если пользователь закрыл меню без выбора, — эту ветку обязательно проверяют, иначе получите ошибку обращения к несуществующему значению.
Ограничение набора доступных значений
Часто задача не «заполнить», а «не дать выбрать лишнее»: показать только договоры выбранного контрагента, только активные склады, только номенклатуру нужного вида. Для этого есть параметры выбора и связи.
Параметры выбора (ПараметрыВыбора) — фиксированное условие отбора. Задаются в свойствах реквизита или элемента формы: например, у поля «Договор» ограничить выбор значением «Действует = Истина». Тогда в форме выбора появятся только подходящие элементы.
Связи параметров выбора (СвязиПараметровВыбора) — условие, которое зависит от другого поля той же формы. Классика — «договор по контрагенту»: пока контрагент не выбран, список договоров пуст; выбрали контрагента — платформа показывает только его договоры. Связь настраивают в свойстве элемента формы, указывая ведущее поле-источник и реквизит, по которому идёт фильтр.
Если список выбора оказался пустым, первым делом проверьте связи параметров выбора. Частая причина — ведущее поле не заполнено, и фильтр отсекает вообще всё.
Для списков на форме (например, журнала или справочника) ограничение задают через отбор. В режиме «Такси» откройте настройку списка командой «Настроить список» в меню «Еще» командной панели — на закладке «Отбор» добавьте условие. Программно отбор динамического списка меняют через его компоновщик настроек, но для типовых задач хватает настройки списка в интерфейсе.
Отдельный инструмент — динамический список. Это элемент формы, который сам читает данные таблицы по мере прокрутки. У него есть собственные настройки отбора, порядка, группировки и условного оформления. Там же, в основной таблице списка, можно задать произвольный запрос — тогда поле-список показывает ровно те строки, которые вернул запрос.
Выбор между параметрами выбора и отбором динамического списка простой: параметры выбора ограничивают то, что пользователь может выбрать в поле ввода, а отбор списка ограничивает то, что видно в форме списка или журнала. Для поля в документе чаще нужны первые, для формы справочника — второй.
Если условие сложное (например, «договоры контрагента, действующие на дату документа»), одними параметрами выбора не обойтись — такие случаи решают через запрос в основной таблице динамического списка или через отбор, настроенный в коде по дате документа.
Загрузка значений из внешнего источника
Если список нужно наполнить из файла, запроса или другой базы, пригодятся методы массовой загрузки.
Из массива — метод ЗагрузитьЗначения заменяет содержимое списка целиком:
Массив = Новый Массив;
Массив.Добавить("Москва");
Массив.Добавить("Санкт-Петербург");
Массив.Добавить("Казань");
Список.ЗагрузитьЗначения(Массив);
Обратная операция — ВыгрузитьЗначения — вернёт массив значений, удобно передавать в параметр запроса или функцию.
Из результата запроса — обходят выборку и добавляют строки. В значение кладут ссылку, в представление — наименование:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ Ссылка, Наименование
|ИЗ Справочник.Склады
|ГДЕ НЕ ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;
Из текстового файла — построчным чтением. Метод ПрочитатьСтроку возвращает Неопределено в конце файла, это и есть условие выхода:
Чтение = Новый ЧтениеТекста("c:\data\values.txt", "UTF-8");
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
Список.Добавить(Строка);
Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();
В клиент-серверном варианте этот код читает файл на сервере, а не на компьютере пользователя. Чтобы загрузить файл с клиента, сначала поместите его на сервер через механизм помещения файлов, и только потом читайте.
Когда источник — другая конфигурация или внешняя система, значения сопоставляют с объектами базы. Строку «Москва» из файла находят в справочнике и в список кладут уже ссылку, а не текст — иначе значение не свяжется с данными и годится только для показа.
Что проверить, если поле не заполняется
Большинство проблем с полями-списками сводится к нескольким причинам. Сопоставьте симптом с причиной.
СписокВыбора — список не заполнили в обработчике формы.ПараметрыВыбора и настройку отбора списка.НайтиПоНаименованию/НайтиПоКоду не нашли элемент и вернули пустое значение. Добавьте проверку Пустая() перед присваиванием.Ещё одна тонкость — множественный выбор. Если поле должно принимать несколько значений, его тип делают СписокЗначений, а не ссылкой на один элемент. Тогда пользователь отмечает флажками несколько позиций, а код читает их обходом коллекции.
Частые вопросы
Чем «Список значений» отличается от массива?
СписокЗначений хранит не только значение, но и представление, пометку (флажок) и картинку для каждого элемента, а ещё умеет показывать форму выбора и сортироваться. Массив — просто упорядоченный набор значений без этих свойств. Для отборов и множественного выбора берут список, для простой передачи данных — массив.Можно ли добавить свой вариант в перечисление из кода?
СписокВыбора.Почему связь параметров выбора иногда очищает уже выбранное значение?
Как заранее отметить часть элементов списка флажками?
Список.Добавить(Значение, "Текст", Истина). Либо после заполнения пройдите по списку и установите Элемент.Пометка = Истина для нужных строк.Список значений сохраняется после закрытия формы?
СписокЗначений существует только в памяти формы. Чтобы сохранить выбор между сеансами, запишите значения в реквизит объекта, в настройки пользователя или в хранилище настроек.