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