Расшифровка одного отчета СКД при помощи другого отчета СКД (в управляемых формах, классический вариант, методика + пример для УТ11)

18.11.12

Разработка - СКД

Если требуется расшифровка одного отчета СКД при помощи другого отчета СКД, можно использовать представленный классический вариант от 1С. Вариант реализуется еще проще чем http://infostart.ru/public/151562/, но при этом имеет ряд недостатков и ограничений. Пример приведен для конфигурации УТ11.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
РасшифровкаКВ
.zip 17,57Kb
124 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Здесь специально используются те же отчеты что и в //infostart.ru/public/151562/, реализуется тот же функционал (за небольшим исключением). Начало такое же как и в предыдущей методике.

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

При расшифровке отчета «НеликвидыНоменклатуры» хочется использовать отчет «АнализДвиженийТоваровСРезервамиУпак», оба отчета самопальные и внедерены в УТ11 (оба отчета во вложении к теме). Т.е. при клике на ячейке с номенклатурой исходного отчета, должен быть построен отчет-расшифровка уже установленным отбором по этой номенклатуре, до кучи можно установить другие параметры отчета расшифровки (например период и склад):

  1. Прежде всего, чтобы иметь возможность запрограммировать расшифровку нам понадобится ФормаОтчета «НеликвидыНоменклатуры», её необходимо добавить (элементы формы система добавит сама).
  2. Для элемента формы «Результат» в событии «ОбработкаРасшифровки» нужно добавить процедуру, например: «РезультатОбработкаРасшифровки»
  3. В модуле этой формы нужно наполнить процедуру содержимым:

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

Номенклатура = ПолучитьРасшифровкуНаСервере(Расшифровка, ЭтоГруппа);

Тут передается также переменная ЭтоГруппа – для возврата признака выбранной номенклатуры.

Сама функция:

&НаСервере

Функция ПолучитьРасшифровкуНаСервере(Расшифровка, ЭтоГруппа = Ложь)

               Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); //Здесь основная «недокументированная фишка»: Переменная ДанныеРасшифровки не описана в хелпе, также не описано что Данные, нужно получать путем извлечения из временного хранилища,

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

               ПолеНоменклатура = Поля.Найти("Номенклатура");

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

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

               Иначе

                               ЭтоГруппа = ПолеНоменклатура.Значение.ЭтоГруппа;

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

               КонецЕсли;

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

До этого момента все делается также как и в //infostart.ru/public/151562/, отсюда начинаются отличия.

Далее, продолжаем наполнять основную процедуру формы исходного отчета «РезультатОбработкаРасшифровки»:

        Если Номенклатура = Неопределено Тогда Возврат; КонецЕсли;

        Если ЭтоГруппа Тогда Возврат; КонецЕсли; //Группа стандартной обработкой проверяется на равенство, поэтому при выборе группы используем стандартную расшифровку.
        СтандартнаяОбработка = Ложь;

        //Получаем Склад, указанный в Отборе текущего отчета:
        КоллекцияЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
        НастройкиЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки;
        ПолеСкладЗдесь = НастройкиЗдесь.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Склад").Поле;
        ИДЭлмОтбораСкладЗдесь = "";
        Для Каждого Элемент Из НастройкиЗдесь.Отбор.Элементы Цикл
                Если Элемент.ЛевоеЗначение = ПолеСкладЗдесь Тогда ИДЭлмОтбораСкладЗдесь = Элемент.ИдентификаторПользовательскойНастройки; Прервать; КонецЕсли;
        КонецЦикла;
        ЭлементОтбораСкладЗдесь = КоллекцияЗдесь.Найти(ИДЭлмОтбораСкладЗдесь);

        //Получаем Период, указанный в настройках текущего отчета:
        ИДНастройкиПериодЗдесь = НастройкиЗдесь.ПараметрыДанных.Элементы.Найти("Интервал").ИдентификаторПользовательскойНастройки;
        КонецПериодаЗдесь = КоллекцияЗдесь.Найти(ИДНастройкиПериодЗдесь).Значение.ДатаОкончания;

        //"Классическая" схема расшифровки одного отчета используя другой отчет:
        //Настраиваем отбор будующего отчета
        ОтборХ = Новый Структура("Номенклатура, Период",
                                Номенклатура,
                                Новый СтандартныйПериод(ДобавитьМесяц(КонецПериодаЗдесь, -12),КонецПериодаЗдесь));
        //Склад добавляем только если включен соотв. отбор в источнике
        Если ЭлементОтбораСкладЗдесь.Использование Тогда
        ОтборХ.Вставить("Склад", ЭлементОтбораСкладЗдесь.ПравоеЗначение);
        КонецЕсли;

        //В параметрах должен фигурировать вариант, в котором НЕТ установки параметров пользовательских настроек и пользовательских отборов,
        //т.к. это вызовет конфликт настроек и отчет не будет сформирован.
        ПараметрыФормыХ = Новый Структура("СформироватьПриОткрытии, Отбор, КлючВарианта", Истина, ОтборХ, "ДляРасшифровки");

        ОткрытьФорму("Отчет.АнализДвиженийТоваровСРезервамиУпак.Форма", ПараметрыФормыХ, ЭтаФорма, Номенклатура);


