Имя: Пароль:
1C
1С v8
СКД - необязательный отбор по периоду
0 Dmitriy_
Kolesnikov
 
30.05.18
07:04
В наборе данных есть реквизит ДатаПриказа.
Мне надо сделать необязательный отбор по этому периоду, то есть отключаемый.
Для этого я создаю новый параметр ПериодДатыПриказа типа СтандартныйПериод.
Но я не могу использовать его напрямую в отборе по дате.
Поэтому я создаю ещё два параметра: НачалоПериодаДатыПриказа и КонецПериодаДатыПриказа, обращающихся к этому периоду.

Если установлен период и установлены два отбора по дате приказа (на больше и меньше дат начала и окончания периода) - всё работает.
Если же отборы установлены, а период нет - результат отчета пустой.

Вопрос: как сделать так, чтобы если пользователь включает период - включались два отбора, если отключает - они соответственно отключались?

Если я правильно понимаю, это можно сделать только в коде.
Или подскажите красивое решение с использованием параметра типа СтандартныйПериод.
1 SleepyHead
 
гуру
30.05.18
07:41
(0) Добавь отбор в СКД , нажми правую кнопку мышки и выбери пункт "Свойства элемента пользовательских настроек".

Дальше, я думаю, сам разберешься.
2 SleepyHead
 
гуру
30.05.18
07:42
(0) И поиграйся с группировками отборов И/ИЛИ, ну или на худой конец с вычисляемыми полями и отбором по ним.
3 DrShad
 
30.05.18
08:02
запрос в студию
4 Dmitriy_
Kolesnikov
 
30.05.18
08:03
(1) там нечем играться. Я этот отбор скрываю от пользователя. (недоступен) Он должен автоматически выполняться только если задан период. Если флаги периода не установлены - отбор не должен производиться.
Два отбора по произвольной дате, объединенных группой И, выглядят как простой флаг. При этом отбор на Больше и на Меньше можно включать\отключать независимо друг от друга. Поэтому не вижу смысла.
Проблема в том, что всё это некрасиво. Красиво выглядит Стандартный Период.
5 Dmitriy_
Kolesnikov
 
30.05.18
08:06
(2) последняя таблица типового отчета ФактическиеОтпуска в ЗУП:

ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ФактическиеОтпускаСотрудников.Сотрудник КАК Сотрудник,
    ФактическиеОтпускаСотрудников.ВидЕжегодногоОтпуска КАК ВидЕжегодногоОтпуска,
    ФактическиеОтпускаСотрудников.ДатаНачала КАК ДатаНачала,
    ФактическиеОтпускаСотрудников.ДатаОкончания КАК ДатаОкончания,
    ФактическиеОтпускаСотрудников.КоличествоДней КАК КоличествоДней,
    ФактическиеОтпускаСотрудников.ЭтоКомпенсация КАК ЭтоКомпенсация,
    ФактическиеОтпускаСотрудников.Регистратор КАК Регистратор,
    ФактическиеОтпускаСотрудников.ВРабочихДнях КАК ВРабочихДнях,
    ФактическиеОтпускаСотрудников.РабочийПериодС КАК РабочийПериодС,
    ФактическиеОтпускаСотрудников.РабочийПериодПо КАК РабочийПериодПо,
    ФактическиеОтпускаСотрудников.Основание КАК Основание,
    КадровыеДанныеСотрудников.ТабельныйНомер КАК ТабельныйНомер,
    КадровыеДанныеСотрудников.Организация КАК Организация,
    КадровыеДанныеСотрудников.Подразделение КАК Подразделение,
    КадровыеДанныеСотрудников.Территория КАК Территория,
    КадровыеДанныеСотрудников.Должность КАК Должность,
    КадровыеДанныеСотрудников.ДолжностьПоШтатномуРасписанию КАК ДолжностьПоШтатномуРасписанию,
    КадровыеДанныеСотрудников.ГрафикРаботы КАК ГрафикРаботы,
    КадровыеДанныеСотрудников.КоличествоСтавок КАК КоличествоСтавок,
    КадровыеДанныеСотрудников.ВидЗанятости КАК ВидЗанятости,
    КадровыеДанныеСотрудников.ТарифнаяСетка КАК ТарифнаяСетка,
    КадровыеДанныеСотрудников.РазрядКатегория КАК РазрядКатегория,
    КадровыеДанныеСотрудников.ТарифнаяСеткаНадбавки КАК ТарифнаяСеткаНадбавки,
    КадровыеДанныеСотрудников.ДатаПриема КАК ДатаПриема,
    КадровыеДанныеСотрудников.ДатаУвольнения КАК ДатаУвольнения,
    КадровыеДанныеСотрудников.Состояние КАК Состояние,
    ФактическиеОтпускаСотрудников.Регистратор.Дата КАК ДатаПриказа,
    ФактическиеОтпускаСотрудников.Регистратор.Номер КАК НомерПриказа
{ВЫБРАТЬ
    Сотрудник.*,
    ВидЕжегодногоОтпуска.*,
    ДатаНачала,
    ДатаОкончания,
    КоличествоДней,
    ЭтоКомпенсация,
    Регистратор.*,
    ВРабочихДнях,
    РабочийПериодС,
    РабочийПериодПо,
    Основание,
    Организация.*,
    Подразделение.*,
    Территория.*,
    Должность.*,
    ДолжностьПоШтатномуРасписанию.*,
    ГрафикРаботы.*,
    КоличествоСтавок,
    ВидЗанятости.*,
    ТарифнаяСетка.*,
    РазрядКатегория.*,
    ТарифнаяСеткаНадбавки.*,
    ДатаПриема,
    ДатаУвольнения,
    Состояние}
