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

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

В данной статье мы детально разберем, как объявлять процедуры, как передавать в них данные, чем они отличаются от функций и какие существуют нюансы работы с параметрами. Мы рассмотрим реальные примеры из практики программирования на 1С, чтобы закрепить теоретическую базу. Вы узнаете, когда целесообразно использовать именно этот тип подпрограммы, а когда лучше обратиться к функциям. Готовы погрузиться в код? Давайте начнем с самого определения и синтаксиса.

Сущность процедуры и её отличие от функции

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

Представьте, что вы пишете модуль для обработки заказа. Вам нужно рассчитать скидку. Для этого вы напишете функцию, которая вернет числовое значение скидки. Это значение потом пойдет в формулу итоговой суммы. А вот чтобы сохранить этот заказ в базу данных, вы вызовете процедуру ЗаписатьВБазу(). Она выполнит запись, проверит права доступа, возможно, создаст движения по регистрам, но ничего не вернет вам "на блюдечке". Её результат — это изменение состояния системы.

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

⚠️ Внимание: Не пытайтесь присвоить результат вызова процедуры переменной. Конструкция вида Результат = МояПроцедура() приведет к ошибке компиляции, так как процедура не возвращает значение. Если вам нужно получить данные из блока кода, используйте функцию.

💡

Используйте процедуры для действий с побочными эффектами: запись в БД, вывод сообщений пользователю, запуск внешних приложений. Используйте функции для вычислений и получения данных.

Синтаксис объявления и вызова процедуры

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

Рассмотрим базовый пример объявления простой процедуры без параметров. Такой код часто используется для обработки событий интерфейса, например, нажатия кнопки "Печать" или "Обновить".

Процедура ОбновитьСписокТоваров()

// Получаем текущий список из базы данных

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Справочник.Товары.Ссылка ИЗ Справочник.Товары";

Результат = Запрос.Выполнить();

// Очищаем таблицу на форме и заполняем заново

ЭлементыФормы.СписокТоваров.Очистить();

// Здесь код заполнения..

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

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

  • 📝 Имя процедуры должно начинаться с буквы и содержать только буквы, цифры и знак подчеркивания.
  • ⚙️ Параметры передаются по значению по умолчанию, если не указано иное ключевое слово Знач.
  • 🔍 Видимость процедуры определяется директивой &НаКлиенте, &НаСервере или отсутствием таковой (серверный контекст по умолчанию в общих модулях).
📊 Какой тип подпрограмм вы используете чаще?
Функции
Процедуры
Примерно поровну
Затрудняюсь ответить

Работа с параметрами: Знач, Вых и обычные

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

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

Если перед именем параметра стоит ключевое слово Знач, это явно указывает на передачу по значению (для типов, которые по умолчанию передаются по ссылке, например, объектов). Однако чаще всего разработчиков интересует возможность изменить исходную переменную. Для этого используются параметры Вых (выходной) или просто передача объекта по ссылке (без слова Знач для объектов).

Тип параметра Синтаксис Поведение Пример использования
Входной (по значению) Параметр Копия значения, изменения не сохраняются Передача строки для вывода в сообщение
Входной-выходной &Параметр (объекты) Передача ссылки, изменения сохраняются Заполнение структуры данными внутри процедуры
Выходной ВыхПараметр Значение формируется внутри, игнорируется на входе Возврат кода ошибки или статуса операции

Рассмотрим пример процедуры, которая меняет значение переменной. Здесь мы используем особенность передачи объектов по ссылке.

Процедура ИзменитьНаименование(Товар, НовоеИмя)

// Товар передается по ссылке, так как это объект

Товар.Наименование = НовоеИмя;

// Изменение затронет оригинальный объект вне процедуры

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

⚠️ Внимание: Будьте осторожны при передаче объектов (СправочникСсылка, ДокументОбъект) без модификатора Знач. Вы можете случайно изменить данные в памяти, которые еще не записаны в базу, что приведет к непредсказуемому поведению программы.

Нюанс передачи простых типов

Числа, строки и даты в 1С являются неизменяемыми типами. Даже если вы передадите их без ключевых слов, внутри процедуры вы фактически работаете с новой копией при присваивании нового значения. Реальная передача по ссылке актуальна в первую очередь для объектов метаданных и коллекций значений.

Область видимости и контекст выполнения

В платформе 1С:Предприятие 8 существует четкое разделение на клиентскую и серверную часть. Это влияет на то, где может выполняться ваша процедура. Неправильное определение контекста выполнения — одна из самых частых ошибок у начинающих разработчиков, приводящая к сообщениям вроде "Процедура не может быть вызвана на клиенте".

Чтобы указать, что процедура должна выполняться на стороне клиента (в браузере или толстом клиенте), используется директива &НаКлиенте. Такие процедуры могут обращаться к элементам формы, вызывать диалоговые окна, но не имеют прямого доступа к базе данных. Наоборот, директива &НаСервере указывает, что код выполняется на сервере 1С. Здесь доступен полный функционал работы с запросами и объектами базы данных.

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

  • ☁️ &НаКлиенте: Работает с интерфейсом, не может делать запросы к БД напрямую.
  • 🖥️ &НаСервере: Работает с данными, не может напрямую управлять элементами формы.
  • 🔒 &НаСервереБезКонтекста: Изолированный серверный код, идеален для библиотечных функций.

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

💡

Всегда явно указывайте контекст выполнения (&НаКлиенте, &НаСервере) для процедур в формах и общих модулях. Это предотвратит ошибки выполнения и упростит отладку.

Рекурсия и особенности вызова

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

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

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

Процедура ОбойтиГруппу(СсылкаНаГруппу)

// Базовое условие или обработка текущего элемента

Сообщить("Обрабатываем группу: " + СсылкаНаГруппу);

// Получаем вложенные группы

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ.. ГДЕ Родитель = &Родитель";

//.. выполнение запроса..

// Рекурсивный вызов для каждой найденной группы

Для каждого Элемент из Результат Цикл

ОбойтиГруппу(Элемент.Ссылка); // Вызов самой себя

КонецЦикла;

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

⚠️ Внимание: При использовании рекурсии всегда проверяйте глубину вложенности данных. Если справочник имеет сотни уровней вложенности, рекурсивная процедура может вызвать ошибку переполнения стека. В таких случаях лучше использовать итеративный подход с очередью или стеком.

☑️ Проверка рекурсивной процедуры

Выполнено: 0 / 4

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

Где именно в реальной конфигурации 1С вы будете встречать процедуры чаще всего? Практически в любом модуле. Обработчики событий формы, такие как ПриСозданииНаСервере или ПриЗаписи, технически являются процедурами. Они реагируют на действия пользователя или системы, выполняют свою логику и завершаются.

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

Также процедуры активно используются в регламентных заданиях. Фоновые процессы, которые очищают журнал регистрации, удаляют помеченные объекты или обмениваются данными с другими системами, реализованы в виде процедур, запускаемых по расписанию. Они работают автономно, без вмешательства пользователя.

ℹ️ Интерфейсы и версии платформы могут меняться. Синтаксис языка 1С стабилен, но доступные методы объектов и контекст выполнения могут отличаться в разных версиях платформы (например, 8.3.10 против 8.3.25). Всегда проверяйте документацию к конкретной версии, с которой вы работаете, особенно при использовании новых возможностей, таких как работа с HTTP-сервисами или JSON в процедурах.

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

Может ли процедура возвращать значение в 1С?

Нет, процедура не может возвращать значение напрямую через оператор Возврат с выражением. Если вам нужно получить результат, используйте функцию. Однако процедура может изменить значения переданных ей параметров (если они не переданы по значению), что косвенно позволяет "вернуть" данные вызывающему коду.

В чем разница между процедурой и обработчиком события?

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

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

Если процедура требует более 5-7 параметров, это признак плохого дизайна. В 1С рекомендуется использовать структуру (Новая Структура) или объект значения для группировки параметров. Передайте одну структуру в процедуру, а внутри распакуйте её значения.

Можно ли вызвать серверную процедуру из клиентской?

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

Что будет, если в процедуре не указать КонецПроцедуры?

Система выдаст ошибку синтаксического контроля при попытке сохранения модуля. Блок кода процедуры должен быть обязательно закрыт соответствующим ключевым словом, иначе компилятор 1С не сможет определить границы подпрограммы.