1с установить период отбора по дате
Есть список Чеков. Документов очень много. Как при открытии программно (!) установить отбор только за сегодня ?
Варианты фильтра - после открытия -
Пер = Новый СтандартныйПериод(НачалоДня(ТекущаяДата()),ТекущаяДата());
элементы.Список.Период = Пер;
Элементы.Список.Обновить();
Фильтруют уже отобранные данные. Т.е. сперва ты ждешь долго, потом видишь документы.
Как установить отбор в Списке до отбора данных ?
Даже ставлю дату руками, сохраняю значение - штатно. И потом ни в ПриСозданииНаСервере ни в ПриОткрытии не могу найти эти значения в отборах Списка
(1)а открыть настройки динамического списка и установить отбор не получается?Сходу точно не скажу, но примерно следующий
(2) А это в какой момент делать ? Я не совсем понимаю , когда именно компоновщик выбирает значения из базы.
Самое ранее что происходит на форме списка - ПриСозданииНаСервере - сюда суваться ?
Сейчас попробую. Спасибо за наводку
(3) Ну это при открытии формы списка.Кроме того, можно ручками настроить отбор
Добавил , все проходит , но фактически журнал не фильтруется
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Период");
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
Список.КомпоновщикНастроек.ЗагрузитьНастройки(Список.КомпоновщикНастроек.Настройки);
Т.е. в компоновщик отбор добавили, а как то обновить, применить ? Не вышло.
Смущает что в настройках формы - в отборе - нет этого заданного отбора
(9) это бы обновляло форму только , но я вижу что нет ни отбора, и скорость открытия долгая - т.е. данные не фильтруются
(10)
нет не уверен ) Но и не ругалось . пробую с Датой
Вы уверены что в динамическом списке есть поле "Период"?
Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
УсловиеОтбора.Использование = Истина;
(13) вот тут подробнее.
у меня
1С:Предприятие 8.3 (8.3.12.1685)
Розница, редакция 2.2 (2.2.11.16) ну тут не так важно
У меня расширением перекрыто ПриСозданииНаСервере
У вас такой же текст ?
В какую процедуру помещали ?
В списке настройки формы - Ваш отбор появился ?
Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
УсловиеОтбора.Использование = Истина;
Вот этот код использую.
В форме списка Вашего расширения, посмотрите привязана ли эта функция к событию формы "ПриСозданииНаСервере"
(15) да привязана, т.к. я туда попадаю при отладкестранно.. где же проблема
(16) Пробуйте так. Должно работать
Отбор = Список.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата");
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
УсловиеОтбора.Использование = Истина;
(18) пробую..
хотя так тоже пробовал вроде в процессе "проб и ошибок"
А в чем разница между -
Список.Отбор.Элементы
Список.КомпоновщикНастроек.Настройки.Отбор.Элементы
Список.КомпоновщикНастроек.ПользовательскиеНастройки.Отбор.Элементы
а то нигде не могу найти принципиальную разницу
Попробовал. С указанием четко даты - не вышло - он точно по времени смотрит.
Поменял на
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
УсловиеОтбора.ПравоеЗначение = Дата('20190108');
работает - отбирает быстрее, открывается быстрее. . НО ! :)
1. не видно интервала отбора - сверху формы
2. В настройках формы - нет этого фильтра.
И как бы ни ставил период , сбрасывал настройки - отбор остается
Т.е. он устанавливается и жестко и все
А если так -
Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
то отбор не ставится вообще
Пока решения не нашел (
Т.е. или тащатся не все данные, но тогда и отбора не видно и не отключить
Или тащатся все данные - но отбор не ставится
У меня сработал вот этот код:
лНовыйПериод = Новый СтандартныйПериод(НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()+24*60*60));
У меня подобная проблема возникла в ЗиКГУ в Журналах документов, особенно кадровых.
Там важна дата события, а не дата создания документа, т.е. нужны отборы по полям типа "ДатаСобытия", "ДатаНачала", "ПериодРегистрации".
Можно, конешно, сделать в настройках два отбора по больше-меньше, но как-то фе.
Я кинул в реквизиты формы СтандартныйПериод и обрабатываю события
&НаКлиенте
Процедура ПериодСобытийДатаНачалаПриИзменении(Элемент)
Если ПериодСобытий.ДатаОкончания < ПериодСобытий.ДатаНачала Тогда
ПериодСобытий.ДатаОкончания = ПериодСобытий.ДатаНачала;
КонецЕсли;
УстановитьПараметрыОтбораПоПериоду();
КонецПроцедуры
&НаКлиенте
Процедура ПериодСобытийДатаОкончанияПриИзменении(Элемент)
Если ПериодСобытий.ДатаНачала > ПериодСобытий.ДатаОкончания Тогда
ПериодСобытий.ДатаНачала = ПериодСобытий.ДатаОкончания;
КонецЕсли;
УстановитьПараметрыОтбораПоПериоду();
КонецПроцедуры
Диалог = Новый ДиалогРедактированияСтандартногоПериода;
Диалог.Период = Форма[Путь];
Диалог.Показать(Новый ОписаниеОповещения("ВыбратьПериодЗавершение", ЭтотОбъект, Контекст));
КонецПроцедуры
ПолеСобытия = Новый ПолеКомпоновкиДанных("ДатаСобытия");
Если Отборы.Количество() = 0 Тогда
Отбор = Отборы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
Отбор.Использование = Истина;
Отбор = Отборы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
Отбор.Использование = Истина;
Иначе
Для каждого Отбор ИЗ Отборы Цикл
Если Отбор.ЛевоеЗначение = ПолеСобытия Тогда
Если Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
Отбор.Использование = Истина;
ИначеЕсли Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
Отбор.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Вообще-то, в ЗиКГУ в механизме Установить период есть возможность
выбрать Показать стандартные периоды и установить Сегодня
В Вашей ситуации, если нет потребности в последующем изменении периода, достаточно:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
.
УстановитьПараметрыОтбораПоПериоду(ПолеСобытия, ДатаНачалаОтбора, ДатаОкончанияОтбора);
//ГДЕ:
//ПолеСобытия = Новый ПолеКомпоновкиДанных("Дата");
//ДатаНачалаОтбора = НачалоДня(ОбщегоНазначения.ТекущаяДатаПользователя());
//ДатаОкончанияОтбора = КонецДня(ОбщегоНазначения.ТекущаяДатаПользователя());
//Ускорит процесс открытия формы - отключить стандартную установку периода
.
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрыОтбораПоПериоду(ПолеСобытия, ДатаНачалаОтбора, ДатаОкончанияОтбора)
Если Отборы.Количество() = 0 Тогда
Отбор = Отборы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
Отбор.Использование = Истина;
Отбор = Отборы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
Отбор.Использование = Истина;
Иначе
Для каждого Отбор ИЗ Отборы Цикл
Если Отбор.ЛевоеЗначение = ПолеСобытия Тогда
Если Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
ИначеЕсли Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Самый простой и быстрый способ создать отчет в 1С это воспользоваться СКД (Системой компоновки данных). Это очень популярный а самое главное очень удобный инструмент, по сути для того чтобы создать отчет с помощью СКД даже не нужно знать 1С программирование. Так как у системы компоновки данных есть графический интерфейс. В сегодняшней статьи поговорим о добавление периодов. Т.е добавим возможность отбора за определенный промежуток времени. Данная возможность должны быть в любом нормальном отчете.
Я хоть и не являюсь гуру программистом 1С, но все же имею кое какой опыт и стараюсь им поделиться в своих небольших статьях, с теми кто в этом нуждается, поэтому рекомендую прочитать следующие статьи.
Добавление периода в СКД
Тоже самое можно сделать просто дописав в запрос вот такую строчку.
ГДЕ
АктОбОказанииУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
Но лучше сделать это в самих настройках СКД.
В этом случае параметры будут отображаться у всех пользователей которые будут открывать отчет.
Вот так добавляется период в СКД. Как сами видите все достаточно просто и понятно, самое главное не торопиться и внимательно читать названия пунктов.
Использование параметров - периодов в системе компоновки данных
Для многих отчетов необходимо дать возможность пользователю указывать период, за который необходимо получить отчет. Часто данные периоды требуется указывать не с точностью до секунды, а с точностью до дня. Для того чтобы пользователь имел возможность ввести в параметрах данных дату без времени, достаточно указать в описании параметра данных тип параметра Дата с указанием состава даты "Дата".
После этого пользователь сможет вводить в параметры данных только значения дат, без времени.
Для того чтобы введенные значения интерпретировалось в отчете как начало и конец дня следует в запросе использовать функции НачалоПериода() и КонецПериода() .
ВЫБРАТЬ
ПродажиОбороты.Контрагент,
ПродажиОбороты.Номенклатура,
ПродажиОбороты.КоличествоОборот,
ПродажиОбороты.СуммаОборот
ИЗ
РегистрНакопления.Продажи.Обороты(
<(НАЧАЛОПЕРИОДА(&ПериодНачало, ДЕНЬ))>,
<(КОНЕЦПЕРИОДА(&ПериодКонец, ДЕНЬ))>, , ) КАК ПродажиОбороты
В данном примере в качестве значений параметров виртуальной таблицы будут передаваться начало и конец дней, выбранных пользователем.
Использование стандартных периодов
Система компоновки данных позволяет использовать стандартные периоды для указания периода отчета.
Для того чтобы задействовать данную возможность следует добавить в схему компоновки данных параметр типа СтандартныйПериод , а в параметрах - датах указать соответствующие выражения и запретить их редактирование пользователем.
После такой доработки схемы компоновки пользователю будет доступен для редактирования только параметр Период , значения которого при помощи выражений будут помещены в параметры ПериодНачало и ПериодКонец .
Пользователь будет редактировать параметр в следующем виде:
Для показанного примера в качестве значения параметра ПериодНачала будет использоваться дата 01.01.2019 , а в качестве значения параметра ПериодКонец будет использоваться дата 31.01.2019 .
Реальные значения дат для стандартного периода определяются при исполнении отчета. Таким образом, если выполнять отчет с установленным периодом Этот месяц в январе 2020-го года, то отчет будет исполняться с 01.01.2020 по 31.01.2020 , а если выполнять в феврале 2020-го года, то с 01.02.2020 по 29.02.2020
Заметим, что даты начала и конца стандартного периода также содержат и время. Причем, начальная дата имеет время 00:00:00 , а конечная дата 23:59:59 , таким образом, в запросе не обязательно использовать функции НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА .
Когда я создал свой первый отчет в 1С с помощью системы компоновки данных (СКД) и начал проверять его на правильность заполнения, то обнаружил одну проблему, с которой думаю будут сталкиваться все начинающие 1С программисты. Проблема заключалась в том что в отчет попадали не все документы. Если сказать точнее не попадали документы за последнее число, установленного периода. Данная статья предназначена тем кто только делает первые шаги в изучение 1С. Если Вы более менее опытный можете дальше не читать.
СКД я посвятил достаточно много статей которые будут полезны начинающим программистам, рекомендую Вам с ними обязательно ознакомиться.
Как правильно настроить отбор по периодам в СКД
И так давайте разберем все на примере, вот у нас есть отчет, мы задали период и сформировали его и видим что за 11.06 есть документы.
Но если мы сформируем отчет на эту дату то он будет пустой.
Внимательные люди заметили что у нас в периоде отображается не только дата но и время, и время установлено началом дня, т.е. мы выбираем документы которые созданы 11.06.2017 в 0:00:00.
Но в большинстве случаев время в периоде просто не нужно, если пользователь выбирает 11.06 соответственно он хочет видеть документы за весь этот день.
Для того чтобы установить период концом выбранного дня нужно немного изменить запрос, поменять условие это
СчетНАОплатуКлиенту.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
СчетНАОплатуКлиенту.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) И КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ)
Т.е мы добавили стандартную функцию НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА.
Если теперь мы выберем тот же период то отчет сформируется правильно.
Возможность установки времени нужно продумывать на начальном этапе, и если в нем нет необходимости то и выводить его не нужно.
Читайте также: