К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить список всех документов конфигурации в 1С

Как в 1С получить список всех документов конфигурации: перебор метаданных, запросы к таблицам, примеры кода для встроенного языка и внешних обработок.

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

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

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

Различие между метаданными и данными документов

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

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

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

Маршрут решения

Как выбрать подход

Нужен перечень видов документов конфигурации (для анализа, прав, обработок)Переберите Метаданные.Документы в цикле
Нужны реальные документы конкретного видаИспользуйте запрос к таблице Документ.ИмяВида
Нужно понять, какие виды документов реально используютсяПереберите метаданные и для каждого вида выполните лёгкий запрос с ПЕРВЫЕ 1
Нужен список без программированияОткройте конфигуратор: ветка Документы в дереве конфигурации

Просмотр списка документов в конфигураторе без программирования

Самый простой способ увидеть все виды документов — открыть конфигуратор и развернуть ветку «Документы» в дереве конфигурации. Там отображаются все объекты типа «Документ» в порядке, заданном разработчиком, с именами и синонимами.

Для больших конфигураций (ERP, УТ, КА) количество документов исчисляется сотнями, и вручную ориентироваться неудобно. В этом случае помогает поиск по дереву конфигурации (Ctrl+F в окне конфигурации) или сортировка по подсистемам: свойство «Подсистемы» у документа показывает, к какому функциональному блоку он относится.

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

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

Основной программный способ — перебор коллекции Метаданные.Документы. Каждый элемент коллекции — объект описания метаданного документа, у которого доступны свойства: Имя, Синоним, Проведение, ДлинаНомера, Движения, Реквизиты, ТабличныеЧасти и другие.

Пример кода, который выводит имена и синонимы всех документов конфигурации:

Для Каждого ДокументМД Из Метаданные.Документы Цикл

Сообщить(ДокументМД.Имя + " — " + ДокументМД.Синоним);

КонецЦикла;

Для практических задач удобнее собрать результат в таблицу значений, чтобы потом вывести её в форму, сохранить в файл или передать дальше:

ТаблицаДокументов = Новый ТаблицаЗначений;

ТаблицаДокументов.Колонки.Добавить("Имя");

ТаблицаДокументов.Колонки.Добавить("Синоним");

ТаблицаДокументов.Колонки.Добавить("Проведение");

Для Каждого ДокументМД Из Метаданные.Документы Цикл

Строка = ТаблицаДокументов.Добавить();

Строка.Имя = ДокументМД.Имя;

Строка.Синоним = ДокументМД.Синоним;

Строка.Проведение = (ДокументМД.Проведение = Метаданные.СвойстваОбъектов.Проведение.Разрешить);

КонецЦикла;

Фильтрация списка по условиям

Отбор по подсистемам

Часто нужны не все документы, а только относящиеся к конкретному разделу учёта — например, к подсистеме «Закупки». Свойство Подсистемы у метаданного документа — это коллекция, поэтому проверка выполняется перебором:

НужнаяПодсистема = Метаданные.Подсистемы.Найти("Закупки");

Если НужнаяПодсистема <> Неопределено Тогда

Для Каждого ДокументМД Из Метаданные.Документы Цикл

Если ДокументМД.Подсистемы.Содержит(НужнаяПодсистема) Тогда

Сообщить(ДокументМД.Имя);

КонецЕсли;

КонецЦикла;

КонецЕсли;

Отбор проводимых документов

Для задач анализа движений или построения отчётов по регистрам бывает нужно оставить только документы, которые могут проводиться. Условие — свойство Проведение, равное значению «Разрешить». Аналогично можно фильтровать по наличию движений по конкретному регистру, перебирая коллекцию ДокументМД.Движения.

Такие фильтры — стандартный приём при построении универсальных обработок: например, инструмент перепроведения сначала формирует список проводимых документов, а затем работает только с ними.

Получение списка фактически введённых документов

Если требуется не структура конфигурации, а реальные документы базы, применяется запрос к таблице конкретного вида документа:

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

Запрос.Текст =

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка КАК Ссылка,

| РеализацияТоваровУслуг.Номер КАК Номер,

| РеализацияТоваровУслуг.Дата КАК Дата

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|УПОРЯДОЧИТЬ ПО

| Дата";

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

Чтобы собрать документы всех видов в одну выборку, можно программно сформировать текст запроса с объединением по всем видам из метаданных. Однако на практике это почти всегда плохая идея: запрос с сотнями объединений будет тяжёлым, а результат — малополезным, так как у разных документов разный смысл и набор полей. Разумнее для каждого вида выполнять отдельный лёгкий запрос.

Для проверки факта использования вида документа достаточно запроса с ограничением ПЕРВЫЕ 1 — он выполняется быстро даже на больших таблицах и отвечает на вопрос «есть ли хотя бы один документ этого вида в базе».

Практический пример: карта использования документов

Типовая прикладная задача — получить таблицу: вид документа, синоним, есть ли экземпляры в базе, количество. Такая сводка нужна при обследовании внедрения, перед удалением неиспользуемых объектов или при планировании свёртки базы.

