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