Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Меркулова_Пособие_РазработкаУправляемыхПриложен...doc
Скачиваний:
15
Добавлен:
01.07.2025
Размер:
18 Мб
Скачать

10.4. Расшифровки в скд Стандартная расшифровка

В СКД стандартная расшифровка представляет собой всплывающее меню (по двойному клику на ячейке), содержащие доступные пользователю действия, рис. 10.14.

Рис.10.14. Стандартная расшифровка в СКД

Интерактивный выбор действия обработки расшифровки, предоставляет пользователю набор доступных действий в виде меню и, в случае необходимости, запрашивает дополнительную информацию.

Меню состоит из возможных действий над расшифровкой: “Расшифровать”, “Открыть”, “Отфильтровать”, “Упорядочить”, “Сгруппировать”, “Оформить”. Для всех действий, кроме расшифровки, программа пытается подобрать наиболее вероятные варианты параметризации, на основе данных расшифровки.

Открыть” - отбираются поля данного элемента расшифровки, которые имеют значения не примитивных типов и не являются перечислениями. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки.

Отфильтровать” - отбираются поля данного элемента расшифровки, которые имеют значения и доступны для использования в главном отборе, либо в отборах элементов структуры, и имеют доступный вид сравнения “Равно”, либо “В группе” для полей содержащих иерархическое значение. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки.

Упорядочить” - отбираются поля данного элемента расшифровки, которые доступны для использования в упорядочивании. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки.

Сгруппировать”- отбираются поля данного элемента расшифровки, которые доступны для использования в группировках и не задействованы в вышестоящих группировках. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки.

Оформить” - отбираются поля данного элемента расшифровки, которые имеют значения, доступны для использования в дополнительном отборе, и имеют доступный вид сравнения “Равно”, либо “В группе” для полей содержащих иерархическое значение. Если элемент расшифровки не имеет полей с установленными значениями (любого типа), используются поля родительских элементов расшифровки.

Расшифровать” – действие не доступно, если данный элемент расшифровки – “детальные записи”, кроме случая, когда он содержит поля – ресурсы.

Нестандартная расшифровка

Вся работа с расшифровкой, выполняется в событии ОбработкаРасшифровки. Чтобы получить доступ к этому событию, необходимо сначала сгенерировать основную форму отчета ( рис. 10.15) и назначить полю «Результат» процедуру – обработчик данного события

Рис.10.15. форма отчета СКД

Параметр «Расшифровка» имеет тип «ИдентификаторРасшифровкиКомпоновкиДанных».

При формировании отчетов с помощью СКД данные о расшифровке хранятся в специальном объекте. Извлечение данных осуществляется по идентификатору объекта (См. в Синтаксис-помощнике Отчеты – Расширение формы отчета – ДанныеРасшифровки). Именно в этом объекте содержатся все элементы расшифровки.

Для передачи параметров в процедуру обработки расшифровки используется стандартный реквизит «ДанныеРасшифровки» типа строка (рис.10.16.)

Рис.10.16. Список стандартных реквизитов в СКД

Особенностью данного реквизита является то, что его значение при передаче параметра расшифровки хранится в так называемом «временном хранилище данных». Это значение можно извлечь, указав ссылку на это хранилище с помощью метода «ПолучитьИзВременногоХранилища». Данный метод работает только на сервере. Поэтому переносим вызов метода на сервер

&НаКлиенте

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

ТОвар=ПолучитьРасшифровку(Расшифровка);

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

&НаСервере

Функция ПолучитьРасшифровку(Расшифровка)

Данные=ПолучитьИзВременногоХранилища(ДанныеРасшифровки);

Поля=Данные.Элементы.Получить(Расшифровка).ПолучитьПоля();

//Полученное поле является коллекцией. Для нахождения в ней нужного значения //воспользуемся методом «Найти». Результат м.б. неопределен, если поиск неуспешен. //Поэтому

ПолеТовар=Поля.Найти("Товар");

Если ПолеТовар=Неопределено Тогда

Возврат Неопределено;

Иначе

Возврат Полетовар.Значение;

КонецЕСли;

//Т.о. Получили значение поля товар, на котором сделали двойной клик.

КонецФункции

Кроме товара, входными данными конкретизирующего отчета являются значения склада и даты, на которую считались остатки (будем считать, что ведомость по движению формируем за весь период от начала эксплуатации БД до выбранной даты). Окончательно получим следующий текст:

&НаКлиенте

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

Товар= _ПолучитьРасшифровку(Расшифровка);

