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