Недавно отлаживал запрос, состоящий из 8 временных таблиц. Некоторые таблицы имели дублирование по полям. Например, может быть много поступлений безналичных по одному заказу. Или много реализаций по одному заказу. Или много заказов оплачивается в одном поступлении безналичных. В общем, когда эти таблицы соединяешь в разных местах и вариантах, то естественно возникают дублирования строк. И очень сложно держать весь контекст пакета запросов у себя в голове и отлаживать его. Понял, что так больше не хочу и надо что-то придумать. Поиск в интернете, по визуализации запросов, простых решений не дал. Ближайшее, что было похоже на то, что мне нужно - это рисовать ER-диаграммы. Но мне хотелось видеть больше информации на диаграмме, поэтому решил рисовать свой велосипед сам с помощью сайта диаграмм draw.io

Вот текст одного из запросов по моей задаче, и его визуализация:

ВЫБРАТЬ
	ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка КАК БДС,
	ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка.Дата КАК ДатаБДС,
	СУММА(ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Сумма) КАК СуммаБДС,
	ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа КАК ЗаказКлиента
ПОМЕСТИТЬ ВТ_БДСПоЗаказам
ИЗ
	Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа
ГДЕ
	ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка.ХозяйственнаяОперация = &ХозяйственнаяОперация
	И ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.СтатьяДвиженияДенежныхСредств = &СтатьяДвиженияДенежныхСредств
	И ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
	И ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка.Проведен
	И НЕ ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка.ПометкаУдаления
	И ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа.Менеджер = &Менеджер

СГРУППИРОВАТЬ ПО
	ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка,
	ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка.Дата,
	ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_БДСПоЗаказам.ЗаказКлиента КАК ЗаказКлиента
ПОМЕСТИТЬ ВТ_ЗаказыКлиентов
ИЗ
	ВТ_БДСПоЗаказам КАК ВТ_БДСПоЗаказам

СГРУППИРОВАТЬ ПО
	ВТ_БДСПоЗаказам.ЗаказКлиента
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_БДСПоЗаказам.БДС КАК БДС,
	ВТ_БДСПоЗаказам.ДатаБДС КАК ДатаБДС,
	ВТ_БДСПоЗаказам.СуммаБДС КАК СуммаБДС,
	ВТ_БДСПоЗаказам.ЗаказКлиента КАК ЗаказКлиента,
	СУММА(РеализацияТоваровУслуг.СуммаДокумента) КАК СуммаРеализацииВПрошлом,
	КОНЕЦПЕРИОДА(МАКСИМУМ(РеализацияТоваровУслуг.Дата), ДЕНЬ) КАК ДатаПоследнейРеализации
ПОМЕСТИТЬ ВТ_СуммаИПоследняяДатаРеализации
ИЗ
	ВТ_БДСПоЗаказам КАК ВТ_БДСПоЗаказам
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
		ПО ВТ_БДСПоЗаказам.ЗаказКлиента = РеализацияТоваровУслуг.ЗаказКлиента
			И (РеализацияТоваровУслуг.Дата <= ВТ_БДСПоЗаказам.ДатаБДС)
ГДЕ
	РеализацияТоваровУслуг.Проведен
	И НЕ РеализацияТоваровУслуг.ПометкаУдаления

СГРУППИРОВАТЬ ПО
	ВТ_БДСПоЗаказам.БДС,
	ВТ_БДСПоЗаказам.ДатаБДС,
	ВТ_БДСПоЗаказам.СуммаБДС,
	ВТ_БДСПоЗаказам.ЗаказКлиента
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_БДСПоЗаказам.БДС КАК БДС,
	ВТ_БДСПоЗаказам.СуммаБДС КАК СуммаБДС,
	ВТ_БДСПоЗаказам.ЗаказКлиента КАК ЗаказКлиента,
	СУММА(ВТ_БДСПоЗаказамКопия.СуммаБДС) КАК СуммаБДСВПрошлом,
	МАКСИМУМ(ВТ_БДСПоЗаказамКопия.ДатаБДС) КАК ПоследняяДатаБДС,
	ВТ_БДСПоЗаказам.ДатаБДС КАК ДатаБДС
