Почему возникает ошибка «Недостаточно фактических параметров» при обмене УТ 10 и БП 3.0 и как ее исправить?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

Разберем классическую проблему, с которой разработчики сталкиваются при настройке обмена данными между устаревшими и современными конфигурациями, например, при выгрузке из «Управление торговлей 10» (УТ 10) в «Бухгалтерия предприятия 3.0» (БП 3.0). Во время обмена может появиться ошибка:


ОписаниеОшибки = Недостаточно фактических параметров
ПозицияМодуля = {(7)}:Документы.ГТДИмпорт.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары");

Проанализируем ситуацию. В конфигурации-приемнике (БП 3.0) метод ЗаполнитьСчетаУчетаВТабличнойЧасти был обновлен и теперь требует передачи трех параметров вместо двух. Источник же (УТ 10) по старым правилам обмена передает только два параметра.

Попытка решить эту проблему "в лоб" с помощью расширения в БП 3.0 и аннотации &Вместо, добавив параметр по умолчанию (например, ЕстьУчетПодакцизныхТоваров = Ложь), обычно терпит фиаско: какое-то время это может работать, но затем снова отваливается при обмене. Выясним причину такого поведения платформы 1С и рассмотрим правильные способы решения.

Почему расширение с аннотацией &Вместо не работает при обмене?

Рассмотрим подробнее механику работы платформы и ограничения расширений:

  1. Особенности COM-соединения. При обмене через COM-соединение вызов методов происходит на уровне интерфейса передачи данных. База-приемник строго ожидает определенную сигнатуру функции. Если источник передает два параметра вместо трех, ошибка недостатка параметров генерируется ядром платформы еще до того, как управление дойдет до логики перехвата в вашем расширении. Механизм &Вместо здесь оказывается просто бесполезен.
  2. Строгий контроль сигнатур. Платформа 1С:Предприятие требует точного совпадения сигнатуры перехватываемого метода. Метод в расширении с аннотацией &Вместо обязан иметь ровно то же количество параметров, что и оригинальный метод типовой конфигурации. Добавление параметров со значениями по умолчанию внутри расширения приводит к тому, что расширение не применяется корректно, особенно в фоновых и COM-сеансах.
  3. Контекст выполнения и флаги компиляции. Чтобы код из расширения вообще стал доступен во время внешнего вызова (при обмене), у заимствованных общих модулей в расширении обязательно должны стоять правильные галочки. Убедитесь, что установлен флаг Внешнее соединение. Если его нет, платформа обратится к исходной (типовой) версии модуля, проигнорировав ваши доработки.

Способ 1: Исправление правил обмена (Рекомендуемый вариант)

Архитектурно правильнее решать проблему на стороне источника вызова — в базе УТ 10. Посмотрим на шаги, которые необходимо предпринять:

  1. Откройте правила обмена в конфигурации «Конвертация данных 2.0».
  2. Найдите правило конвертации документа ГТДИмпорт.
  3. Перейдите в обработчик После загрузки объекта (или туда, где прописан вызов метода).
  4. Отредактируйте код, явно добавив недостающий третий параметр. Код должен выглядеть примерно так:

Документы.ГТДИмпорт.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, "Товары", Ложь);

Сохраните правила и загрузите их в УТ 10. Это устранит первопричину проблемы.

Способ 2: Обновление типовых правил синхронизации

Изменение сигнатуры метода в актуальном релизе БП 3.0 прямо говорит о том, что используемые вами правила обмена устарели. Разберем самый простой путь: обновите комплект правил обмена в базе-источнике (УТ 10). Новые правила обычно поставляются вместе с обновлениями самой конфигурации. Их можно загрузить штатно через настройки синхронизации данных.

Способ 3: Создание процедуры-обертки в расширении БП 3.0

Проанализируем ситуацию, когда изменять правила обмена в УТ 10 по каким-либо причинам долго, сложно или невозможно. В этом случае мы все равно не используем аннотацию &Вместо. Вместо этого в расширении на стороне БП 3.0 мы создаем совершенно новую экспортную процедуру-обертку.

  1. Создайте в расширении (в модуле менеджера документа или общем модуле) новую экспортную процедуру с уникальным именем, например Обмен_ЗаполнитьСчетаУчетаВТабличнойЧасти.
  2. Эта процедура должна принимать ровно два параметра (ровно столько, сколько отправляет УТ 10).
  3. Внутри этой процедуры сделайте вызов типового метода БП 3.0, жестко передав требуемый третий параметр.

Посмотрим на пример кода в расширении:


Процедура Обмен_ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, ИмяТабличнойЧасти) Экспорт
    // Явно вызываем типовой метод и передаем третий параметр по умолчанию
    Документы.ГТДИмпорт.ЗаполнитьСчетаУчетаВТабличнойЧасти(Объект, ИмяТабличнойЧасти, Ложь);
КонецПроцедуры

После этого вам все равно придется минимально скорректировать правила обмена в УТ 10: заменить вызов старого метода на вызов вашей новой процедуры-обертки. Этот подход гарантированно спасет вас от ошибки несовпадения количества параметров при COM-соединении.

Способ 4: Упаковка параметров в структуру

Рассмотрим еще один полезный прием от разработчиков для обхода ограничений на количество параметров в 1С. Если в будущем вам потребуется передавать переменное число параметров между базами, вы можете упаковывать нужные переменные в тип Структура и передавать эту структуру в качестве одного из параметров.

Внутри принимающей процедуры вы делаете проверку типа:


Если ТипЗнч(Параметр1) = Тип("Структура") Тогда
    // Извлекаем и разворачиваем нужные переменные для дальнейшей логики
    ДополнительныйПараметр = Параметр1.НужноеЗначение;
КонецЕсли;

Подведем итог: попытка подменить сигнатуру типового метода в расширении (добавив параметры по умолчанию) при COM-обмене не приведет к желаемому результату. Решайте задачу изменением вызывающего кода на стороне базы-источника в правилах обмена или созданием отдельной процедуры-обертки в базе-приемнике.

← На главную