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