RDT1C icon indicating copy to clipboard operation
RDT1C copied to clipboard

Конструктор запросов ИР. ОБЪЕДИНИТЬ ВСЕ ошибики типовых

Open PerlAmutor opened this issue 2 years ago • 7 comments

За последний месяц столкнулся с двумя ошибками в запросах типовой конфигурации ERP. Суть проблемы, вот тексты запросов формирующих движения в документе СчетФактураВыданный по регистру НДСЗаписиКнигиПокупок:

ERP 2.4.14.181-2.5.9

#Область ТекстСторноИсправление
	ТекстЗапросаСторноИсправление = "
	|
	|ВЫБРАТЬ
	|	&Период                                          КАК Период,
	|	НДСЗаписиКнигиПокупок.Организация                КАК Организация,
	|	НДСЗаписиКнигиПокупок.Поставщик                  КАК Поставщик,
	|	НДСЗаписиКнигиПокупок.СчетФактура                КАК СчетФактура,
	|	НДСЗаписиКнигиПокупок.ВидЦенности                КАК ВидЦенности,
	|	НДСЗаписиКнигиПокупок.СтавкаНДС                  КАК СтавкаНДС,
	|	НДСЗаписиКнигиПокупок.СчетУчетаНДС               КАК СчетУчетаНДС,
	|	НДСЗаписиКнигиПокупок.Событие                    КАК Событие,
	|	&Период                                          КАК ДатаСобытия,
	|	&Исправление                                     КАК Исправление,
	|	ВЫБОР
	|		КОГДА НДСЗаписиКнигиПокупок.ЗаписьДополнительногоЛиста
	|			ТОГДА ИСТИНА
	|		КОГДА НАЧАЛОПЕРИОДА(НДСЗаписиКнигиПокупок.Период,КВАРТАЛ) < НАЧАЛОПЕРИОДА(&Период, КВАРТАЛ)
	|			ТОГДА ИСТИНА
	|	КОНЕЦ                                            КАК ЗаписьДополнительногоЛиста,
	|	ВЫБОР
	|		КОГДА НДСЗаписиКнигиПокупок.КорректируемыйПериод <> ДАТАВРЕМЯ(1,1,1)
	|			ТОГДА НДСЗаписиКнигиПокупок.КорректируемыйПериод
	|		КОГДА НАЧАЛОПЕРИОДА(НДСЗаписиКнигиПокупок.Период,КВАРТАЛ) < НАЧАЛОПЕРИОДА(&Период,КВАРТАЛ)
	|			ТОГДА НДСЗаписиКнигиПокупок.Период
	|	КОНЕЦ                                            КАК КорректируемыйПериод,
	|	НДСЗаписиКнигиПокупок.ИсправленныйСчетФактура    КАК ИсправленныйСчетФактура,
	|	-НДСЗаписиКнигиПокупок.СуммаБезНДСОборот         КАК СуммаБезНДС,
	|	-НДСЗаписиКнигиПокупок.НДСОборот                 КАК НДС,
	|	&КодВидаОперацииНаУменьшение                     КАК КодВидаОперации
	|ИЗ
	|	РегистрНакопления.НДСЗаписиКнигиПокупок.Обороты(
	|		,
	|		,
	|		Регистратор,
	|		Организация В (&Организация, &Контрагент)
	|			И СчетФактура В (ВЫБРАТЬ Т.СчетФактура ИЗ ВтСчетаФактурыИсправления КАК Т) 
	|			И ИсправленныйСчетФактура = &СчетФактураПредыдущееИсправление) КАК НДСЗаписиКнигиПокупок
	|
	|ГДЕ
	|	&Исправление
	|	И НДСЗаписиКнигиПокупок.Регистратор <> &Ссылка
	|	И НДСЗаписиКнигиПокупок.Регистратор ССЫЛКА Документ.СчетФактураВыданный
	|	И (НДСЗаписиКнигиПокупок.СуммаБезНДСОборот > 0
	|		ИЛИ НДСЗаписиКнигиПокупок.НДСОборот > 0)
	|";
	
