В одном документе для расчета потребовалось получать данные из отчета на СКД, реализовал следующим образом:
Код 1C v 8.х
СхемаОст = Отчеты. ТоннажПоЭкспедиторам. ПолучитьМакет( "ОсновнаяСхемаКомпоновкиДанных" ) ;
КомпоновщикНастроекНастройки = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекНастройки. Инициализировать( Новый ИсточникДоступныхНастроекКомпоновкиДанных( СхемаОст) ) ;
КомпоновщикНастроекНастройки. ЗагрузитьНастройки( СхемаОст. НастройкиПоУмолчанию) ;
КомпоновщикНастроекНастройки. Настройки. ПараметрыДанных. УстановитьЗначениеПараметра( "НачалоПериода" , НачалоМесяца( МесяцРасчета) ) ;
КомпоновщикНастроекНастройки. Настройки. ПараметрыДанных. УстановитьЗначениеПараметра( "КонецПериода" , КонецМесяца( МесяцРасчета) ) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета. Выполнить( СхемаОст, КомпоновщикНастроекНастройки. Настройки, , , Тип( "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений" ) ) ;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновкиДанных) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДанныеТЗ = Новый ТаблицаЗначений;
ПроцессорВывода. УстановитьОбъект( ДанныеТЗ) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновкиДанных) ;
ТоннажПоЭкспедиторам. Очистить( ) ;
Для каждого СтрокаТЗ Из ДанныеТЗ Цикл
Если ЗначениеЗаполнено( СтрокаТЗ. Экспедитор) и СтрокаТЗ. Доставка= Неопределено Тогда
нСтр = ТоннажПоЭкспедиторам. Добавить( ) ;
ЗаполнитьЗначенияСвойств( нСтр, СтрокаТЗ) ;
нСтр. Сотрудник= СтрокаТЗ. Экспедитор;
Иначе
Продолжить;
КонецЕсли ;
КонецЦикла ;
На днях делал несколько однотипных отчетов на СКД.
Общий принцип: формируются все варианты отчета, указанные в настройках схемы и каждый вариант выводится на отдельной вкладке.
Потом возникла мысль попробовать объединить все схемы в один отчет, чтобы не плодить лишних объектов в конфигурации. При этом количество вариантов в этих схемах заранее неизвестно. Ok, challenge accepted.
В тестовой конфигурации создаю для отчета две схемы компоновки, "Склад" и "Заявки".
Запросы наборов данных приводить не буду, для каждой схемы в настройках добавляю несколько вариантов отчетов.
Теперь переходим к созданию формы. Практически все реквизиты формы будут создаваться при выборе необходимого макета отчета.
Код 1C v 8.2 УП &НаСервере
Процедура СоздатьПереченьОтчетов()
Для Каждого Макет Из РеквизитФормыВЗначение( "Отчет" ) . Метаданные( ) . Макеты Цикл
Элементы. МакетОтчета. СписокВыбора. Добавить( Макет. Имя, Макет. Синоним) ;
КонецЦикла ;
КонецПроцедуры
&НаСервере
Процедура ОбработатьВыборМакета()
Макет = РеквизитФормыВЗначение( "Отчет" ) . ПолучитьМакет( МакетОтчета) ;
мУдалить = ? ( ПустаяСтрока( РеквизитыКУдалению) , Новый Массив, ПолучитьИзВременногоХранилища( РеквизитыКУдалению) ) ;
мДобавить = Новый Массив;
кУдалению = Новый Массив;
Для Каждого Вариант Из Макет. ВариантыНастроек Цикл
ИмяРеквизита = "ТабДок_" + Вариант. Имя;
тРеквизит = Новый РеквизитФормы( ИмяРеквизита, Новый ОписаниеТипов( "ТабличныйДокумент" ) ) ;
мДобавить. Добавить( тРеквизит) ;
кУдалению. Добавить( ИмяРеквизита) ;
КонецЦикла ;
ИзменитьРеквизиты( мДобавить, мУдалить) ;
Пока Элементы. СтраницыОтчета. ПодчиненныеЭлементы. Количество( ) Цикл
Элементы. Удалить( Элементы. СтраницыОтчета. ПодчиненныеЭлементы[0 ]) ;
КонецЦикла ;
Для Каждого Вариант Из Макет. ВариантыНастроек Цикл
Страница = Элементы. Добавить( "Страница_" + Вариант. Имя, Тип( "ГруппаФормы" ) , Элементы. СтраницыОтчета) ;
Страница. Вид = ВидГруппыФормы. Страница;
Страница. Заголовок = Вариант. Представление;
ИмяРеквизита = "ТабДок_" + Вариант. Имя;
ТабДок = Элементы. Добавить( ИмяРеквизита, Тип( "ПолеФормы" ) , Страница) ;
ТабДок. Вид = ВидПоляФормы. ПолеТабличногоДокумента;
ТабДок. ПутьКДанным = ИмяРеквизита;
ТабДок. ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы. Нет;
ЭтаФорма[ИмяРеквизита]. Очистить( ) ;
КонецЦикла ;
РеквизитыКУдалению = ПоместитьВоВременноеХранилище( кУдалению, УникальныйИдентификатор) ;
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчеты()
Схема = РеквизитФормыВЗначение( "Отчет" ) . ПолучитьМакет( МакетОтчета) ;
Для Каждого Вариант Из Схема. ВариантыНастроек Цикл
Отчет. КомпоновщикНастроек. ЗагрузитьНастройки( Вариант. Настройки) ;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Макет = КомпоновщикМакета. Выполнить( Схема, Отчет. КомпоновщикНастроек. ПолучитьНастройки( ) ) ;
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки. Инициализировать( Макет) ;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ЭтаФорма["ТабДок_" + Вариант. Имя]) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновки) ;
КонецЦикла ;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СоздатьПереченьОтчетов( ) ;
КонецПроцедуры
&НаКлиенте
Процедура МакетОтчетаПриИзменении(Элемент)
ОбработатьВыборМакета( ) ;
КонецПроцедуры
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьОтчеты( ) ;
КонецПроцедуры
Смотрим, что получилось.
Выгрузка базы 1Cv8skd.rar
Источник
Создаем макет СКД, там произвольно или с какими-нибудь условиями выбираем в наборе данных поля табличной части, ставим условие на документ владелец, и задаем оформление. В форме документа добавляем кнопку печать, прописываем в параметрах наш документ и оп-ля - печатная форма готова
Код 1C v 8.х Процедура ОсновныеДействияФормыПечать(Кнопка)
Если Ссылка = Документы. РасчетЗаказа. ПустаяСсылка( ) тогда
Предупреждение( "Документ не записан" ) ;
Возврат ;
Иначе
Схема = ПолучитьМакет( "Макет1" ) ;
Настройки = Схема. НастройкиПоУмолчанию;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных( ) ;
КомпоновщикНастроек. ЗагрузитьНастройки( Настройки) ;
ПараметрДок = Новый ПараметрКомпоновкиДанных( "документ" ) ;
ЗначениеПараметраДок = КомпоновщикНастроек. Настройки. ПараметрыДанных. НайтиЗначениеПараметра( ПараметрДок) ;
ЗначениеПараметраДок. Значение = Ссылка;
ЗначениеПараметраДок. Использование = Истина ;
Настройки = КомпоновщикНастроек. Настройки;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета. Выполнить( Схема, Настройки) ;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных. Инициализировать( МакетКомпоновки) ;
ДокументРезультат = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода. УстановитьДокумент( ДокументРезультат) ;
ПроцессорВывода. Вывести( ПроцессорКомпоновкиДанных) ;
ДокументРезультат. ОтображатьЗаголовки = Ложь ;
ДокументРезультат. ОтображатьСетку = Ложь ;
ДокументРезультат. АвтоМасштаб = Истина ;
ДокументРезультат. Показать( ) ;
КонецЕсли ;
КонецПроцедуры
Автор:
sanja Продолжая свой цикл заметок про СКД, сегодня я хотел бы поподробнее остановиться на расшифровке.
В СКД расшифровка представляет собой всплывающее меню (по двойному клику на ячейке), содержащие доступные пользователю действия, такие как открытие ссылки на элемент, упорядочивание, группировка, оформление и пр. Здесь я приведу примеры решения наиболее распространенных задач, связанных с расшифровкой, таких как:
1. Ограничение доступных действий;
2. Добавление в меню своего произвольного действия;
3. Добавление в меню различных действий, в зависимости от ячейки, для которой выполняется расшифровка.
Вся работа с расшифровкой, выполняется в событии ОбработкаРасшифровки. Что бы получить доступ к этому событию, необходимо сначала сгенерировать основную форму отчета. Затем ПолеТабличногоДокумента > Свойства > События.
Итак, задача №1. Постановка:
Необходимо доступные действия для пользователя ограничить только: открытием элемента, упорядочиванием и оформлением.
Решение:
Код 1C v 8.х Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка= Ложь ;
ОбработкаРасшифровки= Новый ОбработкаРасшифровкиКомпоновкиДанных( ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных( СхемаКомпоновкиДанных) ) ;
ДоступныеДействия= Новый Массив;
ДоступныеДействия. Добавить( ДействиеОбработкиРасшифровкиКомпоновкиДанных. Оформить) ;
ДоступныеДействия. Добавить( ДействиеОбработкиРасшифровкиКомпоновкиДанных. ОткрытьЗначение) ;
ДоступныеДействия. Добавить( ДействиеОбработкиРасшифровкиКомпоновкиДанных. Упорядочить) ;
Настройки= ОбработкаРасшифровки. Выполнить( Расшифровка, ВыполненноеДействие, ДоступныеДействия) ;
Если Настройки< > Неопределено Тогда
КомпоновщикНастроек. ЗагрузитьНастройки( Настройки) ;
ЭлементыФормы. Результат. Очистить( ) ;
СкомпоноватьРезультат( ЭлементыФормы. Результат, ДанныеРасшифровки) ;
КонецЕсли ;
КонецПроцедуры
Задача №2. Постановка:
Необходимо добавить в меню свое действие, открывающее основную форму элемента, содержащегося в ячейке, для которой выполняется расшифровка.
Решение:
Код 1C v 8.х Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка= Ложь ;
ОбработкаРасшифровки= Новый ОбработкаРасшифровкиКомпоновкиДанных( ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных( СхемаКомпоновкиДанных) ) ;
ДополнительныеДействия= Новый СписокЗначений;
ДополнительныеДействия. Добавить( "Действие1" , "Дополнительное действие 1" ) ;
Настройки= ОбработкаРасшифровки. Выполнить( Расшифровка, ВыполненноеДействие, , ДополнительныеДействия) ;
Если Настройки< > Неопределено Тогда
КомпоновщикНастроек. ЗагрузитьНастройки( Настройки) ;
ЭлементыФормы. Результат. Очистить( ) ;
СкомпоноватьРезультат( ЭлементыФормы. Результат, ДанныеРасшифровки) ;
Иначе
Если ВыполненноеДействие= "Действие1" Тогда
ВыполнитьДействие1 ( Расшифровка) ;
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
В процедуре ВыполнитьДействие1(Расшифровка) получаем ПараметрРасшифровки для выбранной ячейки и открывает основную форму:
Код 1C v 8.х Процедура ВыполнитьДействие1(Расшифровка)
Ссылка= ДанныеРасшифровки. Элементы[Расшифровка]. ПолучитьПоля( ) [0 ]. Значение;
Ссылка. ПолучитьФорму( ) . Открыть( ) ;
КонецПроцедуры
Задача №3. Постановка:
Необходимо в зависимости от колонки, для которой выполняется расшифровка, добавлять свои действия: для «Поле1» - «Действие1», для «Поле2» - «Действие2».
Решение:
Код 1C v 8.х Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка= Ложь ;
ОбработкаРасшифровки= Новый ОбработкаРасшифровкиКомпоновкиДанных( ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных( СхемаКомпоновкиДанных) ) ;
ДополнительныеДействия= Новый СписокЗначений;
Если ДанныеРасшифровки. Элементы[Расшифровка]. ПолучитьПоля( ) [0 ]. Поле= "Поле1" Тогда
ДополнительныеДействия. Добавить( "Действие1" , "Дополнительное действие 1" ) ;
ИначеЕсли ДанныеРасшифровки. Элементы[Расшифровка]. ПолучитьПоля( ) [0 ]. Поле= "Поле2" Тогда
ДополнительныеДействия. Добавить( "Действие2" , "Дополнительное действие 2" ) ;
КонецЕсли ;
Настройки= ОбработкаРасшифровки. Выполнить( Расшифровка, ВыполненноеДействие, , ДополнительныеДействия) ;
Если Настройки< > Неопределено Тогда
КомпоновщикНастроек. ЗагрузитьНастройки( Настройки) ;
ЭлементыФормы. Результат. Очистить( ) ;
СкомпоноватьРезультат( ЭлементыФормы. Результат, ДанныеРасшифровки) ;
Иначе
Если ВыполненноеДействие= "Действие1" Тогда
ВыполнитьДействие1 ( Расшифровка) ;
ИначеЕсли ВыполненноеДействие= "Действие2" Тогда
ВыполнитьДействие2 ( Расшифровка) ;
КонецЕсли ;
КонецЕсли ;
КонецПроцедуры
Как видите, ничего сложного здесь нет!
Источник
При использовании в типовой конфигурации:
Код 1C v 8.х
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если ДанныеРасшифровки. Элементы. Получить( Расшифровка) . ПолучитьПоля( ) [0 ]. Поле = "ДокументОприходования" Тогда
Док = ДанныеРасшифровки. Элементы. Получить( Расшифровка) . ПолучитьПоля( ) . Найти( "ДокументОприходования" ) . Значение;
Если ТипЗнч( Док) = Тип( "ДокументСсылка.ПоступлениеТоваровУслуг" ) Тогда
СтандартнаяОбработка = Ложь ;
Предупреждение( Док. Комментарий) ;
Возврат ;
КонецЕсли ;
КонецЕсли ;
ТиповыеОтчеты. СтандартнаяОбработкаРасшифровкиТиповогоОтчета( ОтчетОбъект, ЭтаФорма, Расшифровка, СтандартнаяОбработка) ;
КонецПроцедуры