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

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

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