#КонецОбласти

#Область ТекстКорректировка
	ТекстЗапросаКорректировка = "
	|
	|ВЫБРАТЬ
	|	&Период                           КАК Период,
	|	&Организация                      КАК Организация,
	|	&Контрагент                       КАК Поставщик,
	|	ВЫБОР
	|		КОГДА &Исправление
	|			ТОГДА &СчетФактураОснование
	|		ИНАЧЕ
	|			&Ссылка
	|	КОНЕЦ                             КАК СчетФактура,
	|	ТаблицаДанных.ВидЦенности         КАК ВидЦенности,
	|	ТаблицаДанных.СтавкаНДС           КАК СтавкаНДС,
	|	NULL                              КАК СчетУчетаНДС,
	|	ВЫБОР КОГДА &НалогообложениеНДС = ЗНАЧЕНИЕ(Перечисление.ТипыНалогообложенияНДС.ОблагаетсяНДСУПокупателя)
	|		ТОГДА ЗНАЧЕНИЕ(Перечисление.СобытияПоНДСПокупки.НалогИсчисляетПокупатель)
	|		ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СобытияПоНДСПокупки.ПредъявленНДСКВычету)
	|	КОНЕЦ КАК Событие,
	|	&Период                           КАК ДатаСобытия,
	|	ЛОЖЬ                              КАК ЗаписьДополнительногоЛиста,
	|	NULL                              КАК КорректируемыйПериод,
	|	&Исправление                      КАК Исправление,
	|	ВЫБОР
	|		КОГДА &Исправление
	|			ТОГДА &Ссылка
	|	КОНЕЦ                             КАК ИсправленныйСчетФактура,
	|	СУММА(ТаблицаДанных.СуммаУменьшение - ТаблицаДанных.СуммаНДСУменьшение) КАК СуммаБезНДС,
	|	СУММА(ТаблицаДанных.СуммаНДСУменьшение) КАК НДС,
	|	&КодВидаОперацииНаУменьшение КАК КодВидаОперации
	|ИЗ
	|	ВтТаблицаКорректировки КАК ТаблицаДанных
	|
	|ГДЕ
	|	&Корректировочный
	|	И (ТаблицаДанных.СуммаНДСУменьшение > 0
	|		ИЛИ &НалогообложениеНДС = ЗНАЧЕНИЕ(Перечисление.ТипыНалогообложенияНДС.ОблагаетсяНДСУПокупателя))
	|	И НЕ ТаблицаДанных.Комиссия
	|	И &Организация <> ЗНАЧЕНИЕ(Справочник.Организации.УправленческаяОрганизация)
	|
	|СГРУППИРОВАТЬ ПО
	|	ТаблицаДанных.ВидЦенности,
	|	ТаблицаДанных.СтавкаНДС
	|";
#КонецОбласти
	
	ТекстЗапроса = 
		ТекстЗапросаСторноИсправление
		+ " ОБЪЕДИНИТЬ ВСЕ " + ТекстЗапросаКорректировка;
	
	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	Возврат ТекстЗапроса

