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