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

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

1С 8: как выбрать документ — все рабочие способы

Как выбрать документ в 1С 8: методы Выбрать() и НайтиПоНомеру, запрос с отбором, отбор в динамическом списке. Примеры кода, проверка результата, типичные ошибки.

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

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

Ниже разобраны все основные способы выбора документов в 1С 8.3 с примерами кода на встроенном языке, критериями выбора между ними и проверкой результата.

Способы выбора документа: какой метод подходит под вашу задачу

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

Сравнение способов выбора

Запрос с отбором

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

Документы.Имя.Выбрать()

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

НайтиПоНомеру()

Быстрый поиск одного документа по номеру и дате. Работает только если номер уникален в пределах периодичности нумерации.

НайтиПоРеквизиту()

Поиск по значению реквизита, который входит в критерий отбора или индексирован. По неиндексированному реквизиту будет медленным.

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

Выбор документов запросом с отбором

Запрос — основной инструмент выборки документов при любых нетривиальных условиях. Отбор выполняется на сервере СУБД, поэтому в память попадают только нужные строки и поля.

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

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

"ВЫБРАТЬ

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

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

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

|ИЗ

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

|ГДЕ

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

| И Реализация.Контрагент = &Контрагент

| И Реализация.Проведен = ИСТИНА";

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

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

Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);

Выборка = Запрос.Выполнить().Выбрать();

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

// работа с Выборка.Ссылка

КонецЦикла;

Ключевые правила эффективного запроса по документам:

  • всегда ограничивайте период через параметры — выборка по всей таблице документов без условия по дате на большой базе может выполняться минутами;
  • выбирайте только нужные поля, а не «ВЫБРАТЬ *» — платформа не подгружает табличные части, но лишние реквизиты увеличивают трафик;
  • условия по индексированным полям (Дата, Номер, Ссылка, реквизиты с признаком «Индексировать») работают быстро, условия по неиндексированным реквизитам приводят к полному сканированию таблицы;
  • если нужна ссылка на документ для дальнейшей обработки — не извлекайте объект через ПолучитьОбъект() без необходимости.

Проверка, что запрос что-то нашёл

Типичная ошибка — предполагать, что выборка не пустая. Перед обработкой проверяйте результат:

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

Если Результат.Пустой() Тогда

ВызватьИсключение "Документы за указанный период не найдены";

КонецЕсли;

Метод Выбрать(): перебор документов за период

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

Выборка = Документы.ПриходныйКассовыйОрдер.Выбрать(

НачалоДня(НачалоПериода), КонецДня(КонецПериода));

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

Если Выборка.Проведен Тогда

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

КонецЕсли;

КонецЦикла;

Сигнатура метода позволяет передать начало и конец периода, а также отбор по значениям из критериев отбора (например, по организации, если она включена в критерий отбора для этого вида документов). Третьим параметром можно указать порядок — например, "Дата" для сортировки по возрастанию даты.

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

Поиск конкретного документа: НайтиПоНомеру и НайтиПоРеквизиту

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

НайденныйДок = Документы.СчетФактура.НайтиПоНомеру(

"0000-001234", Дата(2026, 3, 15));

Если НайденныйДок.Пустая() Тогда

Сообщить("Документ не найден");

Иначе

Сообщить("Найден: " + НайденныйДок);

КонецЕсли;

Метод НайтиПоРеквизиту("ИмяРеквизита", Значение) ищет документ по значению реквизита. Он эффективен только если реквизит индексирован или входит в критерий отбора — иначе поиск превращается в полное сканирование таблицы. Оба метода возвращают ссылку; если документ не найден, возвращается пустая ссылка, что проверяется методом Пустая().

Выбор документа по ссылке и работа с объектом

Если ссылка на документ уже известна (получена из запроса, реквизита другого объекта, параметра формы), никакой выборки не требуется — реквизиты доступны напрямую через точку: платформа сама выполнит чтение из базы.

СуммаДокумента = ДокументСсылка.СуммаДокумента; // чтение реквизита по ссылке

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

Типичные ошибки при выборе документов
01
Вызов ПолучитьОбъект() внутри цикла только для чтения реквизитов — время выполнения вырастает в десятки раз, замените на запрос с нужными полями.
02
Выборка без ограничения периода — полное сканирование таблицы документов и риск таймаута на большой базе.
03
Отсутствие проверки Пустая() после НайтиПоНомеру — обращение к реквизитам пустой ссылки вызывает ошибку.
04
Отбор по неиндексированному реквизиту в НайтиПоРеквизиту — медленный поиск, включите индексацию реквизита или используйте запрос.
05
Игнорирование пометки удаления: без условия ПометкаУдаления = ЛОЖЬ в выборку попадают помеченные документы.

Как выбрать документ в пользовательском интерфейсе

Пользователю без программирования документ ищется в форме списка. Основные приёмы в интерфейсе «Такси»:

  • строка поиска вверху списка — ищет по номеру, дате и другим отображаемым полям;
  • кнопка «Настроить список» (или «Ещё» → «Настроить список») — добавление отбора по любому реквизиту: контрагент, организация, сумма, автор;
  • быстрый отбор по значению текущей колонки — правый клик по ячейке и выбор отбора по этому значению;
  • стандартный период — ограничение списка датами через панель периода.

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

Как найти документ в форме списка
  1. 1
    Откройте журнал документов нужного вида через раздел меню.
  2. 2
    Установите период, чтобы сузить список.
  3. 3
    Введите номер или часть наименования контрагента в строку поиска.
  4. 4
    Если не нашли — откройте «Настроить список» и добавьте отбор по нужному реквизиту.
  5. 5
    Проверьте, что не сброшен отбор «Помеченные на удаление» — помеченные документы по умолчанию могут скрываться.

Проверка результата выборки

После выполнения выборки убедитесь, что получен именно тот набор документов, который ожидался. Контрольные точки:

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

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

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

Совпадает с ожидаемым (можно сверить через консоль запросов или список с теми же отборами)

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

Ноль при точно существующих документах — проверьте границы периода и параметры

Проведённость
Норма

В выборке только проведённые, если стояло условие Проведен = ИСТИНА

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

Попадают помеченные на удаление или непроведённые — условие пропущено

Границы периода
Норма

Даты документов внутри заданного интервала включительно

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

Документы на границе периода отсутствуют — используйте КонецДня() или Границу с видом Включая

Тип возвращаемого значения
Норма

Ссылка на документ, проверяется Пустая()

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

Обращение к реквизитам падает с ошибкой — ссылка пустая

Для отладки запросов удобна консоль запросов (в типовых конфигурациях на управляемых формах — через инструменты разработчика или внешние обработки): она показывает результат с теми же параметрами до встраивания кода в обработку.

Итог

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

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

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

Чем запрос лучше метода Выбрать()?

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

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

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

Почему НайтиПоНомеру не находит существующий документ?

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

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

Только запросом: соедините таблицу документа с его табличной частью (Документ.РеализацияТоваровУслуг.Товары) и поставьте условие по номенклатуре. Методы Выбрать и НайтиПоРеквизиту с табличными частями не работают.

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

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

Что быстрее: обращение к реквизиту через ссылку или ПолучитьОбъект()?

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