← Назад к вопросам

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

2.0 Middle🔥 151 комментариев
#Объекты метаданных#Регистры

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Определение подчинённости регистра сведений регистратору

Это вопрос о метаданных в 1С. Регистр сведений может быть подчинён документу (регистратору), что влияет на его жизненный цикл.

Что такое подчинённость регистратору

Регистр сведений, подчинённый регистратору (документу или другому объекту):

  • Автоматически очищается при удалении регистратора
  • Имеет поле "Регистратор" в структуре
  • Период синхронизирован с периодом документа
  • Помогает контролировать консистентность данных
// Пример: РегистрСведений.Цены может быть:
// - Независимым (цены вводит пользователь)
// - Подчинённым ДокументСчёт (цены вводятся в счёте)

Способ 1: Через метаданные (основной)

Процедура ПроверитьПодчинённостьРегистра(ИмяРегистра) Экспорт
    
    РегистрМета = Метаданные.РегистрыСведений.Найти(ИмяРегистра);
    
    Если РегистрМета = Неопределено Тогда
        Возврат Ложь; // Регистр не найден
    КонецЕсли;
    
    // Ключевое свойство: РегистраторОбязателен
    ЕстьРегистратор = РегистрМета.РегистраторОбязателен Или РегистрМета.РегистраторОбязателен <> Неопределено;
    
    Возврат ЕстьРегистратор;
    
КонецПроцедуры;

Проверка основного свойства:

Процедура ПроверитьРегистратора() Экспорт
    
    РегистрМета = Метаданные.РегистрыСведений.Цены;
    
    // Проверяем есть ли регистратор
    Если РегистрМета.РегистраторОбязателен Тогда
        // Регистр ОБЯЗАТЕЛЬНО подчинён регистратору
        // Удаление регистратора удалит все записи
    КонецЕсли;
    
КонецПроцедуры;

Способ 2: Проверка полей метаданных

Процедура ПолноеАнализМетаданных(ИмяРегистра) Экспорт
    
    РегистрМета = Метаданные.РегистрыСведений.Найти(ИмяРегистра);
    
    Если РегистрМета = Неопределено Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Регистр '" + ИмяРегистра + "' не найден";
        Сообщение.Сообщить();
        Возврат;
    КонецЕсли;
    
    // Проверяем свойства
    Сведения = Новая Структура;
    Сведения.Вставить("Имя", РегистрМета.Имя);
    Сведения.Вставить("Синоним", РегистрМета.Синоним);
    Сведения.Вставить("РегистраторОбязателен", РегистрМета.РегистраторОбязателен);
    Сведения.Вставить("Периодичность", РегистрМета.Периодичность);
    
    // Если есть поле Регистратор
    ИмеетПолеРегистратор = Ложь;
    Для Каждого Измерение Из РегистрМета.Измерения Цикл
        Если Измерение.Имя = "Регистратор" Тогда
            ИмеетПолеРегистратор = Истина;
            Прерывание;
        КонецЕсли;
    КонецЦикла;
    
    Сведения.Вставить("ИмеетПолеРегистратор", ИмеетПолеРегистратор);
    
    // Логируем для отладки
    ЗаписьЖурнала.Записать("ИнформацияОРегистре", Сведения);
    
КонецПроцедуры;

Способ 3: Проверка в запросе

Процедура ПроверитьПрименимостьФильтра() Экспорт
    
    // Проверяем может ли быть записано в регистр сведений
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    1
        |ИЗ
        |    РегистрСведений.Цены";
    
    Попытка
        РезультатЗапроса = Запрос.Выполнить();
        // Если запрос выполнен, регистр существует
    Исключение
        Сообщение = ОписаниеОшибки();
        // Регистр не существует или есть ошибка доступа
    КонецПопытки;
    
КонецПроцедуры;

Способ 4: Практический пример — обработка при удалении

Процедура ОбработатьУдалениеРегистратора(РегистраторСсылка) Экспорт
    
    РегистраторМета = РегистраторСсылка.Метаданные();
    
    // Проверяем какие регистры сведений подчинены этому регистратору
    Для Каждого РегистрМета Из Метаданные.РегистрыСведений Цикл
        
        // Проверяем есть ли поле Регистратор
        ПолеРегистратораНайдено = Ложь;
        Для Каждого Измерение Из РегистрМета.Измерения Цикл
            Если Измерение.Имя = "Регистратор" Тогда
                ПолеРегистратораНайдено = Истина;
                Прерывание;
            КонецЕсли;
        КонецЦикла;
        
        Если ПолеРегистратораНайдено Тогда
            // Этот регистр подчинён регистраторам
            // Нужно очистить записи для удаляемого регистратора
            ОчиститьЗаписиРегистра(РегистрМета.Имя, РегистраторСсылка);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры;

Процедура ОчиститьЗаписиРегистра(ИмяРегистра, РегистраторСсылка) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Записи.Регистратор
        |ИЗ
        |    РегистрСведений." + ИмяРегистра + " КАК Записи
        |ГДЕ
        |    Записи.Регистратор = &Регистратор";
    
    Запрос.УстановитьПараметр("Регистратор", РегистраторСсылка);
    
    // Удаляем связанные записи
    НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
    НаборЗаписей.Фильтр.Регистратор.Значение = РегистраторСсылка;
    НаборЗаписей.Фильтр.Регистратор.Использование = Истина;
    НаборЗаписей.Записать();
    
КонецПроцедуры;

Способ 5: Проверка типа периодичности

Процедура ПроверитьПериодичность(ИмяРегистра) Экспорт
    
    РегистрМета = Метаданные.РегистрыСведений.Найти(ИмяРегистра);
    
    // Периодичность может быть:
    // Второсортность
    // День
    // Месяц
    // Квартал
    // Год
    
    Если РегистрМета.Периодичность = Периодичность.Вторая Тогда
        // Регистр изменяется часто, может быть подчинён документам
    ИначеЕсли РегистрМета.Периодичность = Периодичность.День Тогда
        // День — часто подчиняется документам
    КонецЕсли;
    
КонецПроцедуры;

Вывод

Основной способ: использовать РегистрМета.РегистраторОбязателен

Когда использовать:

  • При обработке удаления регистраторов
  • При управлении консистентностью данных
  • При построении динамических отчётов
  • При проверке целостности данных после обновления конфигурации

Ключевые моменты:

  • Подчинённый регистр — автоматически очищается при удалении регистратора
  • Непо́дчинённый — остаются «висячие» записи
  • Проверка через метаданные — самый надёжный способ
Как программно определить подчинён ли регистр сведений регистратору? | PrepBro