Подсчёт количества дней хранения номенклатуры на складе

1. Jovi 15.06.20 17:44 Сейчас в теме
Конфигурация: Trade (10.3.29.1) (http://v8.1c.ru/trade/), версия: 8.3.11.2867, обычные формы.
Добрый день. Подскажите пожалуйста идею, метод или способ, как можно реализовать следующее задание: Нужно подсчитать сколько дней номенклатура пролежала на складе за полтора года. Учитываются полные (то есть на начало дня есть остаток и на конец дня), рабочие дни. Также рабочим днём считается суббота. Но выходные (воскресенье) и праздничные не считаются.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. VictorRGB2 14 15.06.20 18:26 Сейчас в теме
как-то так...

    лЗапрос = Новый Запрос();
    
    лЗапрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |    ВложенныйЗапрос.Склад,
        |    ВложенныйЗапрос.Номенклатура,
        |    СУММА(ВложенныйЗапрос.ОстатокНачалоДня) КАК СвободныйОстатокНачалоДня,        
        |    СУММА(ВложенныйЗапрос.ОстатокКонецДня) КАК СвободныйОстатокКонецДня
        |ИЗ (
        |    ВЫБРАТЬ
        |        ТоварыНаСкладахОстаткиНачалоДня.Склад,
        |        ТоварыНаСкладахОстаткиНачалоДня.Номенклатура,
        |        ТоварыНаСкладахОстаткиНачалоДня.КоличествоОстаток КАК ОстатокНачалоДня,        
        |        0 КАК ОстатокКонецДня
        |    ИЗ
        |        РегистрНакопления.ТоварыНаСкладах.Остатки(
        |            &ГраницаИнтервалаНачалоДня, Номенклатура В (&массивНоменклатуры)) КАК ТоварыНаСкладахОстаткиНачалоДня
        |    
        |    ОБЪЕДИНИТЬ ВСЕ
        |    ВЫБРАТЬ
        |        ТоварыНаСкладахОстаткиКонецДня.Склад,
        |        ТоварыНаСкладахОстаткиКонецДня.Номенклатура,
        |        0 КАК ОстатокНачалоДня,        
        |        ТоварыНаСкладахОстаткиКонецДня.КоличествоОстаток КАК ОстатокКонецДня
        |    ИЗ
        |        РегистрНакопления.ТоварыНаСкладах.Остатки(
        |            &ГраницаИнтервалаКонецДня, Номенклатура В (&массивНоменклатуры)) КАК ТоварыНаСкладахОстаткиКонецДня
        |    ) КАК ВложенныйЗапрос
        |СГРУППИРОВАТЬ ПО
        |    ВложенныйЗапрос.Склад,
        |    ВложенныйЗапрос.Номенклатура
        |ИМЕЮЩИЕ
        |    (СУММА(ВложенныйЗапрос.ОстатокНачалоДня) <> 0 
        |    И СУММА(ВложенныйЗапрос.ОстатокКонецДня) <> 0)
        |УПОРЯДОЧИТЬ ПО
        |    ВложенныйЗапрос.Склад,
        |    ВложенныйЗапрос.Номенклатура
        |";
        
    ЧислоДнейВПериоде = <задаем число дней в периоде, можно числом, можно периодом дат>;
        ДатаНачалаПериода = <задаем первый день периода>;
 
    тзнДанные = Новый ТаблицаЗначений();

    Для НомерДняВПериоде = 0 По ЧислоДнейВПериоде Цикл
        ДатаЗапросаНачалоДня = НачалоДня(ДатаНачалаПериода + НомерДняВПериодеЭкспорта * (60*60*24));
        ДатаЗапросаКонецДня      = КонецДня(ДатаНачалаПериода + НомерДняВПериодеЭкспорта * (60*60*24));
        
        лЗапрос.УстановитьПараметр("ГраницаИнтервалаКонецДня", Новый Граница(ДатаЗапросаНачалоДня , ВидГраницы.Включая));
        лЗапрос.УстановитьПараметр("ГраницаИнтервалаНачалоДня", Новый Граница(ДатаЗапросаКонецДня , ВидГраницы.Включая));

            лЗапрос.УстановитьПараметр("массивНоменклатуры", <задаем номенклатуру запроса>);
            лТЗнДанныеПредварительно = лЗапрос.Выполнить().Выгрузить();
            
            Если тзнДанные.Колонки.Количество() = 0 Тогда
                // формируем набор данных
                тзнДанные = лТЗнДанныеПредварительно.СкопироватьКолонки();
                тзнДанные.Очистить();
                тзнДанные.Колонки.Добавить("ДатаПериод"); // период остатков
            КонецЕсли;
            
            // досчитываем данные и дополняем общую таблицу набора данных
            Для Каждого лСтрокаИсточник Из лТЗнДанныеПредварительно Цикл
                лСтрокаПриемник = тзнДанные.Добавить();
                ЗаполнитьЗначенияСвойств(лСтрокаПриемник, лСтрокаИсточник);
                лСтрокаПриемник.ДатаПериод= Формат(ДатаЗапросаКонецДня, "ДЛФ=Д");
            КонецЦикла;
            
            лТЗнДанныеПредварительно.Очистить();
            
        КонецЦикла;

тзнРезультат = Новый ТаблицаЗначений;
тзнРезультат.Колонки.Добавить("Номенклатура");
тзнРезультат.Колонки.Добавить("ЧислоДнейНаОстатках");

Для НомерДняВПериоде = 0 По ЧислоДнейВПериоде Цикл
  ДеньПериода = КонецДня(ДатаНачалаПериода + НомерДняВПериодеЭкспорта * (60*60*24));
  

  Для Каждого элементМассива Из массивНоменклатуры Цикл
    найденнаяСтрокаНоменклатуры = тзнРезультат.Найти(элементМассива.Значение, "Номенклатура");
    Если найденнаяСтрокаНоменклатуры = Неопределено Тогда
      найденнаяСтрокаНоменклатуры = тзнРезультат.Добавить();
      найденнаяСтрокаНоменклатуры.Номенклатура = элементМассива.Значение;
      найденнаяСтрокаНоменклатуры.ЧислоДнейНаОстатках = 0;
  КонецЕсли;

    массивДанных = тзнДанные.НайтиСтроки(Новый Структура("Номенклатура, ДеньПериод", элементМассива.Значение, ДеньПериода ));
    Если массивДанных.Количество() = 0 Тогда
      // нет остатков за этот день
      Продолжить;
 КонецЕсли;

      найденнаяСтрокаНоменклатуры.ЧислоДнейНаОстатках = найденнаяСтрокаНоменклатуры.ЧислоДнейНаОстатках + 1;
   
  КонецЦикла;
КонецЦикла;

Показать
3. nomad_irk 81 15.06.20 18:56 Сейчас в теме
(2)оно и без запроса в цикле решаемо.
4. VictorRGB2 14 15.06.20 19:02 Сейчас в теме
(3) можно
мне было лень что-то придумывать, дернул кусок работающего кода и дополнил немного по теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот