Управляемые формы, кнопка выбора периода

1. nick_krsk 19 31.07.12 10:37 Сейчас в теме
В документе есть реквизиты НачалоПериода и ОкончаниеПериода.
Подскажите, как на управляемой форме разместить кнопку выбора периода?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Поручик 4674 31.07.12 10:41 Сейчас в теме
(1) Делаешь реквизит формы типа СтандартныйПериод и перетаскиваешь на форму.
user1619761; Moonlitolga; ivan1703; GonziK_KIV; stoptime; user979239; fortorgpro; Vida; volex; jmi; classics; adhocprog; ekomova; Small sa; d_bat; arccos6pi; nick_krsk; +17 Ответить
4. nick_krsk 19 31.07.12 10:46 Сейчас в теме
(2) А как завязать этот реквизит формы с реквизитами документа (НачалоПериода и ОкончаниеПериода)?
5. sanja 153 31.07.12 10:50 Сейчас в теме
(4) дай им такие же имена
6. nick_krsk 19 31.07.12 10:53 Сейчас в теме
(5) Это как? Нельзя в элементе СтандартныйПериод указать, что ДатаНачала связана с такам-то реквизитом, а дата окончания с таким-то?
3. sanja 153 31.07.12 10:44 Сейчас в теме
период в управляемых формах отстой. Выпиливал из БП корп 3.0, где-то здесь совет прочитал
7. Akuji 22 31.07.12 10:56 Сейчас в теме
А использовать реквизиты стандартного периода ДатаНач и кон? зачем еще отдельно создовать
8. nick_krsk 19 31.07.12 10:57 Сейчас в теме
(7) Ну чтобы сохранять. Есть документ счет, в нем период, за который он выставлен.
10. Akuji 22 31.07.12 11:07 Сейчас в теме
(8) Karambol,
ну при изменении стандартно присвоить:
= СтандПериод.ДатаНачала;
Small sa; nick_krsk; +2 Ответить
11. nick_krsk 19 31.07.12 11:15 Сейчас в теме
(10) Спасибо! А как сделать, чтобы реквизит формы СтандПериод заполнялся из реквизита документа? В ПриОткрытии прописать заполнение?
9. Ionmuerto 31.07.12 11:00 Сейчас в теме
Пример из Конфигурации БП 3.0:
1. Добавить в Перечисления "ДоступныеПериодыОтчета"
Значения:
День
Неделя
Декада
Месяц
Квартал
Полугодие
Год
ПроизвольныйПериод

2. Добавить реквизит в "Отчет":
- "НачалоПериода" (Дата)
- "КонецПериода" (Дата)

3. Добавить в реквизит формы:
- "ВидПериода" (ПеречислениеСсылка.ДоступныеПериодыОтчета)
- "Период" (Строка)

3. На форме добавить:
- "ВидПериода" поле ввода путь к данным "ВидПериода"
- "НачалоПериода" поле ввода путь к данным "Отчет.НачалоПериода"
- "КонецПериода" поле ввода путь к данным "Отчет.КонецПериода"
- "Период" поле ввода путь к данным "Период"


4. В модуле "ФормаОтчета":

&НаКлиенте
Процедура ВидПериодаПриИзменении(Элемент)
	
	ВыборПериодаКлиент.ВидПериодаПриИзменении(Элемент, ВидПериода, Отчет.НачалоПериода, Отчет.КонецПериода, Период);
	ВыборПериодаКлиентСервер.ПереключитьТекущуюСтраницуВыбораПериода(
		Элементы.ГруппаПоляВводаПериода, Элементы.ГруппаПроизвольныйПериод, 
		Элементы.ГруппаПериодПоВидам, ВидПериода);
	
	ОбновитьТекстЗаголовка(ЭтаФорма);
	
	Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеАктуальность");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодПриИзменении(Элемент)
	
	ВыборПериодаКлиент.ПериодПриИзменении(Элемент, Период, Отчет.НачалоПериода, Отчет.КонецПериода);
	
	ОбновитьТекстЗаголовка(ЭтаФорма);
	
	Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеАктуальность");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
	
	ВыборПериодаКлиент.ПериодНачалоВыбораИзСписка(ЭтаФорма, Элемент, СтандартнаяОбработка, 
		ВидПериода, Период, Отчет.НачалоПериода, Отчет.КонецПериода);
	
	ОбновитьТекстЗаголовка(ЭтаФорма);
	
	Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеАктуальность");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	
	ВыборПериодаКлиент.ПериодОбработкаВыбора(
		Элемент, ВыбранноеЗначение, СтандартнаяОбработка,
		ВидПериода, Период, Отчет.НачалоПериода, Отчет.КонецПериода);
		
	ОбновитьТекстЗаголовка(ЭтаФорма);
	
	Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеАктуальность");
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка)
	
	ВыборПериодаКлиент.ПериодАвтоПодбор(
		Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка,
		ВидПериода, Период, Отчет.НачалоПериода, Отчет.КонецПериода);
	
КонецПроцедуры

&НаКлиенте
Процедура ПериодОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка)
	
	ВыборПериодаКлиент.ПериодОкончаниеВводаТекста(
		Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка,
		ВидПериода, Период, Отчет.НачалоПериода, Отчет.КонецПериода);
	
КонецПроцедуры

&НаКлиенте
Процедура НачалоПериодаПриИзменении(Элемент)
	
	ОбновитьТекстЗаголовка(ЭтаФорма);
	
	Если Не ЗначениеЗаполнено(ИдентификаторЗадания) Тогда
		ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеАктуальность");
	КонецЕсли;
	
КонецПроцедуры


Листинг ОбщийМодуль.ВыборПериодаКлиент:

////////////////////////////////////////////////////////////­////////////////////
// Функции и процедуры обеспечения выбора периода.
//  
////////////////////////////////////////////////////////////­////////////////////

////////////////////////////////////////////////////////////­////////////////////
// ПРОГРАММНЫЙ ИНТЕРФЕЙС

Процедура ВидПериодаПриИзменении(Элемент, Знач ВидПериода, НачалоПериода, КонецПериода, Период) Экспорт
	
	Если ВидПериода <> ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод") Тогда
		Если ЗначениеЗаполнено(НачалоПериода) Тогда
			НачалоПериода = ВыборПериодаКлиентСервер.НачалоПериодаОтчета(ВидПериода, НачалоПериода);
			КонецПериода  = ВыборПериодаКлиентСервер.КонецПериодаОтчета(ВидПериода, НачалоПериода);
		Иначе
			НачалоПериода = Неопределено;
			КонецПериода  = Неопределено;
		КонецЕсли;
		
		Список = ВыборПериодаКлиентСервер.ПолучитьСписокПериодов(НачалоПериода, ВидПериода);
		ЭлементСписка = Список.НайтиПоЗначению(НачалоПериода);
		Если ЭлементСписка <> Неопределено тогда
			Период = ЭлементСписка.Представление;
		Иначе
			Период = Неопределено;
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

Процедура ПериодПриИзменении(Элемент, Знач Период, НачалоПериода, КонецПериода) Экспорт
	
	Если ПустаяСтрока(Период) Тогда
		НачалоПериода = Неопределено;
		КонецПериода  = Неопределено;
	КонецЕсли;
	
КонецПроцедуры

Процедура ПериодНачалоВыбораИзСписка(Форма, Элемент, СтандартнаяОбработка, ВидПериода, Период, НачалоПериода, КонецПериода) Экспорт
	
	Если НачалоПериода = '00010101' Тогда
		НачалоПериода = ВыборПериодаКлиентСервер.НачалоПериодаОтчета(ВидПериода, ТекущаяДата());
	КонецЕсли;
	ВыбранныйПериод      = ВыбратьПериодОтчета(Форма, Элемент, СтандартнаяОбработка, ВидПериода, НачалоПериода);
	СтандартнаяОбработка = Ложь;
	Если ВыбранныйПериод = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Период = ВыбранныйПериод.Представление;
	
	НачалоПериода = ВыбранныйПериод.Значение;
	КонецПериода  = ВыборПериодаКлиентСервер.КонецПериодаОтчета(ВидПериода, ВыбранныйПериод.Значение);
	
КонецПроцедуры

Процедура ПериодОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка, ВидПериода, Период, НачалоПериода, КонецПериода) Экспорт
	
	Если ТипЗнч(ВыбранноеЗначение) = Тип("Дата") Тогда
		НачалоПериода = ВыборПериодаКлиентСервер.НачалоПериодаОтчета(ВидПериода, ВыбранноеЗначение);
		КонецПериода  = ВыборПериодаКлиентСервер.КонецПериодаОтчета(ВидПериода, ВыбранноеЗначение);
		
		ВыбранноеЗначение = ВыборПериодаКлиентСервер.ПолучитьПредставлениеПериодаОтчета(
			ВидПериода, НачалоПериода, КонецПериода);
			
		Период = ВыбранноеЗначение;
		СтандартнаяОбработка = Ложь;
	КонецЕсли;
	
КонецПроцедуры

Процедура ПериодАвтоПодбор(Элемент, Текст, ДанныеВыбора, Ожидание, СтандартнаяОбработка, ВидПериода, Период, НачалоПериода, КонецПериода) Экспорт
	
	ДанныеВыбора = ВыборПериодаКлиентСервер.ПодобратьПериодОтчета(ВидПериода, Текст, 
		НачалоПериода, КонецПериода);
		
	СтандартнаяОбработка = Ложь;
	
КонецПроцедуры

Процедура ПериодОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка, ВидПериода, Период, НачалоПериода, КонецПериода) Экспорт
	
	Если ПустаяСтрока(Текст) Тогда
		Возврат;
	КонецЕсли;
	
	ДанныеВыбора = ВыборПериодаКлиентСервер.ПодобратьПериодОтчета(ВидПериода, Текст, 
		НачалоПериода, КонецПериода);
		
	СтандартнаяОбработка = Ложь;	
	
КонецПроцедуры


////////////////////////////////////////////////////////////­////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

