Разработка и Конфигурация · 12 мин
Как получить значение из функции в 1С
Как получить значение из функции 1С: оператор Возврат, присвоение результата переменной, функции в выражениях, типичные ошибки и проверка результата.
Функция во встроенном языке 1С — это фрагмент кода, который выполняет вычисления и возвращает результат туда, откуда был вызван. Чтобы получить значение из функции, нужно понимать два момента: как функция отдаёт результат (оператор Возврат) и как вызывающий код этот результат принимает (присвоение переменной или использование в выражении). Ошибки чаще всего возникают не в самой функции, а в месте вызова — когда результат теряется, не проверяется или имеет неожиданный тип.
Ключевое отличие функции от процедуры в 1С именно в возвращаемом значении: процедура выполняет действия и ничего не отдаёт, функция обязана вернуть результат. Если внутри функции нет оператора Возврат или он не сработал ни по одной ветке логики, функция вернёт Неопределено — и это одна из самых частых причин скрытых дефектов в прикладном коде.
Как функция возвращает значение: оператор Возврат
Результат функции задаётся оператором Возврат с выражением. Как только этот оператор выполняется, работа функции завершается, а указанное значение передаётся в точку вызова. Код, написанный после Возврат в той же ветке, выполняться не будет.
Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС)
СуммаНДС = Сумма * СтавкаНДС / 100;
Возврат Сумма + СуммаНДС;
КонецФункции
Операторов Возврат может быть несколько — по одному в каждой ветке условной логики. Это нормальный приём, но важно, чтобы при любом сценарии выполнения функция доходила хотя бы до одного из них:
Функция ПолучитьЦену(Номенклатура)
Если Номенклатура.Пустая() Тогда
Возврат 0;
КонецЕсли;
// ... запрос к данным
Возврат НайденнаяЦена;
КонецФункции
Если функция завершилась, не встретив ни одного Возврат, она вернёт Неопределено. Платформа не выдаст ошибку компиляции — проблема проявится только в момент выполнения, когда вызывающий код попытается работать с этим значением.
Присвоение результата переменной
Самый распространённый способ получить значение из функции — присвоить вызов переменной. Имя переменной слева от знака равенства, вызов функции с параметрами — справа:
ИтоговаяСумма = РассчитатьСуммуСНДС(10000, 20);
Сообщить(ИтоговаяСумма); // 12000
После присвоения переменная содержит именно то значение, которое функция передала оператором Возврат. Тип переменной определяется автоматически — в 1С он не объявляется заранее и зависит от того, что вернула функция.
Обратите внимание на скобки: вызов функции всегда пишется со скобками, даже если параметров нет. Запись Результат = МояФункция; без скобок — синтаксическая ошибка.
Результат = МояФункция(Параметр1, Параметр2);Использование функции прямо в выражении
Необязательно сохранять результат в отдельную переменную — вызов функции можно встраивать в любое выражение: условие, арифметику, параметр другой функции или процедуры:
Если РассчитатьСуммуСНДС(СуммаДокумента, 20) > 100000 Тогда
// требуется согласование
КонецЕсли;
ОбщийИтог = РассчитатьСуммуСНДС(Сумма1, 20) + РассчитатьСуммуСНДС(Сумма2, 20);
Такой приём удобен для коротких проверок, но у него есть ограничения. Если результат функции нужен несколько раз, вызывать её повторно нерационально: каждый вызов выполняет весь код функции заново, что особенно затратно, когда внутри есть запрос к базе данных. В таких случаях сохраните результат в переменную один раз и переиспользуйте её.
Второе ограничение — читаемость. Длинная цепочка вложенных вызовов затрудняет отладку: в отладчике сложно увидеть промежуточные значения. Для сложной логики разбивайте выражение на шаги с промежуточными переменными.
Как принимать результат
Подходит, когда результат нужен несколько раз или требует проверки. Позволяет отладить значение по шагам.
Подходит для одноразовой проверки или простого вычисления. Не подходит, если функция тяжёлая или результат нужен дальше по коду.
Получение значения из функции общего модуля
В типовых конфигурациях большинство функций размещены в общих модулях. Вызов такой функции строится по схеме ИмяМодуля.ИмяФункции(Параметры):
СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(Сумма, Валюта);
Чтобы функция была доступна извне, в общем модуле перед ней должно стоять ключевое слово Экспорт. Без него функция видна только внутри своего модуля, и попытка вызова снаружи даст ошибку «Процедура или функция с указанным именем не определена».
Также учитывайте флажки модуля: «Сервер», «Клиент (обычное приложение)», «Клиент (управляемое приложение)». Функция из серверного модуля недоступна в клиентском контексте без директивы вызова сервера, а функция клиентского модуля нельзя вызвать на сервере. Проверьте контекст модуля до написания вызова.
- 1Убедитесь, что функция объявлена с ключевым словом Экспорт
- 2Проверьте флажки контекста общего модуля (сервер/клиент)
- 3Напишите вызов по схеме ИмяМодуля.ИмяФункции(Параметры)
- 4Присвойте результат переменной и проверьте его на Неопределено
- 5Проверьте тип возвращённого значения перед дальнейшей обработкой
Проверка результата: Неопределено, тип и пустые значения
Получить значение из функции — только половина задачи. Вторая половина — убедиться, что результат пригоден для дальнейшей работы. Три типовые проверки покрывают большинство ситуаций.
Проверка на Неопределено обязательна, если функция может завершиться без явного возврата или возвращает Неопределено как признак «ничего не найдено»:
НайденныйДоговор = ПолучитьОсновнойДоговор(Контрагент);
Если НайденныйДоговор = Неопределено Тогда
ВызватьИсключение "Договор не найден";
КонецЕсли;
Проверка типа нужна, когда функция может вернуть значения разных типов. Используйте функцию ТипЗнч() и перечисление Тип():
Если ТипЗнч(Результат) = Тип("Число") Тогда
// безопасно выполняем арифметику
КонецЕсли;
Для ссылочных значений полезна проверка на пустую ссылку методом Пустая(), для строк и коллекций — проверка на пустоту через ПустаяСтрока() или Количество() = 0. Пропуск этих проверок приводит к ошибкам вида «Попытка получения значения поля объекта, не являющегося объектом» в самом неожиданном месте.
Как проверить результат функции
Результат содержит осмысленное значение
Неопределено — функция не дошла до Возврат или ничего не нашла
Тип соответствует ожидаемому (Число, Строка, ссылка)
Тип отличается — дальнейшие операции вызовут ошибку приведения
Ссылка заполнена, коллекция содержит элементы
Пустая ссылка или пустая таблица — данные не найдены
Типичные ошибки при получении значения из функции
Первая ошибка — игнорирование возвращаемого значения там, где оно важно. Например, функция записи объекта может вернуть признак успеха, но вызов записан просто как оператор. Проблема записи останется незамеченной.
Вторая ошибка — путаница между функцией и процедурой. Если попытаться присвоить результат процедуры переменной, компилятор сообщит об ошибке. Обратная ситуация — вызов функции без использования результата — технически допустима, но часто сигнализирует о неполной логике.
Третья ошибка — изменение параметров «по ссылке». В 1С параметры функции по умолчанию передаются по ссылке: если функция изменяет значение параметра, изменится и переменная в вызывающем коде. Это законный приём возврата нескольких значений, но неочевидный — документируйте такие функции, а если побочный эффект не нужен, передавайте параметр с ключевым словом Знач в объявлении функции.
Как вернуть несколько значений из одной функции
Оператор Возврат принимает только одно выражение, но это не ограничение: вернуть можно структуру, массив или соответствие с несколькими полями. Структура — самый читаемый вариант:
Функция РассчитатьИтоги(ТаблицаТоваров)
Результат = Новый Структура;
Результат.Вставить("Сумма", ТаблицаТоваров.Итог("Сумма"));
Результат.Вставить("Количество", ТаблицаТоваров.Итог("Количество"));
Возврат Результат;
КонецФункции
// Вызов:
Итоги = РассчитатьИтоги(Товары);
СуммаДокумента = Итоги.Сумма;
Альтернатива — параметры, передаваемые по ссылке: функция заполняет их значениями, а оператором Возврат отдаёт, например, признак успеха. Такой стиль встречается в типовых конфигурациях, но снижает прозрачность кода. Предпочтительнее структура: все возвращаемые данные видны в одном месте объявления функции.
Как выбрать способ возврата
Отладка: как увидеть, что вернула функция
Когда результат функции неожиданный, быстрее всего разобраться через отладчик конфигуратора. Поставьте точку останова на строке вызова функции, нажмите «Шагнуть в» — и пройдите код функции по шагам, наблюдая значения локальных переменных до оператора Возврат.
Если отладчик недоступен (например, код выполняется в фоновом задании или на сервере без отладки), временно добавьте вывод в журнал регистрации или сообщение перед оператором Возврат. После диагностики такие вставки нужно удалить — в рабочей базе они замедляют выполнение и засоряют журнал.
Что важно запомнить
Функция отдаёт значение оператором Возврат, а вызывающий код принимает его присвоением переменной или в выражении. Всегда проверяйте результат на Неопределено, тип и пустоту, следите за тем, чтобы все ветки логики доходили до Возврат, а для нескольких значений используйте структуру.
Частые вопросы
Что вернёт функция, если в ней нет оператора Возврат?
Функция вернёт значение Неопределено. Ошибки на этапе компиляции не будет, поэтому такой дефект обнаруживается только при выполнении — обычно когда вызывающий код пытается использовать результат.
Чем функция отличается от процедуры в 1С?
Функция возвращает значение через оператор Возврат и может использоваться в выражениях. Процедура только выполняет действия и не имеет возвращаемого значения; её нельзя присвоить переменной. Передать данные из процедуры можно через параметры, передаваемые по ссылке.
Как получить значение из функции, расположенной на сервере?
Из клиентского кода вызовите функцию серверного общего модуля с директивой &НаСервере в месте вызова или через серверную процедуру-обёртку. Модуль должен иметь флажок «Сервер», а функция — ключевое слово Экспорт. Учитывайте, что каждый серверный вызов из клиента — это обращение к серверу, поэтому группируйте их.
Можно ли вызвать функцию и не использовать её результат?
Синтаксически — да, вызов функции как отдельного оператора допустим. Но если результат содержит признак успеха или ошибки, его игнорирование скрывает проблемы. Оставляйте результат без обработки только когда он действительно не нужен.
Как вернуть из функции таблицу значений или массив?
Точно так же, как любое другое значение: создайте коллекцию внутри функции, заполните её и передайте в оператор Возврат. В вызывающем коде присвойте результат переменной и работайте с ней как с обычной таблицей или массивом.
Почему после вызова функции изменилась переменная, которую я передал как параметр?
Параметры в 1С по умолчанию передаются по ссылке, поэтому функция может изменить исходную переменную. Если такое поведение нежелательно, объявите параметр в функции с ключевым словом Знач — тогда функция получит копию значения.