Разработка и Конфигурация · 8 мин
Как добавить функцию в 1С: практическое руководство
Как добавить функцию в 1С: где разместить код, как объявить функцию с параметрами и возвратом значения, экспортные функции, типичные ошибки и проверка результата.
Функция во встроенном языке 1С — это именованный блок кода, который принимает параметры, выполняет вычисления и возвращает результат через оператор «Возврат». Добавить функцию можно в модуль объекта, общий модуль, модуль формы или модуль менеджера — выбор места зависит от того, где и как часто будет вызываться код. Правильное размещение определяет доступность функции, скорость её выполнения и удобство дальнейшей поддержки конфигурации.
Работа ведётся в конфигураторе: открывается нужный модуль, в него добавляется объявление функции с телом, затем изменения сохраняются и конфигурация обновляется. Для типовых конфигураций на поддержке прямое изменение модулей нежелательно — вместо этого используются расширения, которые позволяют добавить собственный код, не затрагивая типовой функционал.
Где разместить функцию: выбор модуля
Перед написанием кода нужно решить, в каком модуле будет жить функция. От этого зависит, откуда её можно вызвать и на какой стороне (клиент или сервер) она выполнится.
Общие модули подходят для функций, которые используются в нескольких местах конфигурации: расчёты, проверки, работа со строками и датами. Модуль объекта — для логики, привязанной к конкретному документу или справочнику. Модуль формы — для обработчиков и вспомогательных вычислений, нужных только в интерфейсе. Модуль менеджера объекта — для серверных операций с данными объекта без открытия формы.
Сравнение вариантов размещения
Подходит для переиспользуемых функций. Ограничение: серверный модуль недоступен на клиенте без специальных флагов.
Подходит для логики конкретного документа или справочника. Ограничение: функция доступна только в контексте объекта.
Подходит для интерфейсной логики. Ограничение: не годится для общих расчётов, код дублируется между формами.
Подходит для типовых конфигураций на поддержке. Ограничение: не все объекты и методы можно переопределить.
Как объявить функцию: синтаксис и пример
Объявление функции начинается с ключевого слова «Функция», затем указывается имя, в скобках — список параметров. Тело функции содержит произвольный код и завершается оператором «Возврат» с возвращаемым значением. Закрывается конструкция словом «КонецФункции».
Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт
Если СтавкаНДС = 0 Тогда
Возврат Сумма;
КонецЕсли;
Возврат Сумма + Сумма * СтавкаНДС / 100;
КонецФункции
Имя функции должно быть осмысленным и начинаться с глагола или существительного, отражающего действие: «ПолучитьОстаток», «ПроверитьЗаполнение», «СформироватьНомер». Параметры перечисляются через запятую, для каждого можно задать значение по умолчанию: Функция Сформировать(Период, Сжать = Истина).
Как добавить функцию в общий модуль пошагово
Общий модуль — самое частое место для новых функций. Порядок действий одинаков для большинства конфигураций на управляемых формах.
- 1Откройте конфигуратор и в дереве конфигурации найдите ветку «Общие» → «Общие модули».
- 2Создайте новый модуль или откройте существующий двойным щелчком.
- 3Установите флажки в свойствах модуля: «Сервер» — для серверного кода, «Вызов сервера» — если функцию будут вызывать с клиента.
- 4Добавьте в текст модуля объявление функции с ключевым словом «Экспорт».
- 5Сохраните модуль (Ctrl+S) и обновите конфигурацию базы данных (F7).
- 6Вызовите функцию из нужного места по схеме: ИмяМодуля.ИмяФункции(Параметры).
После обновления конфигурации функция становится доступной. Вызов из другого модуля выглядит так:
ИтоговаяСумма = ОбщегоНазначенияРасчеты.РассчитатьСуммуСНДС(СуммаДокумента, 20);
Если функция вызывается из формы, а модуль серверный, без флага «Вызов сервера» платформа выдаст ошибку «Процедура или функция с указанным именем не определена». Это самая частая причина, почему «функция не видна».
Добавление функции в типовую конфигурацию через расширение
Если конфигурация стоит на полной поддержке, прямое редактирование модулей приведёт к снятию с поддержки и проблемам при обновлении. Правильный путь — расширение конфигурации.
Создайте расширение через меню «Конфигурация → Расширения конфигурации». В расширение можно добавить собственный общий модуль и разместить в нём нужные функции — это безопасный вариант, не затрагивающий типовой код. Если нужно изменить поведение существующей типовой функции, используйте аннотации «&ИзменениеИКонтроль», «&После» или «&Вместо» при заимствовании метода в расширение.
Проверка результата и отладка
После добавления функции её нужно проверить. Самый быстрый способ — поставить точку останова внутри функции и запустить отладку (F5), затем выполнить действие, которое вызывает функцию. В табло (Ctrl+Alt+W) можно посмотреть значения параметров и промежуточных переменных.
Альтернатива для быстрой проверки — временный вызов функции из обработчика кнопки на форме или через «Отладка → Вычислить выражение». Убедитесь, что функция возвращает ожидаемый тип значения: число там, где ожидается число, а не строка или «Неопределено».
Как проверить результат
Модуль сохраняется без сообщений об ошибках синтаксиса
Конфигуратор подчёркивает строку и выдаёт ошибку при сохранении
Вызов ИмяМодуля.ИмяФункции() выполняется без исключения
Ошибка «Процедура или функция с указанным именем не определена»
Функция возвращает значение ожидаемого типа при всех входных данных
При некоторых параметрах возвращается Неопределено или падает исключение
Типичные ошибки при добавлении функций
Отдельная группа ошибок связана с контекстом выполнения. Функция, которая обращается к базе данных, не может выполняться на клиенте в тонком клиенте — такие вызовы нужно выносить в серверные модули. Обратная ситуация: функция, работающая с элементами формы, бессмысленна в серверном модуле без контекста формы.
Держите функции короткими: один метод — одна задача. Если тело функции превышает 30–40 строк, её почти всегда стоит разбить на несколько вспомогательных. Такой код проще отлаживать и переиспользовать.
FAQ: частые вопросы о добавлении функций в 1С
Чем функция отличается от процедуры в 1С?
Функция обязательно возвращает значение через оператор «Возврат» и может использоваться в выражениях (например, в правой части присваивания). Процедура выполняет действия, но не возвращает значение, и вызывается отдельным оператором.
Можно ли добавить функцию без доступа к конфигуратору?
Нет, изменение модулей возможно только в конфигураторе. Однако если нужно добавить логику без изменения конфигурации, можно создать внешнюю обработку (файл .epf) и писать код в её модуле — для этого достаточно пользовательского режима с правами на открытие внешних обработок.
Почему функция из общего модуля не видна в форме?
Чаще всего не установлен флаг «Вызов сервера» в свойствах серверного общего модуля либо в заголовке функции отсутствует ключевое слово «Экспорт». Проверьте оба момента и перезапустите сеанс после обновления конфигурации.
Как передать в функцию необязательный параметр?
Задайте значение по умолчанию в заголовке: Функция Рассчитать(Сумма, Ставка = 20). При вызове второй параметр можно опустить — будет использовано значение по умолчанию. Внутри функции также можно проверять параметр на Неопределено.
Что делать, если после обновления конфигурации функция пропала?
Если функция была добавлена прямо в типовой модуль, обновление могло затереть изменения. Восстановите код из резервной копии и перенесите его в расширение или собственный общий модуль, чтобы ситуация не повторилась при следующем обновлении.
Что важно запомнить
Функция добавляется в модуль через конструкцию «Функция ... Возврат ... КонецФункции»; для вызова извне нужен «Экспорт», для клиентского вызова серверного модуля — флаг «Вызов сервера». Типовые конфигурации дорабатывайте через расширения, а результат всегда проверяйте отладкой.