«Недостаточно фактических параметров» в 1С: причины и решение
Процедуру или функцию вызывают с меньшим числом параметров, чем требуется в её объявлении. Обратная ситуация даёт ошибку «Слишком много фактических параметров».
Текст ошибки
Причины
- В объявлении метода добавили обязательный параметр, а вызовы не обновили
- После обновления типовой конфигурации изменилась сигнатура вызываемой процедуры
- Расширение перехватывает метод с другим набором параметров
- Внешняя обработка вызывает методы конфигурации, написанной под другой релиз
- Пропущена запятая на месте необязательного параметра в середине списка
Что означают «формальные» и «фактические» параметры
Формальные параметры — это список в объявлении метода. Фактические — значения, переданные при вызове. Для каждого формального параметра без значения по умолчанию при вызове должно быть передано значение.
Функция СуммаСоСкидкой(Сумма, ПроцентСкидки, Округлять = Истина) Экспорт
Результат = Сумма * (100 - ПроцентСкидки) / 100;
Возврат ?(Округлять, Окр(Результат, 2), Результат);
КонецФункции
// Ошибка: недостаточно фактических параметров
Итог = СуммаСоСкидкой(1000);
// Верно: необязательный параметр можно не передавать
Итог = СуммаСоСкидкой(1000, 5);
// Ошибка: слишком много фактических параметров
Итог = СуммаСоСкидкой(1000, 5, Истина, Ложь);
Как исправить
- Откройте строку из текста ошибки и перейдите к определению метода (F12). Сравните количество параметров.
- Если вы сами добавили параметр в метод, который вызывается из многих мест, сделайте его необязательным: задайте значение по умолчанию. Так старые вызовы продолжат работать.
- Найдите все вызовы метода глобальным поиском (Ctrl+Shift+F) и выполните синтаксический контроль модулей (в конфигураторе: «Конфигурация» → «Проверка конфигурации»). Для вызовов общих модулей платформа находит несоответствие ещё при проверке.
- Если пропускаете необязательный параметр в середине списка, оставьте на его месте запятую:
Метод(А, , В).
После обновления типовой конфигурации
Типовые процедуры БСП и прикладных подсистем иногда меняют список параметров. Если ошибка возникает в доработанном коде или расширении, сравните сигнатуру метода в новом релизе и поправьте вызов. Для перехватов в расширении с аннотациями &Перед, &После и &Вместо набор параметров должен совпадать с исходным методом, иначе расширение не применится или выдаст ошибку.
Встроенные методы платформы
Та же ошибка возникает при вызове встроенных функций и конструкторов с неверным числом параметров, например Новый HTTPСоединение() без адреса сервера. Сверяйтесь с синтаксис-помощником: для каждого метода там указаны обязательные и необязательные параметры, а у некоторых методов есть несколько вариантов синтаксиса.
Частые вопросы
Почему ошибка видна только при выполнении, а не при проверке модуля?
Если метод вызывается у объекта, тип которого определяется во время работы (например, через переменную), платформа не может проверить вызов заранее. Вызовы общих модулей проверяются при синтаксическом контроле.
Можно ли сделать параметр необязательным у уже используемого метода?
Да, задайте ему значение по умолчанию в объявлении. Существующие вызовы с полным набором параметров продолжат работать.