К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как сделать параметр функции необязательным в 1С

Как объявить необязательный параметр функции в 1С: значения по умолчанию, Неопределено, проверка заполненности, типичные ошибки и примеры кода на встроенном языке.

Во встроенном языке 1С любой параметр процедуры или функции можно сделать необязательным, задав ему значение по умолчанию через знак равенства в объявлении. Синтаксис выглядит так: Функция РассчитатьСкидку(Сумма, Процент = 10). Теперь функцию можно вызвать как с двумя аргументами, так и с одним — пропущенный параметр примет значение по умолчанию.

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

Важно понимать ограничения платформы: значения по умолчанию должны быть литералами (число, строка, дата, Истина/Ложь, Неопределено), а необязательные параметры разумно размещать в конце списка, иначе вызовы станут запутанными. Ниже разобраны все практические детали.

Базовый синтаксис необязательных параметров

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

Функция СформироватьПредставление(Наименование, Префикс = "", ДобавитьДату = Ложь)

Результат = Префикс + Наименование;

Если ДобавитьДату Тогда

Результат = Результат + " от " + Формат(ТекущаяДатаСеанса(), "ДЛФ=D");

КонецЕсли;

Возврат Результат;

КонецФункции

Допустимые значения по умолчанию — только литералы: числа, строки в кавычках, даты в одинарных кавычках ('00010101'), булевы значения Истина и Ложь, а также Неопределено. Вызвать функцию или обратиться к переменной в значении по умолчанию нельзя — компилятор выдаст ошибку.

Вызов такой функции возможен в нескольких вариантах: СформироватьПредставление("Товар"), СформироватьПредставление("Товар", "№ ") или со всеми аргументами. Пропущенные с конца параметры автоматически получают свои значения по умолчанию.

Как пропустить параметр в середине списка при вызове

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

Результат = СформироватьПредставление("Товар", , Истина);

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

Если параметр объявлен без значения по умолчанию, пропустить его запятой нельзя — будет передано Неопределено, что часто приводит к ошибкам приведения типов внутри функции. Это ещё один аргумент в пользу того, чтобы все «пропускаемые» параметры имели явное значение по умолчанию.

Использование Неопределено как значения по умолчанию

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

Функция ПолучитьОстатки(Номенклатура, ДатаОстатков = Неопределено)

Если ДатаОстатков = Неопределено Тогда

ДатаОстатков = ТекущаяДатаСеанса();

КонецЕсли;

// далее запрос с использованием ДатаОстатков

КонецФункции

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

Проверка переданного значения внутри функции

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

Выбор зависит от семантики параметра. Если нулевое количество или пустая строка — допустимые рабочие значения, используйте сравнение с Неопределено. Если пустое значение равнозначно отсутствию данных (например, пустой контрагент в отборе), уместнее ЗначениеЗаполнено():

Если ЗначениеЗаполнено(Контрагент) Тогда

// добавить отбор по контрагенту

КонецЕсли;

Для числовых параметров будьте аккуратны: ЗначениеЗаполнено(0) возвращает Ложь. Если ноль — легитимное значение (скидка 0%, нулевой лимит), проверяйте именно на Неопределено, иначе логика функции исказится незаметно для вызывающего кода.

Типичные ошибки
01
Использование ЗначениеЗаполнено() для числового параметра: ноль трактуется как «не передано», и логика работает неверно
02
Значение по умолчанию в виде вызова функции или переменной — компилятор не примет, допустимы только литералы
03
Необязательный параметр без значения по умолчанию в середине списка: при пропуске туда попадёт Неопределено и вызовет ошибку типов
04
Изменение состава параметров экспортной функции без поиска всех мест вызова — старые вызовы начнут передавать аргументы не в те позиции

Оформление экспортных функций в общих модулях

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

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

Учитывайте контекст исполнения: если общий модуль серверный, а функция вызывается с клиента, все параметры должны быть сериализуемыми. Неопределено и примитивные типы передаются без проблем, а вот, например, объекты типа «Запрос» — нет.

Порядок добавления необязательного параметра
  1. 1
    Откройте модуль и найдите объявление функции или процедуры
  2. 2
    Добавьте параметр в конец списка со значением по умолчанию: Параметр = Неопределено
  3. 3
    В начале тела функции обработайте случай пропуска: замените Неопределено на рабочее значение
  4. 4
    Выполните синтаксическую проверку модуля через конфигуратор
  5. 5
    Найдите все вызовы функции и убедитесь, что позиции существующих аргументов не сместились

Когда необязательный параметр — плохое решение

Не стоит злоупотреблять значениями по умолчанию. Если функция имеет пять и более параметров, из которых половина необязательные, вызовы становятся нечитаемыми: Ф(А, , , Истина, , Х). В такой ситуации лучше передать структуру с именованными полями — это стандартный приём в типовых конфигурациях (параметры типа «ДополнительныеПараметры»).

Также необязательные параметры не подходят, когда значение критично для безопасности данных. Если от пропуска параметра зависит, по каким организациям или за какой период будет выполнена выборка, «тихое» значение по умолчанию может привести к неправильным отчётам. Критичные параметры лучше оставлять обязательными — пусть вызывающий код задаёт их явно.

Способы передать дополнительные данные

Необязательный параметр со значением по умолчанию

Подходит для 1–3 дополнительных настроек; ограничение — значения по умолчанию только литеральные

Структура параметров

Подходит при большом числе настроек; вызов длиннее, но читаемее и легко расширяется

Обязательный параметр

Подходит для критичных данных, где пропуск недопустим; требует правки всех вызовов при добавлении

Проверка результата после изменений

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

Затем проверьте оба сценария вызова: с передачей аргумента и без него. Убедитесь, что в режиме «по умолчанию» функция отрабатывает корректно — особенно если значение по умолчанию вычисляется внутри тела (например, подстановка текущей даты вместо Неопределено).

Контрольные точки

Как проверить результат

Синтаксическая проверка модуля
Норма

Ошибок нет, значение по умолчанию — литерал

Тревожный признак

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

Вызов без необязательного аргумента
Норма

Функция отрабатывает, используется значение по умолчанию

Тревожный признак

Ошибка приведения типа или неверный результат

Вызов со всеми аргументами
Норма

Переданное значение переопределяет умолчание

Тревожный признак

Аргументы сместились, значения попадают не в те параметры

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

Итог

Что важно запомнить

Необязательный параметр объявляется через значение по умолчанию после знака равенства, допустимы только литералы. Для вычисляемых значений используйте Неопределено с обработкой внутри тела. Новые параметры добавляйте в конец списка, а числовые проверяйте сравнением с Неопределено, а не ЗначениеЗаполнено().

Частые вопросы

Можно ли сделать необязательным параметр, стоящий перед обязательным?

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

Как задать по умолчанию текущую дату или ссылку на справочник?

Напрямую нельзя: значение по умолчанию обязано быть литералом. Стандартный приём — указать Неопределено и в первых строках тела функции заменить его на нужное вычисляемое значение, например ТекущаяДатаСеанса().

Что попадёт в параметр, если его пропустить и значение по умолчанию не задано?

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

Работает ли этот механизм для процедур и методов объектов?

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

Как передать много необязательных настроек, не раздувая список параметров?

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