Всем привет.
Может кто сталкивался, или уже обсуждали, а поиском я найти не смог. Если дадите ссылку на вопрос/обсуждение, будет круто.
Есть регистр накопления с видом регистра "остатки", нужно получить остатки на каждый день, но не запросом, а с помощью СКД. Может кто сталкивался с такой задачей? Может какую то формулу нужно прописать на вкладке "Ресурсы"?
При таком запросе в скд:
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Период КАК Период,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
Пришел к такой формуле:
ВычислитьВыражение(
"Выбор
Когда Сумма(Остаток) ЕСТЬ NULL Тогда
0
Иначе
Сумма(Остаток)
Конец",
"Период", "Группировка", "Предыдущая", "Текущая") Но она берет остаток на текущую строку и следующую, а дальше 0 ставит на последующие дни.
P.s. Еще раз повторюсь, запрос знаю как сделать, в интернетах уже информацию прочитал. Хотелось бы именно через СКД.
Что нужно поменять:
- изменить расчет ресурса, достаточно просто "Сумма(ОстатокНаНачало)"
- проверить, что есть поля начального и конечного остатка
- проверить что корректно настроены роли полей: периоды, измерения, начальный и конечный остаток.
(1) речь идет о том как в типовых реализована возможность крутить отчет, чтобы оно работало на любой вкус?
Посмотри запрос и настройки схемы в типовом отчете и сделай также.
(12) У меня на 1 число остаток 0, на 2 число уже 100, у меня не было расхода 3 числа, значит 3 числа должно быть тоже 100. Остаток 100 должен держаться до 11 числа, когда идет расход на 50, и получается что 11 числа остаток 50.
Я хочу видеть актуальные данные на каждый день, а отчет показывает пустой остаток
ВычислитьВыражение(
"Выбор
Когда Сумма(Остаток) ЕСТЬ NULL Тогда
0
Иначе
Сумма(Остаток)
Конец",
"Период", "Группировка", "Предыдущая", "Текущая")
Но она берет остаток на текущую строку и следующую, а дальше 0 ставит на последующие дни.
Вот этого всего не надо, остаток надо добавить в ресурсы без изменения выражения. СКД сама все должна сделать.
где-то на просторах инфорстарта нашел давно такой запрос, до сих пор пользуюсь
как переложить в скд уж сами... в моей практике такого не требовалось, потому практически первоисточник...
тзнСЦифрами = Новый ТаблицаЗначений();
КЧ = Новый КвалификаторыЧисла(12,2);
Массив = Новый Массив;
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
тзнСЦифрами.Колонки.Добавить("Цифра", ОписаниеТиповЧ);
Для Счетчик = 0 по лМаксимальноеЧислоДней Цикл
НоваяСтрока = тзнСЦифрами.Добавить();
НоваяСтрока.Цифра = Счетчик;
КонецЦикла;
лЗапрос.Текст = "ВЫБРАТЬ
| ТБДаты.Цифра
|ПОМЕСТИТЬ Единицы
|ИЗ
| &ТБДаты КАК ТБДаты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, Единицы.Цифра) КАК Период
|ПОМЕСТИТЬ Дни
|ИЗ
| Единицы КАК Единицы
|ГДЕ
| Единицы.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДвиженияОстатки.Номенклатура КАК Номенклатура,
| ДНИ.Период КАК Период,
| СУММА(ВЫБОР
| КОГДА ДвиженияОстатки.Период = &НачалоПериода
| ТОГДА ДвиженияОстатки.КоличествоКонечныйОстаток
| ИНАЧЕ ВЫБОР
| КОГДА ДвиженияОстатки.Период <= ДНИ.Период
| ТОГДА ДвиженияОстатки.КоличествоОборот
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ) КАК СвободныйОстаток,
| ДвиженияОстатки.Склад КАК Склад
|ИЗ
| Дни КАК ДНИ,
| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, , Номенклатура В (&массивНоменклатуры)) КАК ДвиженияОстатки
|
|СГРУППИРОВАТЬ ПО
| ДНИ.Период,
| ДвиженияОстатки.Склад,
| ДвиженияОстатки.Номенклатура
|
|ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА ДвиженияОстатки.Период = &НачалоПериода
| ТОГДА ДвиженияОстатки.КоличествоКонечныйОстаток
| ИНАЧЕ ВЫБОР
| КОГДА ДвиженияОстатки.Период <= ДНИ.Период
| ТОГДА ДвиженияОстатки.КоличествоОборот
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ) <> 0
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| ДвиженияРезервы.Номенклатура,
| ДНИ.Период,
| СУММА(ВЫБОР
| КОГДА ДвиженияРезервы.Период = &НачалоПериода
| ТОГДА ДвиженияРезервы.КоличествоКонечныйОстаток
| ИНАЧЕ ВЫБОР
| КОГДА ДвиженияРезервы.Период <= ДНИ.Период
| ТОГДА ДвиженияРезервы.КоличествоОборот
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ),
| ДвиженияРезервы.Склад
|ИЗ
| Дни КАК ДНИ,
| РегистрНакопления.ТоварыВРезервеНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День, ,Номенклатура В (&массивНоменклатуры)) КАК ДвиженияРезервы
|
|СГРУППИРОВАТЬ ПО
| ДНИ.Период,
| ДвиженияРезервы.Склад,
| ДвиженияРезервы.Номенклатура
|
|ИМЕЮЩИЕ
| СУММА(ВЫБОР
| КОГДА ДвиженияРезервы.Период = &НачалоПериода
| ТОГДА ДвиженияРезервы.КоличествоКонечныйОстаток
| ИНАЧЕ ВЫБОР
| КОГДА ДвиженияРезервы.Период <= ДНИ.Период
| ТОГДА ДвиженияРезервы.КоличествоОборот
| ИНАЧЕ 0
| КОНЕЦ
| КОНЕЦ) <> 0
|
|УПОРЯДОЧИТЬ ПО
| Период,
| Склад,
| Номенклатура";
лЗапрос.УстановитьПараметр("КонецПериода", КонецДня(ДатаСинхронизации));
лЗапрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачалаПериодаСинхронизации));
лЗапрос.УстановитьПараметр("ТБДаты", тзнСЦифрами);
лЗапрос.УстановитьПараметр("массивНоменклатуры", тзНомеклатура.ВыгрузитьКолонку("Ссылка"));
(8)
Кодом и запросом знаю как сделать, уже реализовывал.
Вот запрос для скд, который получает на каждую дату:
ВЫБРАТЬ
0 КАК Цифра
ПОМЕСТИТЬ ВТ_Цифры
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
9
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Цифры0.Цифра + 10 * ВТ_Цифры1.Цифра) КАК Дата
ПОМЕСТИТЬ ВТ_Даты
ИЗ
ВТ_Цифры КАК ВТ_Цифры0
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры1
ПО (ИСТИНА)
ГДЕ
ДОБАВИТЬКДАТЕ(&ДатаНачала, ДЕНЬ, ВТ_Цифры0.Цифра + 10 * ВТ_Цифры1.Цифра) МЕЖДУ &ДатаНачала И &ДатаОкончания
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Период,
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.Склад,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоОстаток
ПОМЕСТИТЬ ВТ_ТоварыНаСкладахОстатки
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, День, , ) КАК ТоварыНаСкладахОстаткиИОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ТоварыНаСкладахОстатки.Период КАК ДатаНачала,
ВТ_ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
ВТ_ТоварыНаСкладахОстатки.Склад КАК Склад,
ВТ_ТоварыНаСкладахОстатки.КоличествоОстаток,
МИНИМУМ(ВЫБОР
КОГДА КОНЕЦПЕРИОДА(ВТ_ТоварыНаСкладахОстатки1.Период, ДЕНЬ) = &ДатаОкончания
ТОГДА &ДатаОкончания
ИНАЧЕ ДОБАВИТЬКДАТЕ(ВТ_ТоварыНаСкладахОстатки1.Период, СЕКУНДА, -1)
КОНЕЦ) КАК ДатаОкончания
ПОМЕСТИТЬ ВТ_ОстаткиИИнтервалы
ИЗ
ВТ_ТоварыНаСкладахОстатки КАК ВТ_ТоварыНаСкладахОстатки
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТоварыНаСкладахОстатки КАК ВТ_ТоварыНаСкладахОстатки1
ПО ВТ_ТоварыНаСкладахОстатки.Номенклатура = ВТ_ТоварыНаСкладахОстатки1.Номенклатура
И ВТ_ТоварыНаСкладахОстатки.Склад = ВТ_ТоварыНаСкладахОстатки1.Склад
И ВТ_ТоварыНаСкладахОстатки.Период < ВТ_ТоварыНаСкладахОстатки1.Период
СГРУППИРОВАТЬ ПО
ВТ_ТоварыНаСкладахОстатки.Период,
ВТ_ТоварыНаСкладахОстатки.Номенклатура,
ВТ_ТоварыНаСкладахОстатки.Склад,
ВТ_ТоварыНаСкладахОстатки.КоличествоОстаток
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Даты.Дата КАК Дата,
ВТ_ОстаткиИИнтервалы.Номенклатура,
ВТ_ОстаткиИИнтервалы.Склад,
ВТ_ОстаткиИИнтервалы.КоличествоОстаток
ИЗ
ВТ_ОстаткиИИнтервалы КАК ВТ_ОстаткиИИнтервалы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Даты КАК ВТ_Даты
ПО (ВТ_Даты.Дата МЕЖДУ ВТ_ОстаткиИИнтервалы.ДатаНачала И ВТ_ОстаткиИИнтервалы.ДатаОкончания)
УПОРЯДОЧИТЬ ПО
Дата
Что нужно поменять:
- изменить расчет ресурса, достаточно просто "Сумма(ОстатокНаНачало)"
- проверить, что есть поля начального и конечного остатка
- проверить что корректно настроены роли полей: периоды, измерения, начальный и конечный остаток.
(16) Сделал как вы написали, получилось но частично (картинка во вложении).
Т.е. после этого уже формулу писать чтобы конечный остаток был = начальному, где скд это сделало не правильно?
Регистр накопелний остатки не хранит ни каких данных за день, когда остатки не менялись, и получается. что остаток в этот день равен остатку на конец прошлого дня, думаю отталкиваться нужно от этого...
у меня я уже писал топик по ээтой теме:
http://forum.infostart.ru/forum9/topic237093/message2403347/#message2403347 посмотри вдруг поможет, там есть запрос для примера.
Но не понимаю, почему нужно именно с помощью СКД а не в запросе?
(18) Да я понимаю что вы говорите, я вашу тему находил насчет этого. и (8) как раз ответил запросом который у вас описан.
У СКД есть функционал который может так сделать чтобы не писать такие алгоритмы.
Отвечая на ваш вопрос, сейчас уже больше для саморазвития и уже из принципа, ну просто эта проблема, что там можно сделать, не дает мне нормально спать :D
(19)
Могу предположить только если)))
Я бы попробовал сделать в СКД 2 набор данных в первом остатки по срезу последних
с условиями по номенклатуре и по дате
в во второй набор вывел бы даты производственно календаня и подружил бы наборы по дате, причем тянул бы даты календаря в параметр даты в наборе по остаткам.
В таком случае будет выводиться не остаток на каждый день периода, а будет выводиться остаток на каждый день в отдельности)
(21)
Спасибо, я понял свою ошибку, обязательно нужно было взять начальный остаток и указывать роли. Так же как и описал (16), но там уже был мой косяк, не правильно сделал.
(23) В большинстве случаев роли трогать не надо, если идет автозаполнение. Они сами выставляются как положено. Их менять надо, только если знаете зачем это вам нужно. В своей практике я такое встречал 1 раз.