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