ПОМЕСТИТЬ ВТ_СуммаИПоследняяДатаБДС
ИЗ
	ВТ_БДСПоЗаказам КАК ВТ_БДСПоЗаказам
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_БДСПоЗаказам КАК ВТ_БДСПоЗаказамКопия
		ПО ВТ_БДСПоЗаказам.ЗаказКлиента = ВТ_БДСПоЗаказамКопия.ЗаказКлиента
			И ВТ_БДСПоЗаказам.ДатаБДС > ВТ_БДСПоЗаказамКопия.ДатаБДС

СГРУППИРОВАТЬ ПО
	ВТ_БДСПоЗаказам.БДС,
	ВТ_БДСПоЗаказам.СуммаБДС,
	ВТ_БДСПоЗаказам.ЗаказКлиента,
	ВТ_БДСПоЗаказам.ДатаБДС
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_БДСПоЗаказам.БДС КАК БДС,
	ВТ_БДСПоЗаказам.ДатаБДС КАК ДатаБДС,
	ВТ_БДСПоЗаказам.СуммаБДС КАК СуммаБДС,
	ВТ_СуммаИПоследняяДатаБДС.ПоследняяДатаБДС КАК ПоследняяДатаБДС,
	ВТ_СуммаИПоследняяДатаБДС.СуммаБДСВПрошлом КАК СуммаБДСВПрошлом,
	ВТ_СуммаИПоследняяДатаРеализации.ДатаПоследнейРеализации КАК ДатаПоследнейРеализации,
	ВТ_СуммаИПоследняяДатаРеализации.СуммаРеализацииВПрошлом КАК СуммаРеализацииВПрошлом,
	ВТ_БДСПоЗаказам.ЗаказКлиента КАК ЗаказКлиента,
	РАЗНОСТЬДАТ(ВТ_СуммаИПоследняяДатаРеализации.ДатаПоследнейРеализации, ВТ_БДСПоЗаказам.ДатаБДС, ДЕНЬ) КАК ДнейПослеРеализации,
	ВТ_СуммаИПоследняяДатаРеализации.СуммаРеализацииВПрошлом - ВТ_СуммаИПоследняяДатаБДС.СуммаБДСВПрошлом КАК СуммаНеОплаченнойРеализации
ИЗ
	ВТ_БДСПоЗаказам КАК ВТ_БДСПоЗаказам
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СуммаИПоследняяДатаБДС КАК ВТ_СуммаИПоследняяДатаБДС
		ПО (ВТ_БДСПоЗаказам.БДС = ВТ_СуммаИПоследняяДатаБДС.БДС)
			И (ВТ_БДСПоЗаказам.ЗаказКлиента = ВТ_СуммаИПоследняяДатаБДС.ЗаказКлиента)
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_СуммаИПоследняяДатаРеализации КАК ВТ_СуммаИПоследняяДатаРеализации
		ПО (ВТ_БДСПоЗаказам.БДС = ВТ_СуммаИПоследняяДатаРеализации.БДС)
			И (ВТ_БДСПоЗаказам.ЗаказКлиента = ВТ_СуммаИПоследняяДатаРеализации.ЗаказКлиента)

УПОРЯДОЧИТЬ ПО
	ДнейПослеРеализации УБЫВ
https://drive.google.com/file/d/1uP9CbeMGnEnmvnQ70mgpFe7lPMcEmwZS/view?usp=sha

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

Комментарии (6)


  1. amatoravg
    23.10.2025 13:33

    Визуализация прикольная, но я ожидал, что вы предложите какой то инструмент для автоматизации этого процесса, обработку например, куда вставляешь текст запроса, а она тебе на выходе выдаёт такую (географическую?) схему. А так каждый раз вручную рисовать самому - это не наш метод!


    1. Pavel_nobranch Автор
      23.10.2025 13:33

      На обработке не заработаешь. А вот кто сделает такой интернет сервис наверное озолотится.


      1. amatoravg
        23.10.2025 13:33

        Отчего же не заработаешь... Приделать защиту или хотя бы закрыть код, и выложить на инфостарте...


    1. gennayo
      23.10.2025 13:33

      PlantUml прикрутить не сложно...


  1. economist75
    23.10.2025 13:33

    ORM из экосистемы Python имеют расширения по vis запросов.


  1. ulovka22
    23.10.2025 13:33

    В 1С же есть свой конструктор блок-схем, и объектная модель запросов, логично было бы сделать обработку для визуализации