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

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

Как запустить функцию в 1С: практические способы вызова

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

Функция в 1С — это именованный блок кода на встроенном языке, который принимает параметры, выполняет вычисления и возвращает значение через оператор Возврат. Запустить функцию можно по-разному в зависимости от задачи: из другого модуля конфигурации, из отладчика, из внешней обработки или через консоль кода. Выбор способа зависит от того, тестируете вы собственную разработку или проверяете готовый алгоритм типовой конфигурации.

Главное ограничение, о котором часто забывают: функция не существует сама по себе, она расположена в конкретном модуле — общем модуле, модуле объекта, модуле формы или модуле менеджера. От места размещения и директив компиляции (&НаСервере, &НаКлиенте) зависит, откуда её можно вызвать и будет ли она доступна в нужном контексте.

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

Как устроена функция в 1С и откуда её можно вызвать

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

bsl
Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт
	Возврат Сумма + Сумма * СтавкаНДС / 100;
КонецФункции

Видимость функции определяется типом модуля. Функция в общем модуле с флагом «Сервер» вызывается с сервера, в модуле формы с директивой &НаКлиенте — только на клиенте. Попытка вызвать серверную функцию из клиентского контекста приведёт к ошибке компиляции или выполнения, поэтому перед запуском проверьте директивы и свойства модуля.

Обращение к экспортной функции общего модуля выполняется через точку: ИмяОбщегоМодуля.ИмяФункции(Параметры). Если модуль помечен как «Вызов сервера», его функции доступны и с клиента, но каждый такой вызов — это обращение к серверу, что влияет на производительность при частом использовании.

Запуск функции из кода модуля

Самый частый сценарий — вызов функции из другой функции, процедуры или обработчика события. Внутри своего модуля достаточно написать имя и передать параметры: Результат = РассчитатьСуммуСНДС(10000, 20);. Возвращаемое значение присваивается переменной или используется сразу в выражении.

При вызове из другого модуля добавьте имя владельца. Для общего модуля — ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Наименование"), для модуля менеджера объекта — Справочники.Номенклатура.ИмяФункции(). Порядок параметров должен совпадать с объявлением; необязательные параметры со значениями по умолчанию можно опускать только с конца списка.

Порядок вызова из кода
  1. 1
    Откройте модуль, где объявлена функция, и убедитесь, что она помечена Экспорт
  2. 2
    Проверьте директивы компиляции: контекст вызова должен совпадать с контекстом функции
  3. 3
    В вызывающем модуле напишите ИмяМодуля.ИмяФункции(Параметры) и присвойте результат переменной
  4. 4
    Сохраните модуль и проверьте синтаксис через «Конфигурация — Проверка конфигурации»
  5. 5
    Запустите сценарий в режиме Предприятия и убедитесь, что результат соответствует ожиданию

Запуск и проверка функции через отладчик

Отладчик — основной инструмент, когда нужно запустить функцию и проследить её выполнение по шагам. Включите отладку в конфигураторе через меню «Отладка — Начать отладку» или запустите клиентское приложение с параметром отладки, затем установите точку останова на первой строке тела функции клавишей F9.

Когда выполнение остановится на точке, используйте «Шагнуть через» (F10) для построчного выполнения и «Шагнуть в» (F11) для входа во вложенные вызовы. Значения переменных смотрите в табло (Shift+F9): туда можно вписать любое выражение, включая сам вызов функции, — отладчик вычислит его и покажет результат немедленно.

Если функция выполняется на сервере, убедитесь, что в конфигураторе разрешена отладка серверных контекстов, а на сервере 1С включён режим отладки (параметр -debug для сервера приложений). Без этого точки останова в серверном коде просто не сработают, и программа пройдёт мимо них без остановки.

Запуск функции через консоль кода и внешнюю обработку

Когда нужно разово выполнить функцию без изменения конфигурации, удобна консоль кода — внешняя обработка, позволяющая ввести произвольный текст на встроенном языке и выполнить его в режиме Предприятия. В ней достаточно написать вызов Результат = МойМодуль.МояФункция(Параметр) и вывести результат через Сообщить() или просмотр переменной.

