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