Функция ВыбратьПериодОтчета(Форма, Элемент, СтандартнаяОбработка, ВидПериода, НачалоПериода)
	
	Список = ВыборПериодаКлиентСервер.ПолучитьСписокПериодов(НачалоПериода, ВидПериода);
	Если Список.Количество() = 0 Тогда
		СтандартнаяОбработка = Ложь;
		Возврат Неопределено;
	КонецЕсли;
	
	ЭлементСписка = Список.НайтиПоЗначению(НачалоПериода);
	ВыбранныйПериод = Форма.ВыбратьИзСписка(Список, Элемент, ЭлементСписка);
	
	Если ВыбранныйПериод = Неопределено тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Индекс = Список.Индекс(ВыбранныйПериод);
	Если Индекс = 0 ИЛИ Индекс = Список.Количество() - 1 тогда
		ВыбранныйПериод = ВыбратьПериодОтчета(Форма, Элемент, СтандартнаяОбработка, ВидПериода, ВыбранныйПериод.Значение);
	КонецЕсли;
	
	Возврат ВыбранныйПериод;
	
КонецФункции



Листинг ОбщийМодуль.ВыборПериодаКлиентСервер:

Процедура УстановитьСостояниеПоляТабличногоДокумента(ПолеТабличногоДокумента, Состояние = "НеИспользовать") Экспорт
	
	Если ТипЗнч(ПолеТабличногоДокумента) = Тип("ПолеФормы") 
		И ПолеТабличногоДокумента.Вид = ВидПоляФормы.ПолеТабличногоДокумента Тогда
		ОтображениеСостояния = ПолеТабличногоДокумента.ОтображениеСостояния;
		Если ВРег(Состояние) = "НЕИСПОЛЬЗОВАТЬ" Тогда
			ОтображениеСостояния.Видимость                      = Ложь;
			ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
			ОтображениеСостояния.Картинка                       = Новый Картинка;
			ОтображениеСостояния.Текст                          = "";
		ИначеЕсли ВРег(Состояние) = "НЕАКТУАЛЬНОСТЬ" Тогда
			ОтображениеСостояния.Видимость                      = Истина;
			ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.Неактуальность;
			ОтображениеСостояния.Картинка                       = Новый Картинка;
			ОтображениеСостояния.Текст                          = НСтр("ru = 'Отчет не сформирован. Нажмите ""Сформировать"" для получения отчета.'");;
		ИначеЕсли ВРег(Состояние) = "ФОРМИРОВАНИЕОТЧЕТА" Тогда  
			ОтображениеСостояния.Видимость                      = Истина;
			ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.Неактуальность;
			ОтображениеСостояния.Картинка                       = БиблиотекаКартинок.ДлительнаяОперация48;
			ОтображениеСостояния.Текст                          = НСтр("ru = 'Отчет формируется...'");
		Иначе
			ВызватьИсключение(НСтр("ru = 'Недопустимое значение параметра (параметр номер ''2'')'"));
		КонецЕсли;
	Иначе
		ВызватьИсключение(НСтр("ru = 'Недопустимое значение параметра (параметр номер ''1'')'"));
	КонецЕсли;
	
КонецПроцедуры



Листинг ОбщийМодуль.ВыборПериодаКлиентСервер:
// Заполняет переданный в параметрах список выбора 
// 
// Параметры: 
// МинимальныйПериод   - Перечисление.ДоступныеПериодыОтчета - минимальный вид периода, 
//                       начиная с которого необходимо включать остальные виды периода по возрастанию.
// СписокВыбора        - СписокЗначений - в списке возвращаются заполненный список выбора
// ЗначениеПоУмолчанию - Перечисление.ДоступныеПериодыОтчета - в параметре возвращает вид периода по умолчанию.
//
Процедура ЗаполнитьСписокВыбораВидПериода(Знач МинимальныйПериод, СписокВыбора, ЗначениеПоУмолчанию = Неопределено) Экспорт
	
	Если ТипЗнч(СписокВыбора) <> Тип("СписокЗначений") тогда
		Возврат;
	КонецЕсли;
	
	СписокДоступныхПериодов = ПолучитьСписокДоступныхПериодов();
	
	ЭлементСписка = СписокДоступныхПериодов.НайтиПоЗначению(МинимальныйПериод);
	Если ЭлементСписка <> Неопределено Тогда
		ИндексЭлемента = СписокДоступныхПериодов.Индекс(ЭлементСписка);
		Для Сч = ИндексЭлемента По СписокДоступныхПериодов.Количество() - 1 Цикл
			Период = СписокДоступныхПериодов.Получить(Сч);
			СписокВыбора.Добавить(Период.Значение, Период.Представление);
		КонецЦикла;
		Если Не ЗначениеЗаполнено(ЗначениеПоУмолчанию) Тогда
			ЗначениеПоУмолчанию = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод");
		КонецЕсли;
	Иначе
		Возврат; 
	КонецЕсли;
	
КонецПроцедуры

