Поля со списком значений в 1С: ввод, код и загрузка

· 9 мин

Содержание

Поле со списком заполняют двумя путями: пользователь выбирает значение мышью или набирает часть наименования, а разработчик присваивает значение в коде. В интерфейсе за выбор отвечают справочники, перечисления и объект «Список значений», в коде — присваивание реквизиту и методы коллекции СписокЗначений.

Сложность в том, что «поле со списком» — это не один объект, а четыре разных механизма: справочник, перечисление, СписокЗначений и поле с фиксированным списком выбора. У каждого свой способ заполнения и свои причины, по которым значение «не встаёт». Разберём их по порядку — для платформы 8.3 с интерфейсом «Такси».

Чем отличаются типы полей-списков

Внешне «поле со списком» выглядит одинаково — строка со стрелкой или кнопкой выбора. Но под ней лежат разные механизмы, и заполняются они по-разному.

  • 📗 Реквизит со ссылкой на справочник. Значение — элемент справочника (номенклатура, контрагент, организация). По кнопке выбора открывается форма списка справочника.
  • 📘 Реквизит типа перечисления. Набор значений жёстко задан в конфигураторе (например, статус заказа, вид операции). Пользователь выбирает из выпадающего меню, добавить своё значение нельзя.
  • 📙 Реквизит формы типа СписокЗначений. Универсальная коллекция, которую разработчик наполняет на лету: отборы, параметры отчёта, множественный выбор. В базе не хранится — живёт только на форме.
  • 📒 Поле ввода со списком выбора. Обычное поле примитивного типа (строка, число), которому задан фиксированный СписокВыбора — короткий перечень вариантов без отдельного справочника.

Первый шаг при любой задаче — понять, с каким из этих типов имеешь дело. От этого зависит и ручное заполнение, и код. Если поле ссылается на справочник, наполнять нужно справочник; если это перечисление — значения добавляют в конфигураторе; если СписокЗначений — заполняют в модуле формы.

Тип поляГде берутся значенияКак заполнить в кодеМожно добавить своё
Ссылка на справочникЭлементы справочникаСправочники.Имя.НайтиПо...Да, записью в справочник
ПеречислениеЗадано в конфигуратореПеречисления.Имя.ЗначениеНет, только в конфигураторе
СписокЗначений формыНаполняет разработчикметод Добавить / ЗагрузитьЗначенияДа, в модуле формы
Поле со СписокВыбораФиксированный переченьЭлементы.Поле.СписокВыбора.ДобавитьДа, в обработчике формы

Таблица помогает быстро выбрать инструмент: если значения меняются пользователями — это справочник; если набор стабилен и влияет на логику — перечисление; если список формируется под конкретную форму — СписокЗначений.

Выбор значения вручную и ввод по строке

Самый частый сценарий — пользователь заполняет поле руками. Доступны три приёма, и работают они одновременно.

  1. Кнопка выбора. Справа в поле есть кнопка (три точки или стрелка). Нажатие открывает форму выбора: список справочника, дерево групп или выпадающее меню перечисления.
  2. Ввод по строке. Начните печатать в поле часть наименования или кода — платформа подставит подходящие варианты выпадающим списком. Выберите нужный клавишами или мышью.
  3. Выпадающий список. Для перечислений и полей с заданным СписокВыбора стрелка раскрывает готовый перечень — выбираете одним щелчком.

Ввод по строке экономит время на документах с десятками строк: наберите «моло» — и получите «Молоко 2,5%», не открывая справочник целиком.

Если ввод по строке не находит элемент, которого точно нет в выпадающем меню, дело в настройке объекта. В конфигураторе у справочника есть свойство «Ввод по строке» — там перечислены реквизиты (наименование, код, артикул), по которым идёт поиск. Поле, не включённое в этот список, при вводе не ищется.

Чтобы поле вообще нельзя было заполнить произвольным текстом (только выбором), в свойствах элемента формы включают «Режим выбора из списка». Тогда клавиатурный ввод работает как фильтр, а не как свободный текст.

Когда по одной строке подходит сразу несколько элементов (две номенклатуры с похожим названием), платформа не подставляет первый попавшийся, а раскрывает список совпадений — выбираете нужный вручную. Если совпадений слишком много и список каждый раз получается длинным, добавьте в поиск код или артикул: по ним совпадение обычно одно.

Отдельная кнопка «Показать все» (или открытие по кнопке выбора) полезна, когда наименование вспомнить трудно, а нужный элемент проще найти по группе или по дополнительному реквизиту в форме списка.

Как заполнить реквизит значением в коде

Программное заполнение сводится к присваиванию. Главное — положить в реквизит значение правильного типа.

