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

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

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

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

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

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

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

Процедура ВыполнитьДействие(Параметр1, Параметр2)

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

Сообщить("Выполняется обработка...");

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

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

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

💡

Используйте префиксы в именах процедур, чтобы сразу понимать, где они находятся. Например, ОбработкаПроведения_СоздатьДокумент или Форма_ОбновитьТаблицу.

Работа с параметрами: Значения и Переменные

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

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

Рассмотрим пример, где параметр передается для изменения:

  • 📌 Передача по значению: Создается копия числа или строки. Изменение копии внутри процедуры безопасно для внешнего кода.
  • 🔄 Передача объектов: Объекты (Справочники, Документы) всегда передаются по ссылке. Изменение свойств объекта внутри процедуры изменит его в памяти.
  • 📝 Возврат нескольких значений: Поскольку процедура не возвращает результат через Возврат, изменение переданных переменных — единственный способ получить данные "наружу".

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

📊 Какой тип параметров вы используете чаще всего?
Только значения
Объекты и ссылки
Комбинированный подход
Не использую параметры

Область видимости и модификаторы доступа

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

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

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

Ниже приведена таблица, демонстрирующая различия в доступности процедур в зависимости от места их объявления и модификаторов:

Место объявления Модификатор Доступность
Общий модуль Без экспорта Только внутри модуля
Общий модуль Экспорт Вся конфигурация
Модуль формы Без экспорта Только форма и её команды
Модуль объекта Экспорт Внешние обработки и другие объекты

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

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

Избыточный экспорт нарушает инкапсуляцию. Если внутренняя логика модуля изменится, а внешние коды зависят от экспортируемой процедуры, это может привести к ошибкам во всей системе.

Вызов процедуры из разных контекстов

После того как вы добавили процедуру в 1С, её необходимо вызвать. Синтаксис вызова прост: указывается имя процедуры и в скобках передаются фактические параметры. Однако контекст выполнения (клиент или сервер) накладывает определенные ограничения.

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

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

&НаКлиенте

Процедура КнопкаВыполнитьНажатие(Команда)

// Вызов серверной процедуры через общий модуль

МойОбщийМодуль.СервернаяПроцедура(ТекущийДокумент);

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

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

⚠️ Внимание: Интерфейс конфигуратора и доступные свойства могут незначительно отличаться в зависимости от версии платформы 1С:Предприятие (например, 8.3.15 против 8.3.25). Всегда сверяйтесь с синтаксис-помощником вашей конкретной версии.

☑️ Проверка перед вызовом процедуры

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

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

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

Используйте функцию, когда вам нужно получить какое-то вычисленное значение: рассчитать сумму, найти элемент справочника или проверить условие. Используйте процедуру, когда нужно произвести действие: записать документ, провести набор регистров или открыть форму списка.

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

  • Функция: Сумма = РассчитатьНДС(База) — мы получаем результат в переменную.
  • ⚙️ Процедура: ЗаписатьДокумент(Док) — мы инициируем процесс сохранения.
  • Ошибка: Попытка присвоить результат вызова процедуры переменной приведет к ошибке синтаксиса.

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

💡

Золотое правило: если код должен что-то "сделать" с базой или интерфейсом — пишите процедуру. Если код должен что-то "посчитать" и отдать результат — пишите функцию.

Типичные ошибки при создании процедур

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

Другая распространенная ошибка — попытка изменить значение параметра, переданного по значению (с ключевым словом Знач), внутри процедуры. Хотя для объектов это не так критично (изменяются свойства), для примитивных типов (Число, Строка, Дата) это не сработает так, как ожидает новичок.

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

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

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

Можно ли объявить процедуру внутри другой процедуры?

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

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

Для этого используется специальный параметр с модификатором Неопределено или работа с коллекциями значений. Однако стандартный механизм вариабельности аргументов (как varargs в C#) в явном виде отсутствует, обычно передают Массив или Структуру.

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

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

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

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

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

При попытке сохранения модуля или проверки синтаксиса система выдаст ошибку "Не найдено соответствие начала и конца процедуры". Код не будет выполнен, пока структура блока не будет закрыта корректно.