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

1. nick_krsk 31.07.12 10:37 Сейчас в теме
В документе есть реквизиты НачалоПериода и ОкончаниеПериода.
Подскажите, как на управляемой форме разместить кнопку выбора периода?
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. Поручик 4553 31.07.12 10:41 Сейчас в теме
(1) Делаешь реквизит формы типа СтандартныйПериод и перетаскиваешь на форму.
Moonlitolga; ivan1703; GonziK_KIV; stoptime; user979239; fortorgpro; Vida; volex; jmi; classics; adhocprog; ekomova; Small sa; d_bat; arccos6pi; nick_krsk; +16 Ответить
4. nick_krsk 31.07.12 10:46 Сейчас в теме
(2) А как завязать этот реквизит формы с реквизитами документа (НачалоПериода и ОкончаниеПериода)?
5. sanja 149 31.07.12 10:50 Сейчас в теме
6. nick_krsk 31.07.12 10:53 Сейчас в теме
(5) Это как? Нельзя в элементе СтандартныйПериод указать, что ДатаНачала связана с такам-то реквизитом, а дата окончания с таким-то?
3. sanja 149 31.07.12 10:44 Сейчас в теме
период в управляемых формах отстой. Выпиливал из БП корп 3.0, где-то здесь совет прочитал
7. Akuji 18 31.07.12 10:56 Сейчас в теме
А использовать реквизиты стандартного периода ДатаНач и кон? зачем еще отдельно создовать
8. nick_krsk 31.07.12 10:57 Сейчас в теме
(7) Ну чтобы сохранять. Есть документ счет, в нем период, за который он выставлен.
10. Akuji 18 31.07.12 11:07 Сейчас в теме
(8) Karambol,
ну при изменении стандартно присвоить:
= СтандПериод.ДатаНачала;
Small sa; nick_krsk; +2 Ответить
11. nick_krsk 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));
		КонецЕсли;
		
		Если Слово <> " " И Слово <> "." И Слово <> "/" И Слово <> "\" И Слово <> "" тогда
			МассивСлов.Добавить(Слово);
		КонецЕсли;

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

// Подбирает период отчета по виду периода и текущим датам отчетов
//
Функция ПодобратьПериодОтчета(ВидПериода, Текст, ДатаНачала, ДатаОкончания) Экспорт
	
	ДанныеДляВыбора = Новый СписокЗначений;
	
	МассивСлов = ПолучитьМассивСловПредставляющихПериодОтчета(Текст);
	
	ПолучитьЗначениеПериода(ВидПериода, МассивСлов, ДанныеДляВыбора);
	
	Возврат ДанныеДляВыбора;
	
КонецФункции
Показать
vv2; sergio199; neo-ti; infostartchel; takt3a1c; adhocprog; d_bat; +7 Ответить
13. Akuji 18 31.07.12 11:27 Сейчас в теме
(9) Ionmuerto, фигасе... лучше уж стандартным
14. пользователь 13.02.14 00:13
Сообщение было скрыто модератором.
...
15. Bukaska 138 13.02.14 09:51 Сейчас в теме
(9) Ionmuerto, Включите пожалуйста код в теги, а то смотреть невозможно, сколько черного текста)))
ben19791010; +1 Ответить
12. Akuji 18 31.07.12 11:26 Сейчас в теме
ну наоборот при изменении даты скорее чем при открытии
СтандПериод.ДатаНачала = Объект.ДатаНач;
nick_krsk; +1 Ответить
16. l_men 15 24.04.14 17:40 Сейчас в теме
Мда... стопитцот строк кода)) а раньше деревья были большими, трава зеленее и код короче))
user927693; +1 Ответить
17. oafan 26 21.07.15 17:08 Сейчас в теме
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
		
Диалог.Период.ДатаНачала = Объект.НачалоПериодаСводногоАнализа;;
Диалог.Период.ДатаОкончания = Объект.КонецПериодаСводногоАнализа;
		
Если Диалог.Редактировать() Тогда
		
	Объект.НачалоПериодаСводногоАнализа = НачалоДня(Диалог.Период.ДатаНачала);
	Объект.КонецПериодаСводногоАнализа = КонецДня(Диалог.Период.ДатаОкончания);
			
КонецЕсли;
Показать
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; +38 Ответить
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 176 12.01.16 07:28 Сейчас в теме
Да здравствует экономичность и лаконичность кода! Ура, товарищи!
oafan, спасибо за лаконично красивый и полный ответ по существу вопроса!
21. pvlunegov 176 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, что бы убрать проблемы с модальностью:
&НаКлиенте
Процедура ВыбратьПериод(Команда)
	
	Диалог = Новый ДиалогРедактированияСтандартногоПериода();
	Диалог.Период.ДатаНачала = Объект.ДатаНачала;
	Диалог.Период.ДатаОкончания = Объект.ДатаОкончания;
	
	ОповещениеВыбораПериода = Новый ОписаниеОповещения ("ПослеВыбораПериода", ЭтотОбъект);
	
	Диалог.Показать (ОповещениеВыбораПериода);
	
КонецПроцедуры

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

вдруг кто нить еще тоже сюда попадет по поиску :)
user1619761; xamass; -AI-; vld_dmn; svv1979; KirealSmith; grumpi; OrsaMaggiore; Maddy18; classics; vv2; user1257121; 1C_Casual; user927693; dmbarchenkov; natik1; user1343611; chiefkriu; John_Galt; palalai; Grema789; katavyjob; 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; +47 Ответить
24. user1095163 09.08.19 13:20 Сейчас в теме
27. Grema789 3 16.11.20 16:08 Сейчас в теме
(23)
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
Диалог.Период.ДатаНачала = Объект.ДатаНачала;
Диалог.Период.ДатаОкончания = Объект.ДатаОкончания;

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

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

Конечно попадает)
user927693; chiefkriu; +2 Ответить
29. KazanKokos 9 19.04.21 16:35 Сейчас в теме
(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 115 13.01.22 13:27 Сейчас в теме
Оставьте свое сообщение
Вопросы с вознаграждением
Вакансии
Аналитик 1С
Санкт-Петербург
зарплата до 150 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 220 000 руб.
Полный день

1С Программист по 1С:Управление торговлей
Кострома
зарплата от 100 000 руб. до 110 000 руб.
Полный день

Руководитель отдела разработки
Москва
зарплата от 200 000 руб. до 230 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 150 000 руб.
Полный день