gifts2017

Изменения параметра или отбора типа Дата в форме отчета

Опубликовал Сергей Галюк (dj_serega) в раздел Программирование - Универсальные функции

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

Описание

Данные функции реализованы в форме отчета.

Поиск поля для изменения выполняется по "Наименованию" отбора или параметра. Поэтому если имя поля отбора = имени параметра, будет выполнена замена значения параметра.

Пример (нюанс):

Есть параметр - "Дата"
Есть отбор - "Дата"

При изменении отбора будет выполнена корректировка параметра.


Реализация

1. Для реализации текущего функционала нужно создать 11 команд отчета.

УстановитьДатуВКонецГода
УстановитьДатуВКонецДня
УстановитьДатуВКонецМесяца
УстановитьДатуВКонецНедели
УстановитьДатуВКонецПолугодия
УстановитьДатуВНачалоГода
УстановитьДатуВНачалоДня
УстановитьДатуВНачалоМесяца
УстановитьДатуВНачалоНедели
УстановитьДатуВНачалоПолугодия
УстановитьДатуВТекущееВремя

2. Вынести созданные команды в контекстное меню табличного поля "КомпоновщикНастроекПользовательскиеНастройки":

http://infostart.ru/upload/iblock/f33/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA2.PNG

3. В модуль формы отчета вставить следующий листинг:

