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