При доработке существующего программного кода или внешних обработок разработчики часто сталкиваются с ситуацией, когда добавление нового параметра в процедуру или функцию приводит к синтаксической ошибке на этапе выполнения: «Недостаточно фактических параметров». Разберем подробно, почему возникает данная ошибка, как правильно объявлять и вызывать процедуры, а также рассмотрим нюансы передачи параметров и работы с COM-объектами Excel.
В платформе 1С:Предприятие количество параметров, переданных при вызове процедуры (фактические параметры), должно строго соответствовать количеству параметров, указанных при ее объявлении (формальные параметры). Если в определение процедуры был добавлен новый обязательный параметр, платформа потребует передавать его во всех местах конфигурации или модуля, где эта процедура вызывается.
Проанализируем пример из практики. Предположим, объявление процедуры было изменено для передачи объекта листа Excel:
Процедура ПроверкаФизЛица(ФизЛицоИзЕкселя, ПаспортныеДанные, Лист)
// Код процедуры
КонецПроцедуры
Если в месте вызова передаются только два значения, возникает исключение:
// Ошибочный вызов — передано 2 параметра вместо 3
ПроверкаФизЛица(ЗначениеФизЛица, ЗначениеПаспортныеДанные);
Платформа сообщает о несоответствии сигнатуры: в заголовке процедуры объявлено 3 параметра, а при выполнении передано только 2.
Разберем по шагам, как исправить ошибку путем передачи недостающего параметра:
Ctrl + F или по всей конфигурации через глобальный поиск (Ctrl + Shift + F).Посмотрим на исправленный вызов процедуры:
ПроверкаФизЛица(ЗначениеФизЛица, ЗначениеПаспортныеДанные, Лист);
Если процедура вызывается во многих местах и новый параметр нужен не всегда, хорошим тоном считается объявление параметра со значением по умолчанию. В этом случае параметр становится необязательным, и старые вызовы без этого аргумента продолжат работать корректно.
Синтаксис объявления значения по умолчанию выглядит следующим образом:
Процедура ПроверкаФизЛица(ФизЛицоИзЕкселя, ПаспортныеДанные, Лист = Неопределено)
// Проверяем, передан ли лист Excel
Если Лист <> Неопределено Тогда
// Выполняем действия с листом
Лист.Cells(НомерСтроки, 10).Value = ПаспортныеДанные;
КонецЕсли;
КонецПроцедуры
Важное правило: все необязательные параметры со значениями по умолчанию должны располагаться в конце списка параметров (после обязательных).
При записи данных в COM-объект листа Excel часто допускают синтаксическую ошибку в обращении к ячейке. Свойство Cells принимает строго два обязательных параметра: номер строки и номер колонки.
Рассмотрим частую ошибку, когда второй индекс пропускается:
// Ошибка: пропущен номер колонки
Лист.Cells(10, ).Value = ПаспортныеДанные;
Корректный синтаксис требует явного указания обоих целочисленных индексов:
// Корректно: 10 строка, 2 колонка (или переменные СтрокаФизЛиц и НомерКолонки)
Лист.Cells(10, 2).Value = Строка(ПаспортныеДанные);
Если после исправления параметров обработка приводит к аварийному завершению работы платформы 1С (падению 1Cv8.exe), проанализируем следующие ключевые факторы:
Value COM-объекта обязательно приводите их к примитивным типам через Строка(...), Число(...) или Формат(...). Передача объектов ссылочного типа 1С или значений Неопределено может вызвать сбой маршалинга COM-соединения.ExcelПриложение.DisplayAlerts = Ложь;.
Попытка
Книга.Close(Ложь);
ExcelПриложение.Quit();
Исключение
// Обработка возможного сбоя при закрытии
КонецПопытки;
Лист = Неопределено;
Книга = Неопределено;
ExcelПриложение = Неопределено;
Если модули содержат множество вспомогательных процедур, требующих доступа к объекту Excel, передавать переменную листа через каждый метод не всегда удобно. В таких ситуациях рассмотрим альтернативные подходы:
Перем мЛист; в самом начале модуля формы или объекта. Это сделает переменную доступной во всех процедурах модуля без расширения их списка параметров.Структура (например, ПараметрыОбработки = Новый Структура("ФизЛицо, ПаспортныеДанные, Лист", ...)) и передаем в процедуру единственный аргумент. Это позволяет гибко масштабировать логику без изменения сигнатуры методов.