Ссылку на элемент справочника получают поиском или менеджером объекта:

// По наименованию
Документ.Организация = Справочники.Организации.НайтиПоНаименованию("Ромашка");

// По коду
Документ.Склад = Справочники.Склады.НайтиПоКоду("ОСН-01");

// Предопределённый элемент
Документ.Валюта = Справочники.Валюты.Рубль;

НайтиПоНаименованию вернёт пустую ссылку, если элемент не найден. Проверяйте результат через Найденная.Пустая(), иначе в реквизит попадёт пустое значение и документ проведётся с ошибкой.

Значение перечисления берут у его менеджера по имени из конфигуратора:

// Шаблон: Перечисления.<ИмяПеречисления>.<ИмяЗначения>
Заказ.Статус = Перечисления.СтатусыЗаказов.ВРаботе;

Чтобы заполнить табличную часть, добавляют строку и присваивают её реквизиты:

НоваяСтрока = Документ.Товары.Добавить();
НоваяСтрока.Номенклатура = НайденнаяНоменклатура;
НоваяСтрока.Количество  = 10;
НоваяСтрока.Цена        = 150;

Объект СписокЗначений на форме наполняют методом Добавить — он принимает само значение, представление (текст для пользователя), пометку и картинку:

Список = Новый СписокЗначений;
Список.Добавить(1, "Низкий приоритет");
Список.Добавить(2, "Средний приоритет");
Список.Добавить(3, "Высокий приоритет");

Прочитать заполненный список обратно — обходом коллекции. Пример полностью читает значение и представление каждого элемента:

Для Каждого Элемент Из Список Цикл
    Значение      = Элемент.Значение;
    Представление = Элемент.Представление;
    Сообщить(СтрШаблон("%1 = %2", Представление, Значение));
КонецЦикла;

Обратите внимание: число со строкой здесь не склеивается напрямую — СтрШаблон сам приводит значение к строке, поэтому ошибки преобразования типов не будет.

Если поле ввода на форме привязано к реквизиту примитивного типа, короткий перечень вариантов задают через СписокВыбора в обработчике создания формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Элементы.Приоритет.СписокВыбора.Добавить("Низкий");
    Элементы.Приоритет.СписокВыбора.Добавить("Средний");
    Элементы.Приоритет.СписокВыбора.Добавить("Высокий");
КонецПроцедуры

Когда одни и те же реквизиты нужно перенести из одного объекта в другой (скопировать шапку документа, перенести данные из формы в объект), вместо десятка строк присваивания применяют ЗаполнитьЗначенияСвойств — он копирует все одноимённые свойства разом:

ЗаполнитьЗначенияСвойств(НовыйДокумент, Образец);

Если список вариантов надо показать пользователю прямо из кода и дождаться его выбора, удобен вывод списка меню. На клиенте список значений показывают как меню, а результат разбирают в обработчике:

&НаКлиенте
Процедура ВыбратьПриоритет(Команда)
    Меню = Новый СписокЗначений;
    Меню.Добавить("Низкий");
    Меню.Добавить("Средний");
    Меню.Добавить("Высокий");

    Оповещение = Новый ОписаниеОповещения("ПослеВыбораПриоритета", ЭтотОбъект);
    ПоказатьВыборИзМеню(Оповещение, Меню);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораПриоритета(ВыбранныйЭлемент, ДопПараметры) Экспорт
    Если ВыбранныйЭлемент <> Неопределено Тогда
        Объект.Приоритет = ВыбранныйЭлемент.Значение;
    КонецЕсли;
КонецПроцедуры

ВыбранныйЭлемент будет Неопределено, если пользователь закрыл меню без выбора, — эту ветку обязательно проверяют, иначе получите ошибку обращения к несуществующему значению.

Ограничение набора доступных значений

Часто задача не «заполнить», а «не дать выбрать лишнее»: показать только договоры выбранного контрагента, только активные склады, только номенклатуру нужного вида. Для этого есть параметры выбора и связи.

Параметры выбора (ПараметрыВыбора) — фиксированное условие отбора. Задаются в свойствах реквизита или элемента формы: например, у поля «Договор» ограничить выбор значением «Действует = Истина». Тогда в форме выбора появятся только подходящие элементы.

Связи параметров выбора (СвязиПараметровВыбора) — условие, которое зависит от другого поля той же формы. Классика — «договор по контрагенту»: пока контрагент не выбран, список договоров пуст; выбрали контрагента — платформа показывает только его договоры. Связь настраивают в свойстве элемента формы, указывая ведущее поле-источник и реквизит, по которому идёт фильтр.

Если список выбора оказался пустым, первым делом проверьте связи параметров выбора. Частая причина — ведущее поле не заполнено, и фильтр отсекает вообще всё.

Для списков на форме (например, журнала или справочника) ограничение задают через отбор. В режиме «Такси» откройте настройку списка командой «Настроить список» в меню «Еще» командной панели — на закладке «Отбор» добавьте условие. Программно отбор динамического списка меняют через его компоновщик настроек, но для типовых задач хватает настройки списка в интерфейсе.

Отдельный инструмент — динамический список. Это элемент формы, который сам читает данные таблицы по мере прокрутки. У него есть собственные настройки отбора, порядка, группировки и условного оформления. Там же, в основной таблице списка, можно задать произвольный запрос — тогда поле-список показывает ровно те строки, которые вернул запрос.

Выбор между параметрами выбора и отбором динамического списка простой: параметры выбора ограничивают то, что пользователь может выбрать в поле ввода, а отбор списка ограничивает то, что видно в форме списка или журнала. Для поля в документе чаще нужны первые, для формы справочника — второй.

Если условие сложное (например, «договоры контрагента, действующие на дату документа»), одними параметрами выбора не обойтись — такие случаи решают через запрос в основной таблице динамического списка или через отбор, настроенный в коде по дате документа.

Загрузка значений из внешнего источника

Если список нужно наполнить из файла, запроса или другой базы, пригодятся методы массовой загрузки.

Из массива — метод ЗагрузитьЗначения заменяет содержимое списка целиком:

Массив = Новый Массив;
Массив.Добавить("Москва");
Массив.Добавить("Санкт-Петербург");
Массив.Добавить("Казань");

Список.ЗагрузитьЗначения(Массив);

Обратная операция — ВыгрузитьЗначения — вернёт массив значений, удобно передавать в параметр запроса или функцию.

Из результата запроса — обходят выборку и добавляют строки. В значение кладут ссылку, в представление — наименование:

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ Ссылка, Наименование
    |ИЗ Справочник.Склады
    |ГДЕ НЕ ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Список.Добавить(Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;

Из текстового файла — построчным чтением. Метод ПрочитатьСтроку возвращает Неопределено в конце файла, это и есть условие выхода:

Чтение = Новый ЧтениеТекста("c:\data\values.txt", "UTF-8");
Строка = Чтение.ПрочитатьСтроку();
Пока Строка <> Неопределено Цикл
    Список.Добавить(Строка);
    Строка = Чтение.ПрочитатьСтроку();
КонецЦикла;
Чтение.Закрыть();

В клиент-серверном варианте этот код читает файл на сервере, а не на компьютере пользователя. Чтобы загрузить файл с клиента, сначала поместите его на сервер через механизм помещения файлов, и только потом читайте.

Когда источник — другая конфигурация или внешняя система, значения сопоставляют с объектами базы. Строку «Москва» из файла находят в справочнике и в список кладут уже ссылку, а не текст — иначе значение не свяжется с данными и годится только для показа.

Что проверить, если поле не заполняется

Большинство проблем с полями-списками сводится к нескольким причинам. Сопоставьте симптом с причиной.

Диагностика: выберите симптом

Ещё одна тонкость — множественный выбор. Если поле должно принимать несколько значений, его тип делают СписокЗначений, а не ссылкой на один элемент. Тогда пользователь отмечает флажками несколько позиций, а код читает их обходом коллекции.

Частые вопросы

Чем «Список значений» отличается от массива?
СписокЗначений хранит не только значение, но и представление, пометку (флажок) и картинку для каждого элемента, а ещё умеет показывать форму выбора и сортироваться. Массив — просто упорядоченный набор значений без этих свойств. Для отборов и множественного выбора берут список, для простой передачи данных — массив.
Можно ли добавить свой вариант в перечисление из кода?
Нет. Состав перечисления задаётся в конфигураторе и в режиме «1С:Предприятие» не меняется. Если набор вариантов должен редактироваться пользователем, используйте справочник или поле с СписокВыбора.
Почему связь параметров выбора иногда очищает уже выбранное значение?
При смене ведущего поля платформа проверяет, проходит ли текущее значение по новому условию. Если контрагент сменился и прежний договор ему не принадлежит, значение сбрасывается — это штатное поведение, чтобы в документ не попали несовместимые данные.
Как заранее отметить часть элементов списка флажками?
При добавлении передавайте четвёртым параметром пометку: Список.Добавить(Значение, "Текст", Истина). Либо после заполнения пройдите по списку и установите Элемент.Пометка = Истина для нужных строк.
Список значений сохраняется после закрытия формы?
Нет, СписокЗначений существует только в памяти формы. Чтобы сохранить выбор между сеансами, запишите значения в реквизит объекта, в настройки пользователя или в хранилище настроек.