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