Как хранить типы документов в регистре сведений вместо ссылок на конкретные документы?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При проектировании регистров сведений в 1С часто возникает задача: нам необходимо зафиксировать не конкретный экземпляр документа, а лишь сам его тип (например, «Реализация товаров и услуг» или «Заказ покупателя»). По умолчанию платформа ожидает выбора конкретной ссылки, однако архитектурно это не всегда удобно. Давайте разберем, как решить эту задачу правильно и изящно.

Использование пустых ссылок как базовое решение

Самым распространенным и «родным» способом для платформы 1С является использование пустых ссылок. Если в измерении вашего регистра сведений указан составной тип данных, включающий нужные вам документы, вы можете записывать туда не объект, а «пустое» значение этого типа.

Что это дает? Система продолжает воспринимать поле как ссылочное, сохраняется целостность данных, при этом мы храним лишь информацию о том, какой именно документ нас интересует. Чтобы записать пустую ссылку программно, используйте следующую конструкцию:


// Пример записи пустой ссылки документа в регистр
МенеджерЗаписи = РегистрыСведений.НашРегистр.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.ДокументТип = Документы.РеализацияТоваровУслуг.ПустаяСсылка();
МенеджерЗаписи.Записать();

Таким образом, мы «обманываем» интерфейс выбора: вместо поиска конкретной записи мы просто фиксируем тип данных Документы.РеализацияТоваровУслуг. Это позволяет избежать создания лишних строковых полей и проблем с приведением типов при построении отчетов.

Изменение типа измерения для ограничения выбора

Если вы хотите, чтобы пользователь при работе с формой регистра сразу видел именно типы документов, а не список всех созданных документов, необходимо правильно настроить тип измерения.

  1. Откройте конфигуратор и перейдите к нужному регистру сведений.
  2. В разделе «Измерения» найдите реквизит, отвечающий за выбор документа.
  3. В свойстве «Тип» убедитесь, что выбраны только необходимые виды документов.
  4. Для того чтобы в интерфейсе работа с типом была удобнее, вы можете ограничить набор типов, чтобы не перегружать список выбора лишними объектами конфигурации.

Рассмотрим подробнее работу с механизмом типов метаданных. Если вам нужно, чтобы регистр был универсальным и хранил именно «тип», можно использовать специальный тип данных Тип для реквизита. Это позволит хранить в регистре ссылку на описание типа объекта метаданных. Однако стоит учитывать, что для отчетов на базе СКД работа с таким полем может потребовать дополнительных настроек в виде вычисляемых полей или выражений.

Почему хранение типа строкой — это плохо?

Часто возникает соблазн просто хранить имя типа в строковом поле (например, «Документ.ЗаказКлиента»). Мы крайне не рекомендуем такой подход по нескольким причинам:

Рекомендованный подход к реализации

Разберем по шагам, как лучше организовать работу:

Во-первых, создайте измерение с составным типом, куда включите только необходимые документы. Во-вторых, если интерфейс позволяет, используйте справочник-классификатор, где элементы будут соответствовать типам документов. В самом регистре храните ссылку на этот справочник. Это создаст дополнительный уровень абстракции, который позволит легко управлять списком доступных типов без изменения структуры метаданных самой конфигурации.

В-третьих, если вам нужно программно определять, какой тип выбран в регистре, используйте функцию ТипЗнч(). Это позволит эффективно работать с данными:


Выборка = РегистрыСведений.НашРегистр.Выбрать();
Пока Выборка.Следующий() Цикл
    Если ТипЗнч(Выборка.ДокументТип) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
        // Обработка конкретного типа
    КонецЕсли;
КонецЦикла;

Применяя этот подход, вы обеспечите стабильность системы и удобство дальнейшей разработки. Если у вас возникают специфические задачи, связанные с динамическим выбором, рассмотрите возможность использования формы выбора с ручным наполнением списка типов, что позволит пользователю работать максимально комфортно.

← На главную