Имя: Пароль:
1C
1С v8
Дни в наличии по ГРУППЕ складов.
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) А данные нужно получать по складам
AdBlock убивает бесплатный контент. 1Сергей