Динамический список не работает отбор

Не работает отбор на форме

Доброго времени. Конфигурация самописная. При выборе на форме организации, хочется видеть подразделения этой организации, но выходит просто пустой список. Что делаю не так?

ВЫБРАТЬ
СправочникПодразделенияОрганизаций.Ссылка,
СправочникПодразделенияОрганизаций.Владелец,
СправочникПодразделенияОрганизаций.Родитель,
СправочникПодразделенияОрганизаций.Код,
СправочникПодразделенияОрганизаций.Наименование
ИЗ
Справочник.ПодразделенияОрганизаций КАК СправочникПодразделенияОрганизаций
ГДЕ
СправочникПодразделенияОрганизаций.Владелец = &Владелец

Через консоль запросов видно то, что нужно?

(9) Давайте экспериментировать.
Уточню дальше.
1) Форма открылась. Реквизит Организация пустая, значит ДС показывает все подразделения. Если не пустая, то по всей видимости это обрабатывается при создании формы. Т.е. если организация не пустая, то установить отбор. (коллекция отборов содержит 1 элемент или 0) Все работает корректно
2) Далее меняется реквизит — Если до этого коллекция отборов была пустая, то добавляется 1 элемент отборов и все работает хорошо. Если коллекция уже была заполнена, то отборов становится 2 и уже не работает (взаимоисключают)

Можете пройти отладкой с момента создания формы до первого изменения реквизита Организация.
Нужно узнать количество отборов в коллекциях Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных().Отбор.Элементы.Количество()
Список.Отбор.Элементы.Количество()

У меня предположение, что добавляется много отборов, которые накладываются друг на друга.

Если не хотите расследовать, то измените ДС на произвольный запрос, выберете нужные поля и поставьте условие

«ВЫБРАТЬ
| Все нужные поля
|ИЗ
| Справочник.ПодразделенияОрганизаций КАК ПодразделенияОрганизаций
|ГДЕ
| ПодразделенияОрганизаций.Владелец = &Владелец»;

Источник

Динамический спискок: Программный отбор не доступен в режиме предприятия

На форме документа «Счет» создал Динамический Список который должен отображать все документы типа «Расход» созданные на основании данного «Счета». В документе «Расход» есть реквизит типа ДокументСсылка.Счет, в который записывается «Счет» — основание. В модуле формы добавил:

Отбор работает, все ок. Но, если в режиме предприятия открыть настройки этого списка (Все действия — Настроить список) то там не установлен никакой отбор, хотя отбор существует и работает. Почему так?

тоже не дает никакого результата.

(2) bmk74, Сделал как вы посоветовали. Результат тот же, т.е. пользователи не видят отбор

Или может я не смотрю туда где надо?? (Все действия — Настроить список. )

иесли у вас конфигурация УТ то проще сделать через

(4) klinval, (5) bmk74, Не получается.

Пробовал вот так:

Результат тот же что и в (3)

там в зависимости от режима совместимости используется либо компановщик либо отбор

Есть один нюанс . Когда создаю документ «Расход» в новом «Счете», после записи, проведения и закрытия «Расхода» его не видно в списке, пока не закрою и не открою «Счет» еще раз. В модуле формы «Счета» есть процедура:

Т.е. я записываю сначала «Счет», а потом создаю на его основании «Расход», записываю и закрываю «Расход», но он не появляется в динамическом списке в открытом документе «Счет». Если закрыть «Счет» и открыть его заново — «Расход» уже появляется. Обновление динамического списка также ничего не дает. Подскажите, как исправить это?

Глобальный контекст (Global context)
ОповеститьОбИзменении (NotifyChanged)
Вариант синтаксиса: Изменен один объект

Тип: СправочникСсылка. ; ДокументСсылка. ; ПеречислениеСсылка. ; ПланСчетовСсылка. ; ПланВидовРасчетаСсылка. ; ПланВидовРасчетаСсылка. ; БизнесПроцессСсылка. ; ЗадачаСсылка. ; РегистрСведенийКлючЗаписи. ; РегистрНакопленияКлючЗаписи. ; РегистрБухгалтерииКлючЗаписи. ; РегистрРасчетаКлючЗаписи. ; ПланОбменаСсылка. .
Ссылка измененного объекта или ключ измененной записи регистра, об изменении которой(го) необходимо уведомить динамические списки, чтобы они обновились.
Поведение при очистке кэша (такое же, как при интерактивном изменении):
кэш представлений ссылок — очищаются записи, соответствующие измененной ссылке;
кэш данных через точку — удаляются те записи, которые имеют в пути ссылки того же типа, что и измененная;
кэш данных быстрого выбора — данные хранятся по типам, очищаются данные, которые относятся к типу измененной ссылки;
кэш ограничений по типу — данные хранятся по типам, очищаются данные, которые относятся к типу измененной ссылки.
Описание варианта метода:

Уведомляет динамические списки на клиенте об изменении одного объекта базы данных или одной записи регистра.
Вариант синтаксиса: Изменено много объектов

Тип: Тип.
Тип изменившихся объектов, например «ДокументСсылка.РасходнаяНакладная».
Поведение при очистке кэша — очищается вся информация, которая связана с измененным типом.
Описание варианта метода:

Уведомляет динамические списки на клиенте об изменении множества объектов или множества записей регистра.

Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
Примечание:

Источник

Отбор в динамическом списке

Можно ли в динамическом списке программно установить отбор по нескольким полям (с использованием логических условий И, ИЛИ и т.д.)

Отбор = Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Наименование»);
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.Использование = Истина;
Отбор.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
ЭлементОтбора.ПравоеЗначение = «000000001»;

(2) mkostya,
Это не для динамических списков вроде.

По вопросу:
Можно. Нужно создать группу условий вначале

Или что то типо того, писал по памяти.

Основная таблица для Список Справочник.Корпуса
Основная таблица для СписокПомещений Справочник.Помещения

// Устанавливает отбор у отбора системы компоновки данных.
//
// Пример использования:
// ОбщегоНазначенияКлиентСервер.УстановитьОтборУСпискаНаРавенство(
// Список.Отбор,
// Новый ПолеКомпоновкиДанных(«ИмяСвойства»),
// ЗначениеОтбора);
//
&НаКлиенте
Процедура УстановитьОтборУСпискаНаРавенство(ОтборСКД,
знач ЛевоеЗначение,
знач ПравоеЗначение) Экспорт

ЭлементыОтбора = ОтборСКД.Элементы;
ЭлементОтбораДанных = Неопределено;

Для Каждого ЭлементОтбора Из ЭлементыОтбора Цикл
Если ЭлементОтбора.ЛевоеЗначение = ЛевоеЗначение Тогда
Если ЭлементОтбораДанных = Неопределено Тогда
ЭлементОтбораДанных = ЭлементОтбора;
Иначе
ЭлементОтбора.Использование = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;

Если ЭлементОтбораДанных = Неопределено Тогда
ЭлементОтбораДанных = ЭлементыОтбора.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбораДанных.ЛевоеЗначение = ЛевоеЗначение;
КонецЕсли;

ЭлементОтбораДанных.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбораДанных.ПравоеЗначение = ПравоеЗначение;
ЭлементОтбораДанных.Использование = Истина;

Источник

Динамический список — как сделать отбор по дате ?

Есть список Чеков. Документов очень много. Как при открытии программно (!) установить отбор только за сегодня ?

Варианты фильтра — после открытия —

Пер = Новый СтандартныйПериод(НачалоДня(ТекущаяДата()),ТекущаяДата());
элементы.Список.Период = Пер;
Элементы.Список.Обновить();

Фильтруют уже отобранные данные. Т.е. сперва ты ждешь долго, потом видишь документы.

Как установить отбор в Списке до отбора данных ?

Даже ставлю дату руками, сохраняю значение — штатно. И потом ни в ПриСозданииНаСервере ни в ПриОткрытии не могу найти эти значения в отборах Списка

Сходу точно не скажу, но примерно следующий

(2) А это в какой момент делать ? Я не совсем понимаю , когда именно компоновщик выбирает значения из базы.
Самое ранее что происходит на форме списка — ПриСозданииНаСервере — сюда суваться ?

Сейчас попробую. Спасибо за наводку

Добавил , все проходит , но фактически журнал не фильтруется

&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Период»);
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
Список.КомпоновщикНастроек.ЗагрузитьНастройки(Список.КомпоновщикНастроек.Настройки);

(9) это бы обновляло форму только , но я вижу что нет ни отбора, и скорость открытия долгая — т.е. данные не фильтруются

(10)
нет не уверен ) Но и не ругалось . пробую с Датой

Вы уверены что в динамическом списке есть поле «Период»?

Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Дата»);
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
УсловиеОтбора.Использование = Истина;

(13) вот тут подробнее.
у меня
1С:Предприятие 8.3 (8.3.12.1685)
Розница, редакция 2.2 (2.2.11.16) ну тут не так важно

У меня расширением перекрыто ПриСозданииНаСервере

У вас такой же текст ?
В какую процедуру помещали ?
В списке настройки формы — Ваш отбор появился ?

Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Дата»);
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
УсловиеОтбора.Использование = Истина;

Вот этот код использую.

В форме списка Вашего расширения, посмотрите привязана ли эта функция к событию формы «ПриСозданииНаСервере»

(16) Пробуйте так. Должно работать

Отбор = Список.Отбор.Элементы;
УсловиеОтбора = Отбор.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
УсловиеОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Дата»);
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
УсловиеОтбора.ПравоеЗначение = ТекущаяДата();
УсловиеОтбора.Использование = Истина;

(18) пробую..
хотя так тоже пробовал вроде в процессе «проб и ошибок»

А в чем разница между —

Список.Отбор.Элементы
Список.КомпоновщикНастроек.Настройки.Отбор.Элементы
Список.КомпоновщикНастроек.ПользовательскиеНастройки.Отбор.Элементы

а то нигде не могу найти принципиальную разницу

Попробовал. С указанием четко даты — не вышло — он точно по времени смотрит.
Поменял на
УсловиеОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
УсловиеОтбора.ПравоеЗначение = Дата(‘20190108’);

работает — отбирает быстрее, открывается быстрее. . НО ! 🙂
1. не видно интервала отбора — сверху формы
2. В настройках формы — нет этого фильтра.
И как бы ни ставил период , сбрасывал настройки — отбор остается
Т.е. он устанавливается и жестко и все

А если так —
Отбор = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы;

то отбор не ставится вообще

Пока решения не нашел (

Т.е. или тащатся не все данные, но тогда и отбора не видно и не отключить
Или тащатся все данные — но отбор не ставится

У меня сработал вот этот код:

лНовыйПериод = Новый СтандартныйПериод(НачалоДня(ТекущаяДата()), КонецДня(ТекущаяДата()+24*60*60));

При этом отбор показывается в панели быстрых отборов, как будто бы период задали руками. Решение почерпнуто по этой ссылке: http://1000and1c.blogspot.com/2016/11/1.html

У меня подобная проблема возникла в ЗиКГУ в Журналах документов, особенно кадровых.
Там важна дата события, а не дата создания документа, т.е. нужны отборы по полям типа «ДатаСобытия», «ДатаНачала», «ПериодРегистрации».

Можно, конешно, сделать в настройках два отбора по больше-меньше, но как-то фе.
Я кинул в реквизиты формы СтандартныйПериод и обрабатываю события

Диалог = Новый ДиалогРедактированияСтандартногоПериода;
Диалог.Период = Форма[Путь];
Диалог.Показать(Новый ОписаниеОповещения(«ВыбратьПериодЗавершение», ЭтотОбъект, Контекст));
КонецПроцедуры

ПолеСобытия = Новый ПолеКомпоновкиДанных(«ДатаСобытия»);

Если Отборы.Количество() = 0 Тогда
Отбор = Отборы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
Отбор.Использование = Истина;

Отбор = Отборы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
Отбор.Использование = Истина;
Иначе
Для каждого Отбор ИЗ Отборы Цикл
Если Отбор.ЛевоеЗначение = ПолеСобытия Тогда
Если Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
Отбор.Использование = Истина;
ИначеЕсли Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
Отбор.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Вообще-то, в ЗиКГУ в механизме Установить период есть возможность
выбрать Показать стандартные периоды и установить Сегодня

В Вашей ситуации, если нет потребности в последующем изменении периода, достаточно:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
.
УстановитьПараметрыОтбораПоПериоду(ПолеСобытия, ДатаНачалаОтбора, ДатаОкончанияОтбора);
//ГДЕ:
//ПолеСобытия = Новый ПолеКомпоновкиДанных(«Дата»);
//ДатаНачалаОтбора = НачалоДня(ОбщегоНазначения.ТекущаяДатаПользователя());
//ДатаОкончанияОтбора = КонецДня(ОбщегоНазначения.ТекущаяДатаПользователя());
//Ускорит процесс открытия формы — отключить стандартную установку периода
.
КонецПроцедуры

&НаСервере
Процедура УстановитьПараметрыОтбораПоПериоду(ПолеСобытия, ДатаНачалаОтбора, ДатаОкончанияОтбора)

Если Отборы.Количество() = 0 Тогда
Отбор = Отборы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
Отбор.Использование = Истина;

Отбор = Отборы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
Отбор.ЛевоеЗначение = ПолеСобытия;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
Отбор.Использование = Истина;
Иначе
Для каждого Отбор ИЗ Отборы Цикл
Если Отбор.ЛевоеЗначение = ПолеСобытия Тогда
Если Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаНачалаОтбора;
ИначеЕсли Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно Тогда
Отбор.ПравоеЗначение = ДатаОкончанияОтбора;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;

Источник

Читайте также:  Как настроить голос гугла
Оцените статью