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