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

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

Синтаксическая структура и объявление

Любая подпрограмма в языке начинается с ключевого слова. Полная запись выглядит как Процедура ИмяПодпрограммы(Параметры). Однако система разработки позволяет использовать сокращение пр, что экономит время опытного разработчика. После объявления следует тело процедуры, содержащее инструкции, и завершающая конструкция КонецПроцедуры (или конецпр). Именно между этими границами располагается логика работы вашего алгоритма.

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

Рассмотрим пример объявления. Вы можете написать код в полном виде или использовать краткую форму, результат будет идентичным:

Процедура ОбработатьДокумент(Док, Флаг)

// Тело процедуры

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

Или в сокращенном варианте:

пр ОбработатьДокумент(Док, Флаг)

// Тело процедуры

конецпр

💡

Используйте сокращение «пр» только в личных заметках или при быстром прототипировании. В промышленном коде лучше использовать полное написание для повышения читаемости коллегами.

Ключевые отличия процедуры от функции

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

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

💡

Функция возвращает значение, процедура выполняет действие. Это золотое правило структурного программирования в 1С.

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

  • 🔹 Назначение: Процедура выполняет действия, Функция вычисляет и возвращает результат.
  • 🔹 Вызов: Процедура вызывается отдельной строкой, Функция — частью выражения.
  • 🔹 Возврат: В процедуре Возврат без параметров, в функции — строго с данными.
📊 Как вы чаще объявляете подпрограммы в 1С?
Полностью (Процедура/Функция)
Сокращенно (пр/ф)
Использую автоподстановку
Не пишу код, использую конфигуратор

Область видимости и параметры передачи

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

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

⚠️ Внимание: Будьте осторожны при передаче объектов (справочников, документов) без модификатора Знач. Изменение реквизитов объекта внутри процедуры повлияет на исходный объект в базе данных, даже если вы не вызывали метод Записать() явно, если изменения уже зафиксированы в памяти.

Рассмотрим таблицу, демонстрирующую поведение различных типов параметров:

Тип параметра Модификатор Влияние на исходную переменную Рекомендуемое использование
Примитив (Число, Строка) Нет Изменение возможно (ссылка) Редко, только если нужно вернуть несколько значений
Примитив (Число, Строка) Знач Нет (копия) Стандартный вариант для входных данных
Объект (Справочник) Нет Изменение реквизитов видно снаружи Для модификации данных перед записью
Объект (Справочник) Знач Копия ссылки (изменение реквизитов локально) Для анализа данных без риска изменения

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

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

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

пр ВывестиСообщение(Текст, ТипСообщения)

Сообщить(Текст, СтатусСообщения.ТипСообщения);

ЖурналРегистрации.Записать(Текст);

конецпр

Особенности рекурсии в процедурах

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

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

Ошибки при работе с процедурами

Одна из самых частых проблем — попытка использовать результат работы процедуры в выражении. Например, конструкция А = МояПроцедура(Б) вызовет ошибку, если МояПроцедура объявлена как пр. Компилятор 1С строг к типам возвращаемых значений и четко разграничивает подпрограммы. Чтобы исправить это, нужно либо изменить объявление на Функция и добавить Возврат, либо вызвать процедуру отдельной строкой.

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

⚠️ Внимание: Интерфейс и возможности платформы 1С могут обновляться. В новых версиях могут появляться строгие проверки типов или новые ключевые слова. Всегда сверяйте синтаксис с актуальной справкой по языку для вашей версии платформы (8.3.x).

Не забывайте про именование. Хотя система позволяет называть процедуры как угодно, нарушение соглашений (например, называть процедуру глаголом в прошедшем времени, а функцию в настоящем) запутает команду. Принято называть процедуры глаголами несовершенного вида (Что делать?), а функции — совершенного или существительными (Что сделать? или Что?).

  • 🔸 Ошибка присваивания результата процедуры переменной.
  • 🔸 Попытка доступа к локальной переменной извне процедуры.
  • 🔸 Отсутствие обработки исключительных ситуаций внутри длинных процедур.

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

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

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

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

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

В чем разница между «пр» и «процедура»?

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

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

Нет, в 1С используется динамическая типизация. Вы можете не указывать типы параметров, однако явное описание типов (через аннотации или в тексте) рекомендуется для самодокументирования кода и помощи встроенному редактору.

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

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