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