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

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

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

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

Список значений в 1С (объект «СписокЗначений») — это универсальная коллекция, которая хранит пары «значение + представление» и применяется повсюду: от выбора варианта в диалоге до передачи параметров в отчёты и динамические списки. Умение правильно добавлять в него элементы — базовый навык разработчика, от которого зависит корректность отборов, отчётов и интерфейсных механизмов.

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

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

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

Типичные места применения: список видов субконто в проводках, параметры отборов в СКД, список выбора у поля ввода, передача нескольких ссылок в запрос одним параметром, диалоги «Отметить элементы». Понимание структуры списка помогает выбрать правильный способ добавления и избежать дублей.

Базовое добавление через метод Добавить()

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

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

Список.Добавить(СсылкаНаКонтрагента, "ООО Ромашка");

Список.Добавить(42, "Числовой код");

НовыйЭлемент = Список.Добавить(ТекущаяДатаСеанса(), "Дата операции");

НовыйЭлемент.Пометка = Истина;

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

Практическая рекомендация: представление задавайте явно, когда значение — ссылка на объект с длинным наименованием или когда нужно показать составную информацию, например «Иванов И.И. (менеджер)». Это избавляет от неожиданностей при изменении наименования объекта в базе.

Вставка в нужную позицию и массовое наполнение

Метод Вставить() для контроля порядка

Когда порядок элементов важен — например, пункт «Все» должен стоять первым в списке выбора — используйте Вставить() с указанием индекса:

Список.Вставить(0, Неопределено, "Все контрагенты");

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

Загрузка из массива через ЗагрузитьЗначения()

Если значения уже собраны в массив — например, результат выгрузки колонки таблицы значений — наполнить список одной командой позволяет ЗагрузитьЗначения():

МассивСкладов = ТаблицаСкладов.ВыгрузитьКолонку("Склад");

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

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

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

bsl
Список = Новый СписокЗначений;
Для Каждого Элемент Из МассивЗначений Цикл
	Если Список.НайтиПоЗначению(Элемент) = Неопределено Тогда
		Список.Добавить(Элемент);
	КонецЕсли;
КонецЦикла;

Добавление с пометкой и картинкой

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

Элемент = Список.Добавить(ОтчетСсылка, "Отчёт по продажам");

Элемент.Пометка = Истина;

Элемент.Картинка = БиблиотекаКартинок.Отчет;

Картинка отображается слева от представления в диалогах и элементах управления. В качестве источника используйте библиотеку картинок конфигурации или общие картинки. Не злоупотребляйте уникальными картинками для каждого элемента: это усложняет восприятие списка и увеличивает объём передаваемых данных при работе через тонкий клиент.

После интерактивного выбора через Список.ОтметитьЭлементы() или ВыбратьЭлемент() состояние пометок читается в цикле по элементам списка — это стандартный приём для форм подбора.

Работа со списком в форме и на сервере

Реквизит формы типа «СписокЗначений» наполняется теми же методами, но в клиент-серверном режиме есть нюанс: список сериализуется между клиентом и сервером, поэтому хранить в нём несериализуемые объекты (например, COMОбъект или запрос) нельзя. Допустимы примитивные типы, ссылки, перечисления и другие сериализуемые значения.

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

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

Если список выбора нужно перестроить заново, сначала вызовите СписокВыбора.Очистить(), иначе старые значения останутся и появятся дубли с устаревшими ссылками.

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

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

Если Список.Количество() = 0 Тогда

Сообщить("Список не заполнен");

КонецЕсли;

Найденный = Список.НайтиПоЗначению(ИскомаяСсылка);

Если Найденный = Неопределено Тогда

Список.Добавить(ИскомаяСсылка);

КонецЕсли;

Сравнение значений при поиске выполняется с учётом типа: число 5 и строка «5» — разные значения. Это частая причина «не находит значение, которое точно добавлял». Проверяйте тип добавляемых данных, особенно когда значения приходят из внешних источников или из строк табличных документов, где всё по умолчанию имеет строковый тип.

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

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

Количество элементов
Норма

Список.Количество() соответствует числу добавленных значений

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

Ноль или меньше ожидаемого — проверьте источник данных и условия цикла

Тип значений
Норма

ТипЗнч(Элемент.Значение) совпадает с ожидаемым типом

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

Строки вместо ссылок — значения не преобразованы после чтения из файла или формы

Дубли
Норма

НайтиПоЗначению возвращает один элемент

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

Одинаковые значения встречаются несколько раз — добавьте проверку перед Добавить()

Типичные ошибки и альтернативы списку значений

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

Ещё одна распространённая ситуация: разработчик добавляет в список значения внутри цикла обхода результата запроса и не сбрасывает список между итерациями внешнего цикла. Итог — накопление данных из предыдущих проходов. Решение простое: создавайте новый список (Новый СписокЗначений) или вызывайте Очистить() в начале каждой итерации.

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

Сравнение способов наполнения

Добавить()

Универсальный метод: контроль представления, пометки и картинки. Подходит для поэлементного наполнения

Вставить()

Когда важна позиция элемента, например пункт «Все» первым в списке выбора

ЗагрузитьЗначения()

Быстрое наполнение из готового массива, но очищает список и не задаёт представления

ЗаполнитьЗначения()

Заменяет значения существующих элементов из массива без изменения структуры списка — редкий сценарий синхронизации

Итог

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

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

Часто задаваемые вопросы

Как добавить значение в список, только если его там ещё нет?

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

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

Да, ссылки — один из самых частых типов в списке. Список со ссылками можно передать в запрос одним параметром и использовать в условии «В (&Список)», а также применять как отбор в динамических списках и отчётах на СКД.

Как задать порядок элементов после наполнения списка?

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

Почему в поле ввода не отображаются добавленные значения?

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

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

Запрос принимает и массив, и список значений в условии «В». Список удобнее, когда те же данные параллельно показываются пользователю с представлениями и пометками. Если коллекция нужна только для запроса, массив проще и легче по объёму.

Как очистить список значений полностью?

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