При аудите информационной базы, подготовке к переходу на новую конфигурацию, свертке базы или оценке объемов данных регулярно возникает практическая задача: быстро получить статистику по количеству созданных документов и элементов справочников. Разберем, какими готовыми инструментами можно воспользоваться для решения этой задачи, а также как самостоятельно написать универсальный программный алгоритм с учетом всех архитектурных нюансов платформы 1С:Предприятие 8.
Если требуется получить данные немедленно без разработки собственного решения, рассмотрим проверенные варианты, доступные сообществу 1С:
Создание собственной обработки — простая и гибкая задача. Базовый принцип заключается в последовательном обходе коллекций метаданных и выполнении агрегатного запроса к физическим таблицам. Разберем по шагам, как построить надежный алгоритм.
Для корректного подсчета всех данных в информационной базе важно учесть ограничения доступа на уровне записей. Если в базе включен механизм RLS, обычный запрос вернет только те строки, на которые у текущей учетной записи есть права. Поэтому перед выполнением запросов необходимо включить привилегированный режим.
Посмотрим на пример процедуры подсчета количества элементов справочников и документов:
УстановитьПривилегированныйРежим(Истина);
ТаблицаРезультатов = Новый ТаблицаЗначений;
ТаблицаРезультатов.Колонки.Добавить("ТипОбъекта", Новый ОписаниеТипов("Строка"));
ТаблицаРезультатов.Колонки.Добавить("ИмяОбъекта", Новый ОписаниеТипов("Строка"));
ТаблицаРезультатов.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
ТаблицаРезультатов.Колонки.Добавить("ВсегоЗаписей", Новый ОписаниеТипов("Число"));
ТаблицаРезультатов.Колонки.Добавить("ПомеченоНаУдаление", Новый ОписаниеТипов("Число"));
Запрос = Новый Запрос;
// Обход справочников
Для Каждого МетаданноеСправочник Из Метаданные.Справочники Цикл
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Всего,
| СУММА(ВЫБОР КОГДА Спр.ПометкаУдаления ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК Помечено
|ИЗ
| Справочник." + МетаданноеСправочник.Имя + " КАК Спр";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтрокаТЗ = ТаблицаРезультатов.Добавить();
СтрокаТЗ.ТипОбъекта = "Справочник";
СтрокаТЗ.ИмяОбъекта = МетаданноеСправочник.Имя;
СтрокаТЗ.Синоним = МетаданноеСправочник.Синоним;
СтрокаТЗ.ВсегоЗаписей = Выборка.Всего;
СтрокаТЗ.ПомеченоНаУдаление = ?(Выборка.Помечено = NULL, 0, Выборка.Помечено);
КонецЕсли;
КонецЦикла;
// Обход документов
Для Каждого МетаданноеДокумент Из Метаданные.Документы Цикл
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Всего,
| СУММА(ВЫБОР КОГДА Док.ПометкаУдаления ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК Помечено
|ИЗ
| Документ." + МетаданноеДокумент.Имя + " КАК Док";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтрокаТЗ = ТаблицаРезультатов.Добавить();
СтрокаТЗ.ТипОбъекта = "Документ";
СтрокаТЗ.ИмяОбъекта = МетаданноеДокумент.Имя;
СтрокаТЗ.Синоним = МетаданноеДокумент.Синоним;
СтрокаТЗ.ВсегоЗаписей = Выборка.Всего;
СтрокаТЗ.ПомеченоНаУдаление = ?(Выборка.Помечено = NULL, 0, Выборка.Помечено);
КонецЕсли;
КонецЦикла;
Рассмотрим подробнее ключевые особенности этого кода:
ВЫБОР КОГДА ... ТОГДА 1 ИНАЧЕ 0 КОНЕЦ в функции СУММА позволяет сразу увидеть, какая часть базы занята «мусорными» или неактуальными данными.ОБЪЕДИНИТЬ ВСЕ. В типовых конфигурациях с сотнями документов такой запрос может вызвать сбой парсера СУБД или переполнение стека вызовов.Проанализируем ситуации, в которых стандартный запрос может вести себя не так, как ожидается:
КОЛИЧЕСТВО(*) выполняет полное сканирование индексов или таблиц. Если база данных весит сотни гигабайт или терабайты, последовательное сканирование всех таблиц может вызвать интенсивный ввод-вывод и заблокировать параллельную работу пользователей. Запускать такой анализ лучше во внерабочее время.Если информационная база работает в клиент-серверном режиме под управлением MS SQL Server или PostgreSQL, а доступ к серверу баз данных открыт, можно получить оценку количества строк практически мгновенно, не нагружая рабочую базу сканированием таблиц.
Для сопоставления объектов 1С с физическими именами таблиц в коде конфигурации используется метод ПолучитьСтруктуруХраненияБазыДанных(). Зная физические имена таблиц, администратор СУБД может запросить системную статистику (например, через системные представления sys.partitions в MS SQL Server или pg_class.reltuples в PostgreSQL). Эти данные собираются планировщиком СУБД автоматически: они дают приблизительную, но достаточно точную для общего аудита оценку без наложения блокировок на рабочие данные.