Если Товар=Неопределено Тогда

Возврат;

КонецЕСли;

КонПериода= _ПолучитьДату(Расшифровка);

Если КонПериода=Неопределено Тогда

Возврат;

КонецЕСли;

Склад=_ПолучитьНастройку();

Если склад=Неопределено Тогда

Возврат;

КонецЕСли;

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

Таб=ОбработатьРасшифровку(товар,Склад,КонПериода);

Таб.Показать();

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

&НаСервере

Функция _ПолучитьРасшифровку(Расшифровка)

Данные=ПолучитьИзВременногоХранилища(ДанныеРасшифровки);

Поля=Данные.Элементы.Получить(Расшифровка).ПолучитьПоля();

ПолеТовар=Поля.Найти("Товар");

Если ПолеТовар=Неопределено Тогда

Возврат Неопределено;

Иначе

Возврат Полетовар.Значение;

КонецЕСли;

КонецФункции

&НаСервере

Функция _ПолучитьДату(Расшифровка)

Данные=ПолучитьИзВременногоХранилища(ДанныеРасшифровки);

Выбдата=Данные.настройки.ПараметрыДанных.Элементы.получить(0).Значение.Дата;

Если Выбдата=Неопределено Тогда

Возврат Неопределено;

Иначе

Возврат Выбдата;

КонецЕСли;

КонецФункции

&НаСервере

Функция _ПолучитьНастройку()

ПолучитьОтбор=отчет.КомпоновщикНастроек.ПолучитьНастройки().Отбор;

// из строки <Склад равно "Основной"> выделяем наименование

// выбранного склада

НастройкаСтрока=СокрЛП(Строка(ПолучитьОтбор));

Нач=Найти(НастройкаСтрока,"""");

Наименование=сред(НастройкаСтрока,Нач+1,СтрДлина(НастройкаСтрока)-нач-1);

Склад=Справочники.Склад.НайтиПоНаименованию(Наименование);

Если Склад=Неопределено Тогда

Возврат Неопределено

ИНаче

Возврат Склад;

КонецЕСли;

КонецФункции

Замечание. Если в расшифровку необходимо передать несколько отборов (у нас – только один склад), то удобнее воспользоваться следующим алгоритмом:

&НаСервере

Функция _ПолучитьНастройку()

// коллекция всех пользовательских настроек отчета

Коллекция = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;

// здесь ключем поиска является

//ИдентификаторПользовательскойНастройки(строка), например,

//"d16ae801-9d48-43a2-8efa-fbb3bc811b39"

// а свойство элемента коллекции "ПравоеЗначение" хранит значение настройки

// Поэтому надо сначала найти этот ид-р в коллекции всех доступных

//полей отбора отчета

Настройки = Отчет.КомпоновщикНастроек.Настройки;

ВсеДоступныеПоляОтбора = Настройки.Отбор.ДоступныеПоляОтбора.Элементы;

ПолеСклад=ВсеДоступныеПоляОтбора.Найти("Склад").Поле;

ИДСклад = "";

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

Если Элемент.ЛевоеЗначение = ПолеСклад Тогда

ИДСклад = Элемент.ИдентификаторПользовательскойНастройки;

Прервать;

КонецЕсли;

КонецЦикла;

ЭлементОтбораСклад = Коллекция.Найти(ИДСклад);

Склад=ЭлементОтбораСклад.ПравоеЗначение;

Возврат Склад;

КонецФункции

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

  • «традиционными» средствами, т.е. сформировать макет, а затем модуль формирования с его использованием.

  • можно и вызвать в качестве конкретизирующего другой отчет, который также выполнен с использованием СКД. Например, ведомость движения данного товара (как приход, так и расход) до момента расчета остатков предыдущего отчета.

Рассмотрим только второй случай.

В качестве конкретизирующего отчета используем отчет «Ведомость движения товара на складе», который в случае автономного запуска имеет вид, рис. 10.17.:

Рис.10.17. Отчет по движению выбранного товара на выбранном складе за период

В виде расшифровки отчета по остаткам этот же отчет должен выглядеть так (отборы недоступны), рис.10.18.:

Рис.10.17. Отчет по движению выбранного товара на выбранном складе за период, как расшифровка отчета по остаткам

Поэтому сначала формируем два варианта отчета для отчета «Ведомость…» (для автономного запуска и для использования в расшифровке ) в СКД, а затем вернемся к основному отчету по остаткам и присоединим эту ведомость в качестве расшифровки.