← Назад к вопросам
Как программно определить подчинён ли регистр сведений регистратору?
2.0 Middle🔥 151 комментариев
#Объекты метаданных#Регистры
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Определение подчинённости регистра сведений регистратору
Это вопрос о метаданных в 1С. Регистр сведений может быть подчинён документу (регистратору), что влияет на его жизненный цикл.
Что такое подчинённость регистратору
Регистр сведений, подчинённый регистратору (документу или другому объекту):
- Автоматически очищается при удалении регистратора
- Имеет поле "Регистратор" в структуре
- Период синхронизирован с периодом документа
- Помогает контролировать консистентность данных
// Пример: РегистрСведений.Цены может быть:
// - Независимым (цены вводит пользователь)
// - Подчинённым ДокументСчёт (цены вводятся в счёте)
Способ 1: Через метаданные (основной)
Процедура ПроверитьПодчинённостьРегистра(ИмяРегистра) Экспорт
РегистрМета = Метаданные.РегистрыСведений.Найти(ИмяРегистра);
Если РегистрМета = Неопределено Тогда
Возврат Ложь; // Регистр не найден
КонецЕсли;
// Ключевое свойство: РегистраторОбязателен
ЕстьРегистратор = РегистрМета.РегистраторОбязателен Или РегистрМета.РегистраторОбязателен <> Неопределено;
Возврат ЕстьРегистратор;
КонецПроцедуры;
Проверка основного свойства:
Процедура ПроверитьРегистратора() Экспорт
РегистрМета = Метаданные.РегистрыСведений.Цены;
// Проверяем есть ли регистратор
Если РегистрМета.РегистраторОбязателен Тогда
// Регистр ОБЯЗАТЕЛЬНО подчинён регистратору
// Удаление регистратора удалит все записи
КонецЕсли;
КонецПроцедуры;
Способ 2: Проверка полей метаданных
Процедура ПолноеАнализМетаданных(ИмяРегистра) Экспорт
РегистрМета = Метаданные.РегистрыСведений.Найти(ИмяРегистра);
Если РегистрМета = Неопределено Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Регистр '" + ИмяРегистра + "' не найден";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
// Проверяем свойства
Сведения = Новая Структура;
Сведения.Вставить("Имя", РегистрМета.Имя);
Сведения.Вставить("Синоним", РегистрМета.Синоним);
Сведения.Вставить("РегистраторОбязателен", РегистрМета.РегистраторОбязателен);
Сведения.Вставить("Периодичность", РегистрМета.Периодичность);
// Если есть поле Регистратор
ИмеетПолеРегистратор = Ложь;
Для Каждого Измерение Из РегистрМета.Измерения Цикл
Если Измерение.Имя = "Регистратор" Тогда
ИмеетПолеРегистратор = Истина;
Прерывание;
КонецЕсли;
КонецЦикла;
Сведения.Вставить("ИмеетПолеРегистратор", ИмеетПолеРегистратор);
// Логируем для отладки
ЗаписьЖурнала.Записать("ИнформацияОРегистре", Сведения);
КонецПроцедуры;
Способ 3: Проверка в запросе
Процедура ПроверитьПрименимостьФильтра() Экспорт
// Проверяем может ли быть записано в регистр сведений
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| 1
|ИЗ
| РегистрСведений.Цены";
Попытка
РезультатЗапроса = Запрос.Выполнить();
// Если запрос выполнен, регистр существует
Исключение
Сообщение = ОписаниеОшибки();
// Регистр не существует или есть ошибка доступа
КонецПопытки;
КонецПроцедуры;
Способ 4: Практический пример — обработка при удалении
Процедура ОбработатьУдалениеРегистратора(РегистраторСсылка) Экспорт
РегистраторМета = РегистраторСсылка.Метаданные();
// Проверяем какие регистры сведений подчинены этому регистратору
Для Каждого РегистрМета Из Метаданные.РегистрыСведений Цикл
// Проверяем есть ли поле Регистратор
ПолеРегистратораНайдено = Ложь;
Для Каждого Измерение Из РегистрМета.Измерения Цикл
Если Измерение.Имя = "Регистратор" Тогда
ПолеРегистратораНайдено = Истина;
Прерывание;
КонецЕсли;
КонецЦикла;
Если ПолеРегистратораНайдено Тогда
// Этот регистр подчинён регистраторам
// Нужно очистить записи для удаляемого регистратора
ОчиститьЗаписиРегистра(РегистрМета.Имя, РегистраторСсылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры;
Процедура ОчиститьЗаписиРегистра(ИмяРегистра, РегистраторСсылка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Записи.Регистратор
|ИЗ
| РегистрСведений." + ИмяРегистра + " КАК Записи
|ГДЕ
| Записи.Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", РегистраторСсылка);
// Удаляем связанные записи
НаборЗаписей = РегистрыСведений[ИмяРегистра].СоздатьНаборЗаписей();
НаборЗаписей.Фильтр.Регистратор.Значение = РегистраторСсылка;
НаборЗаписей.Фильтр.Регистратор.Использование = Истина;
НаборЗаписей.Записать();
КонецПроцедуры;
Способ 5: Проверка типа периодичности
Процедура ПроверитьПериодичность(ИмяРегистра) Экспорт
РегистрМета = Метаданные.РегистрыСведений.Найти(ИмяРегистра);
// Периодичность может быть:
// Второсортность
// День
// Месяц
// Квартал
// Год
Если РегистрМета.Периодичность = Периодичность.Вторая Тогда
// Регистр изменяется часто, может быть подчинён документам
ИначеЕсли РегистрМета.Периодичность = Периодичность.День Тогда
// День — часто подчиняется документам
КонецЕсли;
КонецПроцедуры;
Вывод
Основной способ: использовать РегистрМета.РегистраторОбязателен
Когда использовать:
- При обработке удаления регистраторов
- При управлении консистентностью данных
- При построении динамических отчётов
- При проверке целостности данных после обновления конфигурации
Ключевые моменты:
- Подчинённый регистр — автоматически очищается при удалении регистратора
- Непо́дчинённый — остаются «висячие» записи
- Проверка через метаданные — самый надёжный способ