Некоторые пояснения к тексту процедуры:

    1. Получаем Номенклатуру, по которой пользователь произвел клик (вызов серверной функции "ПолучитьРасшифровкуНаСервере") 
    2. Получаем отбор по складу в исходном отчете (из настроек).
    3. Получаем параметр Интервал в исходном отчете (из настроек)
    4. Формируем структуру отбора отчета-расшифровки (наполняем её данными полученными в пп. 1-3)
    5. Формируем структуру ПараметрыФормыХ, для передачи в открывемую форму отчета описание параметров здесь:
      Синтаксис помошник 
    6. Открываем форму отчета расшифровки передавая соответствующие параметры, описание здесь:
      Синтаксис помощник
Обращаю внимание на то,  что эта методика имеет более простую реализацию, но при этом обладает рядом недостатков, впрочем, они незначительные:
    1. т.к. условие в отборе отчета-расшифровки при использовании данной методики, устанавливается платформой на "равенство" или на "вхождение в список", то нет возможности получить расшифровку по группе номенклатуры.
    2. при расшифровке в строке Вариант отчета отчета-расшифровки, получаем значение "Для Расшифровки (Установлен дополнительный отбор)", т.е. переформировать данный отчет с другими настройками (номенклатуры или склада), будет невозможно.
    3. вытекает из пп 2.: для использования такой расшифровки, в настройках отчета-расшифровки должен быть вариант, в котором нет пользовательских отборов и параметров"пересекающихся" с теми, которые устанавливаются при его открытии.
Реализация во вложении, сам продолжаю использовать первоначальный вариант (//infostart.ru/public/151562/), т.к. считаю его более юзабельным.





Вступайте в нашу телеграмм-группу Инфостарт

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

16500 руб.

02.09.2020    245870    1350    419    

1128

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    4969    280    shapa_pro    25    

66

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    15586    ovetgana    112    

105

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Описан способ заполнения списка доступных значений для полей наборов данных и параметров в схеме компоновки данных для любых конфигураций (с использованием БСП или без).

01.07.2025    9124    krasnoshchekovpavel    5    

66

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    8314    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    15493    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

СКД – инструмент, на базе которого в современных конфигурациях реализованы практически все отчеты. СКД используется в динамических списках, печатных формах и универсальных механизмах. Если построить простейший отчет может каждый разработчик, то с нюансами знакомы далеко не все. Расскажем о неочевидных на первый взгляд приемах, способных значительно повысить качество отчетов.

24.12.2024    13067    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

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

20.08.2024    9532    AlexeyPROSTO_1C    1    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. GreenFox 27.11.12 11:40 Сейчас в теме
Спасибо, было познавательно, как раз такая задача сейчас передо мной и стоит - расшифровать один самопальный отчет другим.
2. ksely 113 25.10.15 02:25 Сейчас в теме
Спасибо тебе, добрый человек!
3. janibeg 2 01.07.20 09:49 Сейчас в теме
А эти отчеты должны быть встроены в конфу или достаточно в справочник ДополнительныеОтчетыИОбработки?
4. Diyversus 08.02.21 14:12 Сейчас в теме
Пытаюсь реализовать в обычном приложении (УПП) , ругается на ПолучитьИзВременногоХранилища(ДанныеРасшифровки)

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

Такая ошибка:
{ВнешнийОтчет.АнализНеликвидов106.Форма.ФормаОтчета.Форма(113)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
Данные = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
по причине:
Ошибка получения значения из временного хранилища
по причине:
Неправильный путь к файлу 'ДанныеРасшифровкиКомпоновкиДанных'

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

Что я упускаю из виду?
5. Diyversus 08.02.21 15:17 Сейчас в теме
А упустил я из виду, что ПолучитьИзВременногоХранилища используется для миграции ДанныеРасшифровкиКомпоновкиДанных с клиента на сервер. В обычном приложении не нужно пользоваться временным хранилищем.
6. unknown181538 163 01.06.21 14:27 Сейчас в теме
Это еще актуально? Что за переменная ДанныеРасшифровки, которая нигде не определена?
7. unknown181538 163 03.06.21 02:35 Сейчас в теме
(6) Разобрался. В УТ11 нужно в общий модуль вписывать - публикация очень помогла.
8. akim2040 49 22.08.21 14:14 Сейчас в теме
(7) Можно подробнее?
пытаюсь сделать расшифровку другим отчетом в ERP, но натыкаюсь на эту переменную "ДаннуеРасшифровки" и ошибку что он не определена, не могу понять как исправить
9. unknown181538 163 22.08.21 21:42 Сейчас в теме
(8) Нашел, что тогда сделал. Что-то такое получилось.


// В ОБЩЕМ МОДУЛЕ ОтчетыКлиентПереопределяемый

Процедура ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка) Экспорт
	// ++ 01.06.2021
	иоКлиент.ОбработкаРасшифровки(ФормаОтчета, Элемент, Расшифровка, СтандартнаяОбработка);
	// --





// МОДУЛЬ иоКлиент

Процедура РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, ИмяОтчета)

		Номенклатура = СтруктураРасшифровки.Номенклатура;
		Если Не СтруктураРасшифровки.Свойство("Склад") Тогда
			Склад = Неопределено;
		Иначе
			Склад = СтруктураРасшифровки.Склад;
		КонецЕсли;
	
		Если Номенклатура = Неопределено Тогда 
			Возврат; 
		КонецЕсли;

		//Если ЭтоГруппа Тогда Возврат; КонецЕсли; //Группа стандартной обработкой проверяется на равенство, поэтому при выборе группы используем стандартную расшифровку.
        //Получаем Склад, указанный в Отборе текущего отчета:
        КоллекцияЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
        НастройкиЗдесь = ЭтаФорма.Отчет.КомпоновщикНастроек.Настройки;
        ПолеСкладЗдесь = НастройкиЗдесь.Отбор.ДоступныеПоляОтбора.Элементы.Найти("Склад").Поле;
        ИДЭлмОтбораСкладЗдесь = "";
		
        Для Каждого Элемент Из НастройкиЗдесь.Отбор.Элементы Цикл
			Если Элемент.ЛевоеЗначение = ПолеСкладЗдесь Тогда 
				ИДЭлмОтбораСкладЗдесь = Элемент.ИдентификаторПользовательскойНастройки; 
				Прервать; 
			КонецЕсли;
        КонецЦикла;
        ЭлементОтбораСкладЗдесь = КоллекцияЗдесь.Найти(ИДЭлмОтбораСкладЗдесь);

        //Получаем Период, указанный в настройках текущего отчета:
		//ИДНастройкиПериодЗдесь = НастройкиЗдесь.ПараметрыДанных.Элементы.Найти("Интервал").ИдентификаторПользовательскойНастройки;
		//КонецПериодаЗдесь = КоллекцияЗдесь.Найти(ИДНастройкиПериодЗдесь).Значение.ДатаОкончания;

        //"Классическая" схема расшифровки одного отчета используя другой отчет:
        //Настраиваем отбор будующего отчета
        ОтборХ = Новый Структура("Номенклатура, ПериодОтчета",
                                Номенклатура,
                                Новый СтандартныйПериод(ДобавитьМесяц(ТекущаяДата(), -12),ТекущаяДата()));
        //Склад добавляем только если включен соотв. отбор в источнике
        Если ЗначениеЗаполнено(Склад) Тогда
        	ОтборХ.Вставить("Склад", Склад);
        КонецЕсли;

        //В параметрах должен фигурировать вариант, в котором НЕТ установки параметров пользовательских настроек и пользовательских отборов,
        //т.к. это вызовет конфликт настроек и отчет не будет сформирован.
        ПараметрыФормыХ = Новый Структура("СформироватьПриОткрытии, Отбор, КлючВарианта", Истина, ОтборХ, "ДляРасшифровки");

        ОткрытьФорму("Отчет."+ИмяОтчета+".Форма", ПараметрыФормыХ, ЭтаФорма, Номенклатура);

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



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

	ПолноеИмяОтчета = ЭтаФорма.НастройкиОтчета.ПолноеИмя;

	Если ПолноеИмяОтчета = "ВнешнийОтчет.ОстаткиИДоступностьТоваровРасширенный" Тогда
		
		СтруктураРасшифровки = ОтчетыУТВызовСервераПереопределяемый.СформироватьДанныеРасшифровки(Расшифровка, ЭтаФорма.ОтчетДанныеРасшифровки);
		
		Если СтруктураРасшифровки.Свойство("ПриходПодЗаказ")Или СтруктураРасшифровки.Свойство("ПриходОсновной") Тогда
			СтандартнаяОбработка = Ложь;
			РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, "иоРасшифровкаПоОжидаемому");
		ИначеЕсли СтруктураРасшифровки.Свойство("РасходОсновной") Тогда
			СтандартнаяОбработка = Ложь;
			РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, "иоРасшифровкаПоОтгрузке");
		ИначеЕсли СтруктураРасшифровки.Свойство("ВРезерве") Тогда
			СтандартнаяОбработка = Ложь;
			РасшифроватьОтчетом(ЭтаФорма, СтруктураРасшифровки, "иоРасшифровкаПоНоменклатуре");
		КонецЕсли;
		
	КонецЕсли;
		
КонецПроцедуры
Показать
10. akim2040 49 23.08.21 08:52 Сейчас в теме
(9) Спасибо коллега!
Попробую вечерком.
11. akim2040 49 24.08.21 19:30 Сейчас в теме
Чё то я не расскурил как это сделать...
Может кто помочь за символическую плату сделать?
Нужно сделать расшифровку внешнего отчета внутренним "Ведомость по партиям товаров" в конфигурации ERP
Для отправки сообщения требуется регистрация/авторизация