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

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

Как в 1С получить массив объектов

Как в 1С получить массив объектов: выгрузка запроса в массив, Выгрузить(), НайтиСтроки, массив ссылок и структур. Примеры кода, ошибки и проверка результата.

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

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

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

Что понимать под «массивом объектов» в 1С

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

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

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

Массив ссылок через запрос и ВыгрузитьКолонку

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка КАК Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

| И РеализацияТоваровУслуг.Проведен";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекущаяДатаСеанса()));

Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ТекущаяДатаСеанса()));

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

Метод ВыгрузитьКолонку() возвращает именно массив, поэтому результат сразу готов к передаче в процедуры, отборы динамических списков или параметры других запросов (через условие В (&СписокСсылок)).

Обратите внимание: если запрос не вернул ни одной строки, ВыгрузитьКолонку() вернёт пустой массив, а не Неопределено. Проверка результата делается через МассивСсылок.Количество() = 0.

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

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

ТаблицаРезультата = Запрос.Выполнить().Выгрузить();

МассивОбъектов = Новый Массив;

Для Каждого СтрокаТЗ Из ТаблицаРезультата Цикл

Описание = Новый Структура;

Описание.Вставить("Ссылка", СтрокаТЗ.Ссылка);

Описание.Вставить("Номер", СтрокаТЗ.Номер);

Описание.Вставить("Дата", СтрокаТЗ.Дата);

Описание.Вставить("Сумма", СтрокаТЗ.Сумма);

МассивОбъектов.Добавить(Описание);

КонецЦикла;

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

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

Порядок получения массива структур
  1. 1
    Сформируйте запрос с явным списком полей и алиасами
  2. 2
    Выполните запрос и выгрузите результат в таблицу значений
  3. 3
    Создайте пустой массив через Новый Массив
  4. 4
    В цикле по строкам таблицы создавайте структуру и добавляйте в массив
  5. 5
    Проверьте МассивОбъектов.Количество() перед дальнейшей обработкой

Массив строк через НайтиСтроки и отборы

Если данные уже находятся в таблице значений или табличной части, массив объектов получают без нового обращения к базе. Метод НайтиСтроки() возвращает массив строк, удовлетворяющих отбору:

Отбор = Новый Структура("Склад", СкладОтгрузки);

МассивСтрок = ДокументОбъект.Товары.НайтиСтроки(Отбор);

Для Каждого СтрокаТовара Из МассивСтрок Цикл

// обработка строки

КонецЦикла;

Элементы такого массива — не копии, а сами строки табличной части, поэтому изменение их полей сразу меняет данные объекта. Это удобно для пакетной обработки, но требует аккуратности: удаление строк внутри цикла по массиву допустимо, а вот удаление строк при прямом обходе коллекции приводит к пропуску элементов.

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

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

Выбор подхода зависит от того, где лежат данные и что планируется делать с результатом. Ориентировочные критерии собраны в таблице.

СпособЧто возвращаетКогда применятьОграничение
ВыгрузитьКолонку()Массив значений одной колонкиНужны только ссылки или одно полеТребует выполнения запроса
Цикл по таблице + структурыМассив структурНужно несколько полей, обмен, JSONРучной код преобразования
НайтиСтроки()Массив строк таблицыДанные уже в ТЗ или табличной частиРаботает только с готовой коллекцией
Выборка из запросаПоследовательный обходОбработка без хранения всех данныхНе массив, нет индексного доступа

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

Массив ссылок

Минимум памяти, подходит для отборов и параметров запросов; для чтения реквизитов потребуются обращения к базе

Массив структур

Все нужные данные сразу в памяти, удобен для JSON и передачи между клиентом и сервером; требует кода преобразования

Массив строк ТЗ

Быстрый отбор без запроса, изменения затрагивают исходную таблицу; применим только к уже загруженным данным

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

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

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

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

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

Массив.Количество() > 0

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

Пустой массив — проверить параметры и условия запроса

Тип элементов
Норма

ТипЗнч(Массив[0]) соответствует ожидаемому

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

Неопределено или Null в элементах — ошибка в полях запроса

Ключи структур
Норма

Свойство() возвращает Истина для всех полей

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

Отсутствующий ключ — не совпали алиасы полей запроса

Наиболее частые ошибки при получении массивов объектов:

Типичные ошибки
01
Обращение к Массив[0] без проверки Количество() — при пустом результате возникает ошибка индекса за границами массива
02
Получение объектов через ПолучитьОбъект() в цикле вместо одного запроса — резкое падение производительности на больших выборках
03
Несовпадение имени колонки в ВыгрузитьКолонку() с алиасом в запросе — ошибка «Колонка не найдена»
04
Удаление строк табличной части при прямом обходе коллекции вместо обхода массива НайтиСтроки — пропуск элементов
05
Передача таблицы значений с клиента на сервер вместо массива структур — ошибка сериализации в управляемых формах

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

Ограничения и производительность

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

Второй аспект — контекст выполнения. На тонком и веб-клиенте запросы недоступны, поэтому массив объектов формируется в серверной процедуре и возвращается на клиент уже готовым. Во внешних соединениях (COM, HTTP) массив структур сериализуется в JSON или XDTO, и структуры должны содержать только сериализуемые типы.

Итог

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

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

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

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

Да, если данные уже находятся в памяти: в табличной части документа или таблице значений используйте НайтиСтроки() или обход коллекции с добавлением в Новый Массив. Для данных из базы без запроса придётся перебирать объекты через Выбрать() менеджера объекта, что медленнее и оправдано только в редких сценариях.

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

Штатного метода «в одну строку» в платформе нет — требуется цикл. В конфигурациях на базе БСП есть готовые функции в общих модулях работы с коллекциями, которые выполняют это преобразование; в собственных разработках удобно написать аналогичную универсальную функцию, формирующую структуру по списку колонок таблицы.

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

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

Как передать массив объектов с сервера на клиент?

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

Почему ВыгрузитьКолонку() выдаёт ошибку «Колонка не найдена»?

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

Что быстрее: массив из запроса или обход выборки?

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