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