Имя: Пароль:
1C
1С v8
Сложный запрос к периодическому регистру
0 Sevish
 
08.01.16
15:49
БП платформа 8.2 конфигурация 2.0.64.42

Есть регистр сведений (периодический, далее РС). У регистра одно измерение - "Склад" (стандартный справочник "Склады"). Ресурсы "ДатаПоступления" (по сути равна "Период", но для наглядности сделал), "Вид" и "НачальныйВозраст". Записей может быть 1-2 в квартал.

"СрезПоследних" на нужную дату к этому РС дает мне "ДатаПоступления" и "НачальныйВозраст". "НачальныйВозраст" + разница в днях между "нужной датой" и "ДатаПоступления" дает мне "текущий возраст". И все бы ничего, но мне нужно "текущий возраст" использовать непосредственно в запросе ЗА ВЕСЬ ГОД. Иными словами нужно создать запрос в котором по каждому складу будет свой возраст на каждый день ГОДА или некого иного периода. Зачем?

Эта таблица нужна, чтобы однозначно по "Вид" выбрать требуемые показатели из соответствующего документа, привязанные к "Возрасту".

Более того, еще надо взять остатки по складу ("Хозрасчетный.ОстаткиИОбороты") на начало каждого дня (а как я выяснил если использовать "остатки и обороты" и оборотов не было - совсем беда - остатка нет).

В итоге должно быть что-то вроде этого:

01.01.2015 - Склад1 - Возраст1 - Показатель1_1 - Показатель2_1 - КолВо1

01.01.2015 - Склад2 - Возраст2 - Показатель1_2 - Показатель2_2 - КолВо2

02.01.2015 - Склад1 - Возраст1 - Показатель1_1 - Показатель2_1 - КолВо1

02.01.2015 - Склад2 - Возраст2 - Показатель1_2 - Показатель2_2 - КолВо2

и т. д.




В общем  нет у меня соображений, как это всё в один запрос уместить. А проблема с остатком на начало дня при отсутствии оборотов - это вообще отдельная тематика. Вроде как решается "Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон)", но это не возможно во вложенных запросах, нет там итогов.




Была идея делать все через ТЗ собирая в ней данные разных запросов, но получается адски долго ибо на каждую дату 10-12 складов.




Можно так посмотреть на эту задачу. Основной запрос:

ВЫБРАТЬ

ХозрасчетныйОстаткиИОбороты.Период КАК Период,

ХозрасчетныйОстаткиИОбороты.Субконто3 КАК Склад,

ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток КАК Остаток

ИЗ

РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаНач, &ДатаКон, День, , Счет = &Счет, , ) КАК ХозрасчетныйОстаткиИОбороты

ГДЕ

ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток > 0

УПОРЯДОЧИТЬ ПО

Период,

ХозрасчетныйОстаткиИОбороты.Субконто3.Наименование

ИТОГИ

СУММА(Остаток)

ПО

Период ПЕРИОДАМИ(ДЕНЬ, &ДатаНач, &ДатаКон),

Склад




И всё что нужно добавить к этому запросу вычисление актуального возраста из данных РС и показатели, привязанные к этому возрасту и складу :)
1 rsv
 
08.01.16
15:52
(0) Прочел несколько раз - ничего не понял .
2 rsv
 
08.01.16
15:53
Имхо ... рассматривайте просто как таблицу с  перечнем атрибутов - и все взлетит .
3 Sevish
 
08.01.16
15:59
(2) Не понял совета, сорри.
Попробую иначе объяснить.
Если взять приведенный запрос просто остатков по счету (см. выше), то в результат я получу значение "Период" в каждой строке. Вот из "Склад" и "Период" мне для каждой строки надо вычислить возраст на основании данных периодического регистра сведений. А затем для каждой строки на основании "Период", "Склад" и "Возраст" получить показатели из документа.
4 rsv
 
08.01.16
16:04
(3)

Т.е. с запросом к регистру бухгалтерии определились ?

Скорее джойните теперь с регистром сведений (подзапрос,времянка) по ... тем ключам связи которые необходимы.
5 Sevish
 
08.01.16
16:15
(4) С запросом определился. Ибо если остаток 0 то и считать ничего не надо. Проблема в том, что я не могу сообразить как джойнить. Например, чтобы на какую-то дату мне узнать начальный возраст в РС, мне надо взять "срезпоследних", которому нужно указать дату среза. А она плавающая и зависит от периода, полученного в основном запросу, с которым я определился.
А какие тэги прописать. чтобы запросы более точнее вставлялись, красивее что ли.
6 vicof
 
08.01.16
16:15
(3) Соединить с таблицей дат.
7 vicof
 
08.01.16
16:16
Точней так. Выбрать все даты, какие нужны, к ним джойнить данные регистра, вычислять возраст, далее к ним джойнить нужные показатели
8 Sevish
 
08.01.16
16:21
(7) Не совсем так, но почти так и делал.
1. Взял остатки на каждый день -> "Период".
2. Создал вложенный запрос к РС "СрезПоследних" объединил по "Склад" и "Период" -> вычислил возраст.
3. Создал вложенный запрос к документам объединил по "Склад" -> получил показатели.

Все хорошо, но если за период запроса были новые записи в РС (то есть требуется не только последний возраст), то опаньки. Ну и плюсом пошло то, что если обороты были "0", то и начального остатка я не вижу.
9 vicof
 
08.01.16
16:22
(8) Делай срез последних на каждую дату - гуглится легко
10 Sevish
 
08.01.16
16:24
(7) Что касается Твоего совета: то, что Ты посоветовал я могу сделать в ТЗ без проблем :), как это сделать в одном запросе не представляю. Я могу тупо сделать ТЗ по каждой дате за период. Затем взять остатки добавить в эту ТЗ. Затем сделать запрос к РС и обойдя все строки проставить возраст. Затем прочитать все документы с показателями и ещё раз обойти ТЗ и вставить нужные показатели в зависимости от периода и даты документа...
11 Sevish
 
08.01.16
16:24
(9) гуглю
12 Sevish
 
08.01.16
16:38
Честно признаюсь, никогда не работал с временными таблицами :( Это видимо и смешно и грустно одновременно :(
Нашел вот такой пример.
http://forum1s.ru/read/srez-poslednikh-na-kazhduiu-datu-v-zaprose-1s/
Чтобы оттолкнуться и разобраться. Мне во временную таблицу положить остатки или наоборот, выборку РС за период?
13 vicof
 
08.01.16
17:31
ПОМЕСТИТЬ ВременнаяТаблица
14 vicof
 
08.01.16
17:31
Может, сначала курс по запросам посмотреть?
15 Sevish
 
08.01.16
18:13
(14) Не использовал ранее.
В общем совместить возраст с данными поголовья у меня получилось, буду показатели сейчас пытаться прикрутить.

Но все ещё актуален вопрос с отсутствием остатков на начало если не было оборотов. Вроде как запрос остатков в основном запросе делаю периодами но что-то пока никак.
16 echo77
 
08.01.16
18:17
(15) Выводи с помощью СКД, группировка по периоду с дополнением день
17 Sevish
 
12.01.16
21:18
Решил задачу следующим образом:
1. Взял с "ПЕРИОДАМИ" сначала остатки по складам на каждый день. Результат запроса обошел в цикле и поместил то что надо в ТЗ.
2. Всю остальную информацию с ИБ собирал через запрос с виртуальной таблицей, в которую и загружал свою ТЗ. Объединял "слева". Левой всегда была моя виртуальная таблица.

Таким образом у меня всегда был и остаток по складу на каждый день и все дни подряд непрерывно. Если кому-то интересны подробности - спрашивайте.