Управляемые формы, кнопка выбора периода
По теме из базы знаний
- Стыковка элементов управляемой формы и пользовательских настроек СКД
- Универсальный диалог выбора периода, даты, времени в заданных границах, для любого стандарта даты и на любом языке. Управляемые формы.
- Инструментарий для анализа и редактирования регистров 1С (Управляемые формы)
- Управляемая консоль отчетов – новый функциональный инструмент для работы с запросами и СКД в управляемых формах
- Общий (полный, универсальный) журнал документов для всех конфигураций 1С на управляемых формах
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Пример из Конфигурации БП 3.0:
1. Добавить в Перечисления "ДоступныеПериодыОтчета"
Значения:
День
Неделя
Декада
Месяц
Квартал
Полугодие
Год
ПроизвольныйПериод
2. Добавить реквизит в "Отчет":
- "НачалоПериода" (Дата)
- "КонецПериода" (Дата)
3. Добавить в реквизит формы:
- "ВидПериода" (ПеречислениеСсылка.ДоступныеПериодыОтчета)
- "Период" (Строка)
3. На форме добавить:
- "ВидПериода" поле ввода путь к данным "ВидПериода"
- "НачалоПериода" поле ввода путь к данным "Отчет.НачалоПериода"
- "КонецПериода" поле ввода путь к данным "Отчет.КонецПериода"
- "Период" поле ввода путь к данным "Период"
4. В модуле "ФормаОтчета":
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));
КонецЕсли;
Если Слово <> " " И Слово <> "." И Слово <> "/" И Слово <> "\" И Слово <> "" тогда
МассивСлов.Добавить(Слово);
КонецЕсли;
ПоисковыйТекст = СокрЛП(Прав(ПоисковыйТекст, СтрДлина(ПоисковыйТекст) - ПозицияРазделителя));
КонецЦикла;
Возврат МассивСлов;
КонецФункции
// Подбирает период отчета по виду периода и текущим датам отчетов
//
Функция ПодобратьПериодОтчета(ВидПериода, Текст, ДатаНачала, ДатаОкончания) Экспорт
ДанныеДляВыбора = Новый СписокЗначений;
МассивСлов = ПолучитьМассивСловПредставляющихПериодОтчета(Текст);
ПолучитьЗначениеПериода(ВидПериода, МассивСлов, ДанныеДляВыбора);
Возврат ДанныеДляВыбора;
КонецФункции
ПоказатьДиалог = Новый ДиалогРедактированияСтандартногоПериода();
Диалог.Период.ДатаНачала = Объект.НачалоПериодаСводногоАнализа;;
Диалог.Период.ДатаОкончания = Объект.КонецПериодаСводногоАнализа;
Если Диалог.Редактировать() Тогда
Объект.НачалоПериодаСводногоАнализа = НачалоДня(Диалог.Период.ДатаНачала);
Объект.КонецПериодаСводногоАнализа = КонецДня(Диалог.Период.ДатаОкончания);
КонецЕсли;
Показать
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; Mainframe1C; kimskiysanya; shiko3000; Sangre1999; freeek; vasvl123; pvlunegov; dj_serega;
+43
–
Ответить
Ionmuerto, ты бы еще привел общий модуль из какой нибудь типовой конфигурации.
Ты предлагаешь всю эту портянку читать?
Я могу привести сюда несколько портянок, которые так или иначе касаются данного вопроса.
Из разных конфигураций, типовых.
В разном исполнении, разными авторами писанные.
Все они обыгрывают данный вопрос в различном исполнении.
Если маленький мальчик, в пустыне, задаст тебе вопрос: "Дядя, как мне попить?"
Ты же не будешь читать ему лекцию о способах промышленного опреснения соленой воды...
Просто найди ему воду и дай попить, ведь он смотрит умоляющими детскими глазами!
здесь так-же. никому твои портянки не интересны.
Сюда заходят люди, которые ищут КОРОТКИЙ ЛАКОНИЧНЫЙ ответ на конкретный вопрос.
А ты им про то как БОЛЬШИЕ КОРАБЛИ БОРОЗДЯТ ПРОСТОРЫ большого театра!
Ты предлагаешь всю эту портянку читать?
Я могу привести сюда несколько портянок, которые так или иначе касаются данного вопроса.
Из разных конфигураций, типовых.
В разном исполнении, разными авторами писанные.
Все они обыгрывают данный вопрос в различном исполнении.
Если маленький мальчик, в пустыне, задаст тебе вопрос: "Дядя, как мне попить?"
Ты же не будешь читать ему лекцию о способах промышленного опреснения соленой воды...
Просто найди ему воду и дай попить, ведь он смотрит умоляющими детскими глазами!
здесь так-же. никому твои портянки не интересны.
Сюда заходят люди, которые ищут КОРОТКИЙ ЛАКОНИЧНЫЙ ответ на конкретный вопрос.
А ты им про то как БОЛЬШИЕ КОРАБЛИ БОРОЗДЯТ ПРОСТОРЫ большого театра!
изменил код oafan, что бы убрать проблемы с модальностью:
вдруг кто нить еще тоже сюда попадет по поиску :)
&НаКлиенте
Процедура ВыбратьПериод(Команда)
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
Диалог.Период.ДатаНачала = Объект.ДатаНачала;
Диалог.Период.ДатаОкончания = Объект.ДатаОкончания;
ОповещениеВыбораПериода = Новый ОписаниеОповещения ("ПослеВыбораПериода", ЭтотОбъект);
Диалог.Показать (ОповещениеВыбораПериода);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораПериода (Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
Объект.ДатаНачала = Результат.ДатаНачала;
Объект.ДатаОкончания = Результат.ДатаОкончания;
КонецЕсли;
КонецПроцедуры
Показатьвдруг кто нить еще тоже сюда попадет по поиску :)
vis_tmp; 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;
+58
–
Ответить
(23)
Конечно попадает)
Диалог = Новый ДиалогРедактированияСтандартногоПериода();
Диалог.Период.ДатаНачала = Объект.ДатаНачала;
Диалог.Период.ДатаОкончания = Объект.ДатаОкончания;
ОповещениеВыбораПериода = Новый ОписаниеОповещения ("ПослеВыбораПериода", ЭтотОбъект);
Диалог.Показать (ОповещениеВыбораПериода);
Диалог.Период.ДатаНачала = Объект.ДатаНачала;
Диалог.Период.ДатаОкончания = Объект.ДатаОкончания;
ОповещениеВыбораПериода = Новый ОписаниеОповещения ("ПослеВыбораПериода", ЭтотОбъект);
Диалог.Показать (ОповещениеВыбораПериода);
Конечно попадает)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот