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

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

Механизм выборки через свойство Выборка

Самый прямой и интуитивно понятный способ получить доступ ко всем документам определенного вида — использование встроенного свойства Выборка. Этот метод идеально подходит для небольших объемов данных или задач, требующих простого перебора.

При обращении к свойству Выборка объекта метаданных, система автоматически формирует курсор по всем записям в таблице документов. Это позволяет iterating (перебирать) элементы без написания сложного кода запроса.

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

Ниже приведен пример кода, демонстрирующего базовый принцип работы с выборкой всех документов вида «ЗаказКлиента»:

ДокументОбъект = Документы.ЗаказКлиента.Выборка;

Пока ДокументОбъект.Следующий Цикл

// Обработка конкретного документа

Сообщить(ДокументОбъект.Номер);

КонецЦикла;

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

💡

Если вы используете выборку для изменения данных, обязательно вызывайте метод Записать внутри цикла или используйте пакетную запись для ускорения процесса.

Использование объекта Запрос для выборки данных

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

В отличие от прямой выборки, запрос выполняется на стороне СУБД (например, MS SQL или PostgreSQL), что значительно снижает нагрузку на сервер приложений 1С. Вы получаете готовый набор данных в виде РезультатЗапроса.

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

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

ТекстЗапроса ="ВЫБРАТЬ

| Документы.ЗаказКлиента.Ссылка КАК Ссылка,

| Документы.ЗаказКлиента.Дата КАК Дата,

| Документы.ЗаказКлиента.Контрагент КАК Контрагент

|ИЗ

| Документ.ЗаказКлиента КАК Документы.ЗаказКлиента";

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

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

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

При работе с объектом Запрос вы получаете полный контроль над структурой возвращаемых данных. Это позволяет избегать выборки лишних полей, экономя оперативную память.

Почему запрос быстрее прямой выборки?

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

Работа с Консолью запросов для анализа

Для разовых задач, отладки или анализа структуры данных администраторы и разработчики используют внешний инструмент — Консоль запросов. Она позволяет выполнять произвольные запросы к информационной базе без внесения изменений в код конфигурации.

Это незаменимый инструмент при поиске ответов на вопрос, как получить специфический срез документов. Вы можете визуально построить дерево метаобъектов и сформировать текст запроса.

Консоль запросов также позволяет экспортировать полученные данные в различные форматы, такие как MXL или CSV, что удобно для передачи данных аналитикам.

  • 🔍 Позволяет быстро проверить наличие конкретных документов в базе.
  • ⚡ Дает возможность протестировать производительность сложного запроса перед внедрением в код.
  • 🛠 Упрощает отладку соединений таблиц и условий отбора.

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

📊 Какой инструмент вы используете чаще всего?
Консоль запросов
Обработка"Универсальный отчет"
Свойство Выборка в коде
СКД (Система Компоновки Данных)

Фильтрация и отбор документов по периодам

На практике редко требуется получить абсолютно все документы за всю историю существования базы. Чаще всего возникает потребность в выборке за определенный период или по конкретному контрагенту.

Для реализации фильтрации в запросах используется оператор ГДЕ. Он позволяет наложить условия на поля документа, такие как дата, сумма или ссылки на справочники.

Особое внимание следует уделять типу данных «Дата». В 1С хранится с точностью до секунды, и неправильное использование операторов сравнения может привести к потере части документов или, наоборот, к выборке лишних записей.

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

Пример корректного отбора документов за текущий месяц выглядит следующим образом:

ТекстЗапроса ="ВЫБРАТЬ

| Ссылка

|ИЗ

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

|ГДЕ

| Дата МЕЖДУ &НачПериода И &КонПериода";

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

Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(ТекущаяДата));

Запрос.УстановитьПараметр("КонПериода", КонецМесяца(ТекущаяДата));

Использование параметров в тексте запроса не только защищает от SQL-инъекций (хотя в 1С это менее актуально), но и позволяет переиспользовать один и тот же запрос с разными данными.

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

Для пользователей, не владеющих языком программирования, стандартным решением является использование обработки «Универсальный отчет». Этот механизм встроен в большинство современных конфигураций 1С.

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

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

Метод получения Сложность внедрения Производительность Гибкость настройки
Свойство Выборка Низкая Низкая (на больших объемах) Средняя
Объект Запрос Высокая Высокая Максимальная
Универсальный отчет Отсутствует (готовый) Средняя Высокая (для пользователя)
Консоль запросов Средняя (требует навыка) Высокая Максимальная

Выбор инструмента зависит от вашей роли в проекте. Разработчику необходим код, а бухгалтеру — готовый отчет. Универсальный отчет является стандартом де-факто для оперативного получения данных пользователями.

☑️ Проверка перед массовой выгрузкой

Выполнено: 0 / 4

Обработка результатов и вывод в таблицу

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

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

При переносе данных из результата запроса в таблицу значений важно соблюдать соответствие типов данных. Ошибки приведения типов могут вызвать исключения во время выполнения программы.

Код переноса данных выглядит лаконично и выполняется быстро:

ТЗ = Результат.Выгрузить;

// Теперь ТЗ содержит все строки и может быть использована

// для отображения на форме или дальнейшей обработки

ЭлементФормы.Значение = ТЗ;

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

⚠️ Внимание: Не пытайтесь выгрузить миллионы строк в таблицу значений на клиенте тонкого клиента — это приведет к зависанию интерфейса из-за нехватки памяти.

💡

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

Часто задаваемые вопросы (FAQ)

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

Для этого необходимо добавить условие в запрос: ГДЕ Проведение = ИСТИНА. Если используется свойство Выборка, проверяйте свойство ДокументОбъект.Проведен внутри цикла, хотя это менее производительно.

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

Да, используя оператор ОБЪЕДИНИТЬ ВСЕ. Однако типы ссылок в колонке «Ссылка» должны быть совместимы, либо их нужно приводить к общему типу «Ссылка».

Почему выборка документов работает медленно?

Основные причины: отсутствие индексов по полям отбора, блокировки таблиц другими пользователями, большой объем данных в одной таблице или неоптимальный план запроса СУБД.

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

Используйте запрос с агрегатной функцией: ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ Документ.ВашДокумент. Это намного быстрее, чем перебор всех элементов в цикле.

Влияет ли получение списка документов на работу других пользователей?

Чтение данных (SELECT) обычно не блокирует запись в современных СУБД благодаря механизму версионирования (MVCC), но создает нагрузку на дисковую подсистему и процессор сервера.