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

В этой статье мы разберём 5 основных способов выборки документов — от ручного отбора в интерфейсе до сложных программных запросов с joins и группировками. Вы узнаете, когда лучше использовать ПолучитьСсылку(), а когда — Выбрать(), как ускорить выборку по датам и почему иногда проще обойтись без SQL. Материал будет полезен и новичкам в , и опытным разработчикам, которые хотят оптимизировать свой код.

Все примеры приведены для актуальных версий платформы 1С:Предприятие 8.3 (включая 8.3.23) и проверены на конфигурациях Управление торговлей 11, Бухгалтерия 3.0 и Зарплата и управление персоналом 3.1. Если вы работаете с другой конфигурацией, уточните названия объектов метаданных в её справочнике.

1. Ручная выборка через интерфейс 1С: когда не нужен код

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

Основные места, где можно сделать ручную выборку:

  • 📄 Журналы документов — например, «Поступление товаров» или «Реализация». Здесь есть панель отборов, где можно задать фильтры по дате, контрагенту, сумме и другим реквизитам.
  • 🔍 Отчёты — многие стандартные отчёты (например, «Оборотно-сальдовая ведомость») позволяют выгружать данные по документам с детализацией.
  • 📊 Списки и динамические списки — в формах справочников или документов часто есть кнопка «Ещё» → «Настройка списка», где можно добавить дополнительные колонки и отборы.

Пример: чтобы найти все счета-фактуры за текущий месяц от конкретного поставщика, откройте журнал «Счета-фактуры полученные», нажмите «Отбор» и задайте:

  • 📅 Дата — «Месяц = Текущий месяц»
  • 🏢 Контрагент — выберите нужного поставщика из справочника
⚠️ Внимание: Ручные отборы в интерфейсе не всегда учитывают права доступа. Если вы не видите часть документов, проверьте настройки ролей в Администрирование → Пользователи и права.
📊 Какой способ выборки вы используете чаще?
Ручной отбор в журналах
Стандартные отчёты 1С
Программный код (1С или SQL)
Внешние обработки
Не знаю, как делать выборки

2. Программная выборка через методы объектов: Выбрать() и НайтиПоРеквизиту()

Когда ручных инструментов недостаточно, на помощь приходит встроенный язык . Самые простые методы для выборки документов — это Выбрать() и НайтиПоРеквизиту(). Они подходят для работы с одним типом документов и не требуют знания синтаксиса запросов.

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

СчетаКлиентам = Документы.СчетКлиенту.СоздатьМенеджерЗаписи();

Выборка = СчетаКлиентам.Выбрать();

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

Если НЕ Выборка.Оплачен Тогда

Сообщить("Счет №" + Выборка.Номер + " от " + Формат(Выборка.Дата, "ДФ=dd.MM.yyyy") + " не оплачен!");

КонецЕсли;

КонецЦикла;

Для выборки по конкретному реквизиту удобнее использовать НайтиПоРеквизиту():

// Найдём все приходные ордера по контрагенту "ООО Ромашка"

ПриходныеОрдера = Документы.ПриходныйОрдер.НайтиПоРеквизиту("Контрагент", Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка"));

Преимущества этого подхода:

  • ⚡ Быстрота написания кода — не нужно составлять сложные запросы.
  • 🔄 Легко модифицировать условия прямо в процессе отладки.
  • 📌 Подходит для небольших баз данных (до 100 000 документов).
⚠️ Внимание: Метод Выбрать() загружает документы в оперативную память. Если выборка возвращает более 10 000 строк, используйте ВыбратьИтоги() или перепишите логику через запрос.

Проверьте права на чтение документов

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

Задайте индексы для реквизитов отбора (если база большая)

Создайте резервную копию перед массовыми операциями-->

3. Запросы в 1С: мощный инструмент для сложных выборок

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

Базовый синтаксис запроса для выборки документов:

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

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

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка КАК Ссылка,

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

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

|ИЗ

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

|ГДЕ

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

| И РеализацияТоваровУслуг.Организация = &Организация";

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

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

Запрос.УстановитьПараметр("Организация", Справочники.Организации.НайтиПоНаименованию("ООО Весна"));

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

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

Ключевые возможности запросов:

  • 🔗 Joins — связь с другими таблицами (например, получить данные о товарах из документа реализации).
  • 📊 Группировки — подсчёт количества документов или сумм по группам (например, по контрагентам).
  • 🔍 Подзапросы — вложенные запросы для сложной фильтрации.
  • 📅 Работа с датами — функции НАЧАЛОПЕРИОДА(), КОНЕЦПЕРИОДА() и другие.

Пример запроса с группировкой по контрагентам и подсчётом суммы продаж:

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

"ВЫБРАТЬ

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

| СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК ИтогоПродаж

|ИЗ

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

|ГДЕ

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

|СГРУППИРОВАТЬ ПО

| РеализацияТоваровУслуг.Контрагент";

⚠️ Внимание: В больших базах (свыше 1 млн документов) избегайте запросов с РАЗЛИЧНЫЕ или ОБЪЕДИНИТЬ — они могут тормозить сервер. Используйте временные таблицы или разбивайте запрос на части.
💡

Если запрос выполняется долго, добавьте в текст директиву //ОТЛАДКА и запустите его в режиме отладки. 1С покажет план выполнения и подскажет, где оптимизировать.

4. Оптимизация выборок: индексы, временные таблицы и кэширование

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

1. Индексы

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

  1. Откройте объект метаданных (например, документ «РеализацияТоваровУслуг»).
  2. Перейдите на закладку «Индексы».
  3. Добавьте реквизиты, по которым чаще всего фильтруете данные.

2. Временные таблицы

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

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

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

"ВЫБРАТЬ РАЗРЕШЕННЫЕ

| ТоварыНоменклатура.Ссылка КАК Ссылка

|ПОМЕСТИТЬ ВТПопулрныеТовары

|ИЗ

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

|ГДЕ

| ТоварыНоменклатура.Количество > 100";

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

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

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

"ВЫБРАТЬ

| ПопулрныеТовары.Ссылка КАК Товар,

| СУММА(Товары.Количество) КАК ОбщееКоличество

|ИЗ

| ВТПопулрныеТовары КАК ПопулрныеТовары

| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары

| ПО ПопулрныеТовары.Ссылка = Товары.Номенклатура

|ГДЕ

| Товары.Документ.Дата МЕЖДУ &ДатаНачала И &ДатаКонца

|СГРУППИРОВАТЬ ПО

| ПопулрныеТовары.Ссылка";

3. Кэширование результатов

Если данные редко меняются (например, справочник номенклатуры), сохраняйте результаты выборки в Соответствие или Массив и обновляйте их по таймеру:

Перем мКэшКонтрагентов; // Объявляем на уровне модуля

Процедура ПолучитьКонтрагентовНаКэше()

Если мКэшКонтрагентов = Неопределено Тогда

Запрос = Новый Запрос("ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Контрагенты");

мКэшКонтрагентов = Запрос.Выполнить().Выгрузить();

КонецЕсли;

Возврат мКэшКонтрагентов;

КонецПроцедуры

Метод оптимизации Когда применять Примерный выигрыш в скорости
Индексы Частые выборки по одному реквизиту в 2–10 раз
Временные таблицы Сложные запросы с повторным использованием в 3–5 раз
Кэширование Статичные данные (справочники, редко меняющиеся документы) в 10–100 раз
Разбивка на пакеты Массовая обработка (>50 000 строк) в 5–20 раз
💡

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

5. Работа с регистрами: выборка движений документов

Документы в часто записывают движения в регистры (например, регистр накопления «ТоварыНаСкладах»). Чтобы получить данные о движениях, нужно делать выборку не из документа, а из регистра. Это актуально для отчётов по остаткам, оборотам или аналитике.

Пример запроса для выборки движений по регистру «ТоварыНаСкладах» за месяц:

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

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

"ВЫБРАТЬ

| РегистрНакопленияТоварыНаСкладахОбороты.Номенклатура КАК Товар,

| СУММА(РегистрНакопленияТоварыНаСкладахОбороты.КоличествоПриход) КАК Приход,

| СУММА(РегистрНакопленияТоварыНаСкладахОбороты.КоличествоРасход) КАК Расход

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Обороты(

| &НачалоПериода,

| &КонецПериода,

| ,

| Номенклатура В (&СписокТоваров)

| ) КАК РегистрНакопленияТоварыНаСкладахОбороты

|СГРУППИРОВАТЬ ПО

| РегистрНакопленияТоварыНаСкладахОбороты.Номенклатура";

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

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

СписокТоваров = Новый Массив;

СписокТоваров.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Стул офисный"));

СписокТоваров.Добавить(Справочники.Номенклатура.НайтиПоНаименованию("Стол письменный"));

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

Особенности работы с регистрами:

  • 📈 Обороты — показывают изменения за период (приход/расход).
  • 📉 Остатки — актуальное состояние на дату.
  • 🔄 Виртуальные таблицы — 1С автоматически формирует временные таблицы для удобной выборки.

Если нужно получить остатки товаров на конкретную дату:

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

"ВЫБРАТЬ

| РегистрНакопленияТоварыНаСкладахОстатки.Номенклатура КАК Товар,

| РегистрНакопленияТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОтчета) КАК РегистрНакопленияТоварыНаСкладахОстатки";

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

6. Альтернативные способы: внешние обработки и DirectSQL

Иногда стандартных средств недостаточно, и требуются альтернативные подходы. Рассмотрим два из них:

1. Внешние обработки

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

  • 📑 Универсальные отчёты — обработки типа «Отчёт по документам» с гибкими настройками фильтров.
  • 🔄 Обмен данными — выборка документов для выгрузки в другие системы.
  • 📊 Аналитика — построение графиков или сводных таблиц на основе документов.

Где взять готовые обработки:

  • 🌐 Infostart — крупнейшая база решений для 1С.
  • 📦 Портал ИТС — официальные обработки от 1С.
  • 💾 Локальные файлы — если в вашей компании уже есть наработки.

2. Прямые SQL-запросы (DirectSQL)

Для опытных разработчиков есть возможность выполнять нативные SQL-запросы прямо к базе данных 1С. Это опасно (можно нарушить целостность данных), но иногда необходимо для экстренного восстановления или сверхсложных выборок.

Пример (только для PostgreSQL):

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

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

"ВЫБРАТЬ РАЗРЕШЕННЫЕ

| _Reference168 AS Ссылка,

| _Date_Time AS Дата

|ИЗ ""Document102"" // РеализацияТоваровУслуг в SQL-таблице

|ГДЕ ""_Fld171"" = '2023-01-01'"; // Фильтр по дате

Запрос.УстановитьПараметр("ТипБазы", Тип("СтрокаSQL"));

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

⚠️ Внимание: DirectSQL обходит механизмы контроля 1С. Не используйте его для модификации данных — только для чтения. Перед применением сделайте резервную копию базы!
Как узнать SQL-имя таблицы документа?

В конфигураторе откройте документ, перейдите на закладку "Хранение данных" и посмотрите свойство "Имя таблицы". Например, для "РеализацияТоваровУслуг" это может быть Document102.

7. Типичные ошибки и как их избежать

Даже опытные разработчики иногда допускают ошибки при выборке документов. Вот самые распространённые:

Ошибка Последствия Как исправить
Отсутствие фильтра по дате Запрос выбирает все документы за всю историю, тормозит базу Всегда ограничивайте период, даже если он большой
Использование ПОМЕСТИТЬ В без очистки Временные таблицы накапливаются, занимают память Добавляйте УДАЛИТЬ ВТИмяТаблицы в начале запроса
Выборка всех реквизитов (Документ.*) Лишние данные в результате, медленная обработка Указывайте только нужные поля
Отсутствие индексов на полях отбора Запрос сканирует всю таблицу (table scan) Проверьте индексы в конфигураторе
Использование ПОДОБНО с ведущими wildcards Медленная работа, индексы не используются Заменяйте на точные условия или фильтруйте после выборки

Пример неправильного запроса (медленного):

// Плохо: нет фильтра по дате, выбираем все реквизиты

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Документ.РеализацияТоваровУслуг.Контрагент.Наименование ПОДОБНО ""%ООО%""";

Исправленная версия:

// Хорошо: ограничен период, указаны конкретные поля, точное условие

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

"ВЫБРАТЬ

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

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

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

|ИЗ

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

|ГДЕ

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

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

FAQ: Ответы на частые вопросы

🔹 Как сделать выборку документов по нескольким типам (например, реализации и поступления)?

Используйте конструкцию ОБЪЕДИНИТЬ ВСЕ в запросе:

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

"ВЫБРАТЬ

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

| ""Реализация"" КАК ТипДокумента

|ИЗ

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

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

|ВЫБРАТЬ

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

| ""Поступление"" КАК ТипДокумента

|ИЗ

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

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

Проверьте:

  1. Права доступа пользователя на чтение документов.
  2. Корректность фильтров (особенно по датам и ссылкам).
  3. Наличие движений в регистрах, если выбираете из них.
  4. Использование РАЗЛИЧНЫЕ — иногда оно убирает дубли, которые вам нужны.

Для диагностики добавьте в запрос //ОТЛАДКА и посмотрите план выполнения.

🔹 Можно ли сделать выборку документов по произвольному условию (например, сумма > 1000 И контрагент в определённом городе)?

Да, используйте комбинированные условия в запросе:

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

| Реализация.СуммаДокумента > 1000

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

Запрос.УстановитьПараметр("Город", "Москва");

Для сложных условий по связанным справочникам используйте СОЕДИНЕНИЕ.

🔹 Как ускорить выборку документов в большой базе (1 млн+ записей)?

Применяйте комплексный подход:

  1. Разбивайте запрос на части (по периодам или группам).
  2. Используйте временные таблицы для промежуточных результатов.
  3. Ограничивайте выборку только нужными полями.
  4. Настройте индексы на поля отбора.
  5. Для отчётов используйте РАЗРЕШЕННЫЕ, если не нужны все данные.

Если ничего не помогает, рассмотрите перенос исторических данных в архив.

🔹 Где хранится история изменений документов и как её получить?

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

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

"ВЫБРАТЬ

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

| ИсторияИзменений.ДатаИзменения КАК Когда,

| ИсторияИзменений.Пользователь КАК Кто

|ИЗ

| РегистрСведений.ИсторияИзменений КАК ИсторияИзменений

|ГДЕ

| ИсторияИзменений.Ссылка = &Документ";

Если регистра нет, история не ведётся — её можно включить в конфигураторе (закладка «История данных»).