Набор данных "Запрос" СКД содержит следующий текст:
ВЫБРАТЬ
РН.Организация КАК Организация,
РН.Склад КАК Склад,
РН.Номенклатура КАК Номенклатура,
РН.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
РН.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
РН.КоличествоПриход КАК КоличествоПриход,
РН.КоличествоРасход КАК КоличествоРасход,
РН.Регистратор КАК Регистратор,
РН.ПериодСекунда КАК ПериодСекунда
ИЗ
РегистрНакопления.РегистрНакопления1.ОстаткиИОбороты(, , Авто, Движения, ) КАК РН
Настройки полей следующие:
Полям "КоличествоНачальныйОстаток" и "КоличествоКонечныйОстаток" назначена роль "Остатки". Полям "Регистратор" и "ПериодСекунда" назначена роль "Период". Для поля "Регистратор" установлено выражение упорядочивания.
Настройки:
Результат:
Расшифровка:
Пока все очевидно и предсказуемо.
А теперь чуть-чуть изменим текст запроса.
ВЫБРАТЬ
РН1.Организация КАК Организация,
РН1.Склад КАК Склад,
РН1.Номенклатура КАК Номенклатура,
РН1.ПериодСекунда КАК ПериодСекунда,
РН1.Регистратор КАК Регистратор,
РН1.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
РН1.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
РН1.КоличествоПриход КАК КоличествоПриход,
РН1.КоличествоРасход КАК КоличествоРасход,
РН2.КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления.РегистрНакопления1.ОстаткиИОбороты(, , Авто, Движения, ) КАК РН1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрНакопления2.Обороты(, , Авто, ) КАК РН2
ПО РН1.Организация = РН2.Организация
И РН1.Склад = РН2.Склад
И РН1.Номенклатура = РН2.Номенклатура
И РН1.РЕГИСТРАТОР = РН2.РЕГИСТРАТОР
Настройки полей и настройки СКД не изменились (не считая добавления еще одного ресурса "КоличествоОборот").
А вот результат изменился:
Но исказились только поля остатков, обороты остались корректными. В полях остатка считается просто сумма.
Но при этом расшифровка формируется корректно:
В новом тексте запроса я не случайно выделил кусок РН1.РЕГИСТРАТОР = РН2.РЕГИСТРАТОР.
Если из соединения убрать это условие, то результат снова становится корректным.
А теперь установим такой текст запроса:
ВЫБРАТЬ
РН1.Организация КАК Организация,
РН1.Склад КАК Склад,
РН1.Номенклатура КАК Номенклатура,
РН1.ПериодСекунда КАК ПериодСекунда,
РН1.Регистратор КАК Регистратор,
РН1.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
РН1.КоличествоПриход КАК КоличествоПриход,
РН1.КоличествоРасход КАК КоличествоРасход,
РН1.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
0 КАК КоличествоОборот
ИЗ
РегистрНакопления.РегистрНакопления1.ОстаткиИОбороты(, , Авто, Движения, ) КАК РН1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РН2.Организация,
РН2.Склад,
РН2.Номенклатура,
РН2.ПериодСекунда,
РН2.Регистратор,
0,
0,
0,
0,
РН2.КоличествоОборот
ИЗ
РегистрНакопления.РегистрНакопления2.Обороты(, , Авто, ) КАК РН2
И результат, и расшифровка формируются корректно.
Но такой способ можно применить не всегда.
Были опробованы следующие способы обойти эту проблему:
1. Запросы помещались во временные таблицы:
Текст запроса с временными таблицами
ВЫБРАТЬ
РН.Организация КАК Организация,
РН.Склад КАК Склад,
РН.Номенклатура КАК Номенклатура,
РН.ПериодСекунда КАК ПериодСекунда,
РН.Регистратор КАК Регистратор,
РН.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
РН.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
РН.КоличествоПриход КАК КоличествоПриход,
РН.КоличествоРасход КАК КоличествоРасход
ПОМЕСТИТЬ ВТ1
ИЗ
РегистрНакопления.РегистрНакопления1.ОстаткиИОбороты(, , Авто, Движения, ) КАК РН
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РН2.Регистратор КАК Регистратор,
РН2.Организация КАК Организация,
РН2.Склад КАК Склад,
РН2.Номенклатура КАК Номенклатура,
РН2.КоличествоОборот КАК КоличествоОборот
ПОМЕСТИТЬ ВТ2
ИЗ
РегистрНакопления.РегистрНакопления2.Обороты(, , Авто, ) КАК РН2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ1.Организация КАК Организация,
ВТ1.Склад КАК Склад,
ВТ1.Номенклатура КАК Номенклатура,
ВТ1.ПериодСекунда КАК ПериодСекунда,
ВТ1.Регистратор КАК Регистратор,
ВТ1.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ВТ1.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
ВТ1.КоличествоПриход КАК КоличествоПриход,
ВТ1.КоличествоРасход КАК КоличествоРасход,
ВТ2.КоличествоОборот КАК КоличествоОборот
ИЗ
ВТ1 КАК ВТ1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
ПО ВТ1.Организация = ВТ2.Организация
И ВТ1.Склад = ВТ2.Склад
И ВТ1.Номенклатура = ВТ2.Номенклатура
И ВТ1.Регистратор = ВТ2.Регистратор
2. Отключалось Автозаполнение:
Текст запроса для отключения Автозаполнения
ВЫБРАТЬ
РН.Организация КАК Организация,
РН.Склад КАК Склад,
РН.Номенклатура КАК Номенклатура,
РН.ПериодСекунда КАК ПериодСекунда,
РН.Регистратор КАК Регистратор,
РН.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
РН.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
РН.КоличествоПриход КАК КоличествоПриход,
РН.КоличествоРасход КАК КоличествоРасход
ПОМЕСТИТЬ ВТ1
{ВЫБРАТЬ
Организация.*,
Склад.*,
Номенклатура.*,
ПериодСекунда,
Регистратор.*,
КоличествоНачальныйОстаток,
КоличествоКонечныйОстаток,
КоличествоПриход,
КоличествоРасход}
ИЗ
РегистрНакопления.РегистрНакопления1.ОстаткиИОбороты(, , Авто, Движения, ) КАК РН
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
РН2.Регистратор КАК Регистратор,
РН2.Организация КАК Организация,
РН2.Склад КАК Склад,
РН2.Номенклатура КАК Номенклатура,
РН2.КоличествоОборот КАК КоличествоОборот
ПОМЕСТИТЬ ВТ2
{ВЫБРАТЬ
Организация.*,
Склад.*,
Номенклатура.*,
КоличествоОборот}
ИЗ
РегистрНакопления.РегистрНакопления2.Обороты(, , Авто, ) КАК РН2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ1.Организация КАК Организация,
ВТ1.Склад КАК Склад,
ВТ1.Номенклатура КАК Номенклатура,
ВТ1.ПериодСекунда КАК ПериодСекунда,
ВТ1.Регистратор КАК Регистратор,
ВТ1.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
ВТ1.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток,
ВТ1.КоличествоПриход КАК КоличествоПриход,
ВТ1.КоличествоРасход КАК КоличествоРасход,
ВТ2.КоличествоОборот КАК КоличествоОборот
{ВЫБРАТЬ
Организация.*,
Склад.*,
Номенклатура.*,
ПериодСекунда,
Регистратор.*,
КоличествоНачальныйОстаток,
КоличествоКонечныйОстаток,
КоличествоПриход,
КоличествоРасход,
КоличествоОборот}
ИЗ
ВТ1 КАК ВТ1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ2 КАК ВТ2
ПО ВТ1.Организация = ВТ2.Организация
И ВТ1.Склад = ВТ2.Склад
И ВТ1.Номенклатура = ВТ2.Номенклатура
И ВТ1.Регистратор = ВТ2.Регистратор
Ни один из этих вариантов не помог добиться корректного заполнения полей остатков в отчете.
Почему не работает роль "Остатки" если в запросе присутствует соединение с таблицей регистра по регистратору и как выйти из ситуации я разобраться не смог. Если знаете способ, то отпишитесь в коментах.
UPD.
Сообщество объяснило, как решить данную проблему. Спасибо Денис Урянский.
Решение.
Необходимо добавить второй набор данных и вынести в него запрос к той таблице, которую мы присоединяем левым соединением. Соответственно из первого набора эту таблицу убираем, т.е. приводим его к виду указанному в самом начале публикации.
Набор 2.
После этого необходимо настроить связи между наборами. Ключевым моментом является настройка связи по регистратору. Она должна быть необязательной.
На этом, собственно, все. Остальные настройки остаются без изменений, а отчет и расшифровка формируются корректно.