Разработка и Конфигурация · 10 мин
Как передать параметр в функцию 1С
Как передать параметр в функцию 1С: синтаксис объявления, передача по значению (Знач) и по ссылке, параметры по умолчанию, типичные ошибки и проверка результата.
Передача параметров в функцию — базовый приём встроенного языка 1С, без которого невозможно написать переиспользуемый код. Функция объявляется с перечнем параметров в круглых скобках, а вызывающий код передаёт фактические значения в том же порядке. Понимание разницы между передачей по значению и по ссылке, а также работы параметров по умолчанию, избавляет от большинства ошибок начинающих разработчиков.
В 1С параметры перечисляются при объявлении функции через запятую. При вызове значения подставляются позиционно: первое значение попадает в первый параметр, второе — во второй. Пропустить «средний» параметр можно, оставив пустое место между запятыми, — тогда он получит значение Неопределено либо значение по умолчанию, если оно задано.
Объявление функции с параметрами
Функция в 1С объявляется ключевым словом «Функция», после имени в скобках указывается список формальных параметров. Порядок параметров в объявлении определяет порядок, в котором их нужно передавать при вызове.
Функция РассчитатьСумму(Цена, Количество, СтавкаНДС)
СуммаБезНДС = Цена * Количество;
Возврат СуммаБезНДС + СуммаБезНДС * СтавкаНДС / 100;
КонецФункции
Вызов такой функции выглядит просто: Итог = РассчитатьСумму(150, 3, 20);. Значения подставляются позиционно: 150 попадёт в Цена, 3 — в Количество, 20 — в СтавкаНДС. Если перепутать порядок, ошибки компиляции не будет — функция просто посчитает неправильно, и это одна из самых коварных ошибок.
Имена параметров внутри функции становятся локальными переменными. Их можно читать и (с учётом способа передачи) изменять. Хорошая практика — давать параметрам говорящие имена, чтобы при вызове было понятно, что ожидается.
Функция РассчитатьСумму(Цена, Количество, СтавкаНДС = 20) Экспорт
Возврат Цена <em> Количество </em> (1 + СтавкаНДС / 100);
КонецФункции
// Вызов:
Итог = РассчитатьСумму(150, 3); // ставка по умолчанию 20
Итог2 = РассчитатьСумму(150, 3, 10); // явно указана ставка 10Передача по значению и по ссылке
По умолчанию параметр передаётся по ссылке: внутри функции вы работаете с тем же объектом, что и вызывающий код. Если присвоить параметру новое значение, изменение будет видно снаружи. Это удобно, когда функция должна «вернуть» несколько результатов через параметры.
Если перед именем параметра написать ключевое слово Знач, параметр передаётся по значению — функция получает копию. Любые изменения внутри функции не затронут исходную переменную вызывающего кода.
Функция Обработать(Знач НомерДокумента, ТекстОшибки)
НомерДокумента = НомерДокумента + 1; // снаружи не изменится
ТекстОшибки = "Ошибок нет"; // снаружи изменится
Возврат Истина;
КонецФункции
Важный нюанс: для изменяемых объектов (справочники, документы, таблицы значений, массивы) «по ссылке» означает, что функция может менять содержимое объекта даже без слова Знач. А вот примитивные типы — число, строка, дата, булево — при передаче без Знач тоже могут быть изменены через присваивание параметру нового значения, что часто становится неожиданностью.
По значению или по ссылке
Функция работает с копией. Подходит для примитивов, которые не должны меняться снаружи. Небольшие затраты на копирование.
Функция может изменить значение, видимое вызывающему коду. Подходит для возврата дополнительных результатов и работы с большими объектами без копирования.
Необязательный параметр. Вызывающий код может его не передавать — подставится указанное значение.
Параметры по умолчанию и необязательные параметры
Чтобы сделать параметр необязательным, при объявлении задайте ему значение: СтавкаНДС = 20. Тогда вызов РассчитатьСумму(150, 3) допустим — в СтавкаНДС попадёт 20. Необязательные параметры принято размещать в конце списка, чтобы их можно было просто опустить.
Если необязательный параметр стоит в середине, его можно пропустить, оставив пустое место между запятыми: МояФункция(А, , В). В этом случае параметр получит значение по умолчанию, а если оно не задано — Неопределено. Внутри функции полезно проверять такие параметры: Если Параметр = Неопределено Тогда ....
Значение по умолчанию должно быть простым литералом или выражением, вычисляемым в момент вызова. Не стоит рассчитывать, что там будет «последнее использованное значение» — при каждом вызове без параметра подставляется именно то, что написано в объявлении.
Передача параметров в разных контекстах
Клиент-серверные вызовы
При вызове серверной функции из клиентского кода параметры сериализуются — передаются не ссылки на объекты в памяти, а их представления. Поэтому между клиентом и сервером можно передавать только сериализуемые типы: примитивы, структуры, массивы, ссылки на объекты базы. Передать, например, объект ТабличныйДокумент или COMОбъект на сервер не получится.
Параметры в обработчиках событий
В обработчиках событий формы и объектов платформа сама передаёт параметры — например, Отказ, Источник, ПараметрыЗаписи. Менять их состав нельзя, но можно изменять значения: установка Отказ = Истина внутри обработчика — стандартный способ прервать операцию. Это работает именно потому, что параметр передан по ссылке.
Структура как контейнер параметров
Когда параметров много (больше трёх-четырёх), удобнее передать одну Структуру: ПараметрыРасчета = Новый Структура("Цена, Количество, СтавкаНДС", 150, 3, 20);. Функция принимает один параметр-структуру и обращается к полям по именам. Такой вызов устойчив к изменениям: добавление нового поля не ломает существующие вызовы.
Как выбрать способ передачи
Типичные ошибки при передаче параметров
Самая частая ошибка — перепутанный порядок аргументов одного типа. Вызов РассчитатьСумму(3, 150, 20) синтаксически корректен, но результат неверен. Лечится осмысленными именами параметров и, при большом их числе, переходом на Структуру.
Вторая типичная ситуация — неожиданное изменение переменной вызывающего кода, потому что параметр передан по ссылке и внутри функции ему присвоили значение. Если функция не должна ничего менять снаружи, объявляйте входные параметры через Знач — это одновременно и документация намерений.
Третья группа ошибок — передача несериализуемых типов между клиентом и сервером и попытка вызвать серверную функцию с параметром-объектом, который существует только в клиентском контексте. Платформа выдаст ошибку о невозможности передачи параметра, и правильное решение — передавать ссылку или набор примитивных данных, а объект получать на сервере заново.
Как проверить, что параметры переданы правильно
Самый быстрый способ — отладчик: поставьте точку останова на первой строке функции и посмотрите значения параметров в табло. Видно, что именно пришло снаружи, и сразу заметны перепутанный порядок или Неопределено вместо ожидаемого значения.
Для проверки без отладчика используйте Сообщить() или запись в журнал регистрации: выведите значения параметров в начале функции и сравните с ожидаемыми. В прикладном коде полезны явные проверки входных данных: Если Не ЗначениеЗаполнено(Параметр) Тогда ВызватьИсключение "Не передан обязательный параметр"; КонецЕсли; — так ошибка обнаруживается у источника, а не в глубине расчёта.
Как проверить результат
Каждый параметр содержит ожидаемое значение нужного типа
Значения сдвинуты, равны Неопределено или имеют неожиданный тип
Не изменилась, если параметр объявлен с Знач
Изменилась, хотя функция не должна была её трогать
Подставляется значение по умолчанию из объявления
Внутри функции Неопределено и ошибка при использовании
Что важно запомнить
Параметры передаются позиционно через скобки при вызове. Слово Знач даёт копию (по значению), без него — передача по ссылке с возможностью изменить переменную снаружи. Необязательные параметры объявляются со значением по умолчанию и ставятся в конец. При большом числе параметров используйте Структуру, а между клиентом и сервером передавайте только сериализуемые типы.
Частые вопросы о передаче параметров в 1С
Можно ли передать параметр по имени, а не по позиции?
Во встроенном языке 1С нет именованных аргументов при вызове: значения подставляются строго по позиции. Если хочется вызова вида «имя — значение», передайте одну Структуру, где ключи играют роль имён параметров.
Что будет, если передать меньше параметров, чем объявлено?
Недостающие параметры получат значение по умолчанию, если оно задано в объявлении, либо Неопределено. Ошибки на этапе вызова не будет, поэтому обязательные параметры стоит проверять внутри функции явно.
Чем передача по ссылке опасна для массивов и таблиц значений?
Функция получает доступ к тому же объекту и может добавить, удалить или изменить его элементы — изменения видны вызывающему коду. Если это нежелательно, передавайте копию коллекции или документируйте, что функция модифицирует параметр.
Можно ли изменить параметр, объявленный со словом Знач?
Внутри функции — да, ему можно присваивать новые значения, но это локальная копия: переменная вызывающего кода останется прежней. Слово Знач защищает именно внешнюю переменную, а не запрещает присваивание внутри.
Как передать в функцию произвольное число параметров?
Специального механизма переменного числа аргументов в 1С нет. Практическое решение — передать Массив или Структуру, в которые вызывающий код помещает нужное количество значений, а функция обходит их в цикле.
Почему при вызове серверной функции возникает ошибка передачи параметра?
Чаще всего потому, что тип параметра не сериализуется: например, ТабличныйДокумент, COMОбъект или объект, существующий только в клиентском контексте. Передайте ссылку на объект базы или набор примитивных данных, а нужный объект создайте на сервере заново.