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