Имя: Пароль:
1C
1С v8
Корректное соединение 3 и более запросов с разным количеством полей
0 merlin789
 
22.02.18
10:10
Добрый день, Коллеги.​
Столкнулся со следующей проблемой, не удаётся соединить несколько однотипных полей из 3 запросов к регистрам в 1 поле с соединением по 3 ключевым полям номенклатуре, складу + список дат, дата берётся из регистра производственный календарь помещается в отдельный запрос. Проблема в том, как оформить в конечный запрос, т.к номенклатура, склад и дата сворачиваются не по всем строкам, по некоторым в результате отображаются только сами значения регистра без номенклатуры, склада и даты.(значения null) хотя каждый запрос по отдельности выдаёт корректный результат. Знаю про способ естьnull но он годится только для соединения 2х таблиц. Вариант с объединить не годится т.к. разное количество полей в запросах. Остатётся вариант только группировать по 2 запроса во временную таблицу, и к ней приесодинять данные третьего запроса, но на мой взягляд данный вариант громоздкий и некорректный.
Я ищу конструкцию которая позволит объединить в 1 столбец данные одного и того же справочника(номенклатура, склад) из 3 и более запросов. Буду благодарен за пример с конструкцией или направление в котором двигаться.
1 merlin789
 
22.02.18
10:11
//Календарь
Выбрать
НачалоПериода(ДатаКалендаря,День) как ДатаКалендаря
поместить календарь
Из
РегистрСведений.РегламентированныйПроизводственныйКалендарь
где
ДатаКалендаря между &ДатаНач и &ДатаКон
;


//Движения топлива
Выбрать
ДатаКалендаря,
Склад,
Номенклатура,
Сумма(Количество) как Количество
Поместить ДвиженияТоплива
из
(Выбрать
НачалоПериода(Дата,День) как ДатаКалендаря,
Помещение.Склад как Склад,
Номенклатура,
Количество
из
РегистрСведений.krsДвижениеТопливаНаАЗС
где
Дата между &ДатаНач и &ДатаКон
и
выбор
когда &склад<>Значение(справочник.Склады.пустаяСсылка)
тогда
помещение.Склад=&Склад
иначе
истина
конец
)как ДвижТоплива
сгруппировать по ДатаКалендаря,Склад, Номенклатура
;

//Остатки топлива
Выбрать
НачалоПериода(ДатаКалендаря,День) как ДатаКалендаря,
Склад,
Номенклатура,
Сумма(Количество) как ОстатокН
поместить ОстаткиТоплива
из
(
Выбрать
НачалоПериода(Период, день) как ДатаКалендаря,
Помещение.Склад как Склад,
Номенклатура,
Количество*Плотность как Количество
из РегистрСведений.krsДанныеУровнемеров
где период между &ДатаНач и &ДатаКон
и
выбор
когда &склад<>Значение(справочник.Склады.пустаяСсылка)
тогда
помещение.Склад=&Склад
иначе
истина
конец)как ДДатчиков
сгруппировать по ДатаКалендаря,Склад,номенклатура
;

//Перемещения
ВЫБРАТЬ
НачалоПериода(Период, День) как ДатаКалендаря,
Склад,
Номенклатура,
КоличествоПриход как Приход,
КоличествоРасход как Расход
поместить Перемещения
ИЗ
РегистрНакопления.ТоварыВРознице.Обороты(&ДатаНач, &ДатаКон,День,
выбор
когда &Склад <>Значение(Справочник.Склады.ПустаяСсылка)
тогда
Склад=&Склад
иначе
истина
конец)
;
Выбрать
Календарь.ДатаКалендаря,
ДвиженияТоплива.Номенклатура,
ДвиженияТоплива.Склад,
ОстаткиТоплива.ОстатокН,
ДвиженияТоплива.Количество,
Перемещения.Приход,
Перемещения.Расход
из


Календарь как Календарь
Полное Соединение
ДвиженияТоплива как ДвиженияТоплива
по
Календарь.ДатаКалендаря=ДвиженияТоплива.ДатаКалендаря

Полное Соединение
ОстаткиТоплива как ОстаткиТоплива
по
Календарь.ДатаКалендаря=ОстаткиТоплива.ДатаКалендаря
и
ДвиженияТоплива.Склад=ОстаткиТоплива.Склад
и
ДвиженияТоплива.Номенклатура=ОстаткиТоплива.Номенклатура

Полное Соединение
Перемещения как Перемещения
по
Календарь.ДатаКалендаря=Перемещения.ДатаКалендаря
и
ДвиженияТоплива.Склад=Перемещения.Склад
и
ДвиженияТоплива.Номенклатура=Перемещения.Номенклатура


упорядочить по Календарь.ДатаКалендаря
2 mehfk
 
22.02.18
10:12
3 merlin789
 
22.02.18
10:18
mehfk, нет проблемы соединить эти таблицы, проблема именно в колонках.
т.е для 2 таблиц это было бы так
Выбрать
Календарь.ДатаКалендаря,
ЕстьNULL(ДвиженияТоплива.Номенклатура,Остатки.Номенклатура) как Номенклатура, но как быть когда их больше?
Неужели в 1с нет никакого стандартного метода?
4 Мимохожий Однако
 
22.02.18
10:21
Нарисуй сначала в Excel таблички или в блокнотике, а потом определись что и как. Возможно, нужно объединение.
5 Optan
 
22.02.18
10:22
(3) ЕстьNULL(ДвиженияТоплива.Номенклатура,ЕстьNULL(ОстаткиТоплива.Номенклатура,Перемещения.Номенклатура)
(1)
А почему не соединится с календарем тремя левыми соединениями и сгруппировать?
6 merlin789
 
22.02.18
10:28
(5)была такая мысль
т.е. алгоритм таков?

3 левых соединения с календарём
Выбрать
ДатаКалендаря
ЕстьNULL(таблица1),ЕстьNULL(таблица2),ЕстьNULL(таблица3) как номенклатура
ИЗ
(таблица1
объединить
таблица2
объединить
таблица3)
сгруппировать по номенклатура
7 Optan
 
22.02.18
10:37
(6) Ну я думал как то так:

Выбрать
Календарь.Дата,
ЕстьNULL(Таблица1.Номенклатура,ЕстьNULL(Таблица2.Номенклатура,Таблица3.Номенклатура)),
ЕстьNULL(Таблица1.Склад,ЕстьNULL(Таблица2.Склад,Таблица3.Склад)),
....Дальше Сумма/Максимум(тут все твои числовые показатели)
из Календарь
ЛЕВОЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица1
ПО Календарь.Дата=Таблица1.Дата
......
СГРУППИРОВАТЬ ПО
Календарь.Дата,
ЕстьNULL(Таблица1.Номенклатура,ЕстьNULL(Таблица2.Номенклатура,Таблица3.Номенклатура)),
ЕстьNULL(Таблица1.Склад,ЕстьNULL(Таблица2.Склад,Таблица3.Склад))
8 merlin789
 
22.02.18
10:39
(7)Спасибо!
Основная теорема систематики: Новые системы плодят новые проблемы.