Не доступен план обмена расширения в режиме предприятия при выборе в поле ввода: как решить проблему

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

В процессе разработки и интеграции систем на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда новый функционал выносится в расширение конфигурации для сохранения типовой конфигурации на поддержке. Однако при работе со специфическими объектами метаданных, такими как Планы обмена, в старых режимах совместимости (например, 8.3.11 или 8.3.12) могут возникать непредвиденные платформенные ограничения.

В этой статье мы подробно разберем одну из таких проблем: когда созданный в расширении план обмена отлично виден через меню «Все функции» (Функции для технического специалиста), но при этом его невозможно выбрать в поле ввода с типом ПланОбменаСсылка на форме. Мы выясним технические причины этого поведения платформы и рассмотрим практические методы решения.

Проанализируем ситуацию, разберемся в архитектурных причинах и пошагово внедрим надежные способы обхода этого ограничения.

Почему платформа «не видит» план обмена из расширения?

Давайте разберем внутреннюю кухню работы платформы 1С:Предприятие с типами данных в расширениях. Основная сложность кроется в ограничении работы с составными типами данных в режимах совместимости до версии 8.3.18:

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

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

---

Способ 1. Создание плана-«пустышки» в основной конфигурации (Рекомендуемый)

Этот способ является наиболее надежным и гарантирует стабильную работу интерфейса, системы компоновки данных (СКД), механизмов БСП и платформенных полей ввода. Мы минимально снимем основную конфигурацию с поддержки, создав в ней пустой объект-контейнер, а всю логику перенесем в расширение.

Разберем этот процесс по шагам:

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

Результат: Поскольку тип данных ПланОбменаСсылка.УдаленныйОбменДанными теперь физически объявлен в основной конфигурации, платформа без проблем отображает его во всех полях ввода, включает в составные типы и корректно обрабатывает при интерактивном выборе в режиме 1С:Предприятие.

---

Способ 2. Программное заполнение списка выбора на форме (Без изменения основной конфигурации)

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

Для этого мы заменим стандартный интерактивный выбор платформы на программное заполнение списка выбора элемента формы.

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

Разберем код, который необходимо разместить в модуле формы расширения:


&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    
    // Очищаем стандартный список выбора поля, если он был заполнен
    Элементы.ПолеВводаПланаОбмена.СписокВыбора.Очистить();
    
    // Устанавливаем режим выбора из списка для элемента формы
    Элементы.ПолеВводаПланаОбмена.РежимВыбораИзСписка = Истина;
    
    // Динамически выбираем узлы нашего плана обмена, созданного в расширении
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   НашПланОбменаИзРасширения.Ссылка КАК Ссылка,
        |   НашПланОбменаИзРасширения.Наименование КАК Наименование
        |ИЗ
        |   ПланОбмена.НашПланОбменаИзРасширения КАК НашПланОбменаИзРасширения
        |ГДЕ
        |   НЕ НашПланОбменаИзРасширения.ПометкаУдаления";
        
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        // Добавляем полученные ссылки в список выбора элемента формы
        Элементы.ПолеВводаПланаОбмена.СписокВыбора.Добавить(
            ВыборкаДетальныеЗаписи.Ссылка, 
            ВыборкаДетальныеЗаписи.Наименование
        );
    КонецЦикла;
    
КонецПроцедуры

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

---

Способ 3. Использование внешней обработки в качестве служебной утилиты

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

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


// Пример прямого программного обращения к плану обмена из расширения
УзелОбмена = ПланыОбмена["НашПланОбменаИзРасширения"].ЭтотУзел();
ПланыОбмена.ЗарегистрироватьИзменения(УзелОбмена, ВыгружаемыйОбъект);

Этот подход полностью снимает проблему интерфейсного выбора, перенося всю работу в плоскость чистого программного кода платформы.

---

Важные предупреждения при работе с планами обмена в расширениях

Если вы приняли решение использовать собственные планы обмена в расширениях на старых версиях платформы (до 8.3.15 включительно), обязательно помните о следующих критических нюансах:

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

← На главную