Как подсчитать количество элементов справочников и документов в базе данных 1С?

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

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

Готовые инструменты для подсчета данных

Если требуется получить данные немедленно без разработки собственного решения, рассмотрим проверенные варианты, доступные сообществу 1С:

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

Самостоятельная программная реализация через обход метаданных

Создание собственной обработки — простая и гибкая задача. Базовый принцип заключается в последовательном обходе коллекций метаданных и выполнении агрегатного запроса к физическим таблицам. Разберем по шагам, как построить надежный алгоритм.

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

Посмотрим на пример процедуры подсчета количества элементов справочников и документов:


УстановитьПривилегированныйРежим(Истина);

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

Запрос = Новый Запрос;

// Обход справочников
Для Каждого МетаданноеСправочник Из Метаданные.Справочники Цикл
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	КОЛИЧЕСТВО(*) КАК Всего,
        |	СУММА(ВЫБОР КОГДА Спр.ПометкаУдаления ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК Помечено
        |ИЗ
        |	Справочник." + МетаданноеСправочник.Имя + " КАК Спр";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        СтрокаТЗ = ТаблицаРезультатов.Добавить();
        СтрокаТЗ.ТипОбъекта = "Справочник";
        СтрокаТЗ.ИмяОбъекта = МетаданноеСправочник.Имя;
        СтрокаТЗ.Синоним = МетаданноеСправочник.Синоним;
        СтрокаТЗ.ВсегоЗаписей = Выборка.Всего;
        СтрокаТЗ.ПомеченоНаУдаление = ?(Выборка.Помечено = NULL, 0, Выборка.Помечено);
    КонецЕсли;
КонецЦикла;

// Обход документов
Для Каждого МетаданноеДокумент Из Метаданные.Документы Цикл
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	КОЛИЧЕСТВО(*) КАК Всего,
        |	СУММА(ВЫБОР КОГДА Док.ПометкаУдаления ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК Помечено
        |ИЗ
        |	Документ." + МетаданноеДокумент.Имя + " КАК Док";
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        СтрокаТЗ = ТаблицаРезультатов.Добавить();
        СтрокаТЗ.ТипОбъекта = "Документ";
        СтрокаТЗ.ИмяОбъекта = МетаданноеДокумент.Имя;
        СтрокаТЗ.Синоним = МетаданноеДокумент.Синоним;
        СтрокаТЗ.ВсегоЗаписей = Выборка.Всего;
        СтрокаТЗ.ПомеченоНаУдаление = ?(Выборка.Помечено = NULL, 0, Выборка.Помечено);
    КонецЕсли;
КонецЦикла;

Рассмотрим подробнее ключевые особенности этого кода:

  1. Разделение на активные и помеченные на удаление: Использование конструкции ВЫБОР КОГДА ... ТОГДА 1 ИНАЧЕ 0 КОНЕЦ в функции СУММА позволяет сразу увидеть, какая часть базы занята «мусорными» или неактуальными данными.
  2. Последовательные запросы: Не рекомендуется склеивать запросы ко всем метаданным в один гигантский пакет с оператором ОБЪЕДИНИТЬ ВСЕ. В типовых конфигурациях с сотнями документов такой запрос может вызвать сбой парсера СУБД или переполнение стека вызовов.

Технические ограничения и нюансы платформы

Проанализируем ситуации, в которых стандартный запрос может вести себя не так, как ожидается:

  1. Нагрузка на СУБД на больших базах: Функция КОЛИЧЕСТВО(*) выполняет полное сканирование индексов или таблиц. Если база данных весит сотни гигабайт или терабайты, последовательное сканирование всех таблиц может вызвать интенсивный ввод-вывод и заблокировать параллельную работу пользователей. Запускать такой анализ лучше во внерабочее время.
  2. Разделение данных (SaaS / 1С:Фреш): Если база работает с разделением данных, запрос в пользовательском сеансе вернет количество записей только для текущей области данных (тенанта). Для получения общей статистики по всей базе подсчет необходимо запускать в неразделенном сеансе без указания разделителей.
  3. Распределенные информационные базы (РИБ): В узлах РИБ с установленной фильтрацией (например, передача документов только по одной конкретной организации) подсчет вернет только данные, физически находящиеся в текущем узле, а не в центральной базе.

Альтернативный вариант: получение статистики на уровне СУБД

Если информационная база работает в клиент-серверном режиме под управлением MS SQL Server или PostgreSQL, а доступ к серверу баз данных открыт, можно получить оценку количества строк практически мгновенно, не нагружая рабочую базу сканированием таблиц.

Для сопоставления объектов 1С с физическими именами таблиц в коде конфигурации используется метод ПолучитьСтруктуруХраненияБазыДанных(). Зная физические имена таблиц, администратор СУБД может запросить системную статистику (например, через системные представления sys.partitions в MS SQL Server или pg_class.reltuples в PostgreSQL). Эти данные собираются планировщиком СУБД автоматически: они дают приблизительную, но достаточно точную для общего аудита оценку без наложения блокировок на рабочие данные.

← На главную