Разберем классическую проблему, с которой разработчики сталкиваются при настройке обмена данными между устаревшими и современными конфигурациями, например, при выгрузке из «Управление торговлей 10» (УТ 10) в «Бухгалтерия предприятия 3.0» (БП 3.0). Во время обмена может появиться ошибка:
ОписаниеОшибки = Недостаточно фактических параметров
ПозицияМодуля = {(7)}:Документы.ГТДИмпорт.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");
Проанализируем ситуацию. В конфигурации-приемнике (БП 3.0) метод ЗаполнитьСчетаУчетаВТабличнойЧасти был обновлен и теперь требует передачи трех параметров вместо двух. Источник же (УТ 10) по старым правилам обмена передает только два параметра.
Попытка решить эту проблему "в лоб" с помощью расширения в БП 3.0 и аннотации &Вместо, добавив параметр по умолчанию (например, ЕстьУчетПодакцизныхТоваров = Ложь), обычно терпит фиаско: какое-то время это может работать, но затем снова отваливается при обмене. Выясним причину такого поведения платформы 1С и рассмотрим правильные способы решения.
Рассмотрим подробнее механику работы платформы и ограничения расширений:
&Вместо здесь оказывается просто бесполезен.&Вместо обязан иметь ровно то же количество параметров, что и оригинальный метод типовой конфигурации. Добавление параметров со значениями по умолчанию внутри расширения приводит к тому, что расширение не применяется корректно, особенно в фоновых и COM-сеансах.Архитектурно правильнее решать проблему на стороне источника вызова — в базе УТ 10. Посмотрим на шаги, которые необходимо предпринять:
ГТДИмпорт.
Документы.ГТДИмпорт.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары", Ложь);
Сохраните правила и загрузите их в УТ 10. Это устранит первопричину проблемы.
Изменение сигнатуры метода в актуальном релизе БП 3.0 прямо говорит о том, что используемые вами правила обмена устарели. Разберем самый простой путь: обновите комплект правил обмена в базе-источнике (УТ 10). Новые правила обычно поставляются вместе с обновлениями самой конфигурации. Их можно загрузить штатно через настройки синхронизации данных.
Проанализируем ситуацию, когда изменять правила обмена в УТ 10 по каким-либо причинам долго, сложно или невозможно. В этом случае мы все равно не используем аннотацию &Вместо. Вместо этого в расширении на стороне БП 3.0 мы создаем совершенно новую экспортную процедуру-обертку.
Обмен_ЗаполнитьСчетаУчетаВТабличнойЧасти.Посмотрим на пример кода в расширении:
Процедура Обмен_ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, ИмяТабличнойЧасти) Экспорт
// Явно вызываем типовой метод и передаем третий параметр по умолчанию
Документы.ГТДИмпорт.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, ИмяТабличнойЧасти, Ложь);
КонецПроцедуры
После этого вам все равно придется минимально скорректировать правила обмена в УТ 10: заменить вызов старого метода на вызов вашей новой процедуры-обертки. Этот подход гарантированно спасет вас от ошибки несовпадения количества параметров при COM-соединении.
Рассмотрим еще один полезный прием от разработчиков для обхода ограничений на количество параметров в 1С. Если в будущем вам потребуется передавать переменное число параметров между базами, вы можете упаковывать нужные переменные в тип Структура и передавать эту структуру в качестве одного из параметров.
Внутри принимающей процедуры вы делаете проверку типа:
Если ТипЗнч(Параметр1) = Тип("Структура") Тогда
// Извлекаем и разворачиваем нужные переменные для дальнейшей логики
ДополнительныйПараметр = Параметр1.НужноеЗначение;
КонецЕсли;
Подведем итог: попытка подменить сигнатуру типового метода в расширении (добавив параметры по умолчанию) при COM-обмене не приведет к желаемому результату. Решайте задачу изменением вызывающего кода на стороне базы-источника в правилах обмена или созданием отдельной процедуры-обертки в базе-приемнике.