|
Дни в наличии по ГРУППЕ складов. | ☑ | ||
---|---|---|---|---|
0
al_zzz
09.10.12
✎
14:16
|
Волею судеб сложилось так, что учет ведется по отделам, которые относятся к складам(склады - группы в справочнике). Отделов в каждом складе - тьма тьмущая и адекватный анализ динамики проводить по ним нереально. Надо получить дни в наличии запросом по складу (группе складов). Имеется ввиду - дни, когда на конец дня есть остаток на складе(в целом).
По одному отделу получить - не проблема. Как получать остатки на каждый день по регистру я знаю (это много где описано и сам не раз делал). Суть метода: 1) получаем остатки на начало + остатки и обороты за период; 2) перемножаем таблицу саму с собой, так, чтобы получить таблицу: ДатаНач | ДатаКон | Остаток; 3) Перемножаем таблицу со всеми датами периода и 2) так, чтобы дата из первой таблицы попадала между ДатаНач и ДатаКон. Сперва хотел проделать то же самое для группы складов, сложив остатки по отделам, но столкнулся с ситуацией, что может оказаться, что по одному из отделов может быть движение в определенный день и остаток на конец = 0, а по другим - нет. Тогда получаем неверное наличие. Подскажите, как правильно составить запрос? |
|||
1
Feanorko
09.10.12
✎
14:17
|
Правильно - в соответствии со стандартами фирмы 1С.
|
|||
2
al_zzz
09.10.12
✎
14:18
|
(1) Правильно - чтобы выводил правильные данные.
|
|||
3
Feanorko
09.10.12
✎
14:21
|
(2) тогда мб начать с понимания того, какими именно должны быть эти правильные данные?
|
|||
4
al_zzz
09.10.12
✎
14:27
|
(3) Есть склад(магазин). Он состоит из отделов. На отделе числится определенное количество ТМЦ и происходит его движение с течением времени. Может возникнуть множество вопросов только из этих предпосылок. Например: Всегда ли ТМЦ имелось в должном количестве на складе за определенный период? ТМЦ не продавалось в течении некоторого времени - а сколько всего дней из этого времени она была на остатках на складе?
|
|||
5
Feanorko
09.10.12
✎
14:35
|
(4) Движение и остаток по отделу означает движение и остаток по складу? Если да, то в чем проблема? Если нет, то чего ты тогда хочешь?
|
|||
6
hhhh
09.10.12
✎
14:42
|
(4) ну сгруппируйте по складу. Или в запросе или в СКД, что у вас.
|
|||
7
al_zzz
09.10.12
✎
14:42
|
(5) Да, именно. Проблема в том что вот так выглядит таблица движения по отделам одного склада: http://vfl.ru/fotos/7b21a9051026773.html
Если я остатки группирую по складу, то 7.02 получаю остаток ноль, хотя на самом деле в ноль остаток только в отделе "3502 Выставочный зал (Силикатная,20)". Соответственно, остаток по складу в целом неверен для всех дат, кроме начала периода. |
|||
8
al_zzz
09.10.12
✎
14:50
|
Ап!
|
|||
9
Feanorko
09.10.12
✎
14:52
|
(7) а нет ли у тебя, случаем, отрицательного остатка по какому либо отделу?
|
|||
10
al_zzz
09.10.12
✎
14:56
|
(9) Отрицательного остатка нет. Но, кажется, я не все данные сообщил. Приведу часть запроса лучше, которая дает таблицу на ссылке:
ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, ВложенныйЗапрос.НачалоПериода КАК НачалоПериода, _0_СкладОтдел.Склад КАК Склад, _0_СкладОтдел.Отдел, ВложенныйЗапрос.Количество //Сумма(ВложенныйЗапрос.Количество) КАК Количество ИЗ (ВЫБРАТЬ КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ) КАК НачалоПериода, ТоварыВРозницеОстатки.Номенклатура КАК Номенклатура, ТоварыВРозницеОстатки.Склад КАК Склад, ЕстьNull(ТоварыВРозницеОстатки.КоличествоОстаток,0) КАК Количество ИЗ РегистрНакопления.ТоварыВРознице.Остатки( &НачалоПериода, Номенклатура В (ВЫБРАТЬ _00_ТоварыВНаличии.Номенклатура ИЗ _00_ТоварыВНаличии КАК _00_ТоварыВНаличии) И Склад В (ВЫБРАТЬ _0_СкладОтдел.Отдел ИЗ _0_СкладОтдел КАК _0_СкладОтдел) {(Номенклатура).*, (Склад).*}) КАК ТоварыВРозницеОстатки {ГДЕ ТоварыВРозницеОстатки.Склад.*} ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(ТоварыВРозницеОстаткиИОбороты.Период, ДЕНЬ), ТоварыВРозницеОстаткиИОбороты.Номенклатура, ТоварыВРозницеОстаткиИОбороты.Склад, ЕстьNull(ТоварыВРозницеОстаткиИОбороты.КоличествоКонечныйОстаток,0) ИЗ РегистрНакопления.ТоварыВРознице.ОстаткиИОбороты( &НачалоПериода, &КонецПериода, День, , Номенклатура В (ВЫБРАТЬ _00_ТоварыВНаличии.Номенклатура ИЗ _00_ТоварыВНаличии КАК _00_ТоварыВНаличии) И Склад В (ВЫБРАТЬ _0_СкладОтдел.Отдел ИЗ _0_СкладОтдел КАК _0_СкладОтдел) {(Номенклатура).*, (Склад).*}) КАК ТоварыВРозницеОстаткиИОбороты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ), ТоварыНаСкладахОстатки.Номенклатура, ТоварыНаСкладахОстатки.Склад, ЕстьNull(ТоварыНаСкладахОстатки.КоличествоОстаток,0) ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки( &НачалоПериода, Номенклатура В (ВЫБРАТЬ _00_ТоварыВНаличии.Номенклатура ИЗ _00_ТоварыВНаличии КАК _00_ТоварыВНаличии) И Склад В (ВЫБРАТЬ _0_СкладОтдел.Отдел ИЗ _0_СкладОтдел КАК _0_СкладОтдел) {(Номенклатура).*, (Склад).*}) КАК ТоварыНаСкладахОстатки ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ НАЧАЛОПЕРИОДА(ТоварыНаСкладахОстаткиИОбороты.Период, ДЕНЬ), ТоварыНаСкладахОстаткиИОбороты.Номенклатура, ТоварыНаСкладахОстаткиИОбороты.Склад, ЕстьNull(ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток,0) ИЗ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты( &НачалоПериода, &КонецПериода, День, , Номенклатура В (ВЫБРАТЬ _00_ТоварыВНаличии.Номенклатура ИЗ _00_ТоварыВНаличии КАК _00_ТоварыВНаличии) И Склад В (ВЫБРАТЬ _0_СкладОтдел.Отдел ИЗ _0_СкладОтдел КАК _0_СкладОтдел) {(Номенклатура).*, (Склад).*}) КАК ТоварыНаСкладахОстаткиИОбороты) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ _0_СкладОтдел КАК _0_СкладОтдел ПО ВложенныйЗапрос.Склад = _0_СкладОтдел.Отдел //СГРУППИРОВАТЬ ПО // ВложенныйЗапрос.НачалоПериода, // ВложенныйЗапрос.Номенклатура, // _0_СкладОтдел.Склад Упорядочить по ВложенныйЗапрос.НачалоПериода |
|||
11
al_zzz
09.10.12
✎
15:00
|
(10) - это только временную таблицу получаю.
А вот начало: ВЫБРАТЬ РАЗЛИЧНЫЕ ВЫБОР КОГДА Склады.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА Склады.Родитель КОГДА Склады.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА Склады.Родитель.Родитель КОНЕЦ КАК Склад, ВЫБОР КОГДА Склады.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА Склады.Родитель.Наименование КОГДА Склады.Родитель.Родитель.Родитель = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка) ТОГДА Склады.Родитель.Родитель.Наименование КОНЕЦ КАК ИмяСклада, Склады.Ссылка КАК Отдел ПОМЕСТИТЬ _00_СкладОтдел ИЗ Справочник.Склады КАК Склады ГДЕ Склады.ЭтоГруппа = ЛОЖЬ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПЕРВЫЕ 200 ВЫБОР КОГДА _00_СкладОтдел.ИмяСклада ПОДОБНО "%90%" ТОГДА &ОптовыйСклад ИНАЧЕ _00_СкладОтдел.Склад КОНЕЦ КАК Склад, _00_СкладОтдел.Отдел КАК Отдел ПОМЕСТИТЬ _0_СкладОтдел ИЗ _00_СкладОтдел КАК _00_СкладОтдел ГДЕ (НЕ(_00_СкладОтдел.Склад.Наименование ПОДОБНО "%80%" ИЛИ _00_СкладОтдел.Склад.Наименование ПОДОБНО "%20%")) И ВЫБОР КОГДА _00_СкладОтдел.ИмяСклада ПОДОБНО "%90%" ТОГДА &ОптовыйСклад ИНАЧЕ _00_СкладОтдел.Склад КОНЕЦ = &ОптовыйСклад УПОРЯДОЧИТЬ ПО _00_СкладОтдел.ИмяСклада ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура ПОМЕСТИТЬ _00_ТоварыВНаличии ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.ПометкаУдаления = ЛОЖЬ И Номенклатура.ЭтоГруппа = ЛОЖЬ И (НЕ Номенклатура.Наименование ПОДОБНО "яя%") И Номенклатура.Ссылка = &Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ _0_СкладОтдел.Склад, _00_ТоварыВНаличии.Номенклатура ПОМЕСТИТЬ _Номенклатура_Склад ИЗ _00_ТоварыВНаличии КАК _00_ТоварыВНаличии, _0_СкладОтдел КАК _0_СкладОтдел ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ _00_ТоварыВНаличии.Номенклатура, _00_ТоварыВНаличии.Склад, ВложенныйЗапрос.Дата ПОМЕСТИТЬ _4_НоменклатураДата ИЗ _Номенклатура_Склад КАК _00_ТоварыВНаличии, (ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Дата ИЗ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК b ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК c ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc ПО (ИСТИНА) ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК d ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd ПО (ИСТИНА) ГДЕ aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК ВложенныйЗапрос ; //////////////////////////////////////////////////////////////////////////////// |
|||
12
Feanorko
09.10.12
✎
15:03
|
(11) всё не читал, но сходу похоже на какую-то херню) выкинь его и напиши заново, тока более вдумчиво.
|
|||
13
al_zzz
09.10.12
✎
15:13
|
(12) Боюсь, что получится такая же херня :(
Коротко: 1) Поскольку отделы могут храниться в двух уровнях вложенности, первая временная таблица - это соответствие: Склад - отдел; 2) из 1) исключаются склады НДС("%20%") и ГСМ("%80%"), а закрытые отделы ("%90%") относятся к оптовому складу; 3) Выбирается номенклатура для анализа; 4) Строится произведение таблиц _Номенклатура_Склад Номенклатуры и Склада из 2) 5) Строится произведение 4) и таблицы всех дней периода (генерируются во вложенном запросе) 6) Это искомый запрос, который я привожу первым. |
|||
14
al_zzz
09.10.12
✎
15:19
|
Ап-нуть чтоли!
|
|||
15
Feanorko
09.10.12
✎
15:19
|
(13) пиши так, чтобы было нормально, нужно понимать, как работает запрос :)
у тебя же склад - измерение регистра, зачем какое-то соответствие складов-отделов? |
|||
16
al_zzz
09.10.12
✎
15:20
|
(15) У меня отдел - измерение регистра, а склад - группа отделов. В том и трабла
|
|||
17
al_zzz
09.10.12
✎
15:21
|
(15) А данные нужно получать по складам
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |