При проектировании регистров сведений нередко возникает задача привязать настройки или правила не к конкретному экземпляру документа, а к его типу (виду документа). Например, когда требуется задать параметры обработки для всех документов вида РеализацияТоваровУслуг или ПриходнаяНакладная, даже если в информационной базе еще не создано ни одного документа этого вида.
Разберем основные ограничения платформы 1С:Предприятие и рассмотрим проверенные способы реализации привязки настроек к типам документов.
Проанализируем технические особенности платформы 1С:Предприятие, из-за которых нельзя напрямую выбрать тип данных в качестве значения измерения:
Тип и ОписаниеТипов являются системными типами среды исполнения, а не ссылочными или примитивными типами базы данных. Их невозможно напрямую назначить типами реквизитов или измерений регистра.Рассмотрим самый распространенный подход, когда для измерения регистра задается составной тип из нужных видов документов (или общий тип ДокументСсылка), а в качестве значения сохраняется пустая ссылка соответствующего вида документа.
Разберем по шагам, как настроить измерение и обойти ограничения проверки заполнения:
ДокументСсылка).
Менеджер = Документы.РеализацияТоваровУслуг;
ПустаяСсылкаДокумента = Менеджер.ПустаяСсылка();
Запись = РегистрыСведений.НастройкиОбработкиДокументов.СоздатьМенеджерЗаписи();
Запись.ТипДокумента = ПустаяСсылкаДокумента;
Запись.НастройкаАктивна = Истина;
Запись.Записать();
&НаКлиенте
Процедура ВыбратьТипДокумента(Команда)
Оповещение = Новый ОписаниеОповещения("ПослеВыбораТипа", ЭтотОбъект);
Диалог = Новый ДиалогВыбораТипа();
Диалог.ВыбираемыеТипы = Новый Массив;
Диалог.ВыбираемыеТипы.Добавить(Тип("ДокументСсылка.РеализацияТоваровУслуг"));
Диалог.ВыбираемыеТипы.Добавить(Тип("Диалог.ПоступлениеТоваровУслуг"));
Диалог.Показать(Оповещение);
КонецПроцедуры
&НаСервере
Процедура УстановитьПустуюСсылкуПоТипу(ВыбранныйТип)
// Преобразуем выбранный тип в пустую ссылку через менеджер
ИмяОбъекта = Метаданные.НайтиПоТипу(ВыбранныйТип).Имя;
РеквизитТипДокумента = Документы[ИмяОбъекта].ПустаяСсылка();
КонецПроцедуры
Если конфигурация разработана на базе Библиотеки стандартных подсистем (БСП), наиболее надежным и рекомендуемым решением является использование справочника ИдентификаторыОбъектовМетаданных.
Рассмотрим преимущества и порядок работы с этим справочником:
СправочникСсылка.ИдентификаторыОбъектовМетаданных. Это избавляет регистр от громоздкого составного типа и ускоряет поиск по индексу.
// Получение идентификатора метаданных по типу объекта
ТипОбъекта = Тип("ДокументСсылка.РеализацияТоваровУслуг");
Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипОбъекта);
// Получение метаданных или менеджера по идентификатору
ОбъектМетаданных = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Идентификатор);
Менеджер = ОбщегоНазначения.МенеджерОбъектаПоИдентификатору(Идентификатор);
Еще один универсальный вариант — хранить имя объекта (например, "Документ.РеализацияТоваровУслуг" или "РеализацияТоваровУслуг") в строковом измерении регистра.
Посмотрим на пример работы со строковыми именами метаданных:
// Запись значения
Запись = РегистрыСведений.ПравилаЗагрузки.СоздатьМенеджерЗаписи();
Запись.ИмяВидаДокумента = "РеализацияТоваровУслуг";
Запись.Записать();
// Получение метаданных и менеджера по строковому имени
МетаданныеДокумента = Метаданные.Документы.Найти(Запись.ИмяВидаДокумента);
Если МетаданныеДокумента <> Неопределено Тогда
Менеджер = Документы[Запись.ИмяВидаДокумента];
ПустаяСсылка = Менеджер.ПустаяСсылка();
КонецЕсли;
Разберем, как выполнять поиск записей регистра по типу существующего документа или параметра в языке запросов 1С.
Если в регистре хранятся пустые ссылки составного типа:
ВЫБРАТЬ
Регистр.ТипДокумента,
Регистр.НастройкаАктивна
ИЗ
РегистрСведений.НастройкиОбработкиДокументов КАК Регистр
ГДЕ
// Вариант 1: Проверка на конкретный тип документа через ССЫЛКА
Регистр.ТипДокумента ССЫЛКА Документ.РеализацияТоваровУслуг
// Вариант 2: Сравнение типа измерения с типом переданного в параметр документа
ИЛИ ТИПЗНАЧЕНИЯ(Регистр.ТипДокумента) = ТИПЗНАЧЕНИЯ(&ТекущийДокумент)
Для оптимизации запросов и соединений по составным типам рекомендуется приводить типы с помощью функции ТИП():
ВЫБРАТЬ
Док.Ссылка КАК Документ,
Настройки.НастройкаАктивна
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиОбработкиДокументов КАК Настройки
ПО ТИПЗНАЧЕНИЯ(Настройки.ТипДокумента) = ТИП(Документ.РеализацияТоваровУслуг)