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

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

Как получить массив из функции в 1С

Как вернуть массив из функции в 1С: создание и заполнение массива, возврат через Возврат, передача через параметры, типичные ошибки и примеры кода на встроенном языке.

Во встроенном языке 1С функция может возвращать значение любого типа, включая массив. Для этого достаточно создать объект типа «Массив» внутри функции, заполнить его элементами и вернуть через оператор Возврат. Никакого специального объявления типа возвращаемого значения не требуется — язык динамически типизирован.

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

Ниже разобраны базовый синтаксис, заполнение массива из запроса, передача массива через параметры, особенности клиент-серверного взаимодействия и проверка результата.

Базовый способ: вернуть массив через оператор Возврат

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

Функция ПолучитьСписокСкладов()

МассивСкладов = Новый Массив;

МассивСкладов.Добавить("Основной склад");

МассивСкладов.Добавить("Склад резерва");

МассивСкладов.Добавить("Транзитный склад");

Возврат МассивСкладов;

КонецФункции

Обращение к результату выглядит так:

Склады = ПолучитьСписокСкладов();

Для Каждого Склад Из Склады Цикл

Сообщить(Склад);

КонецЦикла;

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

1c
Функция ПолучитьМассив()
	Результат = Новый Массив;
	Результат.Добавить("Элемент1");
	Возврат Результат;
КонецФункции

Заполнение массива из запроса к базе данных

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

Функция ПолучитьДокументыЗаПериод(НачалоПериода, КонецПериода)

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

Запрос.УстановитьПараметр("Начало", НачалоПериода);

Запрос.УстановитьПараметр("Конец", КонецПериода);

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

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

КонецФункции

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

Если нужен массив структур (например, ссылка плюс сумма документа), обходите выборку в цикле и добавляйте в массив заполненные структуры. Это чуть длиннее, но сохраняет несколько полей для каждой строки.

Альтернатива: заполнение массива через параметр функции

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

Процедура ДобавитьОшибкиВМассив(МассивОшибок)

МассивОшибок.Добавить("Не заполнен контрагент");

МассивОшибок.Добавить("Отсутствует договор");

КонецПроцедуры

// Вызов

Ошибки = Новый Массив;

ДобавитьОшибкиВМассив(Ошибки);

// Ошибки уже заполнен

Этот вариант удобен, когда функция должна вернуть одно значение (например, признак успеха), а массив служит «выходным» контейнером для дополнительных данных — списка ошибок, предупреждений, найденных строк. Возвращаемое значение и наполненный параметр не конфликтуют.

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

Возврат массива через Возврат

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

Заполнение через параметр

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

Возврат структуры с массивом внутри

Подходит, когда нужно вернуть массив вместе с сопутствующими данными: Возврат Новый Структура("Список, Количество", Массив, Массив.Количество()).

Передача массива между клиентом и сервером

В управляемом приложении функции часто выполняются на сервере, а результат нужен на клиенте. Массив сериализуется платформой автоматически, но только если его элементы — допустимые для передачи типы: примитивы, ссылки, структуры, другие массивы. Объекты типа «Запрос», «ТабличныйДокумент» или COM-объекты передать нельзя.

Для серверной функции в общем модуле убедитесь, что у модуля установлены флажки «Сервер» и «Вызов сервера», иначе обращение с клиента вызовет ошибку компиляции. Функция должна быть экспортной:

// Общий модуль РаботаСДокументами, флажки Сервер + Вызов сервера

Функция ПолучитьСсылкиНаДокументы(Период) Экспорт

// ... запрос и заполнение массива

Возврат МассивСсылок;

КонецФункции

На тонком клиенте недоступна часть серверных методов (например, прямое выполнение запросов), поэтому сборку массива из базы всегда размещайте на сервере, а на клиент передавайте уже готовый результат. Это также снижает сетевой трафик: передаётся один массив, а не множество обращений.

Проверка результата и защита от ошибок

После вызова функции полезно убедиться, что вернулся именно массив и он не пуст. Проверка типа выполняется через ТипЗнч(), а наличие элементов — через Количество().

Результат = ПолучитьДокументыЗаПериод(ДатаНачала, ДатаКонца);

Если ТипЗнч(Результат) <> Тип("Массив") Тогда

ВызватьИсключение "Функция вернула не массив";

КонецЕсли;

Если Результат.Количество() = 0 Тогда

Сообщить("Документы за период не найдены");

Возврат;

КонецЕсли;

Отдельный случай — функция, которая при ошибке возвращает Неопределено вместо массива. Такой контракт допустим, но должен быть единообразным во всём коде конфигурации. Более надёжная практика — всегда возвращать массив (пусть и пустой), а факт ошибки передавать отдельно: через исключение, параметр или структуру с признаком успеха.

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

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

Тип возвращаемого значения
Норма

ТипЗнч() возвращает Тип("Массив")

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

Вернулось Неопределено или значение другого типа

Наполненность массива
Норма

Количество() больше нуля либо пустой массив обработан отдельной веткой

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

Обращение к элементу [0] при пустом массиве — ошибка индекса

Передача клиент-сервер
Норма

На клиенте массив доступен и обходится в цикле

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

Ошибка сериализации при вызове серверной функции

Типичные ошибки при возврате массива из функции

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

Типичные ошибки
01
Возврат Неопределено в одной из веток — обход результата в цикле падает с ошибкой; выравнивайте тип возврата во всех ветках
02
Обращение к элементу по индексу без проверки Количество() — при пустом результате запроса возникает ошибка выхода за границы массива
03
Попытка вернуть выборку запроса вместо массива — выборка не является массивом, методы Добавить() и Количество() у неё отсутствуют
04
Возврат массива с несериализуемыми объектами на клиент — ошибка передачи данных между клиентом и сервером
05
Использование процедуры вместо функции — оператор Возврат со значением в процедуре недопустим, результат теряется

Ещё одна тонкость: если функция объявлена в общем модуле без флажка «Вызов сервера», а обращение идёт с клиента, ошибка возникнет ещё на этапе проверки модуля. Проверяйте свойства общего модуля до отладки логики.

Итог

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

Массив возвращается из функции оператором Возврат, альтернатива — заполнение массива, переданного параметром. Из запроса массив получают методом ВыгрузитьКолонку(). Всегда проверяйте тип и количество элементов результата, а для клиент-серверной передачи используйте только сериализуемые типы.

Частые вопросы о массивах в функциях 1С

Можно ли вернуть из функции сразу несколько массивов?

Напрямую — нет, оператор Возврат принимает одно значение. Оберните массивы в структуру: Возврат Новый Структура("Товары, Услуги", МассивТоваров, МассивУслуг). Либо заполните оба массива через параметры функции.

Чем массив отличается от списка значений при возврате из функции?

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

Почему функция возвращает пустой массив, хотя данные в базе есть?

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

Можно ли получить массив из функции, выполняемой в фоновом задании?

Да. Фоновое задание передаёт результат через помещение данных во временное хранилище: внутри фоновой процедуры вызовите ПоместитьВоВременноеХранилище(Массив, АдресХранилища), а после завершения задания заберите массив методом ПолучитьИзВременногоХранилища().

Как вернуть массив фиксированного размера?

Создайте массив с указанием размерности: Новый Массив(10) — получите массив из десяти элементов со значением Неопределено. Заполняйте элементы присваиванием по индексу: Массив[0] = Значение. Метод Добавить() в этом случае увеличит массив сверх заданного размера.