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