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

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

Как из функции вернуть два значения в 1С

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

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

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

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

Почему функция 1С возвращает только одно значение

Оператор Возврат в 1С принимает одно выражение. Конструкция вида Возврат А, Б; синтаксически недопустима — компилятор выдаст ошибку. Это ограничение языка, а не платформы или конкретной конфигурации.

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

Способ 1. Вернуть два значения через структуру

Структура — самый читаемый и безопасный способ. Каждое возвращаемое значение получает осмысленное имя, и вызывающий код обращается к нему по ключу, а не по позиции. Это снижает риск перепутать порядок значений при доработке.

Функция РассчитатьИтоги(ТаблицаТоваров) Экспорт

СуммаДокумента = 0;

СуммаНДС = 0;

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

СуммаДокумента = СуммаДокумента + Строка.Сумма;

СуммаНДС = СуммаНДС + Строка.СуммаНДС;

КонецЦикла;

Результат = Новый Структура;

Результат.Вставить("СуммаДокумента", СуммаДокумента);

Результат.Вставить("СуммаНДС", СуммаНДС);

Возврат Результат;

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

Использование на стороне вызова:

Итоги = РассчитатьИтоги(ТаблицаТоваров);

Сообщить("Сумма: " + Итоги.СуммаДокумента);

Сообщить("НДС: " + Итоги.СуммаНДС);

Тот же приём применяют для пары «успех / описание ошибки» — стандартный паттерн в типовых конфигурациях:

Результат = Новый Структура("Успешно, ТекстОшибки", Ложь, "");

// ... логика ...

Результат.Успешно = Истина;

Возврат Результат;

Способ 2. Вернуть значения массивом

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

Функция ПолучитьМинИМакс(МассивЧисел) Экспорт

Мин = МассивЧисел[0];

Макс = МассивЧисел[0];

Для Каждого Число Из МассивЧисел Цикл

Если Число < Мин Тогда Мин = Число; КонецЕсли;

Если Число > Макс Тогда Макс = Число; КонецЕсли;

КонецЦикла;

Результат = Новый Массив;

Результат.Добавить(Мин);

Результат.Добавить(Макс);

Возврат Результат;

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

Главный минус массива — хрупкость при доработке. Если через полгода кто-то поменяет порядок добавления элементов, весь вызывающий код начнёт получать значения «наоборот», и ошибка может долго оставаться незамеченной. Поэтому для разнородных данных массив уступает структуре.

Сравнение способов

Структура

Именованные поля, читаемый код, легко расширять. Оптимальна для разнородных значений. Небольшие накладные расходы на создание объекта.

Массив

Подходит для однотипных значений и переменного количества элементов. Обращение по индексу повышает риск путаницы при изменениях.

Параметры по ссылке

Результат пишется прямо в переменные вызывающего кода. Удобно для доработки существующих процедур, но затрудняет чтение и тестирование.

Способ 3. Вернуть значения через параметры по ссылке

Если параметр функции или процедуры объявлен без ключевого слова Знач, он передаётся по ссылке: изменения внутри функции видны в вызывающем коде. Это позволяет «вынести» дополнительные результаты через параметры, а основное значение вернуть как обычно.

Функция НайтиКонтрагента(ИНН, Наименование, ОписаниеОшибки) Экспорт

Наименование = "";

ОписаниеОшибки = "";

// ... поиск ...

Если КонтрагентНайден Тогда

Наименование = НайденноеНаименование;

Возврат СсылкаНаКонтрагента;

Иначе

ОписаниеОшибки = "Контрагент с ИНН " + ИНН + " не найден";

Возврат Неопределено;

КонецЕсли;

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

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

Какой способ выбрать в конкретной ситуации

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

Маршрут решения

Как выбрать действие

Возвращаются разнородные значения (сумма и НДС, признак и текст)Используйте структуру с говорящими именами ключей
Возвращается переменное число однотипных значенийИспользуйте массив и задокументируйте порядок элементов комментарием
Дорабатывается существующая функция, где нельзя менять тип возвращаемого значенияДобавьте выходные параметры по ссылке, сохранив прежний Возврат
Нужно проверять успешность операции и получать текст ошибкиВерните структуру с ключами Успешно и ТекстОшибки — это устоявшийся паттерн

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

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

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

Итоги = РассчитатьИтоги(ТаблицаТоваров);

Если ТипЗнч(Итоги) = Тип("Структура")

И Итоги.Свойство("СуммаДокумента") Тогда

// работаем с результатом

Иначе

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

КонецЕсли;

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

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

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

ТипЗнч показывает Структура или Массив во всех ветках функции

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

В одной из веток возвращается Неопределено или другой тип

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

Метод Свойство() возвращает Истина для всех ожидаемых ключей

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

Ошибка «Поле объекта не обнаружено» при обращении

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

Количество() соответствует документированному числу значений

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

Индекс выходит за границу массива

FAQ

Можно ли вернуть из функции 1С три и больше значений?

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

Что лучше для пары «успех / текст ошибки» — структура или параметры по ссылке?

Структура с ключами Успешно и ТекстОшибки. Она делает контракт функции явным, упрощает тестирование и является устоявшимся паттерном в типовых конфигурациях. Параметры по ссылке оправданы в основном при доработке legacy-кода.

Работает ли возврат структуры между клиентом и сервером?

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

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

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

Как вернуть два значения, если функция уже используется во многих местах?

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

Влияет ли упаковка в структуру на производительность?

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

Итог

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

Оператор Возврат в 1С принимает одно значение, поэтому два результата упаковывают в структуру (основной способ), в массив (для однотипных значений) либо выносят в параметры по ссылке. Проверяйте тип и наличие ключей на стороне вызова и не допускайте разных типов возврата в разных ветках функции.