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

28.06.12

Разработка - СКД

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

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

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

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

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

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

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


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

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


 

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

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

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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    256786    1421    421    

1161

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6536    340    shapa_pro    27    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    19078    ovetgana    112    

112

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    11046    krasnoshchekovpavel    7    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10584    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    16580    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    14243    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    11102    AlexeyPROSTO_1C    1    

32
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. VladZetRu 9 28.06.12 17:37 Сейчас в теме
И зачем так изгаляться, в СКД нужно использовать Параметр Стандартный период, и получением из него дополнительных Параметров НачальнаяДата(ДатаНачала или как Вы еще хотите) и КонечнаяДата используемых в запросе СКД.
Параметр СтандартныйПериод выводим на форму и пользуемся.
2. Yashazz 4915 28.06.12 19:07 Сейчас в теме
(1) СтандартныйПериод можно загнать в общее дерево отбора?
3. VladZetRu 9 28.06.12 22:52 Сейчас в теме
(2)Да. Создаешь параметр ПериодОтчета с типом Стандартный период доступный пользователю, а также параметры ДатаНач(Имя совпадает с тем, что в запросе) и ДатаКон не доступные Пользователю, назначаешь им значения в выражении типа &ПериодОтчета.ДатаНачала и соответвенно &ПериодОтчета.ДатаОкончания.
Параметру ПериодОтчета можешь задать значение по умолчанию типа ЭтотМесяц или ПроизвольныйПериод.
4. Serj1C 484 29.06.12 07:24 Сейчас в теме
(3) VladZetRu, В дерево отборов "Период отчета" не попадет, в параметрах останется
6. Yashazz 4915 02.07.12 10:03 Сейчас в теме
(4) Именно.
(5) Это я знаю. Цель была именно в том, чтоб все поля, имеющие тип даты, дать пользователю ставить самому удобно, а не обеспечивать это каждый раз через параметры. В дереве отборов параметры не позволяют использовать "стандартный период".
5. anton.fly7 174 29.06.12 09:02 Сейчас в теме
7. e.kogan 1908 24.05.17 16:21 Сейчас в теме +200 $m
Между прочим, сколько всего напридумывали в новых релизах, а дату интервалом до сих пор нельзя обусловить :( надо бы под тонкий клиент адаптировать, нэ?
8. Cooler 22 24.05.17 16:26 Сейчас в теме
Гм! Подарок к годовщине свадьбы?
9. e.kogan 1908 27.05.17 15:33 Сейчас в теме +1000 $m
(8) Не, к годовщине свадьбы мне бы лёгонький трассировщик кода... )
10. Cooler 22 27.05.17 18:44 Сейчас в теме
"Высокие, высокие отношения!" (с)
Для отправки сообщения требуется регистрация/авторизация