Функция НачалоПериодаОтчета(ВидПериода, ДатаПериода) Экспорт
	
	НачалоПериода = ДатаПериода;
	
	Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Год") Тогда
		НачалоПериода = НачалоГода(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Полугодие") Тогда
		Если Месяц(ДатаПериода) > 6 Тогда
			НачалоПериода = Дата(Год(ДатаПериода), 7, 1);
		Иначе
			НачалоПериода = Дата(Год(ДатаПериода), 1, 1);
		КонецЕсли;
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Квартал") Тогда
		НачалоПериода = НачалоКвартала(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Месяц") Тогда
		НачалоПериода = НачалоМесяца(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Декада") Тогда
		Если День(ДатаПериода) <= 10 Тогда
			НачалоПериода = Дата(Год(ДатаПериода), Месяц(ДатаПериода), 1);
		ИначеЕсли День(ДатаПериода) > 10 И День(ДатаПериода) <= 20 Тогда
			НачалоПериода = Дата(Год(ДатаПериода), Месяц(ДатаПериода), 11);
		Иначе
			НачалоПериода = Дата(Год(ДатаПериода), Месяц(ДатаПериода), 21);
		КонецЕсли;
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Неделя") Тогда
		НачалоПериода = НачалоНедели(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.День") Тогда
		НачалоПериода = НачалоДня(ДатаПериода);
		
	КонецЕсли;
		
	Возврат НачалоПериода;
	
КонецФункции
 
Функция КонецПериодаОтчета(ВидПериода, ДатаПериода) Экспорт
	
	КонецПериода = ДатаПериода;
	
	Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Год") Тогда
		КонецПериода = КонецГода(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Полугодие") Тогда
		Если Месяц(ДатаПериода) > 6 Тогда
			КонецПериода = КонецГода(ДатаПериода);
		Иначе
			КонецПериода = КонецДня(Дата(Год(ДатаПериода), 6, 30));
		КонецЕсли;
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Квартал") Тогда
		КонецПериода = КонецКвартала(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Месяц") Тогда
		КонецПериода = КонецМесяца(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Декада") Тогда
		Если День(ДатаПериода) <= 10 Тогда
			КонецПериода = КонецДня(Дата(Год(ДатаПериода), Месяц(ДатаПериода), 10));
		ИначеЕсли День(ДатаПериода) > 10 И День(ДатаПериода) <= 20 Тогда
			КонецПериода = КонецДня(Дата(Год(ДатаПериода), Месяц(ДатаПериода), 20));
		Иначе
			КонецПериода = КонецМесяца(ДатаПериода);
		КонецЕсли;
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Неделя") Тогда
		КонецПериода = КонецНедели(ДатаПериода);
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.День") Тогда
		КонецПериода = КонецДня(ДатаПериода);
		
	КонецЕсли;
		
	Возврат КонецПериода;
	
КонецФункции

Функция ПолучитьСписокПериодов(Знач НачалоПериода, Знач ВидПериода) Экспорт
	                                                                                                  
	СписокПериодов = Новый СписокЗначений;
	Если НачалоПериода = '00010101' Тогда
		Возврат Новый СписокЗначений;
	Иначе
		ЗначениеНачалоПериода = НачалоПериода;
	КонецЕсли;
	
	Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Год") Тогда
		ТекущийГод = Год(ЗначениеНачалоПериода);
		СписокПериодов.Добавить(Дата(ТекущийГод - 7, 1, 1), "Предыдущие года");
		Для Сч = ТекущийГод По ТекущийГод + 6 Цикл
			СписокПериодов.Добавить(Дата(Сч, 1, 1), Формат(Сч, "ЧГ=0"));
		КонецЦикла;
		СписокПериодов.Добавить(Дата(ТекущийГод + 7, 1, 1), "Последующие года");
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Полугодие") Тогда
		ТекущийГод = Год(ЗначениеНачалоПериода);
		СписокПериодов.Добавить(Дата(ТекущийГод - 1, 1, 1), Формат(ТекущийГод - 1, "ЧГ=0") + "...");
		Для Сч = ТекущийГод По ТекущийГод + 1 Цикл
			СписокПериодов.Добавить(Дата(Сч, 1, 1), "I полугодие " + Формат(Сч, "ЧГ=0"));
			СписокПериодов.Добавить(Дата(Сч, 7, 1), "II полугодие " + Формат(Сч, "ЧГ=0"));
		КонецЦикла;
		СписокПериодов.Добавить(Дата(ТекущийГод + 2, 1, 1), Формат(ТекущийГод + 2, "ЧГ=0") + "...");
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Квартал") Тогда
		ТекущийГод = Год(ЗначениеНачалоПериода);
		СписокПериодов.Добавить(Дата(ТекущийГод - 1, 1, 1), Формат(ТекущийГод - 1, "ЧГ=0") + "...");
		Для Сч = ТекущийГод По ТекущийГод Цикл
			СписокПериодов.Добавить(Дата(Сч, 1, 1), "I квартал " + Формат(Сч, "ЧГ=0"));
			СписокПериодов.Добавить(Дата(Сч, 4, 1), "II квартал " + Формат(Сч, "ЧГ=0"));
			СписокПериодов.Добавить(Дата(Сч, 7, 1), "III квартал " + Формат(Сч, "ЧГ=0"));
			СписокПериодов.Добавить(Дата(Сч, 10, 1), "IV квартал " + Формат(Сч, "ЧГ=0"));
		КонецЦикла;
		СписокПериодов.Добавить(Дата(ТекущийГод + 1, 1, 1), Формат(ТекущийГод + 1, "ЧГ=0") + "...");
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Месяц") Тогда
		ТекущийГод = Год(ЗначениеНачалоПериода);
		СписокПериодов.Добавить(Дата(ТекущийГод - 1, 1, 1), Формат(ТекущийГод - 1, "ЧГ=0") + "...");
		Для Сч = 1 По 12 Цикл
			СписокПериодов.Добавить(Дата(ТекущийГод, Сч, 1), Формат(Дата(ТекущийГод, Сч, 1), "ДФ='MMMM yyyy'"));
		КонецЦикла;
		СписокПериодов.Добавить(Дата(ТекущийГод + 1, 1, 1), Формат(ТекущийГод + 1, "ЧГ=0") + "...");

	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Декада") Тогда
		ТекущийГод   = Год(ЗначениеНачалоПериода);
		ТекущийМесяц = Месяц(ЗначениеНачалоПериода);
		
		СчМесяц = ?(ТекущийМесяц - 4 < 1, 12 + ТекущийМесяц - 4, ТекущийМесяц - 4);
		СчГод   = ?(ТекущийМесяц - 4 < 1, ТекущийГод - 1       , ТекущийГод);
		Сч = 6;
		
		Период = Дата(?(СчМесяц <> 1, СчГод, СчГод - 1), ?(СчМесяц > 1, СчМесяц - 1, 12), 1);
		СписокПериодов.Добавить(Период, Формат(Период, "ДФ='MMMM yyyy'") + "...");
		Пока Сч >0 Цикл
			СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 1),  "I дек. " + Нрег(Формат(Дата(СчГод, СчМесяц, 1), "ДФ='MMMM yyyy'")));
			СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 11), "II дек. " + Нрег(Формат(Дата(СчГод, СчМесяц, 1), "ДФ='MMMM yyyy'")));
			СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 21), "III дек. " + Нрег(Формат(Дата(СчГод, СчМесяц, 1), "ДФ='MMMM yyyy'")));
			СчМесяц = СчМесяц + 1;
			Если СчМесяц > 12 Тогда
				СчГод = СчГод + 1;
				СчМесяц = 1;
			КонецЕсли;
			Сч = Сч - 1;
		КонецЦикла;
		СписокПериодов.Добавить(Дата(СчГод, СчМесяц, 1), Формат(Дата(СчГод, СчМесяц, 1), "ДФ='MMMM yyyy'") + "...");
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Неделя") Тогда
		НачалоНедели = НачалоНедели(ЗначениеНачалоПериода) - 21 * 86400;
		
		СписокПериодов.Добавить(НачалоНедели - 7 * 86400, "Пред. недели ...");
		Для Сч = 0 По 6 Цикл
			НачНедели = НачалоНедели + 7 * Сч * 86400;  
			КонНедели = КонецНедели(НачНедели);
			СписокПериодов.Добавить(НачНедели, Формат(НачНедели, "ДФ=dd.MM") + " - " + Формат(КонНедели, "ДФ=dd.MM"));
		КонецЦикла;
		СписокПериодов.Добавить(НачалоНедели + 7 * 86400, "След. недели ..." );
		
	ИначеЕсли ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.День") Тогда
		КонецНедели   = КонецНедели(ЗначениеНачалоПериода);
		ДатаДняНедели = НачалоНедели(ЗначениеНачалоПериода);
		
		СписокПериодов.Добавить(ДатаДняНедели - 86400, "Предыдущая неделя");
		
		Пока ДатаДняНедели < КонецНедели Цикл
			ДеньНед = ДеньНедели(ДатаДняНедели);
			
			СписокПериодов.Добавить(ДатаДняНедели, Формат(ДатаДняНедели, "ДФ='dd MMMM yyyy (ddd)'"));
			
			ДатаДняНедели = ДатаДняНедели + 86400;
		КонецЦикла;
		
		СписокПериодов.Добавить(КонецНедели + 1, "Следующая неделя");
	КонецЕсли;
		
	Возврат СписокПериодов;
	
КонецФункции

Функция ПолучитьВидПериода(Знач НачалоПериода, Знач КонецПериода, Знач МинимальныйВидПериода = Неопределено) Экспорт
	
	ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод");
	Если ЗначениеЗаполнено(НачалоПериода) И ЗначениеЗаполнено(КонецПериода) Тогда
		Начало = НачалоДня(НачалоПериода);
		Конец  = КонецДня(КонецПериода);
		Если Начало = НачалоДня(НачалоПериода) И Конец = КонецДня(НачалоПериода) Тогда
			ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.День");
		ИначеЕсли Начало = НачалоНедели(НачалоПериода) И Конец = КонецНедели(НачалоПериода) Тогда
			ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Неделя");
		ИначеЕсли Начало = НачалоМесяца(НачалоПериода) И Конец = КонецМесяца(НачалоПериода) Тогда
			ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Месяц");
		ИначеЕсли Начало = НачалоКвартала(НачалоПериода) И Конец = КонецКвартала(НачалоПериода) Тогда
			ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Квартал");
		ИначеЕсли Начало = НачалоГода(НачалоПериода) И Конец = КонецГода(НачалоПериода) Тогда
			ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Год");
		ИначеЕсли Начало = Дата(Год(НачалоПериода), 1, 1) И Конец = Дата(Год(НачалоПериода), 6, 30, 23, 59, 59)
			ИЛИ Начало = Дата(Год(НачалоПериода), 7, 1) И Конец = Дата(Год(НачалоПериода), 12, 31, 23, 59, 59) Тогда
			ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Полугодие");
		ИначеЕсли Начало = Дата(Год(НачалоПериода), Месяц(НачалоПериода), 1) 
			И Конец = Дата(Год(НачалоПериода), Месяц(НачалоПериода), 10, 23, 59, 59)
			ИЛИ Начало = Дата(Год(НачалоПериода), Месяц(НачалоПериода), 11) 
			И Конец = Дата(Год(НачалоПериода), Месяц(НачалоПериода), 20, 23, 59, 59)
			ИЛИ Начало = Дата(Год(НачалоПериода), Месяц(НачалоПериода), 1) 
			И Конец = КонецМесяца(НачалоПериода)	Тогда
			ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.Декада");
		КонецЕсли;
	КонецЕсли;
	
	Если ЗначениеЗаполнено(МинимальныйВидПериода) Тогда
		СписокДоступныхПериодов = ПолучитьСписокДоступныхПериодов();
		
		ПозицияВидПериода            = СписокДоступныхПериодов.Индекс(СписокДоступныхПериодов.НайтиПоЗначению(ВидПериода));
		ПозицияМинимальныйВидПериода = СписокДоступныхПериодов.Индекс(СписокДоступныхПериодов.НайтиПоЗначению(МинимальныйВидПериода));		
		
		Если ПозицияВидПериода < ПозицияМинимальныйВидПериода Тогда
			ВидПериода = МинимальныйВидПериода;
		КонецЕсли;
	КонецЕсли;
	
	Возврат ВидПериода;
	
КонецФункции

Функция ПолучитьПредставлениеПериодаОтчета(ВидПериода, Знач НачалоПериода, Знач КонецПериода) Экспорт
	
	Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод") Тогда	
		Если Не ЗначениеЗаполнено(НачалоПериода) И Не ЗначениеЗаполнено(КонецПериода) Тогда
			Возврат "";
		Иначе
			Возврат Формат(НачалоПериода, "ДФ=dd.MM.yy") + " - " + Формат(КонецПериода, "ДФ=dd.MM.yy");
		КонецЕсли;
	Иначе
		РасчетныйВидПериода = ПолучитьВидПериода(НачалоПериода, КонецПериода);
		Если РасчетныйВидПериода <> ВидПериода И ЗначениеЗаполнено(НачалоПериода) Тогда
			ВидПериода = РасчетныйВидПериода;
		КонецЕсли;
		
		Список = ПолучитьСписокПериодов(НачалоПериода, ВидПериода);
		
		ЭлементСписка = Список.НайтиПоЗначению(НачалоПериода);
		Если ЭлементСписка <> Неопределено тогда
			Возврат ЭлементСписка.Представление;
		Иначе
			Возврат "";
		КонецЕсли;
	КонецЕсли;
	
	Возврат "";
	
КонецФункции

Процедура ПереключитьТекущуюСтраницуВыбораПериода(Страницы, СтраницаПроизвольныйПериод, СтраницаПериодПоВидам, ВидПериода) Экспорт
	
	Если ВидПериода = ПредопределенноеЗначение("Перечисление.ДоступныеПериодыОтчета.ПроизвольныйПериод") Тогда
		Страницы.ТекущаяСтраница = СтраницаПроизвольныйПериод;
	Иначе
		Страницы.ТекущаяСтраница = СтраницаПериодПоВидам;
	КонецЕсли;
	
КонецПроцедуры

Функция ПолучитьМассивСловПредставляющихПериодОтчета(Текст) Экспорт
	
	МассивСлов = Новый Массив;
	ПоисковыйТекст = НРег(СокрЛП(Текст));
	ПозицияРазделителя = 1;
	Пока ПоисковыйТекст <> "" Цикл
		Слово = "";
		ПозицияРазделителя = 0;
		Если Найти(ПоисковыйТекст, " ") > 0 тогда
			 ПозицияРазделителя = ?(ПозицияРазделителя > 0, Мин(ПозицияРазделителя, Найти(ПоисковыйТекст, " ")), Найти(ПоисковыйТекст, " "));
		КонецЕсли;
		Если Найти(ПоисковыйТекст, ".") > 0 тогда
			 ПозицияРазделителя = ?(ПозицияРазделителя > 0, Мин(ПозицияРазделителя, Найти(ПоисковыйТекст, ".")), Найти(ПоисковыйТекст, "."));
		КонецЕсли;
		Если Найти(ПоисковыйТекст, "/") > 0 тогда
			 ПозицияРазделителя = ?(ПозицияРазделителя > 0, Мин(ПозицияРазделителя, Найти(ПоисковыйТекст, "/")), Найти(ПоисковыйТекст, "/"));
		КонецЕсли;
		Если Найти(ПоисковыйТекст, "\") > 0 тогда
			 ПозицияРазделителя = ?(ПозицияРазделителя > 0, Мин(ПозицияРазделителя, Найти(ПоисковыйТекст, "\")), Найти(ПоисковыйТекст, "\"));
		КонецЕсли;
		
		Если ПозицияРазделителя = 0 тогда
			Слово = СокрЛП(ПоисковыйТекст);
			ПоисковыйТекст = "";
		Иначе
			Слово = СокрЛП(Сред(ПоисковыйТекст, 1, ПозицияРазделителя-1));
		КонецЕсли;
		
		Если Слово <> " " И Слово <> "." И Слово <> "/" И Слово <> "\" И Слово <> "" тогда
			МассивСлов.Добавить(Слово);
		КонецЕсли;

		ПоисковыйТекст = СокрЛП(Прав(ПоисковыйТекст, СтрДлина(ПоисковыйТекст) - ПозицияРазделителя));
	КонецЦикла;
	
	Возврат МассивСлов;
	
КонецФункции

// Подбирает период отчета по виду периода и текущим датам отчетов
//
Функция ПодобратьПериодОтчета(ВидПериода, Текст, ДатаНачала, ДатаОкончания) Экспорт
	
	ДанныеДляВыбора = Новый СписокЗначений;
	
	МассивСлов = ПолучитьМассивСловПредставляющихПериодОтчета(Текст);
	
	ПолучитьЗначениеПериода(ВидПериода, МассивСлов, ДанныеДляВыбора);
	
	Возврат ДанныеДляВыбора;
	
КонецФункции
Показать
user1619761; vv2; sergio199; neo-ti; infostartchel; takt3a1c; adhocprog; d_bat; +8 Ответить
13. Akuji 22 31.07.12 11:27 Сейчас в теме
(9) Ionmuerto, фигасе... лучше уж стандартным
14. пользователь 13.02.14 00:13
Сообщение было скрыто модератором.
...
15. Bukaska 140 13.02.14 09:51 Сейчас в теме
(9) Ionmuerto, Включите пожалуйста код в теги, а то смотреть невозможно, сколько черного текста)))
ben19791010; +1 Ответить
12. Akuji 22 31.07.12 11:26 Сейчас в теме
ну наоборот при изменении даты скорее чем при открытии
СтандПериод.ДатаНачала = Объект.ДатаНач;
nick_krsk; +1 Ответить
16. l_men 15 24.04.14 17:40 Сейчас в теме
Мда... стопитцот строк кода)) а раньше деревья были большими, трава зеленее и код короче))
user927693; +1 Ответить
17. oafan 27 21.07.15 17:08 Сейчас в теме
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
		
