Как в 1С:ЗУП 3.1 получить список всех документов за период через запрос по метаданным

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

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

Метод динамического формирования текста запроса

Основная идея заключается в том, чтобы не писать огромный текст запроса вручную, а использовать встроенную коллекцию Метаданные.Документы. Мы переберем все доступные в системе виды документов и для каждого из них сконструируем фрагмент текста ВЫБРАТЬ... ОБЪЕДИНИТЬ ВСЕ.

Давайте проанализируем базовый алгоритм. Нам необходимо создать объект Запрос, определить переменную для накопления текста и запустить цикл по метаданным. Рассмотрим пример кода, который часто приводит к ошибкам у новичков, и сразу разберем правильный вариант.

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


ТекстЗапроса = "";
Запрос = Новый Запрос;

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

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

КонецЦикла;

// Убираем последнее слово " ОБЪЕДИНИТЬ ВСЕ ", так как оно лишнее в конце строки
Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
    ТекстЗапроса = Лев(ТекстЗапроса, СтрДлина(ТекстЗапроса) - 15);
КонецЕсли;

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

РезультатЗапроса = Запрос.Выполнить();

Разбор критических ошибок и нюансов

При реализации этого метода мы можем столкнуться с несколькими техническими проблемами. Разберем их по шагам:

  1. Ошибка «Поле объекта не обнаружено ИМЯ»: Эта ошибка возникает, если вы пытаетесь обратиться к свойствам метаданных внутри текста запроса некорректно. Помните, что в самом тексте запроса (внутри кавычек) 1С ожидает фактическое имя таблицы в базе данных (например, Документ.ПриемНаРаботу). Мы используем конкатенацию строк, чтобы «вклеить» ДокМета.Имя в текст.
  2. Использование псевдонимов (КАК): В запросах с объединением крайне важно, чтобы имена колонок в первой выборке и последующих совпадали. Поэтому мы используем конструкцию КАК ТекТаблица для каждой таблицы, чтобы обращение к полям Ссылка, Проведен и Дата было унифицированным.
  3. Ограничения СУБД: Если в вашей конфигурации ЗУП 3.1 более 300 видов документов, один гигантский запрос может вызвать ошибку SQL-сервера из-за слишком большого количества объединений (UNION ALL). В этом случае проанализируем альтернативу: выполнение запросов в цикле по 20-30 штук с выгрузкой во временную таблицу значений.

Оптимизация: получение типа документа в результате

Чтобы в итоговом списке мы видели не просто ссылки, а понимали, к какому виду относится документ, мы добавили в запрос текстовое поле ВидДокумента. Выясним причину, почему это лучше, чем использование функции ТИПЗНАЧЕНИЯ в самом запросе. Обработка строковых литералов """ + ДокМета.Синоним + """ происходит на этапе формирования текста в коде 1С, что избавляет СУБД от лишних вычислений типов во время выполнения запроса. Это значительно повышает производительность на больших объемах данных.

Использование Журналов документов

Рассмотрим ситуацию, когда нам не нужно сканировать абсолютно все метаданные. В 1С:ЗУП существуют так называемые «Общие журналы». Например, если нам нужны только кадровые документы, эффективнее обратиться к ЖурналДокументов.КадровыеДокументы. Запрос к журналу работает на порядок быстрее, так как данные уже собраны платформой в одну индексированную таблицу.

Пример обращения к журналу:


Запрос.Текст = 
    "ВЫБРАТЬ
    |   ПРЕДСТАВЛЕНИЕ(Журнал.Ссылка.Метаданные.Синоним) КАК ВидДокумента,
    |   Журнал.Ссылка,
    |   Журнал.Проведен
    |ИЗ
    |   ЖурналДокументов.КадровыеДокументы КАК Журнал
    |ГДЕ
    |   Журнал.Дата МЕЖДУ &НачалоПериода И &КонецПериода";

Дополнительные рекомендации

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

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

Таким образом, мы вместе разобрали мощный инструмент автоматизации аудита базы данных. Используя обход коллекции Метаданные.Документы, вы сможете за считанные секунды формировать отчеты, на которые раньше уходили часы ручного труда.

← На главную