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

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

Где в 1С внести код выполняемой функции

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

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

Любой программный код в 1С пишется на встроенном языке внутри модулей. Модуль — это текстовый контейнер, привязанный к конкретному объекту конфигурации: справочнику, документу, форме, отчёту или приложению в целом. Поэтому первый шаг — определить, к какому событию или объекту относится ваша функция, и только потом открывать нужный модуль в конфигураторе.

Ниже разобраны все основные места размещения кода, порядок действий в конфигураторе, проверка результата и типичные ошибки, из-за которых функция не выполняется.

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

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

Основные виды модулей, с которыми работает разработчик:

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

Как открыть нужный модуль в конфигураторе

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

Чтобы открыть модуль, запустите конфигуратор, откройте конфигурацию через меню «Конфигурация → Открыть конфигурацию» и дождитесь построения дерева объектов. Дальше путь зависит от того, где должен жить код.

Как открыть модуль объекта
  1. 1
    Откройте конфигуратор и загрузите конфигурацию через меню «Конфигурация → Открыть конфигурацию».
  2. 2
    В дереве конфигурации найдите нужный объект, например «Документы → РеализацияТоваровУслуг».
  3. 3
    Кликните правой кнопкой мыши по объекту и выберите «Открыть модуль объекта» — для логики записи и проведения.
  4. 4
    Для кода формы раскройте ветку «Формы» объекта, откройте нужную форму и перейдите на вкладку «Модуль» внизу окна.
  5. 5
    Добавьте процедуру или функцию, сохраните модуль и обновите конфигурацию базы данных клавишей F7.

Если дерево конфигурации пустое, значит конфигурация не открыта — это самая частая причина, по которой новичок не находит пункт «Открыть модуль». Также проверьте, что конфигурация не находится на поддержке с запретом изменений: такие объекты помечены замком, и их редактирование требует снятия части ограничений поддержки, что влияет на дальнейшие обновления.

Вносим код в модуль формы: кнопки и обработчики событий

Самый частый практический сценарий — нужно, чтобы при нажатии кнопки на форме выполнялась функция. Для этого код размещается в модуле формы. Откройте форму объекта, перейдите на вкладку «Модуль» и добавьте процедуру с директивой компиляции.

В управляемых формах код делится на клиентский и серверный. Директива &НаКлиенте означает, что код выполняется на компьютере пользователя (доступен интерфейс, но недоступен прямой запрос к базе). Директива &НаСервере — код выполняется на сервере, где доступны запросы и данные, но нельзя показать диалог пользователю.

&НаКлиенте

Процедура РассчитатьСкидку(Команда)

РассчитатьСкидкуНаСервере();

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

&НаСервере

Процедура РассчитатьСкидкуНаСервере()

// логика расчёта

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

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

Модуль объекта и общий модуль: когда какой выбрать

Модуль объекта предназначен для логики, которая относится к конкретному документу или элементу справочника: обработка проведения, заполнение по умолчанию, проверка данных перед записью. Здесь доступны реквизиты объекта напрямую по имени, а также встроенные события — ПередЗаписью, ПриЗаписи, ОбработкаПроведения.

Общий модуль нужен, когда одна и та же функция требуется в нескольких объектах: расчёт налогов, форматирование строк, работа со справочниками. Общие модули создаются в ветке «Общие → Общие модули». Функция в общем модуле должна быть экспортной — с ключевым словом Экспорт после заголовка, иначе она не будет видна снаружи.

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

// код функции

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

Где разместить функцию

Модуль формы

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

Модуль объекта

Подходит для логики записи и проведения конкретного документа. Ограничение: недоступен из форм других объектов без создания экземпляра.

Общий модуль

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

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

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

Код без изменения конфигурации: внешние обработки и расширения

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

Внешняя обработка — файл с расширением .epf, создаётся через «Файл → Новый → Внешняя обработка». Код пишется в модуле формы обработки или в модуле объекта. Готовую обработку подключают через «Файл → Открыть» в режиме Предприятия или регистрируют в справочнике дополнительных отчётов и обработок, если он есть в конфигурации.

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

Проверка результата и поиск ошибок

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

Для отладки используйте точки останова: установите красный маркер на нужной строке модуля, запустите отладку через «Отладка → Начать отладку» и выполните действие в режиме Предприятия. Выполнение остановится на точке, и вы сможете посмотреть значения переменных через «Вычислить выражение» (Shift+F9).

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

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

Обновление конфигурации БД
Норма

Обновление прошло без ошибок, окно сообщений чистое

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

Ошибки компиляции модуля — код не применён

Вызов функции
Норма

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

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

Ничего не происходит или появляется ошибка «Процедура или функция не обнаружена»

Видимость функции
Норма

Функция вызывается из нужного контекста

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

Ошибка «переменная не определена» — функция не экспортная или вызвана из чужого контекста

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

FAQ: частые вопросы о размещении кода в 1С

Можно ли внести код функции в режиме 1С:Предприятие, не открывая конфигуратор?

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

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

Чаще всего функция находится в другом модуле и не объявлена экспортной, либо вы вызываете серверную функцию из клиентского контекста. Проверьте наличие слова «Экспорт» в заголовке функции и правильность директив компиляции. Также убедитесь, что общий модуль имеет подходящие флаги «Сервер» или «Клиент».

Куда вносить код, который должен выполняться при записи документа?

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

Что выбрать: изменить типовой модуль или создать расширение?

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

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

Откройте форму в конфигураторе, найдите нужную команду в списке команд формы и посмотрите свойство «Действие» — там указано имя обработчика. Затем найдите эту процедуру в модуле формы через поиск (Ctrl+F). Если обработчик вызывает процедуру из общего модуля, переходите по цепочке вызовов дальше.

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

Да, для этого и предназначены общие модули. Создайте общий модуль с понятным именем, например «МоиОбработки», установите нужные флаги контекста (обычно «Сервер»), и объявляйте в нём функции с ключевым словом «Экспорт». Вызывать их можно из любого модуля по схеме «ИмяМодуля.ИмяФункции()».

Итог

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

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