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