Как указать время в периоде типового отчета (СтандартныйПериод, СКД) в системах класса WMS, MES, SCADA, АСУ ТП на 1С, построить отчет за период с временем?

13.12.21

Разработка - СКД

Покажем в публикации с открытым кодом, какие нужно сделать небольшие изменения типового стандартного механизма, чтобы можно было указать время или период с временем в любом типовом отчете (на СКД) на базе стандартных подсистем 1С.

Разрабатывая уже 21 год системы управления складами/производством/оборудованием в режиме реального времени (AllCtrl.SCADA, Кронос: WMS, MES), столкнулись с проблемой предоставления пользователю возможности выбора периода времени построения типовых отчетов (с и по какой ему необходимо получить отчет). Типовой подход 1С в библиотеке стандартных подсистем (БСП) позволяет указывать период с начала дня и по конец дня (СтандартныйПериод, СКД), однако для систем класса WMS, SCADA, MES это слишком большой интервал времени для анализа. Поэтому было решено немного подкорректировать типовой механизм/инструмент библиотеки стандартных подсистем.

Итак, вот результат, который мы получим для типового отчета Оборотно-сальдовая ведомость на СКД:

 

Указать период в отчете дата+время

 

Логика наших изменений будет такая - вместо типовых полей по вводу даты стандартного периода добавим наши поля ввода дата+время, скорректируем процедуры изменения и установки интервала периода.

Форма всех отчетов типовой библиотеки стандартных подсистем (БСП 3.1) расположена в общих формах конфигурации и называется - ФормаОтчета. При создании формы на сервере нам необходимо:

1. Понять, какие поля стандартного периода у нас используются в отчете и вынесены на форму отчета (пользовательские настройки, быстрый доступ), запомнить, с какими параметрами схемы компоновки данных (СКД) отчета они связаны (например, НачалоПериода, КонецПериода), какие значения по умолчанию имеют.

2. Очистить выражения по заполнению параметров СКД

Давайте добавим функцию, которая сделает всё вышеописанное :

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

Далее, в стандартной функции заполнения настроек отчета добавим вызов нашей функции:

&НаСервере
Функция НастройкиОтчета(ОтчетОбъект, ОтчетМетаданные, ОтчетПолноеИмя, ПредопределенныеВарианты)
	
	Настройки = ВариантыОтчетов.НастройкиФормыОтчета(Параметры.Отчет, КлючТекущегоВарианта, ОтчетОбъект);
	
	Настройки.Вставить("РазрешеноВыбиратьВарианты", Истина);
	
	//Кронос: WMS начало
	//ИЗМЕНЕНО
	//Настройки.Вставить("СхемаМодифицирована", Ложь);
	//НА
	НастройкиОтчета.Вставить("ПоляСтандартногоПериода", ПолучитьПоляСтандартногоПериода());
	Настройки.Вставить("СхемаМодифицирована", Истина);
	//Кронос: WMS конец
	
	Настройки.Вставить("ПредопределенныеВарианты", ПредопределенныеВарианты);
	Настройки.Вставить("АдресСхемы", АдресСхемыОтчета(ОтчетОбъект));
	Настройки.Вставить("КлючСхемы", "");
	Настройки.Вставить("Контекстный", ЗначениеЗаполнено(КонтекстВарианта));
	Настройки.Вставить("ПолноеИмя", ОтчетПолноеИмя);
	Настройки.Вставить("Наименование", СокрЛП(ОтчетМетаданные.Представление()));
	Настройки.Вставить("ОтчетСсылка", Параметры.Отчет);
	Настройки.Вставить("Подсистема", ФормаПараметры.Подсистема);
	Настройки.Вставить("Внешний", ТипЗнч(Настройки.ОтчетСсылка) = Тип("Строка"));
	Настройки.Вставить("Безопасный", БезопасныйРежим() <> Ложь);
	Настройки.Вставить("ИспользуемыеТаблицы", ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры, "ИспользуемыеТаблицы"));
	
	// Свойства для контекстной настройки отчета.
	Настройки.Вставить("СвойстваРезультата", ВариантыОтчетовСлужебный.СвойстваРезультатаОтчета());
	
	Возврат Настройки;
КонецФункции

Теперь создадим дубли полей Период1ДатаНачала, Период1ДатаОкончания,Период2ДатаНачала, Период2ДатаОкончания на форме, но с составом Дата+Время, пропишем к ним путь в типовых полях на форме:

 

 

Кстати, в более ранних БСП поля создавались программно и там нужно было изменить процедуру ВывестиЭлементыНастройки (общий модуль ОтчетСервер, если кому надо, то можем и для них подсказать как добавить время к дате стандартного периода).

	//Кронос: WMS Добавлено
			БыстрыеНастройкиДобавитьРеквизит(Прочее.ПараметрыЗаполнения, ЗначениеИмя+"_ДатаНачала", 	Новый ОписаниеТипов("Дата", Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
			БыстрыеНастройкиДобавитьРеквизит(Прочее.ПараметрыЗаполнения, ЗначениеИмя+"_ДатаОкончания",  Новый ОписаниеТипов("Дата", Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
		

 

Последнее, что осталось сделать, чтобы наши поля при изменении корректно меняли параметры отчета и наоборот при изменении стандартного периода отчета, чтобы менялись наши поля. В БСП 3.1 за это все отвечает процедура УстановитьПериод (общий модуль ОтчетСервер), подкорректируем её нужным образом:

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

	ОписаниеПараметровСКД = Форма.НастройкиОтчета.ПоляСтандартногоПериода.Получить(СокрЛП(ЭлементПользовательскойНастройки.Параметр));
	Если ТипЗнч(ОписаниеПараметровСКД)=Тип("Структура") И ОписаниеПараметровСКД.Свойство("ДатаНачала") Тогда	                    
		
		ПараметрДатаНачала = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ОписаниеПараметровСКД.ДатаНачала);
		ПараметрДатаНачала.Значение = Форма[Путь+"ДатаНачала"];	
		ПараметрДатаНачала.Использование = Истина;
		
		ПараметрДатаОкончания = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ОписаниеПараметровСКД.ДатаОкончания);
		ПараметрДатаОкончания.Значение = Форма[Путь+"ДатаОкончания"];	
		ПараметрДатаОкончания.Использование = Истина;
		
	КонецЕсли;	
	//Кронос: WMS конец

	ОтчетыКлиентСервер.ОповеститьОИзмененииНастроек(Форма);
КонецПроцедуры

 

UPD. Чтобы корректно при расшифровке указывался период (дата+время) в шапке отчете необходимо еще изменить функцию ИнициализироватьПериод (общий модуль ОтчетыСервер):

Процедура ИнициализироватьПериод(Форма, Индекс)
	ПользовательскиеНастройки = Форма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
	ЭлементНастройки = ПользовательскиеНастройки.Элементы[Индекс];
	
	Путь = Форма.ПутьКДаннымЭлементов.ПоИндексу[Индекс];
	Если ТипЗнч(ЭлементНастройки) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда 
		Форма[Путь] = ЭлементНастройки.Значение;
	Иначе // Элемент отбора.
		Форма[Путь] = ЭлементНастройки.ПравоеЗначение;
	КонецЕсли;
	
	//Кронос: WMS начало
	ОписаниеПараметровСКД = Форма.НастройкиОтчета.ПоляСтандартногоПериода.Получить(СокрЛП(ЭлементНастройки.Параметр));
	Если ТипЗнч(ОписаниеПараметровСКД)=Тип("Структура") И ОписаниеПараметровСКД.Свойство("ДатаНачала") Тогда	                    
		
		ПараметрДатаНачала = Форма.Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ОписаниеПараметровСКД.ДатаНачала);
		
		Форма[Путь].ДатаНачала		= НачалоДня(ПараметрДатаНачала.Значение);
		Форма[Путь+"ДатаНачала"] 	= ПараметрДатаНачала.Значение;
				
		ПараметрДатаОкончания = Форма.Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(ОписаниеПараметровСКД.ДатаОкончания);
		Форма[Путь].ДатаОкончания  	= КонецДня(ПараметрДатаОкончания.Значение);
		Форма[Путь+"ДатаОкончания"] = ПараметрДатаОкончания.Значение;

	КонецЕсли;	
	//Кронос: WMS конец

КонецПроцедуры

Вот собственно и всё, теперь у нас данные в любом отчете отбираются с учётом указанного времени в периоде, также осталась и удобная возможность использования типового указания варианта периода. 

 

Надеюсь, моя публикация была Вам полезна и сэкономит Ваше время, ссылка на все публикации SizovE

Подписывайтесь на мой канал (наверху), будет много интересного бесплатного контента :)

См. также

SALE! 15%

Инструментарий разработчика Роли и права Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159736    876    399    

862

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8741    implecs_team    6    

47

Инструментарий разработчика СКД Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

По выбранной схеме компоновки данных генерирует программный код, который генерирует СКД, аналогичную исходной схеме. Есть дополнительные инструменты для просмотра дерева схемы, сравнение исходной схемы и полученной по коду, а также сравнение изменений в сгенерированном коде для исходной схемы и для измененной.

3 стартмани

05.02.2024    7015    56    obmailok    21    

79

Запросы СКД Программист Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    3159    5    Yashazz    1    

34

СКД WEB-интеграция Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    10844    23    John_d    25    

124

СКД Программист Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

Рассмотрим еще не получивший широкого распространения способ работы с внешними данным в СКД. В процессе обсуждения работы с СКД выяснилось, что многие не знакомы со способом помещения туда временной таблицы, полученной предварительно. Статья будет полезна разработчикам, знакомым с программным созданием СКД.

05.12.2023    8062    PROSTO-1C    15    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1972220 12.07.24 07:34 Сейчас в теме
Добрый день, а есть этот функционал на новую версию БСП 3.1.7.275?
Делаю всё как описано, но при открытии отчета не появляются часы в периоде. На что обратить внимание?
Оставьте свое сообщение