Подробно рассматривать все настройки схемы компоновки мы не будем, остановимся только на том, ради чего была сделана статья.
Имеется некий отчет, у него схема компоновки данных, наборы данных, ресурсы, Параметры, Настройки.
Основные настройки отчета:
1. Рассмотрим вкладку «Макеты» основной схемы компоновки данных.
В макете описано каждое поле, для того что бы можно было сделать расшифровку по ним.
Если поле не ссылочного типа:
- В параметре расшифровки указываем наименование параметра
- В параметрах макета в поле Выражение делаем выбор
- В Параметр расшифровки в поле Выражение указываем ссылку на документ, по которому будет производиться расшифровка.
Если поле ссылочного типа:
Все тоже самое, только в Параметр расшифровки добавляем 2 параметра:
- Один из низ это ссылка на элемент указанный в поле
- Второй это ссылка на документ, по которому будет производиться расшифровка
На этом со схемой компоновки данных закончили.
3. Формы в отчете я использовал БСПшные, только для расшифровки создал свою форму "ФормаРасшифровки" с типом «Форма Отчета»
4. Открываем основную форму отчета БСП, для элемента формы «ОтчетТабличныйДокумент» ищем событие «ОбработкаРасшифровки» и переходим в нее.
В открывшейся процедуре вызываем процедуру обработки в переопределяемом модуле.
ОтчетыКлиентПереопределяемый.ОбработкаРасшифровки(ЭтотОбъект, Элемент, Расшифровка, СтандартнаяОбработка);
5. Проверяем имя отчета, при необходимости подсистему на существование, определяем модуль дальнейшей обработки и вызываем из него следующую процедуру.
Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
Если ФормаОтчета.НастройкиОтчета.ПолноеИмя = "Отчет.ДвижениеМаркированногоТовара" Тогда
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует(
"ТакскомПодсистемы.ЭлектронныйДокументооборот.РеализацияМаркированнойПродукции") Тогда
МодульРеализацияМаркированнойПродукцииКлиент =
ОбщегоНазначенияКлиент.ОбщийМодуль("РеализацияМаркированнойПродукцииКлиент");
МодульРеализацияМаркированнойПродукцииКлиент.ОбработкаРасшифровкиОтчетаДвижениеМаркированногоТовара(
ФормаОтчета, Расшифровка, СтандартнаяОбработка);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
6. Полный код вызываемой процедуры:
Процедура ОбработкаРасшифровкиОтчетаДвижениеМаркированногоТовара(ФормаОтчета, Расшифровка, СтандартнаяОбработка) Экспорт
СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(
ФормаОтчета.ОтчетДанныеРасшифровки,
Новый ИсточникДоступныхНастроекКомпоновкиДанных(ФормаОтчета.Отчет));
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Расшифровка", Расшифровка);
ДополнительныеПараметры.Вставить("ОтчетДанныеРасшифровки", ФормаОтчета.ОтчетДанныеРасшифровки);
ДополнительныеПараметры.Вставить("ФормаОтчета", ФормаОтчета);
ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьВыборДействияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ДоступныеДействия = Новый Массив;
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДополнительныеПунктыМеню = Новый СписокЗначений;
ДополнительныеПунктыМеню.Добавить("КодыМаркировки", НСтр("ru = 'Коды маркировки документа'"));
ОбработкаРасшифровки.ПоказатьВыборДействия(ОписаниеОповещения, Расшифровка, ДоступныеДействия, ДополнительныеПунктыМеню);
КонецПроцедуры
Разберем подробно код процедуры
Прежде всего отменяем стандартную обработку:
СтандартнаяОбработка = Ложь;
Создаем обработку расшифровки:
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(
ФормаОтчета.ОтчетДанныеРасшифровки,
Новый ИсточникДоступныхНастроекКомпоновкиДанных(ФормаОтчета.Отчет));
Создаем ОписаниеОповещения с параметрами, для алгоритма после выбора действия пользователем:
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("Расшифровка", Расшифровка);
ДополнительныеПараметры.Вставить("ОтчетДанныеРасшифровки", ФормаОтчета.ОтчетДанныеРасшифровки);
ДополнительныеПараметры.Вставить("ФормаОтчета", ФормаОтчета);
ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьВыборДействияЗавершение", ЭтотОбъект, ДополнительныеПараметры);
Добавляем два действия, одно платформенное, другое создаем свое собственное "КодыМаркировки":
ДоступныеДействия = Новый Массив;
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДополнительныеПунктыМеню = Новый СписокЗначений;
ДополнительныеПунктыМеню.Добавить("КодыМаркировки", НСтр("ru = 'Коды маркировки документа'"));
Вызываем меню выбора действий:
ОбработкаРасшифровки.ПоказатьВыборДействия(ОписаниеОповещения, Расшифровка, ДоступныеДействия, ДополнительныеПунктыМеню);
7. В обработке оповещения обрабатываем каждый пункт меню действий
- В первом случае просто открываем объект по ссылке
- Во втором вызываем процедуру, которая нам вернет выбранное поле.
И если Выбранное поле заполнено, тогда вызываем процедуру открывающую новую форму отчета.
Процедура ПоказатьВыборДействияЗавершение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт
Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
ПоказатьЗначение(Неопределено, ПараметрВыполненногоДействия);
ИначеЕсли ВыполненноеДействие = "КодыМаркировки" Тогда
ВыбранноеПоле = РеализацияМаркированнойПродукцииВызовСервера.ОбработкаРасшифровкиОтчетаДвижениеМаркированногоТовара(
ДополнительныеПараметры.ОтчетДанныеРасшифровки, ДополнительныеПараметры.Расшифровка);
Если ВыбранноеПоле = Неопределено Тогда
Возврат
КонецЕсли;
ОткрытьОтчетРасшифровкуПоВыбранномуПолю(ДополнительныеПараметры.ФормаОтчета, ВыбранноеПоле);
КонецЕсли;
КонецПроцедуры
Т.к. функция получения выбранного поля находится в общем модуле с галочкой Вызов Сервера, то делаем там только инициализацию серверной функции
Функция ОбработкаРасшифровкиОтчетаДвижениеМаркированногоТовара(ОтчетДанныеРасшифровки, Расшифровка) Экспорт
Возврат РеализацияМаркированнойПродукцииСервер.ПолеРасшифровкиОтчетаДвижениеМаркированногоТовара(
ОтчетДанныеРасшифровки, Расшифровка)
КонецФункции
А уже в серверном общем модуле, описываем алгоритм получения выбранного поля Документ поступления.
Функция ПолеРасшифровкиОтчетаДвижениеМаркированногоТовара(ОтчетДанныеРасшифровки, Расшифровка) Экспорт
ДанныеРасшифровки = ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки);
ПоляРасшифровки = ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля();
НайденноеПоле = ПоляРасшифровки.Найти("ДокументПоступления");
Если НайденноеПоле = Неопределено Тогда
Возврат Неопределено;
Иначе
Возврат НайденноеПоле.Значение;
КонецЕсли;
КонецФункции
8. Процедура инициализирует открытие формы отчета с передачей параметров.
Процедура ОткрытьОтчетРасшифровкуПоВыбранномуПолю(ФормаОтчета, ВыбранноеПоле)
Отбор = Новый Структура;
Отбор.Вставить("ДокументСсылка", ВыбранноеПоле);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Отбор);
ПараметрыФормы.Вставить("КлючНазначенияИспользования", "КодыМаркировки");
ОткрытьФорму(
"Отчет.ДвижениеМаркированногоТовара.Форма.ФормаРасшифровки", ПараметрыФормы, ФормаОтчета, ФормаОтчета.УникальныйИдентификатор);
КонецПроцедуры
9. В модуле открывшейся формы процедура ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
СтандартнаяОбработка = Ложь;
Запрос = "";
Если Параметры.Отбор.Свойство("ДокументСсылка") Тогда
Запрос = СформироватьДинамическиЗапрос(Параметры.Отбор.ДокументСсылка);
КонецЕсли;
Если Запрос = "" Тогда
Возврат;
КонецЕсли;
Схема = Отчеты.ДвижениеМаркированногоТовара.ПолучитьМакет("РасшифровкаКодыМаркировки");
Схема.НаборыДанных[0].Запрос = Запрос;
//Из схемы возьмем настройки по умолчанию
Настройки = Схема.НастройкиПоУмолчанию;
Для Каждого СтрокаОтбора Из Параметры.Отбор Цикл
Отбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(СтрокаОтбора.Ключ);
Отбор.ПравоеЗначение = СтрокаОтбора.Значение;
КонецЦикла;
//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки);
//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
//Очищаем поле табличного документа
Результат.Очистить();
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
АвтоЗаголовок = Ложь;
Заголовок = НСтр("ru = 'Коды операций (расшифровка)'");
КонецПроцедуры
Разберем ключевые строки процедуры:
- Проверяем параметры формы, и вызываем формирование динамического запроса по полученному параметру ссылки на документ.
Запрос = "";
Если Параметры.Отбор.Свойство("ДокументСсылка") Тогда
Запрос = СформироватьДинамическиЗапрос(Параметры.Отбор.ДокументСсылка);
КонецЕсли;
Если Запрос = "" Тогда
Возврат;
КонецЕсли;
- Процедура формирования динамического запроса:
&НаСервере
Функция СформироватьДинамическиЗапрос(ДокументСсылка)
ШаблонЗапроса = "ВЫБРАТЬ
| КодыМаркировки.Ссылка КАК ДокументСсылка,
| КодыМаркировки.НомерСтроки КАК НомерСтроки,
| КодыМаркировки.СерийныйНомер КАК СерийныйНомер
|ИЗ
| Документ.%1.КодыМаркировки КАК КодыМаркировки";
Запрос = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ШаблонЗапроса,
ДокументСсылка.Метаданные().Имя);
Возврат Запрос;
КонецФункции
- Получаем макет скд и в первом наборе данных переопределяем запрос, на тот, что мы сформировали динамически выше.
Схема = Отчеты.ДвижениеМаркированногоТовара.ПолучитьМакет("РасшифровкаКодыМаркировки");
Схема.НаборыДанных[0].Запрос = Запрос;
Посмотрим на вкладку "Наборы данных" полученного макета расшифровки и видим что запрос в нем это лишь шаблон, т.к. мы заранее не знаем какой тип
документа будет расшифровываться. На вкладке "Настройки" вывод детальных записей, больше настроек у этой схемы нет.
- Применяем настройки и добавляем полученный в параметрах отбор
//Из схемы возьмем настройки по умолчанию
Настройки = Схема.НастройкиПоУмолчанию;
Для Каждого СтрокаОтбора Из Параметры.Отбор Цикл
Отбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(СтрокаОтбора.Ключ);
Отбор.ПравоеЗначение = СтрокаОтбора.Значение;
КонецЦикла;
- После располагается типовой код по программному формированию отчета,
куда мы передаем полученную схему, и сформированные настройки отчета.
P.S.
Статья, по формированию расшифровки, без использования БСП