gifts2017

Ввод периода дат в отборах СКД

Опубликовал Яков Коган (Yashazz) в раздел Программирование - Практика программирования

Вы привыкли быстро указывать отбор на даты, пользуясь построителями и штатными окнами 1С? Вам неудобно и долго делать то же самое в отборах СКД? Ввод условия на период дат можно обеспечить с помощью простенькой процедуры, добавляемой в любое нужное место.

Надоело мне вводить периоды вручную - группу делай, границы указывай, лениво и ошибкоопасно. Разработал процедуру:

Процедура ВставитьУсловиеНаИнтервалДат(Элемент) Экспорт
Попытка
 
рТипГруппыОтбора=Тип("ГруппаЭлементовОтбораКомпоновкиДанных");
 
рТипЭлементаОтбора=Тип("ЭлементОтбораКомпоновкиДанных");

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

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

 
//================================================================================
 // Запрашиваем вид интервала
 //
 
спвар=Новый СписокЗначений;
 
спвар.Добавить(ВидСравнения.Интервал,"Не включая границы ( )");
 
спвар.Добавить(ВидСравнения.ИнтервалВключаяГраницы,"Включая границы [ ]");
 
спвар.Добавить(ВидСравнения.ИнтервалВключаяНачало,"Включая начало [ )");
 
спвар.Добавить(ВидСравнения.ИнтервалВключаяОкончание,"Включая конец ( ]");
 
выбзнч=спвар.ВыбратьЭлемент("Укажите тип интервала:");
 Если
выбзнч=Неопределено Тогда Возврат КонецЕсли;
 
// определяемся
 
Если выбзнч.Значение=ВидСравнения.ИнтервалВключаяГраницы
 или выбзнч.Значение=ВидСравнения.ИнтервалВключаяНачало
 Тогда
 
рВидСравненияНачГраницы=ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
 Иначе
 
рВидСравненияНачГраницы=ВидСравненияКомпоновкиДанных.Больше;
 КонецЕсли;
 Если
выбзнч.Значение=ВидСравнения.ИнтервалВключаяГраницы
 или выбзнч.Значение=ВидСравнения.ИнтервалВключаяОкончание
 Тогда
 
рВидСравненияКонГраницы=ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
 Иначе
 
рВидСравненияКонГраницы=ВидСравненияКомпоновкиДанных.Меньше;
 КонецЕсли;

 
//================================================================================
 // Запрашиваем интервал
 //
 
рНачалоПериода=Дата(1,1,1); рКонецПериода=Дата(1,1,1);
 
// стандартный диалог
 
рНастройкаПериода=Новый НастройкаПериода;
 
рНастройкаПериода.УстановитьПериод(рНачалоПериода,рКонецПериода);
 
рНастройкаПериода.РедактироватьКакИнтервал=Истина;
 
рНастройкаПериода.РедактироватьКакПериод=Истина;
 
рНастройкаПериода.ВариантНастройки=ВариантНастройкиПериода.Период;
 Если не
рНастройкаПериода.Редактировать() Тогда Возврат КонецЕсли;
 
рНачалоПериода=НачалоДня(рНастройкаПериода.ПолучитьДатуНачала());
 
рКонецПериода=КонецДня(рНастройкаПериода.ПолучитьДатуОкончания());


 
//================================================================================
 // Ищем, нет ли уже такой группы и таких элементов в ней (только на текущем уровне отбора!)
 //
 
рГруппа=Неопределено;
 
рНачГраница=Неопределено;
 
рКонГраница=Неопределено;
 
//
 
рПредставлениеГруппы="Интервал "+СтрЗаменить(НРег(выбзнч.Представление),"ючая",".")+" для """+СокрЛП(рПоле.Заголовок)+"""";
 Для каждого
элотб Из текдан.Элементы Цикл
 
ОбработкаПрерыванияПользователя();
  Если
ТипЗнч(элотб)=рТипГруппыОтбора
  и элотб.Представление=рПредставлениеГруппы
  и элотб.ТипГруппы=ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ
  Тогда
  
рГруппа=элотб; // ищем внутри неё
  
Для каждого элотбгр Из рГруппа.Элементы Цикл
   
ОбработкаПрерыванияПользователя();
    Если
ТипЗнч(элотбгр)=рТипЭлементаОтбора Тогда
     Если
элотбгр.ВидСравнения=рВидСравненияНачГраницы и элотбгр.ЛевоеЗначение=рПоле.Поле Тогда
     
рНачГраница=элотбгр;
     ИначеЕсли
элотбгр.ВидСравнения=рВидСравненияКонГраницы и элотбгр.ЛевоеЗначение=рПоле.Поле Тогда
     
рКонГраница=элотбгр;
     КонецЕсли;
    КонецЕсли;
   КонецЦикла;
// по элементам подходящей группы
 
КонецЕсли;
 КонецЦикла;

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


 

Сделал вызов этой процедуры в той форме, где находился нужный компоновщик:

РаботаСДиалогами.ВставитьУсловиеНаИнтервалДат(ЭлементыФормы.дОтборРК);

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. VladZetRu (VladZetRu) 28.06.12 17:37
И зачем так изгаляться, в СКД нужно использовать Параметр Стандартный период, и получением из него дополнительных Параметров НачальнаяДата(ДатаНачала или как Вы еще хотите) и КонечнаяДата используемых в запросе СКД.
Параметр СтандартныйПериод выводим на форму и пользуемся.
2. Яков Коган (Yashazz) 28.06.12 19:07
(1) СтандартныйПериод можно загнать в общее дерево отбора?
3. VladZetRu (VladZetRu) 28.06.12 22:52
(2)Да. Создаешь параметр ПериодОтчета с типом Стандартный период доступный пользователю, а также параметры ДатаНач(Имя совпадает с тем, что в запросе) и ДатаКон не доступные Пользователю, назначаешь им значения в выражении типа &ПериодОтчета.ДатаНачала и соответвенно &ПериодОтчета.ДатаОкончания.
Параметру ПериодОтчета можешь задать значение по умолчанию типа ЭтотМесяц или ПроизвольныйПериод.
4. Serj (Serj1C) 29.06.12 07:24
(3) VladZetRu, В дерево отборов "Период отчета" не попадет, в параметрах останется
6. Яков Коган (Yashazz) 02.07.12 10:03
(4) Именно.
(5) Это я знаю. Цель была именно в том, чтоб все поля, имеющие тип даты, дать пользователю ставить самому удобно, а не обеспечивать это каждый раз через параметры. В дереве отборов параметры не позволяют использовать "стандартный период".
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа