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

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

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

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

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

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

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

Перед написанием кода нужно решить, в каком модуле будет жить функция. От этого зависит, откуда её можно вызвать и на какой стороне (клиент или сервер) она выполнится.

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

Сравнение вариантов размещения

Общий модуль

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

Модуль объекта

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

Модуль формы

Подходит для интерфейсной логики. Ограничение: не годится для общих расчётов, код дублируется между формами.

Расширение конфигурации

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

Как объявить функцию: синтаксис и пример

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

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

Если СтавкаНДС = 0 Тогда

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

КонецЕсли;

Возврат Сумма + Сумма * СтавкаНДС / 100;

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

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

Как добавить функцию в общий модуль пошагово

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

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

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

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

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

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

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

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

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

После добавления функции её нужно проверить. Самый быстрый способ — поставить точку останова внутри функции и запустить отладку (F5), затем выполнить действие, которое вызывает функцию. В табло (Ctrl+Alt+W) можно посмотреть значения параметров и промежуточных переменных.

Альтернатива для быстрой проверки — временный вызов функции из обработчика кнопки на форме или через «Отладка → Вычислить выражение». Убедитесь, что функция возвращает ожидаемый тип значения: число там, где ожидается число, а не строка или «Неопределено».

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

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

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

Модуль сохраняется без сообщений об ошибках синтаксиса

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

Конфигуратор подчёркивает строку и выдаёт ошибку при сохранении

Доступность функции
Норма

Вызов ИмяМодуля.ИмяФункции() выполняется без исключения

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

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

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

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

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

При некоторых параметрах возвращается Неопределено или падает исключение

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

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

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

Держите функции короткими: один метод — одна задача. Если тело функции превышает 30–40 строк, её почти всегда стоит разбить на несколько вспомогательных. Такой код проще отлаживать и переиспользовать.
ПЗ
Практическое замечание

FAQ: частые вопросы о добавлении функций в 1С

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

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

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

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

Почему функция из общего модуля не видна в форме?

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

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

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

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

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

Итог

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

Функция добавляется в модуль через конструкцию «Функция ... Возврат ... КонецФункции»; для вызова извне нужен «Экспорт», для клиентского вызова серверного модуля — флаг «Вызов сервера». Типовые конфигурации дорабатывайте через расширения, а результат всегда проверяйте отладкой.