Как выбрать данные из связанных документов в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в среде 1С:Предприятие часто возникает задача получения списка документов, которые так или иначе связаны с текущим объектом. Например, нам нужно найти все подчиненные документы для «Заказа покупателя» или увидеть все оплаты по конкретному счету. Для этих целей платформа предоставляет мощный и оптимизированный механизм — Критерии отбора. Разберем подробно, как использовать этот инструмент в запросах и программном коде.

Использование запросов к виртуальным таблицам критериев отбора

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

Проанализируем структуру такого запроса. В качестве источника данных мы указываем не физическую таблицу, а КритерийОтбора.[ИмяКритерия]. В типовых конфигурациях этот критерий чаще всего называется СвязанныеДокументы.


ВЫБРАТЬ
    СвязанныеДокументы.Ссылка КАК Ссылка,
    СвязанныеДокументы.Ссылка.Контрагент КАК Контрагент,
    СвязанныеДокументы.Ссылка.СуммаДокумента КАК Сумма
ИЗ
    КритерийОтбора.СвязанныеДокументы(&Значение) КАК СвязанныеДокументы
ГДЕ
    СвязанныеДокументы.Ссылка.Проведен

Обратим внимание на важную деталь: виртуальная таблица критерия отбора является параметризированной. В скобках после имени таблицы (&Значение) необходимо передать ссылку на объект, для которого мы ищем связи. Если этого не сделать, запрос не сможет быть выполнен. Выясним, как правильно передать этот параметр в программном коде:


Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ КритерийОтбора.СвязанныеДокументы(&ДокументОснование)";
Запрос.УстановитьПараметр("ДокументОснование", СсылкаНаОбъект);
Результат = Запрос.Выполнить();

Этот метод позволяет не только получить список ссылок, но и сразу вытянуть любые реквизиты связанных объектов через точку (например, Ссылка.Дата, Ссылка.Номер), что очень удобно для построения отчетов или заполнения табличных частей.

Программный поиск через менеджер критерия отбора

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

Рассмотрим метод Найти(). Он возвращает массив ссылок на объекты, которые входят в состав критерия и ссылаются на искомое значение.


// Получаем массив связанных ссылок
МассивСсылок = КритерииОтбора.СвязанныеДокументы.Найти(СсылкаНаОбъект);

// Перебираем результат
Для Каждого ТекСсылка Из МассивСсылок Цикл
    Сообщить("Найден связанный документ: " + ТекСсылка);
КонецЦикла;

Этот способ работает максимально оперативно, так как платформа обращается к заранее подготовленным индексам. Если ваша задача — просто проверить наличие связей или быстро заполнить список выбора, выбирайте именно этот вариант.

Настройка состава критерия отбора в Конфигураторе

Чтобы вышеуказанные методы работали, необходимо убедиться, что нужные документы и их реквизиты включены в состав критерия отбора. Выясним, как это проверить и настроить по шагам:

  1. Откроем Конфигуратор и найдем ветку Общие -> Критерии отбора.
  2. Выберем нужный критерий (например, СвязанныеДокументы) и откроем его окно редактирования.
  3. На вкладке Основные проверим тип значения. Обычно там указаны ссылки на документы или справочники, которые могут выступать в роли «родительского» объекта.
  4. Перейдем на вкладку Состав. Здесь представлен список всех объектов метаданных. Необходимо отметить галочками те реквизиты документов, в которых может храниться ссылка на основной объект.

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

Производительность и механизмы индексации

Проанализируем, почему использование КритерийОтбора предпочтительнее обычного поиска ссылок. При включении реквизита в состав критерия, платформа 1С создает специальные индексы в базе данных (в таблице критерия отбора). Это позволяет системе мгновенно находить связи даже в базах объемом в несколько терабайт.

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

Отличия от «Структуры подчиненности»

Многие пользователи путают критерии отбора с отчетом «Структура подчиненности». На самом деле, типовой отчет во многих конфигурациях (ERP, УТ, БП) строится именно на данных критерия СвязанныеДокументы. Однако критерий отбора — это низкоуровневый инструмент доступа к данным, в то время как отчет — это визуальное представление. Используя запросы к КритерийОтбора, вы можете реализовать свою собственную логику отображения связей, отличную от стандартной.

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

Резюмируем: для эффективной работы со связанными документами используйте КритерийОтбора. Это обеспечит высокую скорость работы системы и чистоту вашего кода.

← На главную