Диалог.Период.ДатаНачала = Объект.НачалоПериодаСводногоАнализа;;
Диалог.Период.ДатаОкончания = Объект.КонецПериодаСводногоАнализа;
		
Если Диалог.Редактировать() Тогда
		
	Объект.НачалоПериодаСводногоАнализа = НачалоДня(Диалог.Период.ДатаНачала);
	Объект.КонецПериодаСводногоАнализа = КонецДня(Диалог.Период.ДатаОкончания);
			
КонецЕсли;
Показать
sir; user1315860; user835653; nnnnnndfge; kontext; user1619761; xamass; -AI-; user1150141; vld_dmn; grumpi; John_Galt; sergio199; Chif13; winipuhtwo; Stivens; varbandim; user1152092; Uejova; electrolis; Superbizon; Vida; alexburn; gigapevt; neo-ti; insurgut; link_l; GigaBit; Night_ost; ILNIK; pvl_mksv; akmich; ffrriill; Гобсек; CeHbKA; jurgal1C; kimskiysanya; shiko3000; Sangre1999; freeek; vasvl123; pvlunegov; dj_serega; +43 Ответить
18. deniseek77 86 21.07.15 23:36 Сейчас в теме
Ответил (17) oafan, через 1 год и 3 месяца
Прикрепленные файлы:
19. gelmoriel 09.08.15 20:06 Сейчас в теме
(18) А я вот сейчас читаю, и мне пригодилось
link_l; pvl_mksv; TRABANT; ffrriill; freeek; dj_serega; +6 Ответить
20. pvlunegov 157 12.01.16 07:28 Сейчас в теме
Да здравствует экономичность и лаконичность кода! Ура, товарищи!
oafan, спасибо за лаконично красивый и полный ответ по существу вопроса!
21. pvlunegov 157 12.01.16 07:32 Сейчас в теме
Ionmuerto, ты бы еще привел общий модуль из какой нибудь типовой конфигурации.
Ты предлагаешь всю эту портянку читать?
Я могу привести сюда несколько портянок, которые так или иначе касаются данного вопроса.
Из разных конфигураций, типовых.
В разном исполнении, разными авторами писанные.
Все они обыгрывают данный вопрос в различном исполнении.

Если маленький мальчик, в пустыне, задаст тебе вопрос: "Дядя, как мне попить?"
Ты же не будешь читать ему лекцию о способах промышленного опреснения соленой воды...

Просто найди ему воду и дай попить, ведь он смотрит умоляющими детскими глазами!

здесь так-же. никому твои портянки не интересны.
Сюда заходят люди, которые ищут КОРОТКИЙ ЛАКОНИЧНЫЙ ответ на конкретный вопрос.

А ты им про то как БОЛЬШИЕ КОРАБЛИ БОРОЗДЯТ ПРОСТОРЫ большого театра!
SanchoD; eldarpok; +2 Ответить
31. grumpi 04.08.21 09:08 Сейчас в теме
(21) Не стреляйте пианиста, играет как умеет. Такой результат - тоже результат.
22. Serge_ASB 31.08.18 18:25 Сейчас в теме
Кто знает, почему в мобильном приложении реквизит типа "стандартный период" не виден?
23. Oldsad 17.06.19 03:58 Сейчас в теме
изменил код oafan, что бы убрать проблемы с модальностью:
&НаКлиенте
Процедура ВыбратьПериод(Команда)
	
	Диалог = Новый ДиалогРедактированияСтандартногоПериода();
	Диалог.Период.ДатаНачала = Объект.ДатаНачала;
	Диалог.Период.ДатаОкончания = Объект.ДатаОкончания;
	
	ОповещениеВыбораПериода = Новый ОписаниеОповещения ("ПослеВыбораПериода", ЭтотОбъект);
	
	Диалог.Показать (ОповещениеВыбораПериода);
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораПериода (Результат, Параметры) Экспорт
	
	Если Результат <> Неопределено Тогда
		Объект.ДатаНачала = Результат.ДатаНачала;
		Объект.ДатаОкончания = Результат.ДатаОкончания;
	КонецЕсли;
	
