Перенос/копирование и установка отбора/фильтра/периода при интерактивном переключении или смене варианта отчета/СКД в БСП 3.1 (1C ERP, УТ, БП, ...)

25.11.21

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

Пользователи ругаются - не хотят заново заполнять период, отборы при смене варианта отчета - в публикации с открытым кодом решим эту боль.

Все последние конфигурации 1С (БП 3.0, ЗУП, ERP, УТ 11, Розница, CRM, ...) используют в своей основе ту или иную версию Библиотеки Стандартных Подсистем (БСП, SSL). Это очень удобно и для разработчиков, и для 1С и для пользователей - везде плюс/минус одинаковый стандартный код, стандартное поведение системы. Мы тоже в 2019 году выпустили третью версию Кронос: WMS (интерфейс Такси, УФ, система управления складом), построенную на базе подсистем БСП. Однако, при её использовании наши пользователи заметили часть неудобств БСП, например - при переключении/смене между предопределенными вариантами отчетов (разный вид представления одной и той же информации) пользователю приходилось повторно указывать установленные им отборы/фильтры или период. Логика 1С при разработке БСП нам понятна, но исходя из того, что для Кронос: WMS основной сценарий работы пользователя с программой другой - мы решили немного подкорректировать работу БСП и сделать приятное пользователям. 

Вот как в пользовательском режиме демонстрационной конфигурации БСП 3.1 это работает:

 

Итак,  приступим к реализации в Демонстрационной конфигурации "Библиотека стандартных подсистем", редакция 3.1 (3.1.4) , но описанное ниже будет верно и для БСП версий 2.4, 3.0.

При интерактивном нажатии на кнопку Ещё->Варианты отчета или кнопки: 

вызывается сначала процедура общей формы ФормаОтчета:

&НаКлиенте
Процедура Подключаемый_ЗагрузитьВариантОтчета(Команда)

а из неё уже процедура загрузки выбранного варианта:

ЗагрузитьВариант(ВариантФормы.КлючВарианта)

Вот собственно здесь и будем делать необходимые нам корректировки и правила.

 

Давайте, для начала в процедуру Подключаемый_ЗагрузитьВариантОтчета (БСП 3.1) встроим вопрос пользователю, хотел бы ли он, чтобы его настройки отчета (отбор или период, прочие параметры) перенеслись в выбранный вариант отчета:

	//заменим 
	//ЗагрузитьВариант(ВариантФормы.КлючВарианта);
	//на
	Оповещение = Новый ОписаниеОповещения("ЗакончитьЗагрузкуВарианта", ЭтотОбъект, ВариантФормы);		
	ПоказатьВопрос(Оповещение, "Перенести отбор/параметры в новый вариант отчета?", РежимДиалогаВопрос.ДаНет);

и напишем процедуру обработки оповещения:

&НаКлиенте
Процедура ЗакончитьЗагрузкуВарианта(Результат, ДополнительныеПараметры) экспорт
	
	ЗагрузитьВариант(ДополнительныеПараметры.КлючВарианта, (Результат=КодВозвратаДиалога.Да));
	
	КлючУникальности = ОтчетыКлиентСервер.КлючУникальности(НастройкиОтчета.ПолноеИмя, ДополнительныеПараметры.КлючВарианта);
	
	Если Элементы.ФормироватьСразу.Пометка Тогда
		ПодключитьОбработчикОжидания("Сформировать", 0.1, Истина);
	КонецЕсли;
	
КонецПроцедуры

После изменим объявление процедуры ЗагрузитьВариант(КлючВарианта, ПеренестиНастройки=Ложь) и запомним в её начале текущие настройки и пользовательские настройки компоновщика СКД: 

	ПредыдущиеНастройки = Отчет.КомпоновщикНастроек.Настройки;
	ПредыдущиеПользовательскиеНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;

 

А теперь самое интересное - нам необходимо перенести/скопировать/установить предыдущие настройки компоновщика СКД в новые установленные, после УстановитьТекущийВариант - сделаем мы это таким кодом:

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

	КонецЕсли;

 

ПеренестиОтборДинамическогоСписка(ТекущиеНастройки.Отбор, ПредыдущиеНастройки.Отбор, Истина);

Если в сценарии работы Ваших отчетов НЕ требуется переносить/копировать отбор, который пользователь сам добавил в отчет (не включенные в пользовательские настройки), то вызвать процедуру ПеренестиОтборДинамическогоСписка нужно с Истина, если нужно все отборы переносить/копировать, то вызывать с Ложь.  Мы у себя используем Истина, т.к. те отборы, которые необходимо автоматически переносить/копировать, включены в пользовательские настройки, остальные мы автоматически не переносим/копируем даже при нажатии пользователем ДА: 

 

Сама процедура ПеренестиОтборДинамическогоСписка  достаточно простая - осуществляет перенос/копирование/установку отбора с Отбора-источник на Отбор-приемник, как в динамическом списке, так и в СКД. Причем, как было описано выше, бывает два варианта - либо только перенос (отбор устанавливается на уже существующие элементы отбора), либо полное копирование/установка отбора (добавляется в том, числе отбор, который отсутствует) в динамический список/СКД приемник. В нашей конфигурации Кронос: WMS мы много где используем копирование настроек, поэтому мы себе добавили процедуру в общий модуль:

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

	КонецЦикла;	
	
КонецПроцедуры

 

Приведу целиком для БСП 3.1.4 получившуюся процедуру ЗагрузитьВариант с учетом корректировки:

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

	РежимРасшифровки = Ложь;
	ВариантМодифицирован = Ложь;
	ПользовательскиеНастройкиМодифицированы = Ложь;
	НастройкиОтчета.ПрочитатьФлажокФормироватьСразуИзПользовательскихНастроек = Истина;
	
	УстановитьТекущийВариант(КлючВарианта);

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

	КонецЕсли;
    //

	ОтчетыКлиентСервер.ОтобразитьСостояниеОтчета(
		ЭтотОбъект,
		НСтр("ru = 'Выбран другой вариант отчета. Нажмите ""Сформировать"" для получения отчета.'"),
		БиблиотекаКартинок.Информация32);
КонецПроцедуры

 

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

 

Надеюсь, моя публикация была Вам полезна и сэкономит Ваше время, ссылка на все публикации SizovE

Подписывайтесь на мой канал (наверху), будет много интересного бесплатного контента :)

См. также

SALE! 20%

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

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 8000 руб.

02.09.2020    122319    673    389    

716

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    4052    25    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

Запросы СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    2006    2    Yashazz    0    

29

СКД на JavaScript в 1С

СКД WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8169    20    John_d    25    

123

Использование менеджера временных таблиц в СКД

СКД Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

05.12.2023    4662    PROSTO-1C    13    

61

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    5815    15    kalyaka    5    

86

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6732    accounting_cons    5    

29

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

Когда отчет надо разделить по страницам, это всегда проблема для разработчика. Поскольку в СКД нет стандартных вариантов, как это сделать. Нашел (на свой взгляд) самое простое и оптимальное решение.

01.09.2023    4532    KVIKS    15    

80
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Olenevod 33 31.01.21 15:36 Сейчас в теме
Полезная статья. Еще вот были случаи когда надо было формировать несколько вариантов отчетов сразу на разных вкладках с одинаковыми настройками. Эта статья облегчает процесс создания такого отчета.
2. SizovE 262 01.02.21 18:52 Сейчас в теме
(1) чтобы не ждать завершения формирования ? Кстати, да, хорошая мысль +
3. Olenevod 33 02.02.21 09:48 Сейчас в теме
(2) Не только. Просто например бухам нужно было анализировать данные в разных "проекциях". Их было пять и, например, пятый отчет уже использовал данные предыдущих отчетов, но с теми же отборами. Им проще переключаться по вкладкам по сформированным отчетам, чем каждый раз их формировать, да еще и настройки подкручивая на каждом.
4. SizovE 262 02.02.21 14:46 Сейчас в теме
(3) Т.е. им по сути нужно было, чтобы вариант отчета строился не в этой вкладке, а открывался в новой, иногда действительно удобно ) - хороший кейс.
5. Garykom 16 18.03.23 01:16 Сейчас в теме
Про группы в отборе забыли
6. SizovE 262 18.03.23 10:14 Сейчас в теме
(5) Согласен ;) можно и группы добавить, но меня пока никто из пользователей не просил
Оставьте свое сообщение