Для Каждого ДокументМД Из Метаданные.Документы Цикл

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 ИСТИНА КАК ЕстьДанные ИЗ Документ."

+ ДокументМД.Имя + " КАК Т";

ЕстьДокументы = Не Запрос.Выполнить().Пустой();

Сообщить(ДокументМД.Имя + ": " + ?(ЕстьДокументы, "используется", "нет данных"));

КонецЦикла;

Подсчёт точного количества через КОЛИЧЕСТВО(*) выполняйте только там, где это действительно нужно: на таблицах с миллионами записей агрегатный запрос заметно нагружает сервер СУБД.

Порядок действий для аудита документов
  1. 1
    Определите цель: список видов, список экземпляров или сводка использования
  2. 2
    Для списка видов переберите Метаданные.Документы и соберите результат в таблицу значений
  3. 3
    Для проверки использования выполните по каждому виду запрос с ПЕРВЫЕ 1
  4. 4
    Сохраните результат в файл (табличный документ, CSV) для анализа
  5. 5
    Проверьте выборочно несколько видов вручную через список документов в режиме Предприятия

Частые ошибки и ограничения

Типичные ошибки
01
Перебор данных вместо метаданных: для списка видов документов не нужны запросы к таблицам — достаточно Метаданные.Документы
02
Построение гигантского запроса с ОБЪЕДИНИТЬ ВСЕ по всем видам документов — такой запрос тяжёл и часто упирается в ограничения СУБД
03
Игнорирование прав доступа: в режиме Предприятия пользователь без прав на документ не увидит его данные, хотя метаданные доступны
04
Обращение к таблице вида документа, которого нет в конфигурации, — текст запроса, собранный динамически, нужно формировать строго по именам из метаданных
05
Выполнение тяжёлых выборок в клиентской процедуре вместо серверной — лишний трафик и зависания интерфейса

Отдельного внимания заслуживают права. Код, обращающийся к метаданным, работает практически всегда, но запросы к данным подчиняются RLS и правам на объекты. Если обработка должна видеть всё независимо от прав текущего пользователя, используйте привилегированный режим (УстановитьПривилегированныйРежим(Истина)) — осознанно и только там, где это оправдано, поскольку это обход механизма разграничения доступа.

Ещё одно ограничение: внешние источники данных и документы расширений. Документы, добавленные расширением конфигурации, видны в Метаданные.Документы в сеансе, где расширение подключено, но при отключённом расширении запрос к их таблицам вызовет ошибку. Учитывайте это в универсальных обработках.

Контрольные точки

Как проверить результат

Количество видов документов в результате
Норма

Совпадает с числом объектов в ветке Документы конфигуратора

Тревожный признак

Меньше — возможно, работает отбор или расширение не подключено

Отметка «используется» по виду документа
Норма

В режиме Предприятия список этого документа действительно содержит записи

Тревожный признак

Код сообщает «нет данных», но документы есть — проверьте права и привилегированный режим

Скорость выполнения обработки
Норма

Проверка использования по всем видам занимает секунды

Тревожный признак

Минуты ожидания — вероятно, где-то выполняется КОЛИЧЕСТВО(*) по большим таблицам

FAQ

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

При переборе Метаданные.Документы у каждого элемента есть коллекция Движения — переберите её внутри основного цикла и получите имена регистров, по которым документ может формировать движения. Фактические движения конкретного документа читаются запросом к таблицам регистров с отбором по регистратору.

Можно ли получить список документов без доступа к конфигуратору?

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

Как выгрузить список документов в Excel или CSV?

Соберите данные в таблицу значений, выведите её в табличный документ и сохраните методом Записать с указанием типа файла MXL, XLSX или CSV. Либо сформируйте текстовый документ, разделяя поля точкой с запятой, — такой файл корректно открывается в Excel.

Почему запрос к таблице документа выдаёт ошибку, хотя вид документа есть в метаданных?

Частые причины: документ добавлен расширением, которое в текущем сеансе отключено; в динамически собранном тексте запроса опечатка в имени; либо запрос выполняется в контексте, где таблица недоступна. Проверьте точное имя через Метаданные.Документы и наличие подключённых расширений.

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

Используйте запрос к таблице Документ.ИмяВида с условием ГДЕ Дата МЕЖДУ &Начало И &Конец и передайте параметры через УстановитьПараметр. Дополнительно можно отобрать только проведённые документы условием Проведен = ИСТИНА.

Есть ли готовые обработки для анализа документов конфигурации?

Для типовых конфигураций существуют инструменты разработчика и консоли запросов (в том числе на Infostart), которые показывают структуру метаданных и позволяют выполнять произвольные запросы. Однако базовый перебор Метаданные.Документы занимает несколько строк кода и часто проще написать его самостоятельно под конкретную задачу.

Итог

Что важно запомнить

Список видов документов конфигурации получают перебором Метаданные.Документы — это быстро и не трогает данные. Список реальных документов — только запросами к таблицам, с ограничениями и в привилегированном режиме при необходимости. Для аудита использования достаточно запросов с ПЕРВЫЕ 1, а тяжёлые выборки тестируйте на копии базы.