Как обойти ограничение типа ЛюбаяСсылка для объектов в расширении при синхронизации данных

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

При разработке расширений для «1С:Предприятие» программисты часто сталкиваются с фундаментальным ограничением платформы: системный тип ЛюбаяСсылка, определенный в основной конфигурации, «не видит» и не включает в себя типы объектов, добавленных через расширение. Это создает серьезные препятствия при использовании типовых механизмов БСП (Библиотеки стандартных подсистем), таких как Синхронизация данных.

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

Суть проблемы и технические причины

Разберем ситуацию: у заказчика документ добавлен в расширение. В этот документ должна происходить загрузка данных через типовой обмен. Типовой механизм обмена активно использует регистр сведений ПубличныеИдентификаторыСинхронизируемыхОбъектов для сопоставления объектов по уникальным идентификаторам (GUID). Проблема заключается в том, что измерение Объект этого регистра имеет тип ЛюбаяСсылка.

Проанализируем, почему платформа ведет себя именно так:

  1. Тип ЛюбаяСсылка формируется на уровне ядра платформы как совокупность всех ссылочных типов основной конфигурации.
  2. В режимах совместимости ниже 8.3.17 расширение не имеет возможности динамически изменять или дополнять составные типы данных, объявленные в основной конфигурации.
  3. Даже если мы попытаемся расширить этот тип программно, механизмы обмена, работающие через запросы к базе данных, все равно не смогут обработать ссылку на объект из расширения, так как на уровне СУБД тип измерения регистра жестко ограничен списком из основной конфигурации.

Рассмотрим по шагам основные стратегии решения этой задачи.

Решение 1: Перенос объекта в основную конфигурацию

Это самый радикальный, но и самый стабильный метод. Если документ является ключевым для бизнес-логики и активно участвует в обменах, его нахождение в расширении может создать больше проблем, чем преимуществ.

Рассмотрим алгоритм переноса:

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

Риски: Необходимость согласования изменений в основной конфигурации с заказчиком и потенциальные сложности при обновлении типового решения.

Решение 2: Переход на сопоставление по полям поиска

Если мы не можем использовать ПубличныеИдентификаторыСинхронизируемыхОбъектов (так как не можем записать туда ссылку), нам необходимо изменить саму логику сопоставления объектов при обмене. Вместо поиска по GUID (который требует наличия записи в указанном регистре), мы настроим поиск по ключевым реквизитам.

Разберем реализацию этого подхода:

В правилах конвертации объектов (ПКО) или в настройках маппинга данных (если используется современный интерфейс БСП) необходимо отключить признак «Искать объект по внутреннему идентификатору». Вместо этого выберем уникальные поля поиска (например, Номер, Дата, ИНН и т.д.).

Однако при таком подходе возникают побочные эффекты, которые нужно обработать вручную:

Решение 3: Ручная обработка пометки удаления и пост-обработка

Как мы выяснили в ходе анализа, при отказе от поиска по GUID типовой функционал может перестать корректно транслировать пометку на удаление. Выясним, как это обойти, не «ломая» типовой код обмена.

Рассмотрим пример реализации «обходного маневра»:

  1. Добавим в документ расширения вспомогательный реквизит, например, СтатусУдаленияПереданный (тип Булево).
  2. При выгрузке данных передадим значение стандартного реквизита ПометкаУдаления в этот вспомогательный реквизит.
  3. В расширении на стороне приемника пропишем обработчик события ПослеЗагрузки.

Пример программного кода для обработчика:


// Процедура в модуле расширения для обработки загруженных данных
&После("ВыполнитьДействияПослеЗагрузкиОбъекта")
Процедура Расш1_ПослеЗагрузкиОбъекта(Объект, ДанныеЗагрузки, ПараметрыЗагрузки)
    
    // Проверяем, что загружаемый объект — наш документ из расширения
    Если ТипЗнч(Объект) = Тип("ДокументОбъект.НашДокументИзРасширения") Тогда
        
        // Если в данных загрузки пришел флаг пометки удаления
        Если Объект.СтатусУдаленияПереданный <> Объект.ПометкаУдаления Тогда
            Объект.УстановитьПометкуУдаления(Объект.СтатусУдаленияПереданный);
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Решение 4: Программное создание записи в обход типизации

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

Затем, используя механизмы перехвата (через &Вместо или &Перед), подменим вызовы типовых процедур регистрации идентификаторов, чтобы они обращались к нашему расширенному регистру. Это сложный путь, требующий глубокого понимания работы БСП.

Выводы и рекомендации

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

Итоговые рекомендации:

  1. Если обмен данными является критически важным процессом, наиболее правильным решением будет перенос метаданных документа в основную конфигурацию. Это избавит от необходимости «городить костыли» в каждом обновлении.
  2. Если перенос в основную базу невозможен, используйте поиск по полям в сочетании с ручной пост-обработкой реквизитов (таких как пометка удаления).
  3. При работе на современных версиях платформы (8.3.20+) всегда проверяйте возможность расширения ОпределяемыхТипов, которые часто заменяют Любую Ссылку в современных версиях БСП.

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

← На главную