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

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

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

Решение через оператор ОБЪЕДИНИТЬ

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

  1. ОБЪЕДИНИТЬ — автоматически удаляет одинаковые строки (дубликаты) из итоговой выборки, выполняя неявную операцию DISTINCT по всем полям.
  2. ОБЪЕДИНИТЬ ВСЕ — просто склеивает строки выборок без проверки на уникальность, что работает быстрее, но требует ручной группировки или конструкции ВЫБРАТЬ РАЗЛИЧНЫЕ, если нужны только неповторяющиеся договоры.

Посмотрим на пример запроса, выбирающего уникальные договоры по документам реализации и возврата (или любым другим документам конфигурации, содержащим соответствующие реквизиты):


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДокументТаблица.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
    (ВЫБРАТЬ
        Реализация.ДоговорКонтрагента КАК ДоговорКонтрагента
    ИЗ
        Документ.РеализацияТоваровУслуг КАК Реализация
    ГДЕ
        Реализация.Контрагент = &Контрагент
        И Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        И Реализация.Проведен
        И Реализация.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)

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

    ВЫБРАТЬ
        Поступление.ДоговорКонтрагента КАК ДоговорКонтрагента
    ИЗ
        Документ.ПоступлениеИзПереработки КАК Поступление
    ГДЕ
        Поступление.Контрагент = &Контрагент
        И Поступление.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        И Поступление.Проведен
        И Поступление.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)) КАК ДокументТаблица

Тонкости работы с метаданными и параметрами

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

  1. Состав реквизитов документов: обратите внимание на структуру типовых метаданных конфигурации Бухгалтерия предприятия 3.0. Например, документ ПеремещениеТоваров отражает складские операции внутри организации и стандартно не содержит реквизитов Контрагент и ДоговорКонтрагента. Если вам требуется учитывать давальческие схемы, проверяйте такие документы, как ПоступлениеИзПереработки, ПередачаТоваров или ПоступлениеВПереработку. Если же реквизиты добавлены разработчиком через расширение, обращайтесь к ним с учетом точного имени.
  2. Границы периода: при передаче параметра окончания периода через конструкцию МЕЖДУ важно включать конец дня. Если передать дату вида 31.01.2025 00:00:00, документы, проведенные днем или вечером 31 января, не попадут в выборку. В коде 1С перед установкой параметра используйте функцию КонецДня():

Запрос = Новый Запрос;
Запрос.Текст = "...";
Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ПериодС));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ПериодПо));

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
    // Обработка полученных договоров
    Договор = Выборка.ДоговорКонтрагента;
КонецЦикла;

Альтернативный вариант: обращение к регистру бухгалтерии

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

Посмотрим на пример запроса к регистру бухгалтерии:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ХозрасчетныйОбороты.Субконто2 КАК ДоговорКонтрагента
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Обороты(
            &ДатаНачала,
            &ДатаОкончания,
            ,
            Счет В ИЕРАРХИИ (&СчетаУчета),
            ,
            Организация = &Организация,
            ,
            Субконто1 = &Контрагент) КАК ХозрасчетныйОбороты
ГДЕ
    ХозрасчетныйОбороты.Субконто2 ССЫЛКА Справочник.ДоговорыКонтрагентов

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

← На главную