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