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