В начало

Своя расшифровка в отчете «ОстаткиНоменклатуры»

 

            Есть некий простецкий отчетик «Остатки номенклатуры», в котором нужно реализовать свою расшифровку данных. В частности нужно добавить свою расшифровку для этого отчета по некоторым полям, например, по полю «Номенклатура» и «Склад».

            Далее показан фрагмент отчета «Остатки номенклатуры». Отчет выводит номенклатуру, период, склад, остаток и оборот, короче ничего особенного.

Рис. Фрагмент отчета «Остатки номенклатуры»

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

Рис. Событие «ОбработкаРасшифровки»

 

            Далее приведен текст процедур в модуле формы отчета «Остатки номенклатуры». Первая процедура служит непосредственно для расшифровки данных «РезультатОбработкаРасшифровки()», вторая – служебная процедура «ОчисткаСтарыхОтборов()» для удобства.

Листинг. Процедуры в модуле формы отчета

Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

Перем ВыполненноеДействие;

    СтандартнаяОбработка=Ложь;

    ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

    ДополнительныеДействия=Новый СписокЗначений;

               

                Если ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле="Номенклатура" Тогда

        ДополнительныеДействия.Добавить("ОтборПоНоменклатуре","Отбор по НОМЕНКЛАТУРЕ");

    ИначеЕсли ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле="Склад" Тогда

        ДополнительныеДействия.Добавить("ОтборПоСкладу","Отбор по СКЛАДУ");

    КонецЕсли;

               

                Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,,ДополнительныеДействия);

    Если Настройки <> Неопределено Тогда

        КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

        ЭлементыФормы.Результат.Очистить();

        СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);

    Иначе

        Если ВыполненноеДействие="ОтборПоНоменклатуре" Тогда

                                               ОчисткаСтарыхОтборов();

                              

                                               НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

                                               ПолеОтбора = Новый ПолеКомпоновкиДанных("Номенклатура");

                                               НовыйЭлементОтбора.ЛевоеЗначение = ПолеОтбора;

                    НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

                                   НовыйЭлементОтбора.ПравоеЗначение = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;

                                               НовыйЭлементОтбора.Использование = Истина;

                              

                               ИначеЕсли ВыполненноеДействие="ОтборПоСкладу" Тогда  

                                               ОчисткаСтарыхОтборов();

 

            НовыйЭлементОтбора = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

                                               ПолеОтбора = Новый ПолеКомпоновкиДанных("Склад");

                                               НовыйЭлементОтбора.ЛевоеЗначение = ПолеОтбора;

                    НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

                                   НовыйЭлементОтбора.ПравоеЗначение = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;

                                               НовыйЭлементОтбора.Использование = Истина;

                                              

                               КонецЕсли;

                              

                               ЭлементыФормы.Результат.Очистить();

        СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);

    КонецЕсли;

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

 

Процедура ОчисткаСтарыхОтборов()

                Для Каждого СтарыйОтбор Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл

                               КомпоновщикНастроек.Настройки.Отбор.Элементы.Удалить(СтарыйОтбор);

                КонецЦикла;

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

 

            Далее запускаем режим «1С:Предприятие», запускаем отчет «Остатки номенклатуры», кликаем 2 раза по выбранной строчке в поле «Номенклатура», чтобы вызвать контекстное меню отчета. Ниже показан фрагмент отчета с нашим дополнительным пунктом расшифровки «Отбор по НОМЕНКЛАТУРЕ».

Рис. Выбираем расшифровку по полю «Номенклатура»

            Выбираем пункт контекстного меню «Отбор по НОМЕНКЛАТУРЕ», при этом будет сформирован новый отчет «Остатки номенклатуры», в который программно будет добавлен отбор по номенклатуре. В принципе, можно аналогично сделать и программное изменение параметров отчета и вывод вообще другого отчета.

Рис. Результат расшифровки по полю «Номенклатура»

            Затем протестируем другое действие, которое появляется в контекстном меню расшифровки при двойном клике в колонке «Склад». Для примера данное действие я назвал «Отбор по СКЛАДУ».

Рис. Выбор в контекстном меню отбора по полю «Склад»

            Аналогично, выбираем дополнительный пункт контекстного меню «Отбор по СКЛАДУ», при этом сработает действие, формирующее отчет с отбором по выбранному складу. Предыдущий отбор очищаем.

Рис. Результат расшифровки/отбора по полю «Склад»

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

            Таким образом,  была реализована программная расшифровка полей отчета «Номенклатура» и «Склад».