При разработке отчетов, обработок и механизмов интеграции в 1С:Предприятие 8 нередко возникает задача собрать список уникальных договоров, по которым с контрагентом велась работа за определенный период. Данные могут содержаться сразу в нескольких видах документов. Рассмотрим подробнее, как решить эту задачу в рамках одного запроса с помощью языка запросов 1С.
Для объединения результатов выборки из двух и более различных таблиц документов используется конструкция ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ. Разберем ключевую разницу:
DISTINCT по всем полям.ВЫБРАТЬ РАЗЛИЧНЫЕ, если нужны только неповторяющиеся договоры.Посмотрим на пример запроса, выбирающего уникальные договоры по документам реализации и возврата (или любым другим документам конфигурации, содержащим соответствующие реквизиты):
ВЫБРАТЬ РАЗЛИЧНЫЕ
ДокументТаблица.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
(ВЫБРАТЬ
Реализация.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Контрагент = &Контрагент
И Реализация.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И Реализация.Проведен
И Реализация.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Поступление.ДоговорКонтрагента КАК ДоговорКонтрагента
ИЗ
Документ.ПоступлениеИзПереработки КАК Поступление
ГДЕ
Поступление.Контрагент = &Контрагент
И Поступление.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
И Поступление.Проведен
И Поступление.ДоговорКонтрагента <> ЗНАЧЕНИЕ(Справочник.ДоговорыКонтрагентов.ПустаяСсылка)) КАК ДокументТаблица
Разберем по шагам важные нюансы, которые необходимо учесть при составлении запроса:
Бухгалтерия предприятия 3.0. Например, документ ПеремещениеТоваров отражает складские операции внутри организации и стандартно не содержит реквизитов Контрагент и ДоговорКонтрагента. Если вам требуется учитывать давальческие схемы, проверяйте такие документы, как ПоступлениеИзПереработки, ПередачаТоваров или ПоступлениеВПереработку. Если же реквизиты добавлены разработчиком через расширение, обращайтесь к ним с учетом точного имени.МЕЖДУ важно включать конец дня. Если передать дату вида 31.01.2025 00:00:00, документы, проведенные днем или вечером 31 января, не попадут в выборку. В коде 1С перед установкой параметра используйте функцию КонецДня():
Запрос = Новый Запрос;
Запрос.Текст = "...";
Запрос.УстановитьПараметр("Контрагент", КонтрагентСсылка);
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ПериодС));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ПериодПо));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Обработка полученных договоров
Договор = Выборка.ДоговорКонтрагента;
КонецЦикла;
Проанализируем альтернативный подход. Если перечень используемых видов документов широк или в будущем могут появиться новые документы, вместо ручного объединения таблиц каждого документа эффективнее обратиться к виртуальной таблице оборотов бухгалтерского регистра Хозрасчетный.
Посмотрим на пример запроса к регистру бухгалтерии:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ХозрасчетныйОбороты.Субконто2 КАК ДоговорКонтрагента
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(
&ДатаНачала,
&ДатаОкончания,
,
Счет В ИЕРАРХИИ (&СчетаУчета),
,
Организация = &Организация,
,
Субконто1 = &Контрагент) КАК ХозрасчетныйОбороты
ГДЕ
ХозрасчетныйОбороты.Субконто2 ССЫЛКА Справочник.ДоговорыКонтрагентов
Такой подход позволяет автоматически учесть движения любых документов (как типовых, так и добавленных в конфигурацию), которые сформировали проводки по взаиморасчетам с указанным контрагентом за выбранный период.