&НаКлиенте
Процедура ИзменитьПараметрДата(Команда)
	
	// КомпоновщикНастроекПользовательскиеНастройки - это имя табличного поля с настройками отчета
	ТекущиеДанные = Элементы.КомпоновщикНастроекПользовательскиеНастройки.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ИмяКоманды = Команда.Имя;
	
	
	Если Найти(ИмяКоманды, "УстановитьДату") Тогда
		
		ЗначениеИзменено = Ложь;
		
		// Первым делом выполним поиск поля в параметрах отчета
		#Область Изменения_в_параметрах
		ЭлементыПараметров = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы;
		Для Каждого ТекущийЭлементПараметров Из ЭлементыПараметров Цикл
			// Перебот параметров отчета
			
			Если ТекущиеДанные.Настройка = ТекущийЭлементПараметров.Заголовок Тогда
				
				ЭлементыПользовательскихНастроек = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
				Для Каждого ТекущийЭлементПользовательскойНастройки Из ЭлементыПользовательскихНастроек Цикл
					// Перебор элементов пользовательских параметров
					
					Если ТекущийЭлементПараметров.Параметр = ТекущийЭлементПользовательскойНастройки.Параметр Тогда
						// Нам нужен пользовательский параметр
						
						ЗначениеДляПреобразования = Неопределено;
						Если		ТипЗнч(ТекущийЭлементПользовательскойНастройки.Значение) = Тип("Дата") Тогда
							ЗначениеДляПреобразования = ТекущийЭлементПользовательскойНастройки.Значение;
						ИначеЕсли	ТипЗнч(ТекущийЭлементПользовательскойНастройки.Значение) = Тип("СтандартнаяДатаНачала") Тогда
							ЗначениеДляПреобразования = ТекущийЭлементПользовательскойНастройки.Значение.Дата;
						КонецЕсли;
						
						Если Не ЗначениеДляПреобразования = Неопределено Тогда
							
							// Вызов процедуры изменения даты
							ИзменитьЗначениеПараметраДата(ИмяКоманды, ЗначениеДляПреобразования);
							
							ЗначениеИзменено = Истина;
							
							Если		ТипЗнч(ТекущийЭлементПользовательскойНастройки.Значение) = Тип("Дата") Тогда
								ТекущийЭлементПользовательскойНастройки.Значение		= ЗначениеДляПреобразования;
							ИначеЕсли	ТипЗнч(ТекущийЭлементПользовательскойНастройки.Значение) = Тип("СтандартнаяДатаНачала") Тогда
								ТекущийЭлементПользовательскойНастройки.Значение.Дата	= ЗначениеДляПреобразования;
							КонецЕсли;
							
						КонецЕсли;
						
						Прервать;
						
					КонецЕсли;
					
				КонецЦикла;
				
				Прервать;
				
			КонецЕсли;
			
		КонецЦикла;
		#КонецОбласти
		
		// Если в параметрах поле не было найдено, выполним поиск по отборам
		#Область Изменения_в_отборах
		Если Не ЗначениеИзменено Тогда
			
			ЭлементыПользовательскихНастроек = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
			Для Каждого ТекущийЭлементПользовательскойНастройки Из ЭлементыПользовательскихНастроек Цикл
				// Перебор пользовательских настроек
				
				Если ТипЗнч(ТекущийЭлементПользовательскойНастройки) = Тип("ОтборКомпоновкиДанных") Тогда
					// Анализируем только отборы отчета
					
					Для Каждого ТекущийЭлементОтбора Из ТекущийЭлементПользовательскойНастройки.Элементы Цикл
						// Перебираем элементы отборов
						
						Если ВРег(СтрЗаменить(ТекущиеДанные.Настройка, " ", "")) = ВРег(ТекущийЭлементОтбора.ЛевоеЗначение) Тогда
							// Выполняем замену если синоним отбора (тот который в активной строке на форме) равен синониму отбора
							
							ЗначениеДляПреобразования = Неопределено;
							Если		ТипЗнч(ТекущийЭлементОтбора.ПравоеЗначение) = Тип("Дата") Тогда
								ЗначениеДляПреобразования = ТекущийЭлементОтбора.ПравоеЗначение;
							ИначеЕсли	ТипЗнч(ТекущийЭлементОтбора.ПравоеЗначение) = Тип("СтандартнаяДатаНачала") Тогда
								ЗначениеДляПреобразования = ТекущийЭлементОтбора.ПравоеЗначение.Дата;
							КонецЕсли;
							
							Если Не ЗначениеДляПреобразования = Неопределено Тогда
								
								// Вызов процедуры изменения даты
								ИзменитьЗначениеПараметраДата(ИмяКоманды, ЗначениеДляПреобразования);
								
								ЗначениеИзменено = Истина;
								
								Если		ТипЗнч(ТекущийЭлементОтбора.ПравоеЗначение) = Тип("Дата") Тогда
									ТекущийЭлементОтбора.ПравоеЗначение			= ЗначениеДляПреобразования;
								ИначеЕсли	ТипЗнч(ТекущийЭлементОтбора.ПравоеЗначение) = Тип("СтандартнаяДатаНачала") Тогда
									ТекущийЭлементОтбора.ПравоеЗначение.Дата	= ЗначениеДляПреобразования;
								КонецЕсли;
								
							КонецЕсли;
							
							Прервать;
							
						КонецЕсли;
						
					КонецЦикла;
					
					Прервать;
					
				КонецЕсли;
				
			КонецЦикла;
			
		КонецЕсли;
		#КонецОбласти
		
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура ИзменитьЗначениеПараметраДата(ИмяКоманды, ЗначениеДляПреобразования)  
	
	Если		Найти(ИмяКоманды, "ВНачалоГода") Тогда
		
		ЗначениеДляПреобразования = НачалоГода(ЗначениеДляПреобразования);
		
	ИначеЕсли	Найти(ИмяКоманды, "ВНачалоПолугодия") Тогда
		
		Если Месяц(ЗначениеДляПреобразования) >= 7 Тогда
			ЗначениеДляПреобразования = ДобавитьМесяц(НачалоГода(ЗначениеДляПреобразования), 6);
		Иначе
			ЗначениеДляПреобразования = НачалоГода(ЗначениеДляПреобразования);
		КонецЕсли;
		
	ИначеЕсли	Найти(ИмяКоманды, "ВНачалоМесяца") Тогда
		
		ЗначениеДляПреобразования = НачалоМесяца(ЗначениеДляПреобразования);
		
	ИначеЕсли	Найти(ИмяКоманды, "ВНачалоНедели") Тогда
		
		ЗначениеДляПреобразования = НачалоНедели(ЗначениеДляПреобразования);
		
	ИначеЕсли	Найти(ИмяКоманды, "ВНачалоДня") Тогда
		
		ЗначениеДляПреобразования = НачалоДня(ЗначениеДляПреобразования);
		
	ИначеЕсли	Найти(ИмяКоманды, "ВТекущееВремя") Тогда
		
		ЗначениеДляПреобразования = ТекущаяДата();
		
	ИначеЕсли	Найти(ИмяКоманды, "ВКонецДня") Тогда
		
		ЗначениеДляПреобразования = КонецДня(ЗначениеДляПреобразования);
		
	ИначеЕсли	Найти(ИмяКоманды, "ВКонецНедели") Тогда
		
		ЗначениеДляПреобразования = КонецНедели(ЗначениеДляПреобразования);
		
	ИначеЕсли	Найти(ИмяКоманды, "ВКонецМесяца") Тогда
		
		ЗначениеДляПреобразования = КонецМесяца(ЗначениеДляПреобразования);
		
	ИначеЕсли	Найти(ИмяКоманды, "ВКонецПолугодия") Тогда
		
		Если Месяц(ЗначениеДляПреобразования) >= 7 Тогда
			ЗначениеДляПреобразования = КонецГода(ЗначениеДляПреобразования);
		Иначе
			ЗначениеДляПреобразования = ДобавитьМесяц(КонецГода(ЗначениеДляПреобразования), -6);
		КонецЕсли;
		
	ИначеЕсли	Найти(ИмяКоманды, "ВКонецГода") Тогда
		
		ЗначениеДляПреобразования = КонецГода(ЗначениеДляПреобразования);
		
	КонецЕсли;
	
КонецПроцедуры // ИзменитьЗначениеПараметраДата

4. Подвязать созданные команды под процедуру "ИзменитьПараметрДата"


После проведенных действий сдвиг даты в конец периода можно осуществить в несколько кликов.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Дмитрий Шпаковский (Godman) 12.02.16 14:14
Никогда не мог понять - почему в стандартном периоде есть "начало дня", но нет "конец дня"? Лично мне "начало дня" ни разу не был нужен, зато я должен каждый раз что-то допиливать чтобы получить конец дня.
2. Сергей Галюк (dj_serega) 12.02.16 15:14
(1) Godman, Аналогично :(
Максимум что можно вытянуть это "Начало текущего дня - Начало следующего дня". Но в таком случаем попадают документы на "00:00:00".
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа