Разработка и Конфигурация · 11 мин
Как получить список всех документов в 1С
Как получить список всех документов в 1С: через запрос, выборку в коде, универсальный отчёт и журнал документов. Примеры кода, отборы, типичные ошибки.
Задача получить список всех документов возникает в 1С постоянно: при выгрузке данных, формировании отчётов, обмене между базами, поиске «потерянных» документов. В зависимости от цели подход различается: иногда достаточно пользовательского журнала документов, иногда нужен запрос к таблицам, а иногда — программная выборка по всем видам документов конфигурации.
Главное, что нужно понимать перед началом: в 1С нет единой таблицы «все документы». Каждый вид документа (РеализацияТоваровУслуг, ПриходныйКассовыйОрдер и т.д.) хранится в собственной таблице. Поэтому «список всех документов» — это либо объединение выборок из разных таблиц, либо перебор метаданных конфигурации.
Ниже разобраны рабочие способы для управляемых и обычных приложений: через журнал документов, универсальный отчёт, консоль запросов и программный код на встроенном языке.
Что считать списком всех документов в 1С
Прежде чем выбирать инструмент, определите, что именно нужно: список документов одного вида (например, все реализации), всех документов по одному контрагенту, или действительно все документы всех видов в базе. От этого зависит и способ, и нагрузка на систему.
Полный перебор всех видов документов в большой базе — тяжёлая операция. В типовой базе среднего размера документов могут быть сотни тысяч или миллионы, и выборка «всего и сразу» без отборов займёт заметное время и память. Поэтому даже в универсальных обработках всегда стоит ограничивать период или состав видов документов.
Как получить список через журнал документов
Самый простой способ без программирования — журналы документов. Журнал объединяет несколько видов документов в одном списке. В типовых конфигурациях есть готовые журналы: «Складские документы», «Кассовые документы», «Документы по контрагенту» и другие. Откройте нужный журнал через раздел меню и установите отборы по периоду, организации, контрагенту.
Если подходящего журнала нет, его можно создать в конфигураторе: добавить объект метаданных «Журнал документов» и в свойствах отметить виды документов, которые должны в него входить. После обновления конфигурации журнал станет доступен пользователям.
Ограничение способа: журнал показывает только те виды документов, которые в него включены при проектировании. Полностью «все документы базы» через один журнал получить можно, только если специально создать такой журнал и включить в него все виды — в конфигурациях с сотнями видов документов это делают редко.
Как получить список через универсальный отчёт
В типовых конфигурациях (Бухгалтерия, Управление торговлей, ERP) есть «Универсальный отчёт». Он позволяет выбрать объект данных — в том числе любой вид документа — и вывести его список с произвольными полями: номер, дата, контрагент, сумма, ответственный.
Порядок действий: откройте универсальный отчёт, выберите тип объекта «Документ», укажите конкретный вид, задайте период и нужные поля, сформируйте отчёт. Результат можно выгрузить в табличный документ и сохранить в Excel.
Ограничение то же: универсальный отчёт работает с одним видом документа за раз. Для сводного списка по всем видам он не подходит — понадобится запрос или обработка.
Как получить список запросом
Запрос — основной инструмент разработчика. Для одного вида документа запрос выглядит так:
ВЫБРАТЬ
Реализация.Ссылка КАК Ссылка,
Реализация.Номер КАК Номер,
Реализация.Дата КАК Дата,
Реализация.Контрагент КАК Контрагент,
Реализация.СуммаДокумента КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
И НЕ Реализация.ПометкаУдаления
Чтобы объединить несколько видов документов в один список, используйте ОБЪЕДИНИТЬ ВСЕ. Состав полей в каждой части объединения должен совпадать по количеству и типам — недостающие реквизиты заменяют на NULL или константу:
ВЫБРАТЬ
Т.Ссылка, Т.Номер, Т.Дата, Т.Контрагент
ИЗ Документ.РеализацияТоваровУслуг КАК Т
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Т.Ссылка, Т.Номер, Т.Дата, Т.Контрагент
ИЗ Документ.ПоступлениеТоваровУслуг КАК Т
Проверить запрос удобно в консоли запросов (внешняя обработка) или в конструкторе запроса конфигуратора. Учтите, что состав стандартных реквизитов (Ссылка, Номер, Дата, Проведен, ПометкаУдаления) одинаков у всех документов, а вот прикладные реквизиты вроде Контрагента есть не везде — обращение к несуществующему реквизиту вызовет ошибку запроса.
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Номер, Дата ИЗ Документ.РеализацияТоваровУслуг ГДЕ Дата МЕЖДУ &Нач И &Кон";
Запрос.УстановитьПараметр("Нач", НачалоДня(НачалоПериода));
Запрос.УстановитьПараметр("Кон", КонецДня(КонецПериода));
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить(Строка(Результат.Ссылка));
КонецЦикла;Как перебрать все виды документов программно
Когда нужен действительно полный список всех документов конфигурации, перебирают метаданные: коллекция Метаданные.Документы содержит все виды документов. Для каждого вида строится выборка методом Документы[ИмяВида].Выбрать() или запросом.
Для Каждого ВидДокумента Из Метаданные.Документы Цикл
Выборка = Документы[ВидДокумента.Имя].Выбрать(НачалоПериода, КонецПериода);
Пока Выборка.Следующий() Цикл
Сообщить(ВидДокумента.Имя + ": " + Строка(Выборка.Ссылка));
КонецЦикла;
КонецЦикла;
Метод Выбрать() без параметров вернёт все документы вида, включая помеченные на удаление. Первые два параметра позволяют ограничить интервал дат — используйте это всегда, если полный диапазон не нужен. Для отбора по реквизитам у метода есть третий параметр — структура отбора, но отбор возможен только по индексированным реквизитам, иначе будет ошибка.
Альтернатива — динамическое построение текста запроса с ОБЪЕДИНИТЬ ВСЕ по всем видам через цикл по метаданным. Такой запрос выполняется быстрее множества отдельных выборок, но текст получается громоздким, а у некоторых СУБД есть ограничение на количество объединений. На практике чаще разбивают выборку на пакеты по видам документов.
- 1Определите состав видов документов и период — не выбирайте всё без ограничений
- 2Переберите Метаданные.Документы и для каждого вида выполните выборку или запрос
- 3Исключите помеченные на удаление, если они не нужны (проверка ПометкаУдаления)
- 4Соберите результат в таблицу значений или список значений
- 5Проверьте количество записей и полноту на контрольном примере
Отборы, помеченные на удаление и права доступа
Три нюанса, которые регулярно портят результат. Первый — пометка удаления: выборка и запрос по умолчанию возвращают и помеченные документы. Если нужен «чистый» список, добавляйте условие НЕ ПометкаУдаления или проверяйте свойство в цикле.
Второй — права. В пользовательском режиме и при выполнении кода под пользователем с ограниченными правами запрос вернёт только те документы, к которым есть доступ (включая ограничения RLS по организациям и контрагентам). Список может оказаться неполным без каких-либо ошибок — это нормальное поведение. Для служебных выгрузок используют привилегированный режим (УстановитьПривилегированныйРежим), но только там, где это оправдано.
Третий — производительность. Выборка миллиона документов в цикле с обращением к реквизитам каждой ссылки порождает отдельные обращения к базе. Если нужны реквизиты, получайте их сразу в запросе, а не через точку от ссылки в цикле — разница во времени выполнения кратная.
Типичные ошибки и как их проверить
Частая ошибка — ожидание, что запрос к одной таблице вернёт документы всех видов. Такой таблицы нет, и это нужно учитывать при проектировании выгрузок: получатель файла должен понимать, что список собран из нескольких источников.
Вторая ошибка — использование ПОМЕСТИТЬ и временных таблиц без необходимости, а также выборка полей «звёздочкой» (через Ссылка.*), что резко увеличивает объём передаваемых данных. Третья — забытый отбор по периоду: без него запрос сканирует всю таблицу.
Проверка результата проста: сравните количество документов в выборке с количеством в журнале документов за тот же период и с теми же отборами. Расхождение почти всегда объясняется пометкой удаления, правами доступа или различием в границах периода (начало/конец дня).
Как проверить результат
Совпадает с журналом за тот же период и отборы
Расходится — проверьте пометку удаления, права, границы дат
В списке присутствуют все нужные виды
Часть видов отсутствует — не все виды включены в запрос или журнал
Секунды или минуты на большом периоде
Запрос «висит» — нет отбора по периоду или лишние соединения
Сравнение способов получения списка
| Способ | Когда подходит | Ограничения |
|---|---|---|
| Журнал документов | Интерактивный просмотр, отборы, печать списка | Только виды, включённые в журнал |
| Универсальный отчёт | Выгрузка списка одного вида с произвольными полями | Один вид документа за раз |
| Запрос с ОБЪЕДИНИТЬ ВСЕ | Сводный список нескольких видов, выгрузки, отчёты | Нужно согласовать состав полей; предел объединений |
| Перебор метаданных + Выбрать() | Действительно все документы всех видов | Медленно на больших объёмах, нужен код |
Выбор простой: для пользовательской задачи начинайте с журнала или универсального отчёта, для интеграций и обработок — с запроса, а перебор метаданных оставьте для случаев, когда состав видов заранее неизвестен или должен подстраиваться под конфигурацию автоматически.
Что важно запомнить
Единой таблицы всех документов в 1С нет. Список получают через журнал, универсальный отчёт, запрос с ОБЪЕДИНИТЬ ВСЕ или перебор метаданных. Всегда ограничивайте период, учитывайте пометку удаления и права доступа, а реквизиты выбирайте в запросе, а не через ссылку в цикле.
Частые вопросы
Можно ли получить список всех документов по конкретному контрагенту?
Да. Проще всего — через отбор в журнале документов по контрагенту. Программно — запросом с условием ГДЕ Контрагент = &Контрагент по нужным видам документов, объединённым через ОБЪЕДИНИТЬ ВСЕ. Учтите, что реквизит контрагента есть не у всех видов документов.
Почему запрос возвращает документы, которых нет в журнале?
Чаще всего дело в пометке удаления: запрос по умолчанию включает помеченные документы, а журнал может их скрывать. Другая причина — границы периода: проверьте, что конец периода задан как конец дня, а не начало.
Как выгрузить список документов в Excel?
Сформируйте список в журнале или универсальном отчёте и сохраните табличный документ через Файл — Сохранить как в формате Excel. Программно результат запроса выгружают в табличный документ или в таблицу значений с последующей записью через ТабличныйДокумент.Записать().
Как получить только проведённые документы?
Добавьте в запрос условие ГДЕ Проведен (или Проведен = ИСТИНА). В выборке методом Выбрать() фильтровать по проведённости нельзя — проверяйте свойство Выборка.Проведен в цикле.
Почему перебор всех документов выполняется очень долго?
Скорее всего, в цикле идёт обращение к реквизитам через ссылку — каждое обращение это отдельный запрос к базе. Получайте нужные поля сразу в запросе, ограничивайте период и обрабатывайте документы пакетами.
Можно ли получить список документов, которых нет ни в одном журнале?
Да, программно: переберите Метаданные.Документы, исключите виды, входящие в журналы (свойство Журналы у метаданных документа показывает, в какие журналы он включён), и соберите выборку по оставшимся видам. Полностью в пользовательском режиме без кода это сделать нельзя.