Запрос, соединение записи регистра накопления со следующей записью по времени и по одному документу расчетов
Добрый день!
УТ 10.3. Необходимо создать запрос, который будет получать данные из регистра накопления
"ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов". Необходимы сроки и суммы просроченной задолженности. Надо соединить по полям "ДокументРасчетовСКонтрагентом" и ПериодДень одной таблицы больше ПериодДень другой таблицы. Но к одной записи первой таблицы, при левом соединении, присоединяется множество записей из второй (все, где дата больше). Не могу придумать условие, чтобы соединялись записи только со следующей, а не со всеми следующими.
Первый запрос чтобы разобраться, второй для конкретного применения.
Условие на конкретный документ расчета с контрагентом добавил для наглядности.
На картинках записи регистра
Результаты первого и второго запросов.
Нужно получить периоды когда контрагент был должен:
02.11.21-27.12.21 долг 628272,1
27.12.21-29.12.21 долг 423214,1
29.12.21-10.01.21 долг 123214,1
УТ 10.3. Необходимо создать запрос, который будет получать данные из регистра накопления
"ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов". Необходимы сроки и суммы просроченной задолженности. Надо соединить по полям "ДокументРасчетовСКонтрагентом" и ПериодДень одной таблицы больше ПериодДень другой таблицы. Но к одной записи первой таблицы, при левом соединении, присоединяется множество записей из второй (все, где дата больше). Не могу придумать условие, чтобы соединялись записи только со следующей, а не со всеми следующими.
Первый запрос чтобы разобраться, второй для конкретного применения.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////Запрос 1
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ПериодДень,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата
ПОМЕСТИТЬ ВТ_ДатыВсе
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
Авто,
,
ДоговорКонтрагента = &ДоговорКонтрагента
И ДокументРасчетовСКонтрагентом = &ДокументРасчетовСКонтрагентом) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ПериодДень,
// ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата,
ВТ_ДатыВсе.ПериодДень КАК ПериодДень1
ИЗ
ВТ_ДатыВсе КАК ВТ_ДатыВсе
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
Авто,
,
ДоговорКонтрагента = &ДоговорКонтрагента
И ДокументРасчетовСКонтрагентом = &ДокументРасчетовСКонтрагентом) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты
ПО ВТ_ДатыВсе.ПериодДень > ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ПериодДень
//////////////////////////////////////////////////////////// /////////////////////////////////////Запрос2
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом,
-ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.СуммаВзаиморасчетовОборот + ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовОборот,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.СуммаВзаиморасчетовКонечныйОстаток,
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата, ДЕНЬ), ДЕНЬ, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности + 1) КАК ПериодПросрочкиНачало,
ДОБАВИТЬКДАТЕ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор.Дата, ДЕНЬ, -1) КАК ПериодПросрочкиКонец,
ДОБАВИТЬКДАТЕ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата, ДЕНЬ, 1) КАК ПериодПросрочкиНачалоСледующегоДня,
РАЗНОСТЬДАТ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор.Дата, ДЕНЬ) - ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности - 1 КАК ЧислоДнейПросрочки,
РАЗНОСТЬДАТ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор.Дата, ДЕНЬ) - 1 КАК ЧислоДнейПользованияКредитом,
ВЫРАЗИТЬ((-ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.СуммаВзаиморасчетовОборот + ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.СуммаВзаиморасчетовКонечныйОстаток) * ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДоговорКонтрагента.ПроцентПоДоговору / 100 * (РАЗНОСТЬДАТ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор.Дата, ДЕНЬ) - 1) КАК ЧИСЛО(15, 2)) КАК ПоДоговору,
ВЫРАЗИТЬ((-ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.СуммаВзаиморасчетовОборот + ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.СуммаВзаиморасчетовКонечныйОстаток) * ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДоговорКонтрагента.Пени / 100 * (РАЗНОСТЬДАТ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом.Дата, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор.Дата, ДЕНЬ) - ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности - 1) КАК ЧИСЛО(15, 2)) КАК Пени,
ВТ_ОстатокПоРеализацииНаТекущуюДату.ОстатокПоРеализацииНаТекущуюДату,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДоговорКонтрагента.ПроцентПоДоговору КАК ПроцентПоДоговору,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДоговорКонтрагента.Пени КАК ПроцентПени
ИЗ
ВТ_ОстатокПоРеализацииНаТекущуюДату КАК ВТ_ОстатокПоРеализацииНаТекущуюДату
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
Авто,
,
ДоговорКонтрагента = &ДоговорКонтрагента
И ДокументРасчетовСКонтрагентом = &ДокументРасчетовСКонтрагентом) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты
ПО ВТ_ОстатокПоРеализацииНаТекущуюДату.ДокументРасчетовСКонтрагентом = ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ДокументРасчетовСКонтрагентом
ГДЕ
ТИПЗНАЧЕНИЯ(ВЫРАЗИТЬ(ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.Регистратор КАК Документ.ПлатежноеПоручениеВходящее)) = ТИП(Документ.ПлатежноеПоручениеВходящее)
УПОРЯДОЧИТЬ ПО
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОборо ты.ПериодДень
ПоказатьУсловие на конкретный документ расчета с контрагентом добавил для наглядности.
На картинках записи регистра
Результаты первого и второго запросов.
Нужно получить периоды когда контрагент был должен:
02.11.21-27.12.21 долг 628272,1
27.12.21-29.12.21 долг 423214,1
29.12.21-10.01.21 долг 123214,1
Прикрепленные файлы:
По теме из базы знаний
- 50+ советов для успешной сдачи 1С: Специалист по платформе
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Как читать чужой код? Часть 3. Разбор и доработка запросов
- Быстрый фронт в базе размером 6.8 терабайт – наши стандарты при разработке и рефакторинге запросов
- Пример решения задачи по оперативному учету для экзамена (1С: Специалист по платформе 8.3)
Найденные решения
(4) Вот пример для документа "Авансовый ответ"
ВЫБРАТЬ
АвансовыйОтчет.Ссылка КАК Ссылка,
МИНИМУМ(СледующийАвансовыйОтчет.Дата) КАК Дата
ПОМЕСТИТЬ ДатаСледующегоДокумента
ИЗ
Документ.АвансовыйОтчет КАК АвансовыйОтчет
ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК СледующийАвансовыйОтчет
ПО (АвансовыйОтчет.Дата < СледующийАвансовыйОтчет.Дата)
СГРУППИРОВАТЬ ПО
АвансовыйОтчет.Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДатаСледующегоДокумента.Ссылка КАК Документ,
АвансовыйОтчет.Ссылка КАК СледующийДокумент
ИЗ
ДатаСледующегоДокумента КАК ДатаСледующегоДокумента
ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК АвансовыйОтчет
ПО (ДатаСледующегоДокумента.Дата = АвансовыйОтчет.Дата)
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Добрый день, вот вам идея - в таблице с кучей записей больше текущего периода сделать группировку с выявлением минимального периода - потом опять соединить с таблицей и получить нужную таблицу с ближайшим периодом
(4) Вот пример для документа "Авансовый ответ"
ВЫБРАТЬ
АвансовыйОтчет.Ссылка КАК Ссылка,
МИНИМУМ(СледующийАвансовыйОтчет.Дата) КАК Дата
ПОМЕСТИТЬ ДатаСледующегоДокумента
ИЗ
Документ.АвансовыйОтчет КАК АвансовыйОтчет
ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК СледующийАвансовыйОтчет
ПО (АвансовыйОтчет.Дата < СледующийАвансовыйОтчет.Дата)
СГРУППИРОВАТЬ ПО
АвансовыйОтчет.Ссылка
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДатаСледующегоДокумента.Ссылка КАК Документ,
АвансовыйОтчет.Ссылка КАК СледующийДокумент
ИЗ
ДатаСледующегоДокумента КАК ДатаСледующегоДокумента
ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет КАК АвансовыйОтчет
ПО (ДатаСледующегоДокумента.Дата = АвансовыйОтчет.Дата)
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот