Все последние конфигурации 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.
Подписывайтесь на мой канал (наверху), будет много интересного бесплатного контента :)