gifts2017

Как создать кнопки варианта отчета СКД для обычных форм

Опубликовал program program (prodines) в раздел Программирование - Практика программирования

Добавляем кнопки вариантов отчёта в самодельном отчёте на СКД (обычные формы) на базе типового шаблона отчёта СКД с ИТС.

Я сделал свой отчёт на СКД с использованием обычной (т.е. не управляемой) формы. В качестве заготовки взял типовой шаблон отчёта на СКД с ИТС http://its.1c.ru/db/metod81#content:3048:1 .

В самом конце возникла неожиданная проблема - как организовать переключение вариантов отчета на форме?

На форме этого шаблона уже была изначально предусмотрена панель выбора вариантов отчёта - "ПанельВыбораВариантов" - в самом верху формы, и в левом углу её уже имелась надпись "Варианты отчёта".

Как добавить все варианты отчёта в виде кнопок этой панели?

В Интернете я нашёл лишь решение в виде добавления новой кнопки "Выбор варианта отчёта" на форму - но так не интересно, зачем изобретать велосипед, когда уже есть штатная панель кнопок варианта отчёта?

Я исследовал вопрос. Оказалось, что кнопки на эту панель добавляются, если пользователь сохранит текущую настройку путём нажатия кнопки "Сохранить вариант" (с дискетой, в правом нижнем углу отображённой панели настроек). Оказалось также, что сохраняются не просто варианты отчёта - но одновременно и пользовательские настройки, и сохраняется всё это в справочнике "Сохраненные настройки" и в хранилище значения, причём настройки эти привязаны индивидуально к пользователю.

Я написал две процедуры, программно имитирующие нажатие кнопки с дискетой. Только вместо текущего варианта отчёта они сохраняют все имеющиеся варианты отчёта. Процедуры вызываются при открытии отчёта. При этом эти кнопки (при необходимости) создаются.

Вот программный код этих процедур:

Процедура СохранитьВариантНастроекПользователя(СохраненнаяНастройка, НастраиваемыйОбъект, ВариантНастроек)

Наименование = ВариантНастроек.Имя;

ТипНастройки = Перечисления.ТипыНастроек.НастройкиОтчета;

Пользователь = глЗначениеПеременной("глТекущийПользователь");

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СохраненныеНастройкиПользователи.Ссылка
|ИЗ
| Справочник.СохраненныеНастройки.Пользователи КАК СохраненныеНастройкиПользователи
|ГДЕ
| СохраненныеНастройкиПользователи.Ссылка.Наименование = &Наименование
| И СохраненныеНастройкиПользователи.Ссылка.ТипНастройки = &ТипНастройки
| И СохраненныеНастройкиПользователи.Ссылка.НастраиваемыйОбъект = &НастраиваемыйОбъект
| И СохраненныеНастройкиПользователи.Пользователь = &Пользователь";

Запрос.УстановитьПараметр("Наименование", Наименование);
Запрос.УстановитьПараметр("НастраиваемыйОбъект", НастраиваемыйОбъект);
Запрос.УстановитьПараметр("Пользователь", Пользователь);
Запрос.УстановитьПараметр("ТипНастройки", ТипНастройки);

Результат = Запрос.Выполнить();

Если НЕ Результат.Пустой() Тогда

//Сообщить("Такой элемент уже есть в справочнике.");

Возврат;

КонецЕсли;

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

СтруктураНастроек = ТиповыеОтчеты.ПолучитьСтруктуруПараметровТиповогоОтчета(ЭтотОбъект);

СтруктураНастроек.НастройкиКомпоновщика = ВариантНастроек.Настройки;

СохранениеНастроек.СохранитьНастройкуОбъекта(СохраненнаяНастройка, СтруктураНастроек);

Модифицированность = Ложь;
Если Не ТиповыеОтчеты.ЭтоСтараяВерсияОтчета(ЭтотОбъект) Тогда
РежимРедактированияНастройки = Ложь;
ЭтоОтработкаРасшифровки = Ложь;
КонецЕсли;

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


Процедура СоздатьКнопкиПанелиВариантовОтчета(ОтчетОбъект, ФормаОтчета) Экспорт

Макет = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Для каждого ВариантНастроек Из Макет.ВариантыНастроек Цикл

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

КонецЦикла;

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

......

Процедура ПриОткрытии()

//Начало изменения
СоздатьКнопкиПанелиВариантовОтчета(ЭтотОбъект, ЭтаФорма);
//Конец изменения

...........

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

Такой вариант создания этих кнопок я считаю наиболее безопасным - потому что этот код в максимальной степени имитирует имеющийся функционал (функционал кнопки с дискетой). Всё это работает под любым пользователем.

Также я выкладываю демо-отчёт для демонстрации этого функционала - там 2 варианта отчёта - первый выводит коды справочника "Контрагенты", второй - его наименования. Всё это будет работать в любой конфигурации, где есть справочник "Контрагенты", если же такого справочника не найдётся - подправьте запрос в СКД, замените справочник "Контрагенты" на какой-нибудь свой.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ШаблонВариантыОтчетаСКД.erf
.erf 32,79Kb
14.03.14
25
.erf 32,79Kb 25 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. DAnry (DAnry) 19.03.14 15:08
Проблема актуальна. Спасибо за статью, очень полезна (что бы не выдумывать велосипед).
2. Марина Чирина (chmv) 19.01.16 12:11
а нельзя ли сделать тоже самое для управляемых форм?
НЕ хотят выбрать вариант, а только помощью панелей
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа