Конфигурация: Trade (10.3.29.1) (http://v8.1c.ru/trade/), версия: 8.3.11.2867, обычные формы.
Добрый день. Подскажите пожалуйста идею, метод или способ, как можно реализовать следующее задание: Нужно подсчитать сколько дней номенклатура пролежала на складе за полтора года. Учитываются полные (то есть на начало дня есть остаток и на конец дня), рабочие дни. Также рабочим днём считается суббота. Но выходные (воскресенье) и праздничные не считаются.
лЗапрос = Новый Запрос();
лЗапрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Номенклатура,
| СУММА(ВложенныйЗапрос.ОстатокНачалоДня) КАК СвободныйОстатокНачалоДня,
| СУММА(ВложенныйЗапрос.ОстатокКонецДня) КАК СвободныйОстатокКонецДня
|ИЗ (
| ВЫБРАТЬ
| ТоварыНаСкладахОстаткиНачалоДня.Склад,
| ТоварыНаСкладахОстаткиНачалоДня.Номенклатура,
| ТоварыНаСкладахОстаткиНачалоДня.КоличествоОстаток КАК ОстатокНачалоДня,
| 0 КАК ОстатокКонецДня
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &ГраницаИнтервалаНачалоДня, Номенклатура В (&массивНоменклатуры)) КАК ТоварыНаСкладахОстаткиНачалоДня
|
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ
| ТоварыНаСкладахОстаткиКонецДня.Склад,
| ТоварыНаСкладахОстаткиКонецДня.Номенклатура,
| 0 КАК ОстатокНачалоДня,
| ТоварыНаСкладахОстаткиКонецДня.КоличествоОстаток КАК ОстатокКонецДня
| ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| &ГраницаИнтервалаКонецДня, Номенклатура В (&массивНоменклатуры)) КАК ТоварыНаСкладахОстаткиКонецДня
| ) КАК ВложенныйЗапрос
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Номенклатура
|ИМЕЮЩИЕ
| (СУММА(ВложенныйЗапрос.ОстатокНачалоДня) <> 0
| И СУММА(ВложенныйЗапрос.ОстатокКонецДня) <> 0)
|УПОРЯДОЧИТЬ ПО
| ВложенныйЗапрос.Склад,
| ВложенныйЗапрос.Номенклатура
|";
ЧислоДнейВПериоде = <задаем число дней в периоде, можно числом, можно периодом дат>;
ДатаНачалаПериода = <задаем первый день периода>;
тзнДанные = Новый ТаблицаЗначений();
Для НомерДняВПериоде = 0 По ЧислоДнейВПериоде Цикл
ДатаЗапросаНачалоДня = НачалоДня(ДатаНачалаПериода + НомерДняВПериодеЭкспорта * (60*60*24));
ДатаЗапросаКонецДня = КонецДня(ДатаНачалаПериода + НомерДняВПериодеЭкспорта * (60*60*24));
лЗапрос.УстановитьПараметр("ГраницаИнтервалаКонецДня", Новый Граница(ДатаЗапросаНачалоДня , ВидГраницы.Включая));
лЗапрос.УстановитьПараметр("ГраницаИнтервалаНачалоДня", Новый Граница(ДатаЗапросаКонецДня , ВидГраницы.Включая));
лЗапрос.УстановитьПараметр("массивНоменклатуры", <задаем номенклатуру запроса>);
лТЗнДанныеПредварительно = лЗапрос.Выполнить().Выгрузить();
Если тзнДанные.Колонки.Количество() = 0 Тогда
// формируем набор данных
тзнДанные = лТЗнДанныеПредварительно.СкопироватьКолонки();
тзнДанные.Очистить();
тзнДанные.Колонки.Добавить("ДатаПериод"); // период остатков
КонецЕсли;
// досчитываем данные и дополняем общую таблицу набора данных
Для Каждого лСтрокаИсточник Из лТЗнДанныеПредварительно Цикл
лСтрокаПриемник = тзнДанные.Добавить();
ЗаполнитьЗначенияСвойств(лСтрокаПриемник, лСтрокаИсточник);
лСтрокаПриемник.ДатаПериод= Формат(ДатаЗапросаКонецДня, "ДЛФ=Д");
КонецЦикла;
лТЗнДанныеПредварительно.Очистить();
КонецЦикла;
тзнРезультат = Новый ТаблицаЗначений;
тзнРезультат.Колонки.Добавить("Номенклатура");
тзнРезультат.Колонки.Добавить("ЧислоДнейНаОстатках");
Для НомерДняВПериоде = 0 По ЧислоДнейВПериоде Цикл
ДеньПериода = КонецДня(ДатаНачалаПериода + НомерДняВПериодеЭкспорта * (60*60*24));
Для Каждого элементМассива Из массивНоменклатуры Цикл
найденнаяСтрокаНоменклатуры = тзнРезультат.Найти(элементМассива.Значение, "Номенклатура");
Если найденнаяСтрокаНоменклатуры = Неопределено Тогда
найденнаяСтрокаНоменклатуры = тзнРезультат.Добавить();
найденнаяСтрокаНоменклатуры.Номенклатура = элементМассива.Значение;
найденнаяСтрокаНоменклатуры.ЧислоДнейНаОстатках = 0;
КонецЕсли;
массивДанных = тзнДанные.НайтиСтроки(Новый Структура("Номенклатура, ДеньПериод", элементМассива.Значение, ДеньПериода ));
Если массивДанных.Количество() = 0 Тогда
// нет остатков за этот день
Продолжить;
КонецЕсли;
найденнаяСтрокаНоменклатуры.ЧислоДнейНаОстатках = найденнаяСтрокаНоменклатуры.ЧислоДнейНаОстатках + 1;
КонецЦикла;
КонецЦикла;