Перенос/копирование и установка отбора/фильтра/периода при интерактивном переключении или смене варианта отчета/СКД в БСП 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

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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • Поиск от одного разработчика до ИТ-команд под проект.
  • Обмен любыми контактами разрешён.
  • 0% комиссии, допускаются расчёты напрямую.

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

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

16500 руб.

02.09.2020    255058    1403    421    

1153

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    6315    329    shapa_pro    25    

69

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    18594    ovetgana    112    

111

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    10798    krasnoshchekovpavel    5    

68

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    10334    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    16427    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    14082    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    10852    AlexeyPROSTO_1C    1    

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