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

08.02.16

Разработка - Универсальные функции

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

Описание

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

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

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

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

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


Реализация

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

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

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

//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С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5403    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    46297    dimanich70    83    

164

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6841    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57351    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8607    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22758    YA_418728146    8    

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