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

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

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

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

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

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

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

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

💡

Используйте процедуры для действий с побочными эффектами (запись в БД, вывод на экран), а функции — для чистых вычислений и проверок условий.

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

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

Рассмотрим базовый пример объявления простой процедуры без параметров:

Процедура ОбновитьИнтерфейс()

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

ЭлементыФормы.КнопкаПровести.Доступность = Истина;

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

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

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

📊 Как часто вы используете модификатор Знач?
Всегда для безопасности
Только для чисел и строк
Никогда, не вижу смысла
Затрудняюсь ответить

Работа с параметрами: типы и модификаторы

Параметры процедур в обладают динамической типизацией, что означает, что вам не нужно указывать тип данных при объявлении. Тип определяется значением, которое передается в процедуру при её вызове. Однако, для повышения надежности кода и работы с системой подсказок (IntelliSense), настоятельно рекомендуется использовать аннотации типов или явные проверки внутри тела процедуры.

Существует три основных способа передачи параметров:

  • 📥 По значению (без модификаторов): Для объектов это передача ссылки. Изменение свойств объекта внутри процедуры повлияет на исходный объект.
  • 🛡️ По значению (с модификатором Знач): Создается копия значения. Для примитивных типов это полная защита, для объектов — защита ссылки (но не свойств).
  • 🔄 Как переменная (неявно): Если процедура изменяет сам параметр (например, присваивает ему новое значение), это изменение не выйдет за пределы процедуры, если не использован специальный механизм возврата.

Важно понимать разницу между изменением ссылки и изменением содержимого объекта. Если вы передали в процедуру справочник и выполнили Параметр.Наименование = "Новое имя", то в базе данных имя изменится. Если же вы сделали Параметр = Справочники.Номенклатура.ПустаяСсылка(), то внутри процедуры переменная просто укажет на другой объект, а исходная переменная в месте вызова останется неизменной.

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

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

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

Таблица ниже демонстрирует основные различия в доступности методов в зависимости от типа модуля:

Тип модуля Доступ к базе данных Доступ к интерфейсу Область видимости
Модуль объекта Полный доступ Только через форму Только внутри объекта
Общий модуль Зависит от галочки "Клиент/Сервер" Нет (на сервере) Глобально или по праву доступа
Модуль формы Ограничен (клиентский контекст) Полный доступ к элементам Только внутри формы
Модуль команды Полный доступ (сервер) Нет Глобально для команды

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

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

Что такое контекстная процедура?

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

Особенности клиент-серверного взаимодействия

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

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

Рассмотрим правильный паттерн вызова:

  1. Создайте серверную процедуру в общем модуле или модуле объекта для обработки данных.
  2. В модуле формы создайте клиентскую процедуру-обертку.
  3. Используйте конструкцию ВыполнитьНаСервере для передачи управления.
&НаКлиенте

Процедура КнопкаОбработкиНажатие(Кнопка)

// Подготовка параметров

Параметры = Новый Структура("ОбъектСсылка", Ссылка);

// Вызов сервера

ВыполнитьНаСервере("ОбработкаДанныхНаСервере", Параметры);

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

⚠️ Внимание: Передача больших массивов данных между клиентом и сервером через параметры процедур существенно снижает производительность. Старайтесь передавать только ссылки на объекты или минимально необходимые идентификаторы.

💡

Правильное разделение кода на клиентские и серверные процедуры — залог быстродействия вашей конфигурации 1С.

Типовые ошибки и лучшие практики

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

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

Следуйте принципу единой ответственности: одна процедура должна делать одно конкретное действие. Если ваша процедура занимает более 50-100 строк кода и содержит вложенные циклы с разной логикой, попробуйте декомпозировать её на несколько мелких вспомогательных процедур. Это облегчит чтение и тестирование кода.

☑️ Чек-лист качественной процедуры

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

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

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

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

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

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

Как передать неопределенное количество параметров?

В 1С нет прямого аналога varargs как в некоторых других языках. Обычно для передачи динамического набора данных используют параметр типа Структура, Массив или СписокЗначений, который упаковывает все необходимые данные в один аргумент.

Может ли процедура иметь те же имена, что и встроенные методы?

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

Что происходит с локальными переменными после завершения процедуры?

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