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

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

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

Как получить список всех документов в 1С: через запрос, выборку в коде, универсальный отчёт и журнал документов. Примеры кода, отборы, типичные ошибки.

Задача получить список всех документов возникает в 1С постоянно: при выгрузке данных, формировании отчётов, обмене между базами, поиске «потерянных» документов. В зависимости от цели подход различается: иногда достаточно пользовательского журнала документов, иногда нужен запрос к таблицам, а иногда — программная выборка по всем видам документов конфигурации.

Главное, что нужно понимать перед началом: в 1С нет единой таблицы «все документы». Каждый вид документа (РеализацияТоваровУслуг, ПриходныйКассовыйОрдер и т.д.) хранится в собственной таблице. Поэтому «список всех документов» — это либо объединение выборок из разных таблиц, либо перебор метаданных конфигурации.

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

Что считать списком всех документов в 1С

Прежде чем выбирать инструмент, определите, что именно нужно: список документов одного вида (например, все реализации), всех документов по одному контрагенту, или действительно все документы всех видов в базе. От этого зависит и способ, и нагрузка на систему.

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

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

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

Если подходящего журнала нет, его можно создать в конфигураторе: добавить объект метаданных «Журнал документов» и в свойствах отметить виды документов, которые должны в него входить. После обновления конфигурации журнал станет доступен пользователям.

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

Как получить список через универсальный отчёт

В типовых конфигурациях (Бухгалтерия, Управление торговлей, ERP) есть «Универсальный отчёт». Он позволяет выбрать объект данных — в том числе любой вид документа — и вывести его список с произвольными полями: номер, дата, контрагент, сумма, ответственный.

Порядок действий: откройте универсальный отчёт, выберите тип объекта «Документ», укажите конкретный вид, задайте период и нужные поля, сформируйте отчёт. Результат можно выгрузить в табличный документ и сохранить в Excel.

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

Как получить список запросом

Запрос — основной инструмент разработчика. Для одного вида документа запрос выглядит так:

ВЫБРАТЬ

Реализация.Ссылка КАК Ссылка,

Реализация.Номер КАК Номер,

Реализация.Дата КАК Дата,

Реализация.Контрагент КАК Контрагент,

Реализация.СуммаДокумента КАК Сумма

ИЗ

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

ГДЕ

Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода

И НЕ Реализация.ПометкаУдаления

Чтобы объединить несколько видов документов в один список, используйте ОБЪЕДИНИТЬ ВСЕ. Состав полей в каждой части объединения должен совпадать по количеству и типам — недостающие реквизиты заменяют на NULL или константу:

ВЫБРАТЬ

Т.Ссылка, Т.Номер, Т.Дата, Т.Контрагент

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

Т.Ссылка, Т.Номер, Т.Дата, Т.Контрагент

ИЗ Документ.ПоступлениеТоваровУслуг КАК Т

Проверить запрос удобно в консоли запросов (внешняя обработка) или в конструкторе запроса конфигуратора. Учтите, что состав стандартных реквизитов (Ссылка, Номер, Дата, Проведен, ПометкаУдаления) одинаков у всех документов, а вот прикладные реквизиты вроде Контрагента есть не везде — обращение к несуществующему реквизиту вызовет ошибку запроса.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Номер, Дата ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата МЕЖДУ &Нач И &Кон";
Запрос.УстановитьПараметр("Нач", НачалоДня(НачалоПериода));
Запрос.УстановитьПараметр("Кон", КонецДня(КонецПериода));
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
	Сообщить(Строка(Результат.Ссылка));
КонецЦикла;

Как перебрать все виды документов программно

Когда нужен действительно полный список всех документов конфигурации, перебирают метаданные: коллекция Метаданные.Документы содержит все виды документов. Для каждого вида строится выборка методом Документы[ИмяВида].Выбрать() или запросом.

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

Выборка = Документы[ВидДокумента.Имя].Выбрать(НачалоПериода, КонецПериода);

Пока Выборка.Следующий() Цикл

Сообщить(ВидДокумента.Имя + ": " + Строка(Выборка.Ссылка));

КонецЦикла;

