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