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

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

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

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

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

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

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

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

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

Программное добавление строки методом Добавить()

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

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

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

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

Список.Добавить(Справочники.Контрагенты.НайтиПоКоду("000001"), "Основной контрагент", Истина);

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

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

НоваяСтрока = Список.Добавить(ТекущаяДатаСеанса(), "Дата отгрузки");

НоваяСтрока.Картинка = БиблиотекаКартинок.Календарь;

bsl
Список = Новый СписокЗначений;
Элемент = Список.Добавить(Значение, "Представление", Истина);
Элемент.Картинка = БиблиотекаКартинок.Информация;

Вставка строки в нужную позицию

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

Список.Вставить(0, "Срочно", "Приоритетная задача");

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

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

Когда список значений является реквизитом формы и выведен в табличное поле, пользователь может добавлять строки вручную: кнопкой «Добавить» на командной панели таблицы, клавишей Insert или через контекстное меню. Если кнопка недоступна, проверьте свойство «Изменять состав строк» у таблицы формы и признак «Только просмотр».

Программно строка в реквизит формы добавляется тем же методом Добавить() — обращение идёт к реквизиту по имени:

&НаКлиенте

Процедура ДобавитьСтроку(Команда)

СписокДокументов.Добавить(ТекущийДокумент, Строка(ТекущийДокумент));

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

Отображение на форме обновляется автоматически, отдельный вызов обновления не нужен. Частая ситуация: разработчик создаёт локальную переменную Новый СписокЗначений внутри процедуры, добавляет в неё строки — и удивляется, что на форме ничего не появилось. Локальная переменная и реквизит формы — разные объекты; чтобы данные попали на форму, работать нужно именно с реквизитом или присвоить ему готовый список целиком.

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

Добавление нескольких строк и загрузка готового набора

Если строк много, их добавляют в цикле. Например, заполнение списка из выборки запроса или массива:

Для Каждого СтрокаВыборки Из Выборка Цикл

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

КонецЦикла;

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

МассивКонтрагентов = Новый Массив;

МассивКонтрагентов.Добавить(Контрагент1);

МассивКонтрагентов.Добавить(Контрагент2);

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

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

Проверка дублей и поиск перед добавлением

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

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

Список.Добавить(НовыйКонтрагент);

КонецЕсли;

Метод возвращает найденный элемент списка или Неопределено, если значения нет. Сравнение идёт по значению, а не по представлению: две строки с одинаковым представлением, но разными ссылками считаются разными элементами. Для ссылочных типов сравнение выполняется по ссылке, что обычно и требуется в учётных задачах.

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

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

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

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

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

Количество не изменилось — добавление шло в другую переменную

Значение в строке
Норма

Список[0].Значение возвращает добавленное значение нужного типа

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

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

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

Новая строка видна в табличном поле сразу после добавления

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

Строка есть в данных, но не видна — проверьте отбор или связанный реквизит

Типичные ошибки и ограничения

Самая частая ошибка — перепутанный порядок параметров. Разработчик пишет Список.Добавить("Представление", Значение), и в значение строки попадает строка-представление, а само значение уходит в представление. Запомните порядок: сначала значение, затем представление, затем пометка.

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

Типичные ошибки
01
Перепутан порядок параметров Добавить() — представление попадает в значение, ломается дальнейшая логика сравнения
02
Добавление в локальную переменную вместо реквизита формы — на форме ничего не появляется
03
ЗагрузитьЗначения() вместо цикла — стираются ранее добавленные строки
04
Отсутствие проверки на дубли — в списке накапливаются одинаковые значения, отборы работают неверно
05
Вставка по индексу больше размера списка — ошибка «Неверное значение индекса»

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

Когда список значений — не лучший выбор

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

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

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

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

Массив

Простой набор однотипных значений без представлений и пометок. Нет встроенного отображения на форме

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

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

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

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

Итог

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

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

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

Как добавить строку в начало списка, а не в конец?

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

Почему после Добавить() строка не видна на форме?

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

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

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

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

Да, список значений хранит любые типы, включая ссылки. При выводе на форму ссылка отобразится своим представлением, а по двойному клику пользователь сможет открыть объект, если это предусмотрено настройками поля.

Чем отличается Добавить() от ЗагрузитьЗначения()?

Добавить() вставляет одну строку, сохраняя существующие. ЗагрузитьЗначения() сначала полностью очищает список, а затем заполняет его значениями из массива без представлений и пометок.

Как удалить добавленную строку?

Методом Удалить() с указанием элемента списка или его индекса: Список.Удалить(Список[0]) удалит первую строку. Для полной очистки используйте Список.Очистить().