КонецЦикла;

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

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

Порядок действий для полной выборки
  1. 1
    Определите состав видов документов и период — не выбирайте всё без ограничений
  2. 2
    Переберите Метаданные.Документы и для каждого вида выполните выборку или запрос
  3. 3
    Исключите помеченные на удаление, если они не нужны (проверка ПометкаУдаления)
  4. 4
    Соберите результат в таблицу значений или список значений
  5. 5
    Проверьте количество записей и полноту на контрольном примере

Отборы, помеченные на удаление и права доступа

Три нюанса, которые регулярно портят результат. Первый — пометка удаления: выборка и запрос по умолчанию возвращают и помеченные документы. Если нужен «чистый» список, добавляйте условие НЕ ПометкаУдаления или проверяйте свойство в цикле.

Второй — права. В пользовательском режиме и при выполнении кода под пользователем с ограниченными правами запрос вернёт только те документы, к которым есть доступ (включая ограничения RLS по организациям и контрагентам). Список может оказаться неполным без каких-либо ошибок — это нормальное поведение. Для служебных выгрузок используют привилегированный режим (УстановитьПривилегированныйРежим), но только там, где это оправдано.

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

Типичные ошибки и как их проверить

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

Вторая ошибка — использование ПОМЕСТИТЬ и временных таблиц без необходимости, а также выборка полей «звёздочкой» (через Ссылка.*), что резко увеличивает объём передаваемых данных. Третья — забытый отбор по периоду: без него запрос сканирует всю таблицу.

Проверка результата проста: сравните количество документов в выборке с количеством в журнале документов за тот же период и с теми же отборами. Расхождение почти всегда объясняется пометкой удаления, правами доступа или различием в границах периода (начало/конец дня).

Типичные ошибки
01
Выборка без ограничения периода — долгое выполнение и нагрузка на базу
02
Забытое условие по пометке удаления — в списке лишние документы
03
Обращение к реквизитам через ссылку в цикле вместо полей запроса — кратное замедление
04
Игнорирование прав доступа — «неполный» список принимают за ошибку кода
05
Обращение к реквизиту, которого нет у части видов документов, — ошибка запроса при объединении
Контрольные точки

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

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

Совпадает с журналом за тот же период и отборы

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

Расходится — проверьте пометку удаления, права, границы дат

Состав видов документов
Норма

В списке присутствуют все нужные виды

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

Часть видов отсутствует — не все виды включены в запрос или журнал

Время выполнения
Норма

Секунды или минуты на большом периоде

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

Запрос «висит» — нет отбора по периоду или лишние соединения

Сравнение способов получения списка

СпособКогда подходитОграничения
Журнал документовИнтерактивный просмотр, отборы, печать спискаТолько виды, включённые в журнал
Универсальный отчётВыгрузка списка одного вида с произвольными полямиОдин вид документа за раз
Запрос с ОБЪЕДИНИТЬ ВСЕСводный список нескольких видов, выгрузки, отчётыНужно согласовать состав полей; предел объединений
Перебор метаданных + Выбрать()Действительно все документы всех видовМедленно на больших объёмах, нужен код

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

Итог

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

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

Частые вопросы

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

Да. Проще всего — через отбор в журнале документов по контрагенту. Программно — запросом с условием ГДЕ Контрагент = &Контрагент по нужным видам документов, объединённым через ОБЪЕДИНИТЬ ВСЕ. Учтите, что реквизит контрагента есть не у всех видов документов.

Почему запрос возвращает документы, которых нет в журнале?

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

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

Сформируйте список в журнале или универсальном отчёте и сохраните табличный документ через Файл — Сохранить как в формате Excel. Программно результат запроса выгружают в табличный документ или в таблицу значений с последующей записью через ТабличныйДокумент.Записать().

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

Добавьте в запрос условие ГДЕ Проведен (или Проведен = ИСТИНА). В выборке методом Выбрать() фильтровать по проведённости нельзя — проверяйте свойство Выборка.Проведен в цикле.

Почему перебор всех документов выполняется очень долго?

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

Можно ли получить список документов, которых нет ни в одном журнале?

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