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

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С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    16659    dimanich70    81    

134

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

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

1 стартмани

18.03.2024    3796    3    John_d    11    

57

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

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

12.02.2024    13669    atdonya    23    

56

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

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

30.11.2023    5200    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    13425    YA_418728146    7    

165

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3254    52    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18016    160    sapervodichka    112    

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