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

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

Как добавить процедуру в 1С: практическое руководство

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

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

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

Где могут располагаться процедуры в 1С

Прежде чем писать код, нужно выбрать модуль. От этого зависит область видимости процедуры, контекст выполнения (клиент или сервер) и доступность данных. Неверный выбор места — одна из самых частых причин переделки кода.

Основные варианты размещения:

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

Как добавить процедуру в модуль формы

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

В модуле напишите заготовку процедуры:

&НаКлиенте

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

// Код процедуры

Сообщить("Скидка рассчитана");

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

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

Добавление процедуры в модуль формы
  1. 1
    Откройте конфигуратор и дерево конфигурации
  2. 2
    Найдите объект и откройте его форму
  3. 3
    Перейдите на вкладку «Модуль»
  4. 4
    Напишите конструкцию «Процедура ... КонецПроцедуры» с директивой компиляции
  5. 5
    Привяжите процедуру к команде или событию через палитру свойств
  6. 6
    Проверьте синтаксис: Конфигурация → Проверка конфигурации

Как добавить процедуру в общий модуль

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

Чтобы процедуру можно было вызвать извне, добавьте слово Экспорт:

Процедура ЗаписатьЛогОперации(ТекстОперации) Экспорт

ЗаписьЖурналаРегистрации("Операции",

УровеньЖурналаРегистрации.Информация, , , ТекстОперации);

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

Вызов такой процедуры из любого места конфигурации выполняется через имя модуля: МойОбщийМодуль.ЗаписатьЛогОперации("Текст");. Если флаг «Вызов сервера» не установлен, клиентский код не сможет обратиться к серверному модулю — проверьте это свойство при ошибке «Процедура или функция с указанным именем не определена».

Параметры процедуры и передача значений

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

Процедура УвеличитьСумму(Сумма, Знач Процент)

Сумма = Сумма + Сумма * Процент / 100;

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

Для параметра можно задать значение по умолчанию: Процедура Печать(Документ, КоличествоКопий = 1). Такие параметры должны располагаться в конце списка. При вызове их можно опускать.

Добавление процедуры через расширение конфигурации

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

В заимствованной форме можно добавлять свои процедуры, а типовые обработчики перехватывать аннотациями &После("ИмяПроцедуры"), &Перед("ИмяПроцедуры") или &Вместо("ИмяПроцедуры"):

&После("ПриСозданииНаСервере")

Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Дополнительная логика

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

Аннотация &Вместо полностью заменяет типовой обработчик — используйте её только когда без этого нельзя обойтись, так как при обновлении типового кода ваша замена может потерять совместимость. Варианты &После и &Перед устойчивее к обновлениям.

Способы добавить процедуру

Прямая доработка конфигурации

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

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

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

Общий модуль в расширении

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

Проверка и отладка добавленной процедуры

После написания кода выполните синтаксическую проверку: «Конфигурация → Проверка конфигурации» с включённым флагом проверки модулей. Ошибки компиляции (несуществующие переменные, незакрытые конструкции) будут показаны в окне сообщений с указанием строки.

Для пошаговой отладки поставьте точку останова (F9) на строке внутри процедуры, запустите отладку (F5) и выполните действие, вызывающее процедуру. В табло (Shift+F9) можно посмотреть значения переменных и параметров. Если процедура не вызывается вообще — проверьте привязку к событию или команде и директиву компиляции.

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

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

Проверка конфигурации
Норма

Ошибок в модуле нет

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

Сообщения о неопределённых процедурах или синтаксических ошибках

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

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

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

Процедура не срабатывает или падает с исключением

Обновление конфигурации (для расширений)
Норма

Расширение остаётся совместимым, код работает

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

Конфликты заимствованных обработчиков после обновления

Типичные ошибки и ограничения

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

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

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

Итог

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

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

Часто задаваемые вопросы

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

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

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

Основные причины: отсутствует слово «Экспорт» у процедуры в другом модуле; неверно указано имя модуля или объекта при вызове; у общего модуля не установлен нужный контекст (например, серверный модуль вызывается с клиента без флага «Вызов сервера»); опечатка в имени. Проверьте эти пункты по очереди.

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

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

Куда лучше поместить процедуру, которая нужна в нескольких документах?

В серверный общий модуль с признаком «Вызов сервера», если к ней обращается и клиентский код. Так код не дублируется, исправления вносятся в одном месте, а вызов выполняется через имя модуля: ИмяМодуля.ИмяПроцедуры(Параметры).

Что делать, если после обновления конфигурации процедура в расширении перестала работать?

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

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

Да, в управляемой форме каждая процедура должна иметь директиву: &НаКлиенте, &НаСервере, &НаСервереБезКонтекста или варианты с «НаКлиентеНаСервере». Без директивы компилятор выдаст ошибку. Выбор зависит от того, обращается ли код к базе данных и нужен ли контекст формы.