Есть проблема с созданием отчёта...
Сейчас работаю с УТ 10.3, но эта проблема свойственна для любой конфигурации...
Итак, задача вроде бы простая: в отчет необходимо в разрезе Складов и Номенклатуры по дням за указанный период выводить Остатки на начало дня, Оборот (приход - расход), Остатки на конец дня, и Заказы оформленные с этих складов. Внешний вид отчёта примерно такой:
Остатки и Оборот берутся из соответствующих полей виртуальной таблицы РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты.
Заказы берутся из поля "КоличествоПриход" виртуальной таблицы РегистрНакопления.ЗаказыПокупателей.Обороты.
А ТЕПЕРЬ СОБСТВЕННО ПРОБЛЕМА:
Всё формируется нормально, если Заказы имеются на ТЕ ЖЕ Дни/Склады/Номенклатуры, по которым есть Приход/Расход в Регистре ТоварыОрганизаций (за выбранный период, разумеется).
А вот если какой-то Заказ сформирован на Дату/Склад/Номенклатуру, отсутствующие в Регистре ТоварыОрганизаций, то начинаются "чудеса"...:
Если связывать регистры через "ОБЪЕДИНИТЬ", то по таким записям пропадают Остатки (и начальный и конечный).
Если связывать через "СОЕДИНЕНИЕ" даже через промежуточную виртуальную таблицу, содержащую все Даты/Склады/Номенклатуры из обоих регистров (за выбранный период), то запись о Заказе вообще выводится в начале отчёта с пустой датой и в строке без склада и номенклатуры.
ЧТО ДЕЛАТЬ??? КАК ПОБОРОТЬ???
Сразу скажу, что "Дополнение периодами" (в СКД) не помогает.
Вот пример запроса в СКД с использованием ОБЪЕДИНЕНИЯ в типовой УТ 10.3:
////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыОрганизацийОстаткиИОбороты.Период,
ТоварыОрганизацийОстаткиИОбороты.Склад,
ТоварыОрганизацийОстаткиИОбороты.Номенклатура,
ТоварыОрганизацийОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.КоличествоПриход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоРасход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоКонечныйОстаток,
СУММА(0) КАК Заказано
ПОМЕСТИТЬ вт1
ИЗ
РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, , День, ДвиженияИГраницыПериода, ) КАК ТоварыОрганизацийОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ТоварыОрганизацийОстаткиИОбороты.Период,
ТоварыОрганизацийОстаткиИОбороты.Склад,
ТоварыОрганизацийОстаткиИОбороты.Номенклатура,
ТоварыОрганизацийОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.КоличествоПриход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоРасход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоКонечныйОстаток
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗаказыПокупателейОбороты.Период,
ЗаказыПокупателейОбороты.ЗаказПокупателя.СкладГруппа,
ЗаказыПокупателейОбороты.Номенклатура,
СУММА(0),
СУММА(0),
СУММА(0),
СУММА(0),
ЗаказыПокупателейОбороты.КоличествоПриход
ИЗ
РегистрНакопления.ЗаказыПокупателей.Обороты(, , День, ) КАК ЗаказыПокупателейОбороты
СГРУППИРОВАТЬ ПО
ЗаказыПокупателейОбороты.Период,
ЗаказыПокупателейОбороты.ЗаказПокупателя.СкладГруппа,
ЗаказыПокупателейОбороты.Номенклатура,
ЗаказыПокупателейОбороты.КоличествоПриход
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
вт1.Период,
вт1.Склад,
вт1.Номенклатура,
СУММА(вт1.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
СУММА(вт1.КоличествоПриход) КАК КоличествоПриход,
СУММА(вт1.КоличествоРасход) КАК КоличествоРасход,
СУММА(вт1.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
СУММА(вт1.Заказано) КАК Заказано
ИЗ
вт1 КАК вт1
СГРУППИРОВАТЬ ПО
вт1.Период,
вт1.Склад,
вт1.Номенклатура
(1)Прям ПРОБЛЕМА =)
Возьмите данные ПроизводственногоКалендаря за указанный период/передайте таблицу дат через ВТ(там будут все дни в указанном интервале), и уже к нему цепляйте данные обоих регистров по ПроизводственныйКалендарь.Дата = НачалоДня(ВашРегистр.Период). Потом, если понадобится, отфильтруете те дни, где не было оборотов ни по одному из регистров(например, выходные)
З.Ы.
Метод дополнения» задает один из следующих вариантов:
Движения
В этом случае будут выданы те периоды, в которых были движения.
ДвиженияИГраницыПериода (по умолчанию)
В этом случае выбираются периоды, в которых были движения, а также периоды на начало и конец заданного интервала (с) СП
(13) mymyka,
А "Производственный календарь" - это где в УТ 10.3?
(сам уже думал создать подобную табличку со всеми датами, но если есть готовая,- подскажи где она, чёт не найду..).
Кстати, я пытался делать это, но по-другому - вытаскивал ОстаткиИОбороты, потом Заказы, а потом объединял их Периоды/Склады/Номенклатуры (уникальные, ессн.), и уже к этой вирт.таблице снова привязывал первые две. Но я не формировал первые две таблицы (хотя достаточно, наверное, только первую) заново... Счас попробую...
Сам я вижу проблему в том, что несмотря на указание мной в настройках СКД дополнять периоды днями с даты НачалоПериода по КонецПериода, сама СКД чихать на это хотела, и она выдёргивает остатки и обороты из регистра ТоварыОрганизаций только по тем дням, где есть приход или расход.
Неужели придётся буквально вручную выдёргивать остатки по тем Дням/Складам/Номенклатурам (и потом объединять всё это), по которым есть Заказы вне измерений ТоварыОрганизаций???
Или есть более красивое решение? Может быть, нужно просто настроить Роли в СКД (я не умею((()?
Если приход или расход есть, например, только 1го и 2го сентября,
а Заказ оформлен 4го сентября,
и при этом я формирую отчёт с 1го по 4е сентября,
то отчёт сформируется нормально, так как я в "Параметрах виртуальной таблицы" ТоварыОрганизацийОстаткиИОбороты указал "Метод дополнения" = "ДвиженияИГраницыПериода".
Супер! Вот только мне нужны данные из регистра ТоварыОрганизаций НЕ ТОЛЬКО на те даты, где есть обороты, или которые являются Границами заданного периода, а на ВСЕ даты...
Как это сделать??? Если бы не в СКД, а обычным запросом, то можно было бы сделать так:
...
Период ПЕРИОДАМИ (&Начало, &Конец, День).
...
А вот СКД издевается со своей оптимизацией запросов, будь она неладна... Замучался уже...
(4) Nitralove, спасибо за ответ.
Этот видеокурс (Гилёва), и конкретно этот урок я видел.
Но в том то и дело, что там идёт обращение к ОДНОМУ(!!!) регистру накопления...
А у меня отчёт должен строиться по ДВУМ регистрам, в одном из которых (ТоварыОрганизаций), для простоты понимания, есть записи только 1го сентября, а во втором (ЗаказыПокупателей) только 2го сентября того же года.
И при попытке их как-то связать вылазиют кракозябры :(
(7) spacecraft, спасибо.
Даты начала и окончания в параметрах виртуальных таблиц на уровне запросов я указывал. Не помогает.
Собственно их можно и не указывать, т.к. СКД подставляет их автоматически, если устраивают стандартные "НачалоПериода" и "КонецПериода"...
В любом случае эффект равен нулю((((
Эххххх, да неужели никто никогда не связывал несколько (хотя бы два) Регистров накопления, у которых нет совпадения хотя-бы по датам???
ВЫБРАТЬ
ТоварыОрганизацийОстаткиИОбороты.Склад,
ТоварыОрганизацийОстаткиИОбороты.Номенклатура,
ТоварыОрганизацийОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.КоличествоПриход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоРасход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоКонечныйОстаток,
СУММА(0) КАК Заказано,
ТоварыОрганизацийОстаткиИОбороты.ПериодДень КАК Период
ПОМЕСТИТЬ вт1
ИЗ
РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, ) КАК ТоварыОрганизацийОстаткиИОбороты
СГРУППИРОВАТЬ ПО
ТоварыОрганизацийОстаткиИОбороты.Склад,
ТоварыОрганизацийОстаткиИОбороты.Номенклатура,
ТоварыОрганизацийОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.КоличествоПриход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоРасход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоКонечныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.ПериодДень
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗаказыПокупателейОбороты.ЗаказПокупателя.СкладГруппа,
ЗаказыПокупателейОбороты.Номенклатура,
СУММА(0),
СУММА(0),
СУММА(0),
СУММА(0),
ЗаказыПокупателейОбороты.КоличествоПриход,
ЗаказыПокупателейОбороты.ПериодДень
ИЗ
РегистрНакопления.ЗаказыПокупателей.Обороты(, , Авто, ) КАК ЗаказыПокупателейОбороты
СГРУППИРОВАТЬ ПО
ЗаказыПокупателейОбороты.ЗаказПокупателя.СкладГруппа,
ЗаказыПокупателейОбороты.Номенклатура,
ЗаказыПокупателейОбороты.КоличествоПриход,
ЗаказыПокупателейОбороты.ПериодДень
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
вт1.Склад,
вт1.Номенклатура,
СУММА(вт1.КоличествоНачальныйОстаток) КАК КоличествоНачальныйОстаток,
СУММА(вт1.КоличествоПриход) КАК КоличествоПриход,
СУММА(вт1.КоличествоРасход) КАК КоличествоРасход,
СУММА(вт1.КоличествоКонечныйОстаток) КАК КоличествоКонечныйОстаток,
СУММА(вт1.Заказано) КАК Заказано,
вт1.Период
ИЗ
вт1 КАК вт1
СГРУППИРОВАТЬ ПО
вт1.Склад,
вт1.Номенклатура,
вт1.Период
(12) Ivanovag123, для УТ10 все тоже самое, только таблицу регистра заменить. Ну и склада нет во второй таблице.
ВЫБРАТЬ
ТоварыОрганизацийОстаткиИОбороты.Склад,
ТоварыОрганизацийОстаткиИОбороты.Номенклатура,
ТоварыОрганизацийОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.КоличествоПриход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоРасход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоКонечныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.ПериодДень КАК Период,
ЗаказыПокупателейОбороты.КоличествоПриход КАК Заказано
ИЗ
РегистрНакопления.ТоварыОрганизаций.ОстаткиИОбороты(, , Авто, ДвиженияИГраницыПериода, ) КАК ТоварыОрганизацийОстаткиИОбороты
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Обороты(, , Авто, ) КАК ЗаказыПокупателейОбороты
ПО ТоварыОрганизацийОстаткиИОбороты.Номенклатура = ЗаказыПокупателейОбороты.Номенклатура
СГРУППИРОВАТЬ ПО
ТоварыОрганизацийОстаткиИОбороты.Склад,
ТоварыОрганизацийОстаткиИОбороты.Номенклатура,
ТоварыОрганизацийОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.КоличествоПриход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоРасход,
ТоварыОрганизацийОстаткиИОбороты.КоличествоКонечныйОстаток,
ТоварыОрганизацийОстаткиИОбороты.ПериодДень,
ЗаказыПокупателейОбороты.КоличествоПриход
(14) spacecraft, Не работает(((
И ты забыл указать связь по Периоду и по Складу...
Если не указывать, то данные везде задваиваются.
А если указать, то будет как я уже описывал - заказы появляются ни к чему не привязанные (в отдельной строке и в отдельной колонке без даты).
Во вложении отчёт для УТ 10.3 на твоём последнем запросе (я только Период и Склад там связал).
В вашей табличке я вижу 28.09.2015 (конечная дата отчёта) заказ одного Вентилятора.
Измените дату этого заказа на 27.09.2015, и сразу поймёте в чём проблема (на эту дату у вас пропадут нач. и кон.остатки по этой позиции).
Я писал об этом ещё в первом посте и уточнил в третьем...
(26) Ivanovag123, не сразу понял. Тогда решать дополнение придется запросом. Во временную таблицу получать значения первой таблицы (остаткиИОбороты) на каждую дату в интервале. И уже ее соединять со второй.
(41) spacecraft, к сожалению, не правильно(((
Хоть Остатки теперь и не затираются, но при этом и Остатки и обороты задваиваются,
нет группировки по складам итого, и скорее всего перепутаны связи.
Счас попробую исправить, если это возможно.
П.С.: А схему зачем? Я её с СКД могу и сам выдернуть :)
(50) Ivanovag123, это уже другая ошибка. И тут пока не знаю как решить. Ведь если нет оборотов за период, то и данные берутся на предыдущий день, когда были. А там начальный и конечный именно на тот день. Вот они и копируются на дни, когда оборотов не было.
(52) spacecraft, почти победил(и)!!!
Глянь скрин...
Там осталась проблема только с начальным ИТОГОВЫМ остатком (в последнем столбике).
Всё остальное ОК!!!
Возможно, проблема в назначении ролей для полей остатка, хотя как тогда они правильно между днями переносятся??))
Пытаюсь понять...
(55) Ivanovag123, я не знаю, насколько это корректно, но в моем варианте, если полю "Заказано" в диалоге настройки ролей указать "Измерение", то проблема со скриншота решается
(57) konstruktiv, и правда, проблема и так решается...
Хде ж ты раньше был??????????
Я в шоке. А как это Заказы измерением могут быть???????? СКД издевается, или я туплю?
(57) konstruktiv, ...({(&НачалоПериода)}, {(&КонецПериода)},)... лишнее вроде. Я удалил, ничего не поменялось (То есть всё так же зашибись!, только кода меньше).
(18) ditp,
что-то я юмора с кодом не понял... Фрагмент:
ВЫБРАТЬ
"товар1" КАК товар,
"склад1" КАК склад,
"20150901" КАК дата,
10 КАК остаток,
5 КАК приход,
4 КАК расход
ПОМЕСТИТЬ тОстатки
(18) ditp,
можете ваш отчёт на реальных регистрах УТ 10 сделать?
Что-то я никак не могу ваши виртуальные таблицы расковырять...
Просто судя по скрину у вас ошибка только в остатке на первую дату (5-4 д/б=1, а не 10), а в остальном нормально всё...
(34) Ivanovag123, нет у меня ут 10 под рукой. да и лень.
Свои таблицы заполняю от балды и для примера, требовать от них каких=то корректных данных странно.
Замена "выбрать хрень объединить выбрать чушь" на реальные регистры вполне тривиальна.
Но будут пропуски дней, если не было ни движений, ни заказов.
Тогда действительно, поможет либо таблица с датами типа календаря, либо что-то вроде
ВЫБРАТЬ 0 КАК Х ПОМЕСТИТЬ Регистр1 ОБЪЕДИНИТЬ ВЫБРАТЬ 1;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ Младшие.Х + 2 * Старшие.Х КАК Х ПОМЕСТИТЬ Регистр2 ИЗ Регистр1 КАК Младшие, Регистр1 КАК Старшие;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ Младшие.Х + 4 * Старшие.Х КАК Х ПОМЕСТИТЬ Регистр4 ИЗ Регистр2 КАК Младшие, Регистр2 КАК Старшие;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ Младшие.Х + 16 * Старшие.Х КАК Х ПОМЕСТИТЬ Регистр8 ИЗ Регистр4 КАК Младшие, Регистр4 КАК Старшие;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, Регистр8.Х) КАК Дата
ИЗ
Регистр8 КАК Регистр
ГДЕ ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, Регистр8.Х) <= &КонДата
(21)В (19) код для запроса, генерирующий таблицу дат, состоящую из дней в указанном периоде. Для случая, если нет готового регистра с датами.
Первые 3 пакета генерируют таблицу чисел от 1 до 256, а финальный запрос для каждого из этих чисел вычисляет день, равный НачДата + Число дней, и берет только те строки, в которых полученная Дата меньше КонДата.
(0) Задачу решили?
Проблема в том что СКД не может правильно рассчитать итоги, из-за того что у вас поля называются одинаково.
Я решал подобную задачу вполне успешно - необходимо в запросе дать разные псевдонимы полям-измерениям. Далее на вкладке вычисляемые поля я переопределял поля - решение не очень, т.к. тераяется возможность наложить отбор на поле в запросе, а не на уровне СКД, но работает.
Если интересно - я готовлю публикацию по отчету для УАТ, в качестве примера выложу схему по вашей задаче - она проще и доступнее
Я вот тут подумал...
Может быть объединение делать не в запросе, а на уровне СКД (Первая закладка, - Добавить набор данных объединение...)
Только я так ни разу не делал и не знаю как это сделать... Может кто-нить сбацать?
(30) Ivanovag123, я вчера это попробовал. Тоже самое получается. Тут проблема в самом дополнение средствами СКД.
Да и такое соединение получается левым (или даже внутренним, если на вторую таблицу ограничение делать).
В аттаче база, с аккуратным решением, без нагромождения наборов данных, временных таблиц, регистра дат и пакетных запросов :Р ВнешнийОтчет1, все данные уже заведены.
(61) mymyka,
konstruktiv в (57) уже всё решил (спасибо ему ОГРОМНОЕ), и там действительно всё элементарно (да простит меня spacecraft с его абсолютно рабочим вариантом (58), но вариант konstruktiv понятнее и проще).
Отчёт для УТ 10.3 во вложении. Всё проверено, работает быстро и корректно. Проверено всё, что только можно.
Я там просто немного доработал его код (там только "приукрашки" форматирования):
- Склады теперь по иерархии (у нас так),
- добавил дополнение периодов по дням (не знаю зачем, просто вроде так просили)),
- порядок полей исправил (кон.остаток в конце),
- дата окончания берёт время 23:59:59 (если это не сделать, то обороты по товарам за последний день в отчёт не попадут),
- у всех количеств точность = 0 (мне так надо, т.к. у нас половину пылесоса не продают))),
- период в заголовках сделал без времени (07.09.2015 0:00:00 -> 07.09.2015) и выровнял по центру,
- столбики с кон.остатком закрасил светло-серым для наглядности.
(65) mymyka, не понял... а дтшник тут при чём? Делать новую конфигурацию? Круто :)
И что такое Тип дополнения группировки Период? Если вы о том, что в скрине, то это ни разу не помогло.