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

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

Как вставить функцию в 1С: пошаговое руководство

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

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

Ошибки при добавлении функций — одна из самых частых причин неработающего кода у начинающих разработчиков 1С: функция объявлена в форме, а вызывается из общего модуля; забыто слово «Экспорт», из-за чего функция недоступна извне; пропущен «Возврат», и функция возвращает Неопределено. Ниже разобраны все шаги с примерами кода и способами проверки.

Где именно вставлять функцию: выбор модуля

Перед написанием кода определитесь с местом размещения — от этого зависит видимость функции и контекст её выполнения. Основные варианты:

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

Для общего модуля важны флаги в его свойствах: «Сервер», «Клиент (обычное приложение)», «Клиент (управляемое приложение)», «Вызов сервера». Если функция работает с базой данных (запросы, записи объектов), модуль должен быть серверным. Функция в клиентском модуле не сможет напрямую выполнить запрос к базе.

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

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

Функция нужна только внутри одной формыДобавьте её в модуль этой формы
Функция относится к логике одного документа или справочникаРазместите её в модуле объекта или модуле менеджера
Функция вызывается из нескольких объектовСоздайте общий модуль и объявите функцию с ключевым словом Экспорт
Функция обращается к базе данныхИспользуйте серверный общий модуль или серверный контекст формы

Синтаксис объявления функции

Функция объявляется ключевым словом «Функция», именем, списком параметров в скобках и завершается словом «КонецФункции». Результат возвращается оператором «Возврат»:

Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт

СуммаНДС = Сумма * СтавкаНДС / (100 + СтавкаНДС);

Возврат Сумма + СуммаНДС;

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

Ключевые правила синтаксиса:

  • Имя функции — на русском или английском языке, без пробелов, начинается с буквы.
  • Параметры перечисляются через запятую; можно задать значения по умолчанию: Функция ПолучитьЦену(Товар, Дата = Неопределено).
  • Слово «Экспорт» делает функцию доступной из других модулей. Без него функция видна только внутри своего модуля.
  • Оператор «Возврат» обязателен, если нужен результат. Функция без «Возврат» вернёт Неопределено.
  • Точка с запятой ставится после каждого оператора, но не после «КонецФункции» (допустимо и с ней).

Если возвращаемое значение не нужно, используйте процедуру («Процедура … КонецПроцедуры») — она не предполагает «Возврат» значения, и вызов функции как процедуры (с игнорированием результата) в 1С вызовет ошибку исполнения.

Пошаговая вставка функции в общий модуль

Самый распространённый сценарий — добавление переиспользуемой функции в общий модуль. Порядок действий в конфигураторе:

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

Пример вызова из модуля формы:

&НаКлиенте

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

Итог = РасчетыСервер.РассчитатьСуммуСНДС(Объект.Сумма, 20);

Объект.СуммаИтог = Итог;

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

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

Вставка функции в модуль формы: директивы компиляции

В модуле управляемой формы каждая функция должна иметь директиву компиляции, определяющую, где она выполняется:

  • &НаКлиенте — выполняется на клиенте, нет доступа к запросам и базе напрямую.
  • &НаСервере — выполняется на сервере, полный доступ к данным, но нет доступа к элементам интерфейса.
  • &НаСервереБезКонтекста — серверная функция без доступа к данным формы; быстрее, подходит для независимых расчётов.
  • &НаКлиентеНаСервереБезКонтекста — код, общий для обеих сторон.
&НаСервереБезКонтекста

Функция ПолучитьОстатокТовара(ТоварСсылка)

Запрос = Новый Запрос("ВЫБРАТЬ Остаток ИЗ РегистрНакопления.Товары.Остатки ГДЕ Товар = &Товар");

Запрос.УстановитьПараметр("Товар", ТоварСсылка);

Выборка = Запрос.Выполнить().Выбрать();

Если Выборка.Следующий() Тогда

Возврат Выборка.Остаток;

КонецЕсли;

Возврат 0;

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