Альтернатива — собственная внешняя обработка (.epf): в модуле формы создаётся кнопка, в обработчике которой вызывается нужная функция с параметрами, введёнными в поля формы. Такой подход удобен для повторяющихся проверок и передачи тестового инструмента коллегам без доступа к конфигуратору.

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

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

Как выбрать способ запуска

Функция вызывается в штатной логике конфигурацииВызывайте её напрямую из кода модуля с соблюдением контекста
Нужно понять, почему функция возвращает неверный результатЗапустите отладку с точкой останова и табло выражений
Нужен разовый запуск без изменения конфигурацииИспользуйте консоль кода или простую внешнюю обработку
Функция не экспортная и лежит в чужом модулеСкопируйте её код в тестовую обработку или добавьте Экспорт в расширении

Запуск функции по расписанию и из фонового задания

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

Разовый асинхронный запуск выполняется через фоновое задание: ФоновыеЗадания.Выполнить("ИмяМодуля.ИмяФункции", ПараметрыМассивом). Это удобно для длительных операций — расчётов, загрузки данных, — чтобы не блокировать интерфейс пользователя. Статус и ошибки фонового задания смотрятся в консоли заданий или в журнале регистрации.

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

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

Ошибки выполнения фиксируются в журнале регистрации (в конфигураторе: «Администрирование — Журнал регистрации»). Там виден текст исключения, модуль и строка, что позволяет быстро локализовать проблему даже без отладчика — особенно для фоновых и регламентных заданий.

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

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

Возвращаемое значение
Норма

Функция вернула значение ожидаемого типа

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

Неопределено или значение другого типа без явной причины

Журнал регистрации
Норма

Нет записей об ошибках за время вызова

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

Ошибки выполнения с указанием модуля и строки

Побочные эффекты
Норма

Данные изменены только в ожидаемых объектах

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

Изменения затронули лишние документы или справочники

Ограничения и безопасная практика

Права доступа влияют на запуск функций, работающих с данными: если у пользователя нет прав на объект, функция завершится ошибкой нарушения прав или вернёт пустой результат. Для проверки логики без прав используйте УстановитьПривилегированныйРежим(Истина) внутри серверного модуля — но осознанно, поскольку это отключает проверку прав для всего кода внутри блока.

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

Итог

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

Функция запускается вызовом по имени с параметрами из доступного контекста; экспортность и директивы компиляции определяют видимость. Для тестирования используйте отладчик с точкой останова или консоль кода, для автоматического запуска — регламентные и фоновые задания, а эксперименты с данными проводите только на копии базы.

Частые вопросы

Чем функция отличается от процедуры в 1С?

Функция обязательно возвращает значение через оператор Возврат и может использоваться в выражениях, например в правой части присваивания. Процедура ничего не возвращает и вызывается отдельным оператором. Если результат работы блока кода не нужен, правильнее оформлять его процедурой.

Почему возникает ошибка «Функция не определена», хотя она есть в модуле?

Наиболее вероятные причины: функция объявлена без слова Экспорт и вызывается из другого модуля; неверно указано имя общего модуля; контексты не совпадают (клиент вызывает серверную функцию). Проверьте также, что общий модуль не помечен «Привилегированный» без необходимости и что конфигурация сохранена после изменений.

Можно ли запустить функцию из модуля формы другого объекта?

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

Как запустить функцию с параметрами в фоновом задании?

Параметры передаются массивом вторым аргументом метода ФоновыеЗадания.Выполнить: сначала строка с полным именем метода «ИмяМодуля.ИмяФункции», затем массив значений в порядке параметров. Внутри функции обращайтесь к ним как к обычным параметрам объявления.

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

Используйте консоль кода в режиме Предприятия: вызовите функцию и выведите результат через Сообщить() или посмотрите переменную в табло консоли. Либо проверьте журнал регистрации, если функция сама пишет туда диагностические сообщения.

Безопасно ли тестировать функцию на рабочей базе?

Функции, которые только читают данные и возвращают результат, относительно безопасны. Функции, записывающие или удаляющие объекты, тестируйте на копии базы: отменить выполненные изменения штатными средствами после завершения вызова нельзя, а восстановление из резервной копии занимает значительное время.