ИЗ
    Представления_ФактическиеОтпускаСотрудников КАК ФактическиеОтпускаСотрудников
        ЛЕВОЕ СОЕДИНЕНИЕ Представления_КадровыеДанныеСотрудников КАК КадровыеДанныеСотрудников
        ПО ФактическиеОтпускаСотрудников.Сотрудник = КадровыеДанныеСотрудников.Сотрудник
            И ФактическиеОтпускаСотрудников.ДатаОкончания = КадровыеДанныеСотрудников.Период
{ГДЕ
    ФактическиеОтпускаСотрудников.Сотрудник.*,
    ФактическиеОтпускаСотрудников.ВидЕжегодногоОтпуска.*,
    ФактическиеОтпускаСотрудников.ДатаНачала,
    ФактическиеОтпускаСотрудников.ДатаОкончания,
    ФактическиеОтпускаСотрудников.КоличествоДней,
    ФактическиеОтпускаСотрудников.ЭтоКомпенсация,
    ФактическиеОтпускаСотрудников.Регистратор.*,
    ФактическиеОтпускаСотрудников.ВРабочихДнях,
    ФактическиеОтпускаСотрудников.РабочийПериодС,
    ФактическиеОтпускаСотрудников.РабочийПериодПо,
    ФактическиеОтпускаСотрудников.Основание,
    КадровыеДанныеСотрудников.ТабельныйНомер,
    КадровыеДанныеСотрудников.Организация.*,
    КадровыеДанныеСотрудников.Подразделение.*,
    КадровыеДанныеСотрудников.Территория.*,
    КадровыеДанныеСотрудников.Должность.*,
    КадровыеДанныеСотрудников.ДолжностьПоШтатномуРасписанию.*,
    КадровыеДанныеСотрудников.ГрафикРаботы.*,
    КадровыеДанныеСотрудников.КоличествоСтавок,
    КадровыеДанныеСотрудников.ВидЗанятости.*,
    КадровыеДанныеСотрудников.ТарифнаяСетка.*,
    КадровыеДанныеСотрудников.РазрядКатегория.*,
    КадровыеДанныеСотрудников.ТарифнаяСеткаНадбавки.*,
    КадровыеДанныеСотрудников.ДатаПриема,
    КадровыеДанныеСотрудников.ДатаУвольнения,
    КадровыеДанныеСотрудников.Состояние,
    ФактическиеОтпускаСотрудников.Регистратор.Дата КАК ДатаПриказа}
6 DrShad
 
30.05.18
08:18
и где условия?
7 SleepyHead
 
гуру
30.05.18
08:35
(4) Если все так серьезно, то придется в "ПриКомпоновкеРезультата" выгружать результат запроса в ТЗ, и убирать из нее лишние строки по твоему условию. А потом уже скармливать ее на вывод.
8 SleepyHead
 
гуру
30.05.18
08:37
(4) А чем не нравится вычисляемое поле и отбор по нему, пусть даже скрытый?

ВЫБОР КОГДА ...период задан ТОГДА <вычисление условия для отлора> иначе ИСТИНА КОНЕЦ
9 Dmitriy_
Kolesnikov
 
30.05.18
09:49
(8)
"период задан" - как это определить на языке СКД?
10 Dmitriy_
Kolesnikov
 
30.05.18
09:51
(6) а какие условия в запросе? В запросе в фигурных скобках - те поля, по которым потенциально могут быть заданы условия в СКД.
11 DrShad
 
30.05.18
10:08
накладывать отбор на результат в СКД не всегда удобно
12 Dmitriy_
Kolesnikov
 
30.05.18
10:11
А наложить отбор в запросе так, чтобы он не был обязательным, разве можно? как определить, поставил пользователь флаг включения отбора или нет?
13 DrShad
 
30.05.18
10:13
(12) можно, но нужно проверять значение параметра
в твоем случае это на пустую дату
14 SleepyHead
 
гуру
30.05.18
10:37
(9) В коде можно, ну тогда делай, как я предложил в (7)
15 SleepyHead
 
гуру
30.05.18
10:38
+14

// Возвращает значение параметры СКД
//
// Параметры :
//
//    ИмяПараметра - Строка - имя параметра схемы компоновки данных
//    ЗначениеПоУмолчанию - Произвольный - значение по умолчанию, если в настройках значение не установлено
//
// Возвращаемое значение:
//    Произвольный - значение параметра СКД

Функция ПолучитьЗначениеПараметраСхемы(НастрокиСКД, ИмяПараметра, ЗначениеПоУмолчанию, Используется=Ложь)
Перем Параметр, Рез;

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