Как наложить отбор по дате поверх пользовательского отбора?

1. RVDVuQUw 10.08.26 13:21 Сейчас в теме
Всем доброго времени суток! Есть Журнал документов (УТ 10.3, Кассовые документы). Нужно установить отбор по дате, при этом не нарушая работу пользовательского отбора. Т.е. пользователь может задавать любой период, но отображаться должны только документы не старше определённой даты. Я так понимаю, мне нужно в процедуре ЖурналДокументовСписокПриПолученииДанных как-то получить новый список доступных документов из того, на который уже наложен пользовательский отбор и подсунуть его вместо изначального? Только не соображу, как это сделать.
Процедура ЖурналДокументовСписокПриПолученииДанных(Элемент, ОформленияСтрок)
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		Если ОформлениеСтроки.Дата >= Дата(2026, 7, 15) Тогда
			// Тут что должно быть?					
		КонецЕсли;
	КонецЦикла;
		
КонецПроцедуры
Показать


Подскажите, пожалуйста, как подменить список. Или может есть более правильный/простой способ решения этой задачи?
Найденные решения
8. SlavaKron 10.08.26 14:29 Сейчас в теме
Перем
	ОбновлятьОтбор;

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	// Привязываем процедуру ОбновитьОтборПоСсылкам к измерению отбора
	ПодключитьОбработчикИзмененияДанных("ДокументСписок.Отбор", "ОбновитьОтборПоСсылкам", Истина);
	ОбновлятьОтбор = Истина;
	ОбновитьОтборПоСсылкам();
КонецПроцедуры

Процедура ОбновитьОтборПоСсылкам(ИмяДанных = "")
	
	Если Не ОбновлятьОтбор Тогда
		Возврат;
	КонецЕсли;
	
	// Временно отключаем обновление чтобы не вызвать зацикливание при программном изменении отбора
	ОбновлятьОтбор = Ложь;
	
	ОтборСсылка = ДокументСписок.Отбор.Ссылка;
	ОтборСсылка.Использование = Ложь;
	
	ОтборДата = ДокументСписок.Отбор.Дата;
	// Сохраняем пользовательский отбор по дате
	ПараметрыОтбора = Новый Структура("ВидСравнения,Значение,ЗначениеПо,ЗначениеС,Использование");
	ЗаполнитьЗначенияСвойств(ПараметрыОтбора, ОтборДата);
	
	// Временно устанавливаем наш отбор по дате
	ОтборДата.Использование = Истина;
	ОтборДата.ВидСравнения = ВидСравнения.БольшеИлиРавно;
	ОтборДата.Значение = '20260101';
	
	// Получаем ссылки соответствующие всем отбора + наш отбор по Дате
	Построитель = Новый ПостроительЗапроса;
	Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументСписок);
	МассивСсылок = Построитель.Результат.Выгрузить().ВыгрузитьКолонку("Ссылка");
	
	// Восстанавливаем пользовательский отбор по дате
	ЗаполнитьЗначенияСвойств(ОтборДата, ПараметрыОтбора);
	
	ОтборСсылка.Использование = Истина;
	ОтборСсылка.ВидСравнения = ВидСравнения.ВСписке;
	ОтборСсылка.Значение.ЗагрузитьЗначения(МассивСсылок);
	
	ОбновлятьОтбор = Истина;
	
КонецПроцедуры
Показать
RVDVuQUw; +1 Ответить
11. SlavaKron 10.08.26 16:26 Сейчас в теме
(10) Добавьте ОбновитьОтборПоСсылкам() в событие ОбработкаЗаписиНовогоОбъекта списка.
RVDVuQUw; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 10.08.26 13:32 Сейчас в теме
(1) ПриПолученииДанных тут точно не подходит. Думаю, тут лучше подойдёт дополнительный отбор по ссылкам.
3. homer_ 79 10.08.26 13:34 Сейчас в теме
Процедура ПриОткрытии()
    
    // Устанавливаем фиксированный отбор по дате
    ЭлементыФормы.Список.Отбор.Дата.ВидСравнения = ВидСравнения.Равно;
    ЭлементыФормы.Список.Отбор.Дата.Значение     = НачалоДня(ТекущаяДата());
    ЭлементыФормы.Список.Отбор.Дата.Использование = Истина;
    ЭлементыФормы.Список.Отбор.Дата.Доступность = Ложь;
    
КонецПроцедуры
Показать
4. RVDVuQUw 10.08.26 13:40 Сейчас в теме
(2) Это как? Покажите, пожалуйста, пример, если можно.

(3) Работает ровно до того момента, пока пользователь не изменит период отбора. Запрещать изменять период нельзя, т.к. пользователь должен иметь возможность задавать период, например, в один день, и этот день может попасть в доступный ему период. Так что не вариант, к сожалению.
5. SlavaKron 10.08.26 13:43 Сейчас в теме
(4)
Это как?
Что именно?
6. ZergKRSK 130 10.08.26 13:45 Сейчас в теме
(4)
Это как?

Что-то типа такого
ОтборСсылка = ДокументСписок.Отбор.Найти("Ссылка");
ОтборСсылка.Использование = Истина;
ОтборСсылка.ВидСравнения = ВидСравнения.ВСписке;
ОтборСсылка.Значение = ПолучитьНужныеДокументы();
RVDVuQUw; +1 Ответить
7. homer_ 79 10.08.26 14:10 Сейчас в теме
Сделать на УФ журнал. там можно это решить
или через РЛС
8. SlavaKron 10.08.26 14:29 Сейчас в теме
Перем
	ОбновлятьОтбор;

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	// Привязываем процедуру ОбновитьОтборПоСсылкам к измерению отбора
	ПодключитьОбработчикИзмененияДанных("ДокументСписок.Отбор", "ОбновитьОтборПоСсылкам", Истина);
	ОбновлятьОтбор = Истина;
	ОбновитьОтборПоСсылкам();
КонецПроцедуры

Процедура ОбновитьОтборПоСсылкам(ИмяДанных = "")
	
	Если Не ОбновлятьОтбор Тогда
		Возврат;
	КонецЕсли;
	
	// Временно отключаем обновление чтобы не вызвать зацикливание при программном изменении отбора
	ОбновлятьОтбор = Ложь;
	
	ОтборСсылка = ДокументСписок.Отбор.Ссылка;
	ОтборСсылка.Использование = Ложь;
	
	ОтборДата = ДокументСписок.Отбор.Дата;
	// Сохраняем пользовательский отбор по дате
	ПараметрыОтбора = Новый Структура("ВидСравнения,Значение,ЗначениеПо,ЗначениеС,Использование");
	ЗаполнитьЗначенияСвойств(ПараметрыОтбора, ОтборДата);
	
	// Временно устанавливаем наш отбор по дате
	ОтборДата.Использование = Истина;
	ОтборДата.ВидСравнения = ВидСравнения.БольшеИлиРавно;
	ОтборДата.Значение = '20260101';
	
	// Получаем ссылки соответствующие всем отбора + наш отбор по Дате
	Построитель = Новый ПостроительЗапроса;
	Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументСписок);
	МассивСсылок = Построитель.Результат.Выгрузить().ВыгрузитьКолонку("Ссылка");
	
	// Восстанавливаем пользовательский отбор по дате
	ЗаполнитьЗначенияСвойств(ОтборДата, ПараметрыОтбора);
	
	ОтборСсылка.Использование = Истина;
	ОтборСсылка.ВидСравнения = ВидСравнения.ВСписке;
	ОтборСсылка.Значение.ЗагрузитьЗначения(МассивСсылок);
	
	ОбновлятьОтбор = Истина;
	