КонецПроцедуры
Показать

вдруг кто нить еще тоже сюда попадет по поиску :)
belov-k; user1316759; svilsa; 888Nurken; windsurf; grafnew; user835653; фокусник; dalim; kontext; user1619761; xamass; -AI-; vld_dmn; svv1979; KirealSmith; grumpi; OrsaMaggiore; Maddy18; classics; vv2; user1257121; 1C_Casual; user927693; dmbarchenkov; natik1; user1343611; chiefkriu; John_Galt; palalai; Grema789; katavy; alexnov; shi85; surgut_dezvgr; mamonth; MikhailDr; sergio199; SlVl; winipuhtwo; deminded; freeek; GeRon; Stivens; dndw; Hans; Evgen_AS; GeneR; user659124_s.kostina; alevnev; Open-BS; ra9000; makarovy; user1095163; Marliiin; MrFlanker; Uejova; +57 Ответить
24. user1095163 09.08.19 13:20 Сейчас в теме
27. Grema789 3 16.11.20 16:08 Сейчас в теме
(23)
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
Диалог.Период.ДатаНачала = Объект.ДатаНачала;
Диалог.Период.ДатаОкончания = Объект.ДатаОкончания;

ОповещениеВыбораПериода = Новый ОписаниеОповещения ("ПослеВыбораПериода", ЭтотОбъект);

