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