Разработка и Конфигурация · 11 мин
Как добавить элемент в список значений в 1С
Как добавить элемент в список значений 1С: метод Добавить(), работа со СпискомЗначений в коде, на форме и в полях ввода, типичные ошибки и проверка результата.
Список значений в 1С — это универсальная коллекция, которая хранит пары «значение — представление» и используется повсеместно: для заполнения выпадающих списков на формах, передачи параметров в отчёты СКД, выбора нескольких значений в отборах и хранения временных наборов данных в коде. Добавить элемент в такой список можно несколькими способами, и выбор зависит от того, где находится список: в программном коде, в реквизите формы или в поле ввода, которое заполняет пользователь.
Основной инструмент — метод Добавить() объекта СписокЗначений. Он принимает само значение, необязательное представление для отображения, признак пометки и картинку. Ошибки при работе с этим методом чаще всего связаны не с самим добавлением, а с типом добавляемого значения, дублями элементов и непониманием разницы между списком значений и массивом или таблицей значений.
Ниже разобраны все рабочие сценарии: программное добавление, заполнение списка выбора поля формы, интерактивное добавление пользователем, контроль дублей и типичные ошибки с примерами кода на встроенном языке 1С.
Что такое список значений и когда он используется
Объект СписокЗначений — это коллекция, каждый элемент которой содержит четыре свойства: Значение (сами данные произвольного типа), Представление (текст для отображения пользователю), Пометка (флажок выбора) и Картинка (значок элемента). Создать список можно конструктором Новый СписокЗначений, а в формах он часто уже существует как реквизит или как свойство СписокВыбора у поля ввода.
Типичные области применения: выпадающие списки в полях ввода, множественный выбор значений в отборах динамических списков и отчётов, передача списка ссылок между процедурами, временное хранение выбранных пользователем данных. В отличие от массива, список значений умеет сериализоваться и храниться, например, в хранилище значения, а в отличие от таблицы значений — не требует описания колонок.
Как добавить элемент методом Добавить()
Базовый синтаксис метода: Список.Добавить(Значение, Представление, Пометка, Картинка). Все параметры, кроме первого, необязательны. Если представление не указано, 1С автоматически формирует его из значения — для ссылок это будет стандартное представление объекта, для примитивных типов — строковое преобразование.
Список = Новый СписокЗначений;
// Простое добавление значения
Список.Добавить("Москва");
// Значение с явным представлением
Список.Добавить("СПб", "Санкт-Петербург");
// Значение с пометкой (флажок установлен)
Список.Добавить(СсылкаНоменклатура, , Истина);
// Перебор и вывод результата
Для Каждого Элемент Из Список Цикл
Сообщить(Элемент.Значение);
КонецЦикла;
Метод возвращает ссылку на добавленный элемент списка, что удобно, если нужно сразу дозаполнить его свойства — например, установить картинку или изменить представление после добавления. Элементы списка имеют индексы от нуля, обратиться к конкретному элементу можно через Список[Индекс] или методом Получить(Индекс).
- 1Создайте объект: Список = Новый СписокЗначений
- 2Вызовите Список.Добавить(Значение, Представление, Пометка)
- 3При необходимости проверьте дубль через НайтиПоЗначению()
- 4Проверьте результат перебором списка или по свойству Количество()
Добавление в список выбора поля формы
Частая практическая задача — заполнить выпадающий список у поля ввода на управляемой форме. Для этого используется свойство СписокВыбора элемента формы, которое само является списком значений и поддерживает тот же метод Добавить(). Заполнение обычно выполняется в обработчике ПриСозданииНаСервере.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СписокВыбора = Элементы.СпособДоставки.СписокВыбора;
СписокВыбора.Добавить("Самовывоз", "Самовывоз со склада");
СписокВыбора.Добавить("Курьер", "Доставка курьером");
СписокВыбора.Добавить("ТК", "Транспортная компания");
КонецПроцедуры
Если список нужно заполнять динамически — например, по данным из базы — используйте запрос и обход выборки. Важно: при повторном открытии формы или перезаполнении очищайте список методом Очистить(), иначе элементы будут дублироваться при каждом обращении к процедуре заполнения.
Динамическое заполнение из справочника
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование
|ИЗ Справочник.Склады ГДЕ НЕ ПометкаУдаления");
Выборка = Запрос.Выполнить().Выбрать();
Элементы.Склад.СписокВыбора.Очистить();
Пока Выборка.Следующий() Цикл
Элементы.Склад.СписокВыбора.Добавить(
Выборка.Ссылка, Выборка.Наименование);
КонецЦикла;
Интерактивное добавление пользователем
Когда список значений выведен на форму как реквизит (например, таблица с одной колонкой или поле со списком пометок), пользователь добавляет элементы кнопкой «Добавить» или клавишей Insert. Чтобы новый элемент получил осмысленное значение, а не пустое, назначьте списку тип через ТипЗначения — тогда при добавлении 1С предложит выбрать значение нужного типа.
// В модуле формы: ограничиваем тип элементов списка
СписокНоменклатуры.ТипЗначения =
Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
Если нужно программно открыть пользователю диалог выбора и добавить выбранное значение, используйте ПоказатьВыборИзСписка или открытие формы выбора справочника с обработчиком оповещения. В тонком клиенте все интерактивные вызовы выполняются асинхронно, результат обрабатывается в отдельной процедуре-обработчике.
Проверка дублей и контроль типов
Список значений по умолчанию допускает дубликаты — метод Добавить() не проверяет уникальность. Если дубли недопустимы, перед добавлением выполняйте поиск методом НайтиПоЗначению(): он вернёт элемент списка или Неопределено, если значение не найдено.
Процедура ДобавитьУникальное(Список, Значение, Представление = "")
Если Список.НайтиПоЗначению(Значение) <> Неопределено Тогда
Возврат; // уже есть в списке
КонецЕсли;
Список.Добавить(Значение, Представление);
КонецПроцедуры
Вторая частая проблема — несоответствие типов. Если список на форме имеет ограничение ТипЗначения, попытка добавить значение другого типа вызовет ошибку или значение будет приведено к допустимому типу с потерей данных. Перед добавлением убедитесь, что тип значения входит в описание типов списка, особенно при загрузке данных из внешних источников.
Альтернативы: массив, таблица значений, соответствие
Список значений не всегда оптимален. Если нужна просто упорядоченная коллекция без представлений и пометок, легче использовать массив с методом Добавить(). Если требуется быстрый поиск по ключу, лучше подходит соответствие. Для структурированных данных с несколькими полями на элемент — таблица значений.
Сравнение вариантов
Нужны представления, пометки, выбор из списка на форме, передача в отчёты СКД. Медленнее массива при больших объёмах
Простая коллекция значений для обработки в коде. Нет представлений и пометок, не отображается на форме напрямую
Быстрый поиск по ключу. Нет порядка следования и индексного доступа
Несколько полей у каждого элемента, вывод в табличное поле. Требует описания колонок, тяжелее списка
Между коллекциями есть мосты: список значений заполняется из массива методом ЗагрузитьЗначения(), а выгружается обратно методом ВыгрузитьЗначения(). Это удобно, когда данные обрабатываются как массив, а на форму выводятся как список.
Проверка результата после добавления
После добавления убедитесь, что элемент реально попал в список и имеет ожидаемые свойства. Простейший контроль — количество элементов и перебор с выводом значений.
Как проверить результат
Число увеличилось на количество добавленных элементов
Количество не изменилось — добавление не выполнилось или список очищен позже
Метод возвращает элемент, а не Неопределено
Возвращает Неопределено — добавлено другое значение или другого типа
Новый пункт виден в выпадающем списке поля
Пункт отсутствует — заполнен другой элемент формы или список очищен после заполнения
// Быстрая диагностика в консоли кода или отладчике
Сообщить("Элементов: " + Список.Количество());
Для Каждого Эл Из Список Цикл
Сообщить(Строка(Эл.Значение) + " | " + Эл.Представление
+ " | Пометка: " + Эл.Пометка);
КонецЦикла;
Что важно запомнить
Элемент добавляется методом Добавить(Значение, Представление, Пометка). Для полей формы работайте со свойством СписокВыбора и очищайте его перед повторным заполнением. Контролируйте дубли через НайтиПоЗначению() и следите за соответствием типа значения типу списка.
Частые вопросы
Как добавить элемент в список значений, если он находится в реквизите объекта?
Реквизиты типа СписокЗначений в объектах конфигурации встречаются редко — чаще используются табличные части. Если реквизит именно список значений, получите объект методом ПолучитьОбъект(), вызовите Добавить() у реквизита и запишите объект методом Записать(). Без записи изменения сохранятся только в памяти.
Как вставить элемент не в конец, а в нужную позицию?
Используйте метод Вставить(Индекс, Значение, Представление, Пометка) — он добавляет элемент в указанную позицию, сдвигая последующие. Индексация начинается с нуля. Для перемещения существующего элемента есть метод Сдвинуть(Элемент, Смещение).
Почему НайтиПоЗначению не находит добавленный элемент?
Чаще всего несовпадение типов: добавлена строка «001», а ищется ссылка, или добавлено число, а ищется строка. Поиск сравнивает значения с учётом типа. Проверьте тип добавляемого значения через ТипЗнч() и приведите его к типу поиска.
Как добавить сразу несколько значений из массива?
Вызовите Список.ЗагрузитьЗначения(Массив) — список будет полностью заменён содержимым массива. Если нужно дополнить существующий список, а не заменить его, перебирайте массив циклом и вызывайте Добавить() для каждого элемента.
Можно ли добавить элемент в список значений на клиенте без вызова сервера?
Да, если список является реквизитом формы типа СписокЗначений — он доступен и на клиенте, метод Добавить() работает в клиентском контексте. Ограничение: на клиенте нельзя выполнять запросы к базе, поэтому данные для заполнения из справочников получают на сервере.
Чем список значений отличается от табличной части при хранении данных?
Список значений — временная коллекция в памяти, не хранится в базе напрямую (только через сериализацию в хранилище значения). Табличная часть — часть объекта конфигурации, физически сохраняется в базе данных вместе с объектом и доступна для запросов.