КонецПроцедуры
Показать
RVDVuQUw; +1 Ответить
9. RVDVuQUw 10.08.26 14:41 Сейчас в теме
(8) Кажется работает! Спасибо огромнейшее!!!
10. RVDVuQUw 10.08.26 15:44 Сейчас в теме
Блин. Поторопилась радоваться. Теперь при добавлении документа через журнал выдаёт сообщение "Введённые данные не отображены в списке, так как не соответствуют отбору". Даже если перенести вызоа процедуры ОбновитьОтборПоСсылкам(); из ПередОткрытием() в ОбновлениеОтображения()
:(
11. SlavaKron 10.08.26 16:26 Сейчас в теме
(10) Добавьте ОбновитьОтборПоСсылкам() в событие ОбработкаЗаписиНовогоОбъекта списка.
RVDVuQUw; +1 Ответить
12. RVDVuQUw 10.08.26 16:33 Сейчас в теме
Да, так заработало! Спасибо большое ещё раз!!!
13. RVDVuQUw 10.08.26 17:18 Сейчас в теме
Так, а в общий модуль, я так понимаю, это вынести нельзя, да? Нужно для каждого журнала и списка документов в форме эту процедуру прописывать?
14. RVDVuQUw 10.08.26 17:42 Сейчас в теме
А, не, вроде можно!
В общем модуле:
Процедура УстановитьОграничениеПоДате(ДокументСписок, ДатаОграничения, ИмяПоляДата = "Дата", ИмяПоляСсылка = "Ссылка") Экспорт

    ОтборСсылка = ДокументСписок.Отбор[ИмяПоляСсылка];
    ОтборДата    = ДокументСписок.Отбор[ИмяПоляДата];

    // Отключаем наш технический отбор,
    // чтобы он не участвовал в повторном построении списка.
    ОтборСсылка.Использование = Ложь;

    // Сохраняем пользовательский отбор по дате.
    ПараметрыОтбора = Новый Структура("ВидСравнения,Значение,ЗначениеПо,ЗначениеС,Использование");

    ЗаполнитьЗначенияСвойств(ПараметрыОтбора, ОтборДата);

    Попытка

        // Временно ставим системное ограничение.
        ОтборДата.Использование = Истина;
        ОтборДата.ВидСравнения = ВидСравнения.БольшеИлиРавно;
        ОтборДата.Значение = ДатаОграничения;

        Построитель = Новый ПостроительЗапроса;
        Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ДокументСписок);

        МассивСсылок = Построитель.Результат.Выгрузить().ВыгрузитьКолонку(ИмяПоляСсылка);

    Исключение

        // Обязательно вернуть пользовательский отбор.
        ЗаполнитьЗначенияСвойств(ОтборДата, ПараметрыОтбора);

        ВызватьИсключение;

    КонецПопытки;

    // Восстанавливаем отбор пользователя.
    ЗаполнитьЗначенияСвойств(ОтборДата, ПараметрыОтбора);

    // Накладываем техническое ограничение по ссылкам.
    ОтборСсылка.Использование = Истина;
    ОтборСсылка.ВидСравнения = ВидСравнения.ВСписке;
    ОтборСсылка.Значение.ЗагрузитьЗначения(МассивСсылок);

КонецПроцедуры
Показать


В форме журнала:

Перем ОбновлятьОтбор;

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
	// Вставить содержимое обработчика.
	
	Если РольДоступна("ОграничениеПоДатеКассовыхДокументов") Тогда
		// Привязываем процедуру ОбновитьОтборПоСсылкам к измерению отбора
    	ПодключитьОбработчикИзмененияДанных("ЖурналДокументовСписок.Отбор", "ОбновитьОтборПоСсылкам", Истина);

    	ОбновлятьОтбор = Истина;

    	ОбновитьОтборПоСсылкам();		
	КонецЕсли;

КонецПроцедуры


Процедура ОбновитьОтборПоСсылкам(ИмяДанных = "")

    Если Не ОбновлятьОтбор Тогда
        Возврат;
    КонецЕсли;

    ОбновлятьОтбор = Ложь;

    Попытка

        МодульДополнительныхФункцийИПроцедур.УстановитьОграничениеПоДате(ЖурналДокументовСписок, НачалоДня(Дата(2026,6,1)));

    Исключение

        ОбновлятьОтбор = Истина;
        ВызватьИсключение;

    КонецПопытки;

    ОбновлятьОтбор = Истина;

КонецПроцедуры

Процедура ОбновлениеОтображения()	
	Если РольДоступна("ОграничениеПоДатеКассовыхДокументов") Тогда
		ОбновитьОтборПоСсылкам();
	КонецЕсли;
КонецПроцедуры

Процедура ЖурналДокументовСписокОбработкаЗаписиНовогоОбъекта(Элемент, Объект, СтандартнаяОбработка)
	Если РольДоступна("ОграничениеПоДатеКассовыхДокументов") Тогда
		ОбновитьОтборПоСсылкам();
    КонецЕсли;
КонецПроцедуры
Показать


Ещё раз всем спасибо!!!
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот