
5. Расшифровки в скд Стандартная расшифровка
В СКД стандартная расшифровка представляет собой всплывающее меню (по двойному клику на ячейке), содержащие доступные пользователю действия
Интерактивный выбор действия обработки расшифровки, предоставляет пользователю набор доступных действий в виде меню и, в случае необходимости, запрашивает дополнительную информацию. Меню состоит из возможных действий над расшифровкой: “Расшифровать”, “Открыть”, “Отфильтровать”, “Упорядочить”, “Сгруппировать”, “Оформить”. Для всех действий, кроме расшифровки, программа пытается подобрать наиболее вероятные варианты параметризации, на основе данных расшифровки. “Открыть” - отбираются поля данного элемента расшифровки, которые имеют значения не примитивных типов и не являются перечислениями. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки. “Отфильтровать” - отбираются поля данного элемента расшифровки, которые имеют значения и доступны для использования в главном отборе, либо в отборах элементов структуры, и имеют доступный вид сравнения “Равно”, либо “В группе” для полей содержащих иерархическое значение. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки. “Упорядочить” - отбираются поля данного элемента расшифровки, которые доступны для использования в упорядочивании. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки. “Сгруппировать”- отбираются поля данного элемента расшифровки, которые доступны для использования в группировках и не задействованы в вышестоящих группировках. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки. “Оформить” - отбираются поля данного элемента расшифровки, которые имеют значения, доступны для использования в дополнительном отборе, и имеют доступный вид сравнения “Равно”, либо “В группе” для полей содержащих иерархическое значение. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки. “Расшифровать” – действие не доступно, если данный элемент расшифровки – “детальные записи”, кроме случая, когда он содержит поля – ресурсы.
Нестандартная расшифровка
Вся работа с расшифровкой, выполняется в событии ОбработкаРасшифровки. Чтобы получить доступ к этому событию, необходимо сначала сгенерировать основную форму отчета..
Параметр «Расшифровка» имеет тип «ИдентификаторРасшифровкиКомпоновкиДанных».
При формировании отчетов с помощью СКД данные о расшифровке хранятся в специальном объекте. Извлечение данных осуществляется по идентификатору объекта
См. в Синтаксис-помощнике Отчеты – Расширение формы отчета – ДанныеРасшифровки. Именно в этом объекте содержатся все элементы расшифровки.
Работу с данным параметром рассмотрим только для 8.2 - УП
Для передачи параметров в процедуру обработки расшифровки используется стандартный реквизит «ДанныеРасшифровки» типа строка
Особенностью данного реквизита является то, что его значение при передаче параметра расшифровки хранится в так называемом «временном хранилище данных». Это значение можно извлечь, указав ссылку на это хранилище с помощью метода «ПолучитьИзВременногоХранилища». Данный метод работает только на сервере. Поэтому переносим вызов метода на сервер
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
ТОвар=ПолучитьРасшифровку(Расшифровка);
КонецПроцедуры
&НаСервере
Функция ПолучитьРасшифровку(Расшифровка)
Данные=ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
Поля=Данные.Элементы.Получить(Расшифровка).ПолучитьПоля();
Полученное поле является коллекцией. Для нахождения в ней нужного значения воспользуемся методом «Найти». Результат м.б. неопределен, если поиск неуспешен. Поэтому
ПолеТовар=Поля.Найти("Товар");
Если ПолеТовар=Неопределено Тогда
Возврат Неопределено;
Иначе
Возврат Полетовар.Значение;
КонецЕСли;
Т.о. Получили значение поля товар, на котором сделали двойной клик.
КонецФункции
Кроме товара, входными данными конкретизирующего отчета являются значения склада и даты, на которую считались остатки (будем считать, что ведомость по движению формируем за весь период от начала эксплуатации БД до выбранной даты). Окончательно получим следующий текст:
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Товар= _ПолучитьРасшифровку(Расшифровка);
Если Товар=Неопределено Тогда
Возврат;
КонецЕСли;
КонПериода= _ПолучитьДату(Расшифровка);
Если КонПериода=Неопределено Тогда
Возврат;
КонецЕСли;
Склад=_ПолучитьНастройку();
Если склад=Неопределено Тогда
Возврат;
КонецЕСли;
СтандартнаяОбработка=Ложь;
Таб=ОбработатьРасшифровку(товар,Склад,КонПериода);
Таб.Показать();
//Сообщить(Товар);
КонецПроцедуры
&НаСервере
Функция _ПолучитьРасшифровку(Расшифровка)
Данные=ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
Поля=Данные.Элементы.Получить(Расшифровка).ПолучитьПоля();
//
ПолеТовар=Поля.Найти("Товар");
Если ПолеТовар=Неопределено Тогда
Возврат Неопределено;
Иначе
//Сообщить(Полетовар.Значение);
Возврат Полетовар.Значение;
КонецЕСли;
КонецФункции
&НаСервере
Функция _ПолучитьДату(Расшифровка)
Данные=ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
Выбдата=Данные.настройки.ПараметрыДанных.Элементы.получить(0).Значение.Дата;
Если Выбдата=Неопределено Тогда
Возврат Неопределено;
Иначе
Возврат Выбдата;
КонецЕСли;
КонецФункции
&НаСервере
Функция _ПолучитьНастройку()
ПолучитьОтбор=отчет.КомпоновщикНастроек.ПолучитьНастройки().Отбор;
// из строки <Склад равно "Основной"> выделяем наименование выбранного склада
НастройкаСтрока=СокрЛП(Строка(ПолучитьОтбор));
Нач=Найти(НастройкаСтрока,"""");
Наименование=сред(НастройкаСтрока,Нач+1,СтрДлина(НастройкаСтрока)-нач-1);
Склад=Справочники.Склад.НайтиПоНаименованию(Наименование);
Если Склад=Неопределено Тогда
Возврат Неопределено
ИНаче
Возврат Склад;
КонецЕСли;
КонецФункции
После получения товара, склада, даты как параметров расшифровки, можно формировать конкретизирующий отчет. Его можно сделать двумя способами:
«традиционными» средствами, т.е. сформировать макет, а затем модуль формирования с его использованием.
можно и вызвать в качестве конкретизирующего другой отчет, который также выполнен с использованием СКД. Например, ведомость движения данного товара (как приход, так и расход) до момента расчета остатков предыдущего отчета.
Рассмотрим второй случай.
В качестве конкретизирующего отчета используем отчет «Ведомость движения товара на складе», который в случае автономного запуска имеет вид:
В виде расшифровки отчета по остаткам этот же отчет должен выглядеть так (отборы недоступны):
Поэтому сначала формируем два варианта отчета для отчета «Ведомость…» (для автономного запуска и для использования в расшифровке ) в СКД, а затем вернемся к основному отчету по остаткам и присоединим эту ведомость в качестве расшифровки.
А) Разработка ведомости в СКД
Формируем запрос с вычисляемыми полями
Запрос:
Выбираем ресурсы
Поскольку поля «товар» и «склад», «Период» должны стать входными данными для отчета, передаваемые программным способом, эти поля устанавливаем в закладке «параметры»
В «настройках» сначала определяем группировки отчета
З
атем
описываем параметры, как, во-первых, не
включаемые в пользовательские настройки,
а во-вторых, значение которых формируется
программным путем, т.е. как параметры
данной СКД.
Формируем выбранные поля:
Поскольку данная ведомость должна быть сформирована по конкретному товару, складу, а также за период с начала функционирования БД до назначенной в основном отчете даты, необходимо установить отбор. Поскольку все поля отбора получают значение при вызове конкретизирующего отчета, следовательно, это и будут значения переданных параметров.
Наконец, назначим сортировку данных в ведомости по периоду
Данный вариант отчета по умолчанию назван «основной». Для запуска ведомости в автономном режиме добавим новый вариант отчета «автономный» копированием основного.
В данном варианте изменяем только настройки:
А) параметры:
б) отбор:
Отчет готов.
Теперь, если запустить отчет в автономном режиме, получим:
Осталось выяснить, как этот отчет будет вызываться из основного отчета, а также как осуществляется передача параметров при вызове.
Б) Присоединение ведомости в качестве расшифровки отчета по остаткам
Данная процедура присоединения решается программным путем в процедуре обработки расшифровки. Для каждого этапа формирования отчета в СКД существует свой ключевой объект, вызываемый программным путем
КомпоновщикМакетаКомпоновкиДанных
На вход его поступает схема компоновки данных, а также настройки(параметры, отборы и прочее), а на выходе (с помощью метода СКОМПОНОВАТЬ) формируется макет.
Далее этот макет необходимо заполнить данными. Для этого используется объект ПроцессорКомпоновкиДанных, который возвращает Результат. Но пока его выводить на экран нельзя.
Для вывода результата на экран используется объект ПроцессорВыводаКомпоновкиДанных. Он возвращает либо табличныйДокумент, либо форму отчета на СКД
Реализуем эти три этапа
&НаСервере
Функция ОбработатьРасшифровку(товар,Склад,КонПериода)
Ведомость=Отчеты.ВедомостьДвиженияТОвара_СКД1.Создать();
// заодно формируем заголовок ведомости программным путем
КомпоновщикНастроек=Ведомость.КомпоновщикНастроек;
Настройки=КомпоновщикНастроек.ПолучитьНастройки();
Параметр=Настройки.ПараметрыВывода.НайтиЗначениеПараметра (Новый ПараметрКомпоновкиДанных("Заголовок"));
Параметр.Значение="Дижение товара за период до "+Строка(КонПериода);
Параметр.Использование=Истина;
Ведомость.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
// первый этап
СКД=Ведомость.СхемаКомпоновкиДанных;
ПараметрТовар=Настройки.ПараметрыДанных.Элементы.Найти("Товар");
Если ПараметрТовар<> Неопределено Тогда
ПараметрТовар.Значение=Товар;
КонецЕСли;
ПараметрСклад=Настройки.ПараметрыДанных.Элементы.Найти("Склад");
Если ПараметрСклад<> Неопределено Тогда
ПараметрСклад.Значение=Склад;
КонецЕСли;
ПараметрКонДата=Настройки.ПараметрыДанных.Элементы.Найти("КонДата");
Если ПараметрКонДата<> Неопределено Тогда
ПараметрКонДата.Значение=КонПериода;
КонецЕСли;
Ведомость.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КомпоновщикМакета= новый КомпоновщикМакетаКомпоновкиДанных;
Макет= КомпоновщикМакета.Выполнить(СКД, настройки);
// второй этап
ПроцессорСКД=Новый ПроцессорКомпоновкиДанных;
ПроцессорСКД.Инициализировать(макет);
// третий этап
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ТабДок=Новый ТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабДок);
ЕщеТаб=ПроцессорВывода.Вывести(ПроцессорСКД);
// осталось показать результат. Но этого в серверной процедуре делать нельзя. Поэтому
Возврат ЕщеТаб;
КонецФункции
Запускаем отчет:
После вывода расшифровки: