К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как добавить элемент в список значений в 1С

Как добавить элемент в список значений 1С: метод Добавить(), работа со СпискомЗначений в коде, на форме и в полях ввода, типичные ошибки и проверка результата.

Список значений в 1С — это универсальная коллекция, которая хранит пары «значение — представление» и используется повсеместно: для заполнения выпадающих списков на формах, передачи параметров в отчёты СКД, выбора нескольких значений в отборах и хранения временных наборов данных в коде. Добавить элемент в такой список можно несколькими способами, и выбор зависит от того, где находится список: в программном коде, в реквизите формы или в поле ввода, которое заполняет пользователь.

Основной инструмент — метод Добавить() объекта СписокЗначений. Он принимает само значение, необязательное представление для отображения, признак пометки и картинку. Ошибки при работе с этим методом чаще всего связаны не с самим добавлением, а с типом добавляемого значения, дублями элементов и непониманием разницы между списком значений и массивом или таблицей значений.

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

Что такое список значений и когда он используется

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

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

Как добавить элемент методом Добавить()

Базовый синтаксис метода: Список.Добавить(Значение, Представление, Пометка, Картинка). Все параметры, кроме первого, необязательны. Если представление не указано, 1С автоматически формирует его из значения — для ссылок это будет стандартное представление объекта, для примитивных типов — строковое преобразование.

Список = Новый СписокЗначений;

// Простое добавление значения

Список.Добавить("Москва");

// Значение с явным представлением

Список.Добавить("СПб", "Санкт-Петербург");

// Значение с пометкой (флажок установлен)

Список.Добавить(СсылкаНоменклатура, , Истина);

// Перебор и вывод результата

Для Каждого Элемент Из Список Цикл

Сообщить(Элемент.Значение);

КонецЦикла;

Метод возвращает ссылку на добавленный элемент списка, что удобно, если нужно сразу дозаполнить его свойства — например, установить картинку или изменить представление после добавления. Элементы списка имеют индексы от нуля, обратиться к конкретному элементу можно через Список[Индекс] или методом Получить(Индекс).

Порядок действий
  1. 1
    Создайте объект: Список = Новый СписокЗначений
  2. 2
    Вызовите Список.Добавить(Значение, Представление, Пометка)
  3. 3
    При необходимости проверьте дубль через НайтиПоЗначению()
  4. 4
    Проверьте результат перебором списка или по свойству Количество()

Добавление в список выбора поля формы

Частая практическая задача — заполнить выпадающий список у поля ввода на управляемой форме. Для этого используется свойство СписокВыбора элемента формы, которое само является списком значений и поддерживает тот же метод Добавить(). Заполнение обычно выполняется в обработчике ПриСозданииНаСервере.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

СписокВыбора = Элементы.СпособДоставки.СписокВыбора;

СписокВыбора.Добавить("Самовывоз", "Самовывоз со склада");

СписокВыбора.Добавить("Курьер", "Доставка курьером");

СписокВыбора.Добавить("ТК", "Транспортная компания");

КонецПроцедуры

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

Динамическое заполнение из справочника

Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование

|ИЗ Справочник.Склады ГДЕ НЕ ПометкаУдаления");

Выборка = Запрос.Выполнить().Выбрать();

Элементы.Склад.СписокВыбора.Очистить();

Пока Выборка.Следующий() Цикл

Элементы.Склад.СписокВыбора.Добавить(

Выборка.Ссылка, Выборка.Наименование);

КонецЦикла;

Интерактивное добавление пользователем

Когда список значений выведен на форму как реквизит (например, таблица с одной колонкой или поле со списком пометок), пользователь добавляет элементы кнопкой «Добавить» или клавишей Insert. Чтобы новый элемент получил осмысленное значение, а не пустое, назначьте списку тип через ТипЗначения — тогда при добавлении 1С предложит выбрать значение нужного типа.

// В модуле формы: ограничиваем тип элементов списка

СписокНоменклатуры.ТипЗначения =

Новый ОписаниеТипов("СправочникСсылка.Номенклатура");

Если нужно программно открыть пользователю диалог выбора и добавить выбранное значение, используйте ПоказатьВыборИзСписка или открытие формы выбора справочника с обработчиком оповещения. В тонком клиенте все интерактивные вызовы выполняются асинхронно, результат обрабатывается в отдельной процедуре-обработчике.

Проверка дублей и контроль типов

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

Процедура ДобавитьУникальное(Список, Значение, Представление = "")

Если Список.НайтиПоЗначению(Значение) <> Неопределено Тогда

Возврат; // уже есть в списке

КонецЕсли;

Список.Добавить(Значение, Представление);

КонецПроцедуры

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

Типичные ошибки
01
Добавление без проверки дублей — список разрастается одинаковыми значениями, отборы и отчёты работают некорректно
02
Повторное заполнение СписокВыбора без Очистить() — элементы дублируются при каждом открытии формы
03
Несовпадение типа значения с ТипЗначения списка — ошибка выполнения или потеря данных при приведении типов
04
Передача представления вместо значения — в список попадает строка вместо ссылки, последующий поиск по ссылке не находит элемент

Альтернативы: массив, таблица значений, соответствие

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

Сравнение вариантов

Список значений

Нужны представления, пометки, выбор из списка на форме, передача в отчёты СКД. Медленнее массива при больших объёмах

Массив

Простая коллекция значений для обработки в коде. Нет представлений и пометок, не отображается на форме напрямую

Соответствие

Быстрый поиск по ключу. Нет порядка следования и индексного доступа

Таблица значений

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

Между коллекциями есть мосты: список значений заполняется из массива методом ЗагрузитьЗначения(), а выгружается обратно методом ВыгрузитьЗначения(). Это удобно, когда данные обрабатываются как массив, а на форму выводятся как список.

Проверка результата после добавления

После добавления убедитесь, что элемент реально попал в список и имеет ожидаемые свойства. Простейший контроль — количество элементов и перебор с выводом значений.

Контрольные точки

Как проверить результат

Количество элементов: Список.Количество()
Норма

Число увеличилось на количество добавленных элементов

Тревожный признак

Количество не изменилось — добавление не выполнилось или список очищен позже

Поиск добавленного: НайтиПоЗначению()
Норма

Метод возвращает элемент, а не Неопределено

Тревожный признак

Возвращает Неопределено — добавлено другое значение или другого типа

Отображение на форме
Норма

Новый пункт виден в выпадающем списке поля

Тревожный признак

Пункт отсутствует — заполнен другой элемент формы или список очищен после заполнения

// Быстрая диагностика в консоли кода или отладчике

Сообщить("Элементов: " + Список.Количество());

Для Каждого Эл Из Список Цикл

Сообщить(Строка(Эл.Значение) + " | " + Эл.Представление

+ " | Пометка: " + Эл.Пометка);

КонецЦикла;

Итог

Что важно запомнить

Элемент добавляется методом Добавить(Значение, Представление, Пометка). Для полей формы работайте со свойством СписокВыбора и очищайте его перед повторным заполнением. Контролируйте дубли через НайтиПоЗначению() и следите за соответствием типа значения типу списка.

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

Как добавить элемент в список значений, если он находится в реквизите объекта?

Реквизиты типа СписокЗначений в объектах конфигурации встречаются редко — чаще используются табличные части. Если реквизит именно список значений, получите объект методом ПолучитьОбъект(), вызовите Добавить() у реквизита и запишите объект методом Записать(). Без записи изменения сохранятся только в памяти.

Как вставить элемент не в конец, а в нужную позицию?

Используйте метод Вставить(Индекс, Значение, Представление, Пометка) — он добавляет элемент в указанную позицию, сдвигая последующие. Индексация начинается с нуля. Для перемещения существующего элемента есть метод Сдвинуть(Элемент, Смещение).

Почему НайтиПоЗначению не находит добавленный элемент?

Чаще всего несовпадение типов: добавлена строка «001», а ищется ссылка, или добавлено число, а ищется строка. Поиск сравнивает значения с учётом типа. Проверьте тип добавляемого значения через ТипЗнч() и приведите его к типу поиска.

Как добавить сразу несколько значений из массива?

Вызовите Список.ЗагрузитьЗначения(Массив) — список будет полностью заменён содержимым массива. Если нужно дополнить существующий список, а не заменить его, перебирайте массив циклом и вызывайте Добавить() для каждого элемента.

Можно ли добавить элемент в список значений на клиенте без вызова сервера?

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

Чем список значений отличается от табличной части при хранении данных?

Список значений — временная коллекция в памяти, не хранится в базе напрямую (только через сериализацию в хранилище значения). Табличная часть — часть объекта конфигурации, физически сохраняется в базе данных вместе с объектом и доступна для запросов.