Частая ошибка — вызов клиентской функции из серверной или наоборот без учёта директив. Серверная функция не может вызвать клиентскую, а клиентская может вызвать серверную только явно (через имя модуля или функцию формы с директивой &НаСервере).

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

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

  • Конфигуратор не выдаёт ошибок при проверке модуля (команда «Конфигурация → Проверка конфигурации» или Ctrl+F7 в редакторе модуля).
  • Функция вызывается без ошибки «не определена» — значит, имя, место объявления и «Экспорт» указаны верно.
  • Возвращаемое значение соответствует ожиданиям: проверьте через отладчик (точка останова, F5) или вывод через Сообщить().
  • Функция корректно обрабатывает граничные случаи: пустые параметры, Неопределено, нулевые значения.
Контрольные точки

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

Синтаксис модуля
Норма

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

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

Ошибка «Ожидается ключевое слово КонецФункции» или «Переменная не определена»

Вызов из другого модуля
Норма

Функция находится и выполняется

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

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

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

В отладчике видно ожидаемое значение после Возврат

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

Возвращается Неопределено — оператор Возврат пропущен или не достигается

Работа с клиента
Норма

Серверная функция вызывается из клиентского кода

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

Ошибка при вызове — не установлен флаг «Вызов сервера» в общем модуле

Типичные ошибки при вставке функций

Большинство проблем при добавлении функций сводится к нескольким повторяющимся причинам. Их знание экономит время на отладке.

Типичные ошибки
01
Пропущено слово Экспорт — функция объявлена, но недоступна из других модулей, вызов падает с ошибкой «не определена».
02
Нет оператора Возврат — функция возвращает Неопределено, и расчёты дальше дают неверный результат без явной ошибки.
03
Функция вставлена внутрь другой функции — в 1С вложенные объявления запрещены, модуль не компилируется.
04
Код размещён не в том контексте — запрос к базе в клиентской функции приводит к ошибке компиляции.
05
Вызов функции как процедуры: строка «РассчитатьСумму(100);» без присваивания результата вызывает ошибку исполнения.
06
Изменён типовой общий модуль — при обновлении конфигурации доработка теряется или блокирует обновление.

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

Альтернативы: когда функция не нужна

Не каждая задача требует новой функции. Перед созданием проверьте существующие варианты:

  • Стандартные функции платформы — для строк, дат, чисел есть готовые: СтрНайти, Формат, Окр, НачалоДня и другие.
  • Функции типовых общих модулей — в конфигурациях на БСП есть модули ОбщегоНазначения, СтроковыеФункцииКлиентСервер и другие с готовыми решениями.
  • Процедура вместо функции — если результат не возвращается, а выполняется действие (запись, сообщение).
  • Схема компоновки данных или запрос — для вычислений над большими наборами данных запрос эффективнее циклических вызовов функций.

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

Итог

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

Функция в 1С объявляется конструкцией «Функция … КонецФункции» в подходящем модуле, возвращает результат через «Возврат», а для вызова из других модулей требует слова «Экспорт». Выбирайте модуль по месту использования, соблюдайте директивы компиляции в формах и проверяйте результат отладчиком.

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

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

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

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

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

Можно ли вызвать серверную функцию с клиента?

Да, если функция находится в общем модуле с установленным флагом «Вызов сервера» или в модуле формы с директивой &НаСервере. Учтите, что каждый такой вызов — это обращение к серверу, поэтому частые вызовы в цикле замедляют работу; лучше передавать данные пакетно.

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

В 1С параметры объектных типов (документы, справочники, структуры в некоторых случаях) передаются по ссылке по умолчанию, а значения примитивных типов — по значению. Чтобы гарантировать передачу по ссылке, используйте ключевое слово «Знач» наоборот для копирования: «Функция Обработать(Знач Параметр)» создаёт локальную копию.

Можно ли объявить функцию внутри другой функции?

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

Что делать, если функция нужна и на клиенте, и на сервере?

Используйте общий модуль с директивами, допускающими оба контекста (флаги «Клиент» и «Сервер»), либо в форме — директиву &НаКлиентеНаСервереБезКонтекста. Код внутри такой функции должен быть совместим с обоими контекстами: без запросов к базе и без обращений к элементам интерфейса.