Диалог.Показать (ОповещениеВыбораПериода);

Конечно попадает)
user927693; chiefkriu; +2 Ответить
29. KazanKokos 10 19.04.21 16:35 Сейчас в теме
(23)
Спасибо. До сих пор актуально.
35. 1C_Casual 162 19.07.22 10:03 Сейчас в теме
(23) Бокал светлого этому господину!
36. Stiks1911 05.08.22 11:02 Сейчас в теме
(23)Благодарю за код, тоже по поиску попал))
25. Hans 2 18.12.19 14:57 Сейчас в теме
Хоспади, через семь лет нормальный код дали.
26. winipuhtwo 11 22.04.20 12:54 Сейчас в теме
Лучше поздно, чем никогда :)))) Пригодилось, всем спасибо, плюсанул оба кода :)
sergio199; +1 Ответить
28. John_Galt 30.12.20 16:12 Сейчас в теме
И до сих пор попадают. Два плюса.
30. user1257121 17.06.21 00:37 Сейчас в теме
32. grumpi 04.08.21 09:09 Сейчас в теме
(17) (23) Спасибо, выручили! И, кстати, да, попал сюда по поиску:)))
33. RomanBor 116 13.01.22 13:27 Сейчас в теме
34. chesnok 1 05.04.22 12:02 Сейчас в теме
Повысим поисковость данного совета!
37. rpashkovsky 23 05.05.23 17:14 Сейчас в теме
Не проще ли со стандартных команд вытащить кнопку "Установить период" и выставить свойство "Положение в командной панели" = "В командной панели и дополнительном подменю", а не вот этот вот всё?)
Оставьте свое сообщение

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