Это из ERP 2.4.14.181 документ АвансовыйОтчет формирует движения в регистр СуммыДокументовВВалютеРегл:

	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	ТаблицаДокумента.НомерСтроки,
	|	&Период КАК Период,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ТаблицаДокумента.Валюта
	|	ИНАЧЕ
	|		&Валюта
	|	КОНЕЦ КАК Валюта,
	|	ТаблицаДокумента.ИдентификаторСтроки КАК ИдентификаторСтроки,
	|	ТаблицаДокумента.Сумма - ТаблицаДокумента.СуммаНДС КАК СуммаБезНДС,
	|	ТаблицаДокумента.СтавкаНДС КАК СтавкаНДС,
	|	ТаблицаДокумента.СуммаНДС КАК СуммаНДС,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ВЫРАЗИТЬ((ТаблицаДокумента.Сумма - ТаблицаДокумента.СуммаНДС) * ЕСТЬNULL(ТаблицаКурсыВалютРегл.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ((ТаблицаДокумента.Сумма - ТаблицаДокумента.СуммаНДС) * &КоэффициентПересчетаВВалютуРегл КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаБезНДСРегл,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ВЫРАЗИТЬ(ТаблицаДокумента.СуммаНДС * ЕСТЬNULL(ТаблицаКурсыВалютРегл.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ(ТаблицаДокумента.СуммаНДС * &КоэффициентПересчетаВВалютуРегл КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаНДСРегл,
	|	НЕОПРЕДЕЛЕНО КАК ТипРасчетов,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ВЫРАЗИТЬ((ТаблицаДокумента.Сумма - ТаблицаДокумента.СуммаНДС) * ЕСТЬNULL(ТаблицаКурсыВалютУпр.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ((ТаблицаДокумента.Сумма - ТаблицаДокумента.СуммаНДС) * &КоэффициентПересчетаВВалютуУпр КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаБезНДСУпр,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ВЫРАЗИТЬ(ТаблицаДокумента.СуммаНДС * ЕСТЬNULL(ТаблицаКурсыВалютУпр.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ(ТаблицаДокумента.СуммаНДС * &КоэффициентПересчетаВВалютуУпр КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаНДСУпр
	|
	|ИЗ
	|	Документ.АвансовыйОтчет.ПрочиеРасходы КАК ТаблицаДокумента
	|		
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютРегл КАК ТаблицаКурсыВалютРегл
	|		ПО ТаблицаКурсыВалютРегл.Валюта = ТаблицаДокумента.Валюта
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютУпр КАК ТаблицаКурсыВалютУпр
	|		ПО ТаблицаКурсыВалютУпр.Валюта = ТаблицаДокумента.Валюта
	|ГДЕ
	|	ТаблицаДокумента.Ссылка = &Ссылка
	|	И ТаблицаДокумента.Ссылка.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыАвансовогоОтчета.Утвержден)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ТаблицаДокумента.НомерСтроки,
	|	&Период КАК Период,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ТаблицаДокумента.Валюта
	|	ИНАЧЕ
	|		&Валюта
	|	КОНЕЦ КАК Валюта,
	|	ТаблицаДокумента.ИдентификаторСтроки КАК ИдентификаторСтроки,
	|	НЕОПРЕДЕЛЕНО КАК СтавкаНДС,
	|	ТаблицаДокумента.Сумма КАК СуммаБезНДС,
	|	0 КАК СуммаНДС,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ВЫРАЗИТЬ(ТаблицаДокумента.Сумма * ЕСТЬNULL(ТаблицаКурсыВалютРегл.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ(ТаблицаДокумента.Сумма * &КоэффициентПересчетаВВалютуРегл КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаБезНДСРегл,
	|	0 КАК СуммаНДСРегл,
	|	НЕОПРЕДЕЛЕНО КАК ТипРасчетов,
	|	ВЫБОР КОГДА &Мультивалютный ТОГДА
	|		ВЫРАЗИТЬ(ТаблицаДокумента.Сумма * ЕСТЬNULL(ТаблицаКурсыВалютУпр.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ(ТаблицаДокумента.Сумма * &КоэффициентПересчетаВВалютуУпр КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаБезНДСУпр,
	|	0 КАК СуммаНДСУпр
	|
	|ИЗ
	|	Документ.АвансовыйОтчет.ОплатаПоставщикам КАК ТаблицаДокумента
	|		
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютРегл КАК ТаблицаКурсыВалютРегл
	|		ПО ТаблицаКурсыВалютРегл.Валюта = ТаблицаДокумента.Валюта
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютУпр КАК ТаблицаКурсыВалютУпр
	|		ПО ТаблицаКурсыВалютУпр.Валюта = ТаблицаДокумента.Валюта
	|ГДЕ
	|	ТаблицаДокумента.Ссылка = &Ссылка
	|	И ТаблицаДокумента.Ссылка.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыАвансовогоОтчета.Утвержден)
	|	
	|ОБЪЕДИНИТЬ ВСЕ
	|	
	|ВЫБРАТЬ
	|	ТаблицаДокумента.НомерСтроки,
	|	&Период КАК Период,
	|	ВЫБОР КОГДА ТаблицаДокумента.ВалютаКонвертации <> &ВалютаРегламентированногоУчета ТОГДА
	|		ТаблицаДокумента.ВалютаКонвертации
	|	ИНАЧЕ
	|		ТаблицаДокумента.Валюта
	|	КОНЕЦ КАК Валюта,
	|	ТаблицаДокумента.ИдентификаторСтроки КАК ИдентификаторСтроки,
	|	ВЫБОР КОГДА ТаблицаДокумента.ВалютаКонвертации <> &ВалютаРегламентированногоУчета ТОГДА
	|		ТаблицаДокумента.СуммаКонвертации
	|	ИНАЧЕ
	|		ТаблицаДокумента.Сумма
	|	КОНЕЦ КАК СуммаБезНДС,
	|	НЕОПРЕДЕЛЕНО КАК СтавкаНДС,
	|	0 КАК СуммаНДС,
	|	ВЫБОР КОГДА ТаблицаДокумента.ВалютаКонвертации <> &ВалютаРегламентированногоУчета ТОГДА
	|		ВЫРАЗИТЬ(ТаблицаДокумента.СуммаКонвертации * ЕСТЬNULL(ТаблицаКурсыВалютРеглСуммаКонвертации.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ(ТаблицаДокумента.Сумма * ЕСТЬNULL(ТаблицаКурсыВалютРеглСумма.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаБезНДСРегл,
	|	0 КАК СуммаНДСРегл,
	|	НЕОПРЕДЕЛЕНО КАК ТипРасчетов,
	|	ВЫБОР КОГДА ТаблицаДокумента.ВалютаКонвертации <> &ВалютаУправленческогоУчета ТОГДА
	|		ВЫРАЗИТЬ(ТаблицаДокумента.СуммаКонвертации * ЕСТЬNULL(ТаблицаКурсыВалютУпрСуммаКонвертации.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	ИНАЧЕ
	|		ВЫРАЗИТЬ(ТаблицаДокумента.Сумма * ЕСТЬNULL(ТаблицаКурсыВалютУпрСумма.КоэффициентПересчета, 0) КАК ЧИСЛО(31,2))
	|	КОНЕЦ КАК СуммаБезНДСУпр,
	|	0 КАК СуммаНДСУпр
	|
	|ИЗ
	|	Документ.АвансовыйОтчет.КонвертацияВалюты КАК ТаблицаДокумента
	|		
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютРегл КАК ТаблицаКурсыВалютРеглСумма
	|		ПО ТаблицаКурсыВалютРеглСумма.Валюта = ТаблицаДокумента.Валюта
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютРегл КАК ТаблицаКурсыВалютРеглСуммаКонвертации
	|		ПО ТаблицаКурсыВалютРеглСуммаКонвертации.Валюта = ТаблицаДокумента.ВалютаКонвертации
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютУпр КАК ТаблицаКурсыВалютУпрСумма
	|		ПО ТаблицаКурсыВалютУпрСумма.Валюта = ТаблицаДокумента.Валюта
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТКурсыВалютУпр КАК ТаблицаКурсыВалютУпрСуммаКонвертации
	|		ПО ТаблицаКурсыВалютУпрСуммаКонвертации.Валюта = ТаблицаДокумента.ВалютаКонвертации
	|ГДЕ
	|	ТаблицаДокумента.Ссылка = &Ссылка
	|	И &Мультивалютный
	|	И ТаблицаДокумента.Ссылка.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыАвансовогоОтчета.Утвержден)
	|";

Если внимательно изучить два вышестоящих блока кода, то видно, что в первом нарушена последовательность полей, вот участки в объединении:

	|	&Период                                          КАК ДатаСобытия,
	|	&Исправление                                     КАК Исправление,
	|	&Период                           КАК ДатаСобытия,
	|	ЛОЖЬ                              КАК ЗаписьДополнительногоЛиста,
	|	NULL                              КАК КорректируемыйПериод,
	|	&Исправление                      КАК Исправление,

И второй документ:

	|	ТаблицаДокумента.ИдентификаторСтроки КАК ИдентификаторСтроки,
	|	ТаблицаДокумента.Сумма - ТаблицаДокумента.СуммаНДС КАК СуммаБезНДС,
	|	ТаблицаДокумента.СтавкаНДС КАК СтавкаНДС,
	|	ТаблицаДокумента.СуммаНДС КАК СуммаНДС,
	|	ТаблицаДокумента.ИдентификаторСтроки КАК ИдентификаторСтроки,
	|	НЕОПРЕДЕЛЕНО КАК СтавкаНДС,
	|	ТаблицаДокумента.Сумма КАК СуммаБезНДС,
	|	0 КАК СуммаНДС,

Предложение заключается в том, чтобы добавить в Конструктор запросов ИР расширенную проверку, которая бы брала имена полей объединений запросов и сравнивала их позиции, в случае если имя поля не совпадает, например СтавкаНДС <> СуммаБезНДС, то выдавать предупреждение пользователю. Такие ошибки достаточно тяжело ловить самому, т.к. они себя проявляют уже только в момент анализа выходного результата.

PerlAmutor avatar Aug 30 '22 19:08 PerlAmutor

Было бы неплохо тексты запросов в виде одного файла консоли запросов сделать. Файлы "неудобных" с точки зрения сайта расширений оборачивай в zip.

tormozit avatar Aug 30 '22 19:08 tormozit

Сделал ОбъединитьВсе.zip

PerlAmutor avatar Aug 30 '22 19:08 PerlAmutor

Проблему понял. Создал задачу https://www.hostedredmine.com/issues/949195

tormozit avatar Aug 30 '22 19:08 tormozit

Насколько понятным тебе кажется сообщение Запрос[0]. Различные имена полей объединения Часть[1].Чук - Часть[2].Ф1 Запрос[0]. Различные имена полей объединения Часть[1].Ф1 - Часть[2].Чук ?

tormozit avatar Aug 30 '22 20:08 tormozit

Для твоих примеров будет так

1.СчетФактураВыданный Запрос[0]. Различные имена полей объединения Часть[1].ЗаписьДополнительногоЛиста - Часть[2].Исправление Запрос[0]. Различные имена полей объединения Часть[1].КорректируемыйПериод - Часть[2].ЗаписьДополнительногоЛиста Запрос[0]. Различные имена полей объединения Часть[1].Исправление - Часть[2].КорректируемыйПериод

  1. Ты его уже исправил конструктором ИР (видимо форматированием). Потому там ошибок нет.

tormozit avatar Aug 30 '22 20:08 tormozit

  1. Понятно будет.
  2. Форматировал, но сам не исправлял, вроде показывает несоответствие:

image

Конструктор запроса ИР сам переименовал поля после форматирования во втором объединении:

image

PerlAmutor avatar Aug 30 '22 23:08 PerlAmutor

Так и задумано. Конструктор должен выдавать согласованный текст запроса, где в частности имена полей во всех частях объединения будут одинаковыми на одинаковых позициях. Поменял сообщение на лучше отражающее происходящее: В запросе[1] переименовано поле части[2] объединения Ф1->Чук. Старое имя в комментарии. В запросе[1] переименовано поле части[2] объединения Чук->Ф1. Старое имя в комментарии.

tormozit avatar Aug 31 '22 03:08 tormozit

Реализовано в 6.43

tormozit avatar Sep 04 '22 18:09 tormozit

Спасибо. Работает.

PerlAmutor avatar Sep 06 '22 03:09 PerlAmutor