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

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

Как вызвать метод в 1С: полное руководство с примерами

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

Вызов метода — базовая операция во встроенном языке 1С:Предприятие. Методом называют процедуру или функцию, описанную в модуле объекта, общем модуле или модуле формы. Правильный вызов зависит от того, где описан метод (клиент или сервер), экспортный он или нет, и какие параметры ожидает.

Ошибки при вызове методов — одна из самых частых причин сообщений «Процедура или функция с указанным именем не определена» и «Слишком много фактических параметров». Почти всегда причина в неправильном контексте вызова, отсутствии ключевого слова Экспорт или несовпадении числа параметров.

Материал рассчитан на разработчиков и внедренцев, работающих с конфигуратором 1С. Примеры синтаксиса актуальны для управляемых форм и типовых конфигураций на платформе 8.3.

Как устроены методы во встроенном языке 1С

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

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

Ключевое слово Экспорт после заголовка метода делает его доступным снаружи модуля. Без него метод считается локальным, и попытка обратиться к нему извне завершится ошибкой компиляции.

Как вызвать процедуру или функцию внутри того же модуля

Самый простой случай — вызов метода, описанного в том же модуле. Достаточно указать имя и параметры в круглых скобках. Если параметров нет, скобки всё равно ставятся.

Процедура КомандаРассчитать(Команда)

Результат = РассчитатьСумму(ТаблицаТоваров);

ПоказатьОповещениеПользователя("Готово");

КонецПроцедуры

Функция РассчитатьСумму(Таблица)

Сумма = 0;

Для Каждого Строка Из Таблица Цикл

Сумма = Сумма + Строка.Сумма;

КонецЦикла;

Возврат Сумма;

КонецФункции

Обратите внимание: вызов функции РассчитатьСумму(...) участвует в присваивании, а вызов процедуры ПоказатьОповещениеПользователя(...) — самостоятельный оператор. Если вызвать функцию как отдельный оператор и не использовать результат, платформа это допустит, но возвращаемое значение будет потеряно.

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

Как вызвать экспортный метод общего модуля

Общие модули — стандартное место для переиспользуемой логики. Чтобы вызвать метод общего модуля, укажите имя модуля, точку и имя метода:

Статус = ОбменДаннымиСервер.ПолучитьСтатусОбмена(Узел);

ОбщегоНазначения.СообщитьПользователю("Документ записан");

Условия успешного вызова: метод объявлен с Экспорт, имя общего модуля написано точно как в конфигураторе, а контекст исполнения совпадает. Если общий модуль помечен только флагом «Сервер», вызвать его из клиентского кода нельзя — платформа выдаст ошибку о недоступности модуля.

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

Для методов, которые должны быть доступны и на клиенте, и на сервере, в типовых конфигурациях принято создавать пары модулей с постфиксами «Клиент» и «Сервер», а также модули без постфикса для кода, исполняемого в обоих контекстах.

Вызов методов на клиенте и на сервере

В управляемых формах код делится директивами компиляции: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Метод с директивой &НаКлиенте не может напрямую обратиться к базе данных — для этого вызывается серверный метод.

&НаКлиенте

Процедура ЗаполнитьЦены(Команда)

ЗаполнитьЦеныНаСервере();

КонецПроцедуры

&НаСервере

Процедура ЗаполнитьЦеныНаСервере()

// запрос к базе данных

КонецПроцедуры

Серверный вызов с клиента — это сетевое обращение, поэтому он должен быть редким и осмысленным. Нельзя вызывать серверный метод в цикле по строкам таблицы: правильный подход — передать данные на сервер одним вызовом, обработать их там и вернуть результат.

Для длительных серверных операций в современных версиях платформы применяют асинхронные механизмы — фоновые задания через ФоновыеЗадания.Выполнить() и длительные операции БСП, чтобы не блокировать интерфейс пользователя.

Передача параметров и возврат значений

Параметры передаются по позиции в том порядке, в котором объявлены. В объявлении можно задать значение по умолчанию:

Функция НайтиКонтрагента(ИНН, Наименование = "") Экспорт

