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

Как я уже говорил, основные проблемы для меня возникают из-за соединения таблиц по полям допускающим дубликаты. Поэтому в таблицах их сразу выделяю красным. При взгляде на таблицу сразу видно, что соединение двух таблиц с красными полями, дает результирующую таблицу с красным полем. Это очень удобно сразу видеть по цветам. Стрелки красного цвета показывают какая таблица ЛЕВАЯ в соединениях. Да, рисование занимает время, но очень разгружает мозг от необходимости держать это все в уме. Потому как других способов нет. Комментарии в запрос не вставишь, так как конструктор запроса их удалит. Названия полей в тексте и на визуализации отличаются. Так как запрос в процессе работы. Сразу отвечу для профи 1С-ников. Почему запрос к документам, а не регистрам? Потому что база маленькая и можно себе это позволить. И создавать сложную логику задачи мне так удобнее. Переписать запрос на регистры можно потом, когда это (никогда) потребуется :-)
