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