...

КонецФункции

// оба вызова корректны:

Контрагент = НайтиКонтрагента("7707083893");

Контрагент = НайтиКонтрагента("7707083893", "ООО Ромашка");

По умолчанию параметры передаются по ссылке: изменения параметра внутри метода видны в вызывающем коде. Ключевое слово Знач перед параметром включает передачу по значению — метод работает с копией. Это важно для серверных вызовов: параметры Знач копируются при передаче, что увеличивает накладные расходы для больших таблиц.

Если нужно вернуть несколько значений, используйте структуру: функция формирует Новый Структура("Успех, Сообщение", Истина, "") и возвращает её целиком. Это читаемее, чем изменять параметры по ссылке.

Типичные ошибки
01
Вызов метода без Экспорт из другого модуля — ошибка 'Процедура или функция не определена'; добавьте Экспорт в объявление
02
Несовпадение числа параметров — ошибка 'Слишком много фактических параметров'; сверьте вызов с заголовком метода
03
Вызов серверного общего модуля из клиентского кода — модуль недоступен; снимите лишние флаги или перенесите вызов на сервер
04
Опечатка в имени модуля или метода — компилятор покажет ошибку; используйте Ctrl+Пробел для автоподстановки

Как вызвать метод объекта, справочника или документа

Методы, описанные в модуле объекта (например, документа), вызываются через объект, полученный из ссылки:

ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();

ДокОбъект.ПересчитатьИтоги();

ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);

Методы модуля менеджера вызываются через менеджер типа: Справочники.Номенклатура.НайтиПоКоду("0001") или Документы.РеализацияТоваров.СоздатьДокумент(). Такие методы доступны только на сервере.

Стандартные методы платформы (например, Записать(), НайтиПоНаименованию(), Выбрать()) вызываются так же — через точку от объекта или менеджера. Полный список доступных методов конкретного типа смотрите в синтакс-помощнике конфигуратора (Ctrl+F1).

Проверка результата и отладка вызова

После написания вызова проверьте модуль: меню «Конфигурация → Проверка конфигурации» с включённой проверкой логической целостности покажет неопределённые методы и ошибки параметров ещё до запуска.

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

Контрольные точки

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

Компиляция модуля
Норма

Проверка конфигурации завершается без ошибок по вызову

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

Сообщение 'Процедура или функция не определена'

Выполнение в режиме Предприятие
Норма

Метод отрабатывает, функция возвращает ожидаемое значение

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

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

Серверный вызов с клиента
Норма

Данные приходят на клиент одним пакетом, интерфейс не зависает

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

Множественные серверные вызовы в цикле, заметные паузы

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

Часто задаваемые вопросы

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

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

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

Три типовые причины: метод объявлен без ключевого слова Экспорт, а вызов идёт из другого модуля; опечатка в имени метода или общего модуля; общий модуль недоступен в текущем контексте (например, серверный модуль вызван на клиенте). Проверьте все три пункта по порядку.

Можно ли вызвать метод формы из другой формы?

Напрямую — нет, модули форм изолированы. Используйте оповещения (Оповестить и ОбработкаОповещения), передачу параметров при открытии формы или вынесите общую логику в общий модуль, доступный обеим формам.

Как вызвать метод с параметрами по умолчанию, пропустив часть из них?

Укажите запятую без значения: МойМетод(Первый, , Третий) — второй параметр примет значение по умолчанию из объявления. Пропускать можно только параметры, для которых задано значение по умолчанию, иначе будет ошибка.

Что делать, если серверный вызов с клиента работает медленно?

Сократите число вызовов: собирайте данные на клиенте в структуру или таблицу и передавайте одним вызовом. Уберите вызовы из циклов. Для длительных операций используйте фоновые задания, чтобы форма оставалась отзывчивой.

Итог

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

Метод вызывается по имени с параметрами в скобках; из другого модуля — через имя модуля или объекта и только при наличии Экспорт. Следите за контекстом клиент/сервер, числом параметров и передачей данных. Проверяйте код через проверку конфигурации и отладчик до запуска в рабочей базе.