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

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

Как в 1С разместить код выполняемой функции

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

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

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

Прежде чем писать код, определите, где функция будет использоваться. От этого зависит выбор модуля, необходимость ключевого слова Экспорт и директив компиляции (&НаСервере, &НаКлиенте). Неправильный выбор места размещения — самая частая причина ошибок вида «Процедура или функция с указанным именем не определена».

Где в 1С размещается код функции

Конфигуратор не позволяет написать функцию «в любом месте» — код всегда привязан к модулю конкретного объекта. Основные варианты размещения:

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

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

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

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

  1. Откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. В дереве конфигурации найдите ветку Общие → Общие модули.
  3. Добавьте новый модуль (правой кнопкой — Добавить) или откройте существующий.
  4. Задайте имя модуля, например РасчетыСервер, и настройте флажки: Сервер, Вызов сервера (если функции будут вызываться с клиента).
  5. Дважды щёлкните по модулю и в редакторе кода добавьте функцию.

Пример простой функции:

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

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

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

КонецЕсли;

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

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

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

ИтоговаяСумма = РасчетыСервер.РассчитатьСуммуСНДС(10000, 20);
bsl
Функция РассчитатьСуммуСНДС(Сумма, СтавкаНДС) Экспорт
	Возврат Сумма + Сумма * СтавкаНДС / 100;
КонецФункции

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

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

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

&НаКлиенте

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

Итог = РассчитатьИтогНаСервере();

ПоказатьОповещениеПользователя("Итог: " + Итог);

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

&НаСервере

Функция РассчитатьИтогНаСервере()

Возврат Объект.Товары.Итог("Сумма");

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

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

Вызов функции из других модулей

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

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

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

Проверка и отладка кода функции

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

  1. Сохраните модуль и обновите конфигурацию базы данных: Конфигурация → Обновить конфигурацию базы данных (клавиша F7).
  2. Проверьте синтаксис: Конфигурация → Проверка конфигурации или кнопка проверки модуля в редакторе кода.
  3. Запустите отладку (F5), поставьте точку останова внутри функции (F9) и вызовите её в режиме «Предприятие».
  4. Убедитесь, что параметры приходят в ожидаемом виде, а оператор Возврат срабатывает во всех ветках логики.

Частая проблема — функция не возвращает значение на одном из путей выполнения. В этом случае результат будет Неопределено, что приводит к ошибкам в вызывающем коде. Контролируйте, чтобы каждая ветка завершалась оператором Возврат.

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

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

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

Нет сообщений об ошибках в окне служебных сообщений

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

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

Вызов в режиме Предприятие
Норма

Функция отрабатывает, возвращает ожидаемое значение

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

Ошибка выполнения, результат Неопределено

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

Все ветки логики заканчиваются оператором Возврат

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

Есть ветки без Возврат — результат непредсказуем

Типичные ошибки при размещении функций

Большинство проблем связано не с самим кодом, а с местом его размещения и видимостью:

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

Альтернативы: расширения и внешние обработки

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

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

Сравнение вариантов

Общий модуль конфигурации

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

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

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

Внешняя обработка

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

Итог

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

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

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

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

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

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

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

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

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

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

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

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

Разместите её в модуле этой формы без слова Экспорт — она будет локальной и не засорит программный интерфейс. Выбирайте директиву &НаКлиенте или &НаСервере в зависимости от того, работает ли функция с данными базы.

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

Включите в конфигураторе отладку: Отладка → Подключение, и убедитесь, что в настройках (Сервис → Параметры → Отладка) разрешена отладка серверных вызовов. Для файловой базы этого достаточно; для клиент-серверной может потребоваться запуск сервера 1С с ключом отладки.