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