18.11.2015

СКД интерпретирует запросы "по своему" или как исправить ошибку вывода отчета СКД когда в исходном запросе и в отчёте СКД разные данные

В данном уроке рассмотрим интересный момент, связанный с системой компоновки данных. Дело в том, что Вы можете написать и отладить запрос в обычной консоли запросов, затем вставить этот запрос в СКД и получаемые данные могут отличаться. Давайте рассмотрим на реальном примере, в чём здесь может быть проблема. Итак, исходный запрос выглядит следующим образом:

ВЫБРАТЬ
	СостояниеРаботниковОрганизаций.Сотрудник,
	СостояниеРаботниковОрганизаций.Организация,
	СостояниеРаботниковОрганизаций.Период
ПОМЕСТИТЬ Гос
ИЗ
	РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
ГДЕ
	СостояниеРаботниковОрганизаций.Период МЕЖДУ &НачалоПериода И &КонецПериода
	И СостояниеРаботниковОрганизаций.Состояние = &Гос
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Интервалы.Сотрудник,
	Интервалы.Организация,
	МИНИМУМ(Интервалы.Разница) КАК Разница,
	Интервалы.НачалоПериода
ПОМЕСТИТЬ Нужн
ИЗ
	Интервалы КАК Интервалы

СГРУППИРОВАТЬ ПО
	Интервалы.Организация,
	Интервалы.Сотрудник,
	Интервалы.НачалоПериода
;

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

ИНДЕКСИРОВАТЬ ПО
	Сотрудник,
	Организация
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Финал.Сотрудник КАК Сотрудник,
	Финал.Организация КАК Организация,


	СУММА(Финал.Количество) КАК Количество

ИЗ
	Финал КАК Финал

СГРУППИРОВАТЬ ПО
	Финал.Организация,
	Финал.Сотрудник




Следующий результат мы получаем при формировании запроса в "Консоли запросов"

pic1.png

Далее, копируем запрос и создаём новый отчет со следующими настройками и параметрами:

pic2.png

pic3.png

pic4.png

Сохраняем отчёт, открываем его в пользовательской части и видим другой результат, отличный от "Консоли запросов". Хотя по теории у нас результат отчета в СКД должен строго соответствовать результату запроса.

pic5.png 

Сейчас посмотрим, какой на самом деле запрос выполняется при формировании данного отчета.

Для этого нам понадобится "Консоль системы компоновки данных".

Сохраняем настройки текущей схемы.

pic6.png

Далее, открываем "Консоль системы компоновки данных" добавляем в неё новый отчёт и загружаем файл схемы в формате XML

pic7.png

pic8.png

Далее формируем отчёт

pic9.png

Видим, что действительно и через консоль нам отчёт показывает не верный результат

Переходим на закладку "Макет для коллекции XML" находим теги <query> и копируем, заключённый в них текст запроса

pic91.png

Далее создаём новый текстовый документ и копируем в него текст запроса. Нам предстоит создать 2 файла: первый с текстом запроса, интерпретированным СКД, второй текст будет содержать наш исходный запрос, который мы использовали в самом начале в "Консоле запросов"

pic11.png

pic12.png

pic13.png

Следующим этапом - выполним сравнение двух текстовых файлов, которые содержат запросы

pic14.png

В результате сравнения мы увидим, что в действительности запросы отличаются.

В нашем примере из финального запроса исчезло важное поле "Начало периода" по которому выполнялась группировка.

pic15.png

Теперь, как сказал мой коллега необходимо всеми правдами и неправдами "дотянуть" данное поле до финальной таблицы вывода запроса.

Для того, чтобы информация выводилась корректно применяем функцию "Максимум"

pic16.png

В результате проделанных действий мы увидим корректный результат в нашем отчёте:

pic17.png

Вот таким образом мы с Вами разобрались сегодня как решить проблему, когда СКД интерпретирует запрос "по своему" и в результате мы получаем различные данные при выполнении запроса и в результирующем отчёте, когда используем этот же запрос.

Успехов Вам в решении подобных проблем. 






Возврат к списку

  • Facebook
  • Вконтакте