Система компоновки данных очень удобна как сервис получения отчетов. Однако, предложенный инструмент также позволяет получать таблицу значений или дерево значений, которые весьма востребованы в программной обработке информации.
Эта статья опишет удобную функцию, возвращающую результат работы СКД в форме табличного документа, дерева или таблицы значений. Причем, эта функция может получать исходные данные из внешней базы в режиме Com соединения.
Предлагаемая функция, назовём её СформироватьРезультатСКД, одинаково работает как в обычном, так и в управляемом приложениях.
Предлагаемая универсальная функция «СформироватьРезультатСКД», преследует только одну цель – повысить удобство применения СКД при программной обработке данных, в том числе, полученных из внешней базы.
Описание универсальной функции.
СформироватьРезультатСКД(), версия 2.8.05
Синтаксис:
СформироватьРезультатСКД(<СтруктураПараметрыЗапускаСКД>)
Параметры:
<СтруктураПараметрыЗапускаСКД> (обязательный)
Тип: Структура.
Задает настройки и параметры запуска системы компоновки данных: ключ структуры определяет имя параметраЗапускаСКД, а значение структуры — значение параметраЗапускаСКД. Порядок объявления ключей в структуре несущественен.
Ключи и значения структуры (СтруктураПараметрыЗапускаСКД). |
ключ1 = "АдресРезультатаСКД", тип:строка. (Необязательный). Значение1, тип:Строка. Адрес временного хранилища, в которое будет помещен результат работы системы компоновки данных. Наличие или отсутствие ключа1 определяет тип возвращаемого значения. Если ключ1 отсутствует, то будет возвращён сам РезультатСКД.
|
ключ2 = "АдресМакетаСКД", тип:строка. (обязательный) Значение2, тип: Строка. Адрес временного хранилища, в которое помещен макет схемы компоновки данных (Тип:СхемаКомпоновкиДанных).
|
ключ3 = "НастройкиСКД", тип:Строка. (необязательный). Значение3= тип:Строка, НастройкиКомпоновкиДанных. а) Если значение3 равно Имени вариантаСКД (строка), указанному на странице настроек схемыСКД, тогда РезультатСКД будет получен с настройками по умолчанию указанного вариантаСКД. б) Если значение3 равно текущим настройкам (КомпоновщикНастроек.Настройки), то с этими настройками будет получен РезультатСКД. с) Если значение3 не указано, то РезультатСКД будет получен с настройками по умолчанию основного вариантаСКД.
|
ключ4 = "ПараметрыСКД", тип:Строка Значение4, тип:Структура. Структура4 содержит параметры схемы компоновки данных, указанные на странице параметров. Структура4.Ключ = Имя параметра, как оно задано в схеме компоновки данных. Структура4.Значение = Значение параметра.
|
ключ5 = "СтрокаСоединения", тип:Строка. (необязательный). Значение5, тип:Строка. Строка соединения с внешней базой. Если СтрокаСоединения не указана, то источником данных считается текущая база.
|
Ключ6 = "РезультатСКДТип", тип:Строка. (необязательный). Значение6 = Тип:Строка,ТабличныйДокумент, ТаблицаЗначений, ДеревоЗначений, ДанныеФормыКоллекция, ДанныеФормыДерево. Задает тип результатаСКД. Обрабатываются следующие значения строки: «ТабличныйДокумент», «ТабДок», «ТаблицаЗначений», «ТЗ» и «ДеревоЗначений», «ДЗ». Другие значения строки будут интерпретироваться как «ТабличныйДокумент». Если ключ6 не указан, то будет возвращён результатСКД типа ТабличныйДокумент.
|
Ключ7 = «ВнешниеНаборыДанныхСКД». Тип:Строка. (необязательный) Значение7 = Тип:строка, структура. а) Строка соединения с Внешней информационной базой 1С:Предприятие обеспечивает Com соединение с внешней базой. б) Структура обеспечивает Web соединение с внешней базой. Значение7структура.Ключ1=URLОписанияWebСервиса Значение7структура.Значение1=URLОписанияWebСервиса
|
Ключ8 = «ПроверитьНаличие». Тип:Строка (необязательный) Значени8, тип Булево. Используется для определения варианта местоположения ОбщегоМодуляСКД. Допустимы два варианта: А) Конфигурация.ОбщиеМодули.ОбщегоНазначенияСКД. (рекомендуется) Б) ВнешнийОтчет.ОбщийМодуль.ОбщегоНазначенияСКД
|
Ключ9 = «ПроверятьДоступностьПолей». Тип:Строка (необязательный) Значение9, тип Булево. Определяет, выполнять ли проверку прав на просмотр полей и проверку доступности поля во включенных функциональных возможностях.
|
Ключ10 = «ПараметрыФункциональныхОпций». Тип:Строка (необязательный) Значение10, тип Структура. Содержит параметры функциональных опций, используемые при исполнении отчета.
|
Ключ11= «ВозможностьПрерыванияПользователем». Тип:Строка (необязательный). Значени11, тип Булево. Указывает, может ли пользователь прервать вывод при помощи комбинации клавиш Ctrl + Break.
|
Ключ12= «ОбщиеФормулы». Тип:Строка (необязательный). Значени12, тип Булево. Указывает, может ли пользователь вызывать функции из общего модуля.
|
Возвращаемое значение: Тип: Строка, Структура, ТабличныйДокумент, ТаблицаЗначений, ДеревоЗначений. А) Если тип — строка, то возвращен адрес временного хранилища, в котором размещен результат СКД. Возвращаемое значение помещается во временное хранилище по адресу "АдресРезультатаСКД". Б) Если тип – структура, то используются два ключа: Ключ1= «РезультатСКД», Ключ2= «ДанныеРасшифровки» |
Вариант 1 возвращаемого значения типа Структура. значение1 = Тип:ТабличныйДокумент значение2 = Тип:ДанныеРасшифровкиКомпоновкиДанных
|
Вариант 2 для тонкого клиента возвращаемого значения типа Структура, Значение1 = Тип:ТабличныйДокумент Значение2 = Неопределено
|
Вариант 3 возвращаемого значения – тип:Структура. Значение1 = Тип:ТаблицаЗначений Значение2 = Неопределено
|
Вариант 4 возвращаемого значения – тип:Структура. Значение1 = Тип:ДеревоЗначений Значение2 = Неопределено
|
Вариант 5 возвращаемого значения — тип:ТабличныйДокумент
|
Вариант 6 возвращаемого значения -тип:ТаблицаЗначений
|
Вариант 7 возвращаемого значения -тип:ДеревоЗначений
|
Описание:
Возвращает структуру, содержащую результат работы Системы компоновки данных (РезультатСКД) и ДанныеРасшифровки. Тип РезультатаСКД может быть ТабличныйДокумент, ТаблицаЗначений или ДеревоЗначений.
Примечание. Возвращаемое значение может быть помещено во временное хранилище по адресу "АдресРезультатаСКД".
Доступность:
Сервер, Толстый клиент, тонкий клиент
Примечание:
- Функция может быть размещена либо в общем модуле конфигурации (рекомендуется), либо в расширении конфигурации, либо в модуле внешнего отчета.
- Для упрощения изучения функции, к данной разработке приложена блок-схема действий программиста, принявшего решение использовать функцию. Блок-схема вызывается кнопкой.
- Функция состоит из трех модулей «ОбщегоНазначенияСКД» , «ФункцииДляОтчетовСерверСКД» и «ФункцииДляОтчетовСКД».
- Для обеспечения чтения внешней базы, во внешней базе следует разместить процедуры «ФункцииДляОтчетовСерверСКД» и «ФункцииДляОтчетовСКД».
Использованный здесь алгоритм чтения внешней базы через Com соединение опубликован в книге «Разработка сложных отчетов в 1С:Предприятии 8» автора Е.Ю.Хрусталева.
- В управляемом приложение данную функцию следует использовать в паре с другой универсальной функцией «СоздатьКолонкиНаУправляемойФорме» //infostart.ru/public/547849/
В заключение хочу сказать, что две универсальные функции эффективно сокращают трудозатраты на разработку в управляемых формах.
Озвучка демонстрационного примера.
(При разночтении озвученного текста и написанного, правильным следует считать текст написанный).
Начинается демонстрация использования универсальной функции СформироватьРезультатСКД.
Демонстрация функции будет выполнена для:
- обычного приложения,
- тонкого клиента управляемого приложения
- для Com соединения с внешней базой
Чтобы доставить себе удовольствие от работы с этой функцией, рекомендую разместить её в трёх общих модулях конфигурации. Например, «ОбщегоНазначенияСКД» , «ФункцииДляОтчетовСерверСКД» и «ФункцииДляОтчетовСКД».
Также, эти модули можно разместить в расширении конфигурации.
Оба варианты представлены в программном коде.
Для обеспечения чтения внешней базы, во внешней базе следует разместить процедуры «ФункцииДляОтчетовСерверСКД» и «ФункцииДляОтчетовСКД».
40 сек.
Для упрощения изучения функции, к данной разработке приложена блок-схема действий программиста, принявшего решение использовать функцию. Блок-схема вызывается кнопкой.
Запускаем 1С:Предприятие в двух режимах.
А) Обычное приложение
Б) Тонкий клиент управляемого приложения
И демонстрируем использование функции в каждом режиме.
А) Демонстрируем Обычный режим.
Один раз проследим работу функции в конфигураторе.
В этой разработке предложены удобные шаблоны вызова функции как в обычном приложении, так и в управляемом.
Видим, что в тексте шаблонов присутствуют все параметры настроек.
Наличие закомментированных настроек снизит трудозатраты программиста на их активацию.
В этом примере ввод настроек немного автоматизирован на мышку.
1мин.40сек
Подключим внешнюю базу данных и продолжим демонстрацию.
Формирование строки Com соединения выполним на странице «Настройка внешней базы».
Напоминаю, что во внешней базе следует разместить процедуры «ФункцииДляОтчетовСерверСКД» и «ФункцииДляОтчетовСКД».
Использованный здесь алгоритм чтения внешней базы через Com соединение опубликован в книге «Разработка сложных отчетов в 1С:Предприятии 8» автора Е.Ю.Хрусталевой.
2мин.40сек
Б) В тонком клиенте повторим все варианты вызова универсальной функции.
Примечание. В управляемом приложение данную функцию следует использовать в паре с другой универсальной функцией «СоздатьКолонкиНаУправляемойФорме» //infostart.ru/public/547849/
На управляемой форме повторим те же варианты настроек, но без конфигуратора.
Поочередно получим табличный документ, дерево значений и таблицу значений.
3 мин. 30 сек.
В заключение хочу сказать, что две универсальные функции эффективно сокращают трудозатраты на разработку в управляемых формах.
В следующих статьях будут показаны примеры использования этой пары универсальных функций.
Желаю удачи всем и каждому.
Функция СформироватьРезультатСКД( цСтруктураЗапускаСКД) Экспорт
Перем цАдресРезультатаСКД,цАдресМакетаСКД, цАдресДанныхРасшифровкиСКД;
Перем цПараметрыСКД, цВариантСКД, цРезультатСКДТип, цНастройки, цОбщиеФормулы;
Перем цСтрокаСоединения , цВнешниеНаборыДанныхСКД, цВариантБазыВнешнегоСоединения;//, ФлагЭтоТонкийКлиент;
Перем цПроверитьНаличиеЭтойФункции, цДанныеРасшифровки;
Перем цПроверятьДоступностьПолей, цПараметрыФункциональныхОпций, цВозможностьПрерыванияПользователем;
ФлагПроверитьНаличиеЭтойФункции = цСтруктураЗапускаСКД.Свойство("ПроверитьНаличие",цПроверитьНаличиеЭтойФункции);
Если ФлагПроверитьНаличиеЭтойФункции Тогда
Возврат Истина;//Есть эта универсальная функция в глобальном модуле
КонецЕсли;
цУпрОбыч =ТекущийРежимЗапуска();
ФлагЕстьАдресРезультатаСКД = цСтруктураЗапускаСКД.Свойство("АдресРезультатаСКД",цАдресРезультатаСКД);
Если ФлагЕстьАдресРезультатаСКД Тогда
Если не ЗначениеЗаполнено(цАдресРезультатаСКД) Тогда
ФлагЕстьАдресРезультатаСКД = Ложь;
ИначеЕсли ЭтоАдресВременногоХранилища(цАдресРезультатаСКД) Тогда
УдалитьИзВременногоХранилища(цАдресРезультатаСКД);
Иначе
цАдресРезультатаСКД = Новый УникальныйИдентификатор ;
КонецЕсли;
КонецЕсли;
ФлагЕстьАдресДанныхРасшифровкиСКД = цСтруктураЗапускаСКД.Свойство("АдресДанныхРасшифровкиСКД",цАдресДанныхРасшифровкиСКД);
Если ФлагЕстьАдресДанныхРасшифровкиСКД Тогда
Если ЭтоАдресВременногоХранилища(цАдресДанныхРасшифровкиСКД) Тогда
УдалитьИзВременногоХранилища(цАдресДанныхРасшифровкиСКД);
Иначе
цАдресДанныхРасшифровкиСКД = Новый УникальныйИдентификатор ;
КонецЕсли;
КонецЕсли;
ФлагЕстьАдресМакетаСКД = цСтруктураЗапускаСКД.Свойство("АдресМакетаСКД",цАдресМакетаСКД);
Если ФлагЕстьАдресМакетаСКД
И ЭтоАдресВременногоХранилища(цАдресМакетаСКД) Тогда
цСхемаКомпоновкиДанных = ПолучитьИзВременногоХранилищаСКД(цАдресМакетаСКД);
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "не указан макет СКД";
//Сообщение.Поле = "";
Сообщение.Сообщить();
КонецЕсли;
ФлагНастройкиСКД = цСтруктураЗапускаСКД.Свойство("НастройкиСКД",цНастройки);
Если ФлагНастройкиСКД Тогда
Если ТипЗнч(цНастройки) = тип("Строка") Тогда //ИмяВариантаНастройки
цВариантСКД = цНастройки;
цНастройки = цСхемаКомпоновкиДанных.ВариантыНастроек[цВариантСКД].Настройки;
ИначеЕсли ТипЗнч(цНастройки) = тип("НастройкиКомпоновкиДанных") Тогда //ТекущаяНастройка
//Ok
ИначеЕсли цНастройки = Неопределено Тогда
цНастройки = цСхемаКомпоновкиДанных.НастройкиПоУмолчанию;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "нет настройки СКД";
//Сообщение.Поле = "";
Сообщение.Сообщить();
КонецЕсли;
Иначе
цНастройки = цСхемаКомпоновкиДанных.НастройкиПоУмолчанию;
КонецЕсли;
ФлагПроверятьДоступностьПолейСКД = цСтруктураЗапускаСКД.Свойство("ПроверятьДоступностьПолей",цПроверятьДоступностьПолей);
Если не ФлагПроверятьДоступностьПолейСКД Тогда
цПроверятьДоступностьПолей=Истина;
КонецЕсли;
ФлагПараметрыФункциональныхОпцийСКД = цСтруктураЗапускаСКД.Свойство("ПараметрыФункциональныхОпций",цПараметрыФункциональныхОпций);
Если не ФлагПроверятьДоступностьПолейСКД Тогда
цПараметрыФункциональныхОпций=Неопределено;
КонецЕсли;
ФлагВозможностьПрерыванияПользователемСКД = цСтруктураЗапускаСКД.Свойство("ВозможностьПрерыванияПользователем",цВозможностьПрерыванияПользователем);
Если не ФлагВозможностьПрерыванияПользователемСКД Тогда
цВозможностьПрерыванияПользователем=Истина;
КонецЕсли;
///// определим тип РезультатаСКД
флагТабДок = Ложь ;
ФлагТЗ = Ложь;
ФлагДЗ = Ложь;
ФлагЕстьРезультатСКДТип = цСтруктураЗапускаСКД.Свойство("РезультатСКДТип",цРезультатСКДТип);
Если ФлагЕстьРезультатСКДТип Тогда //определимТипВозвращаемыхДанных
Если ТипЗнч(цРезультатСКДТип) = тип("Строка") Тогда
флагТабДок = (ВРег(цРезультатСКДТип) = ВРег("ТабличныйДокумент")
ИЛИ ВРег(цРезультатСКДТип) = ВРег("ТабДок" ));
ФлагТЗ = (ВРег(цРезультатСКДТип) = ВРег("ТаблицаЗначений")
ИЛИ ВРег(цРезультатСКДТип) = ВРег("ТЗ")) ;
ФлагДЗ = (ВРег(цРезультатСКДТип) = ВРег("ДеревоЗначений")
ИЛИ ВРег(цРезультатСКДТип) = ВРег("ДЗ")) ;
Иначе
флагТабДок = (ТипЗнч(цРезультатСКДТип) = тип("ТабличныйДокумент"));
ФлагТЗ = (ТипЗнч(цРезультатСКДТип) = тип("ТаблицаЗначений"))
ИЛИ (ТипЗнч(цРезультатСКДТип) = тип("ДанныеФормыКоллекция")) ;
ФлагДЗ = (ТипЗнч(цРезультатСКДТип) = тип("ДеревоЗначений"))
ИЛИ (ТипЗнч(цРезультатСКДТип) = тип("ДанныеФормыДерево")) ;
КонецЕсли;
КонецЕсли;
Если (флагТабДок или ФлагТЗ или ФлагДЗ )=Ложь Тогда
флагТабДок = Истина;
КонецЕсли;
ФлагЕстьВнешниеНаборыДанныхСКД = цСтруктураЗапускаСКД.Свойство("ВнешниеНаборыДанныхСКД",цВнешниеНаборыДанныхСКД);
Если ФлагЕстьВнешниеНаборыДанныхСКД Тогда
Если Не ТипЗнч(цВнешниеНаборыДанныхСКД)=Тип("Структура") Тогда
ФлагЕстьВнешниеНаборыДанныхСКД = Ложь;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "предложены не правильные внешние данные: "+цВнешниеНаборыДанныхСКД;
//Сообщение.Поле = "";
//Сообщение.УстановитьДанные();
Сообщение.Сообщить();
КонецЕсли;
КонецЕсли;
ФлагЕстьобщиеФормулы = цСтруктураЗапускаСКД.Свойство("ОбщиеФормулы",цОбщиеФормулы );
Если НЕ ФлагЕстьобщиеФормулы Тогда
цОбщиеФормулы = Истина;
КонецЕсли;
ФлагПараметрыСКД = цСтруктураЗапускаСКД.Свойство("ПараметрыСКД",цПараметрыСКД);
Если ФлагПараметрыСКД Тогда
Для каждого цЭлем Из цПараметрыСКД Цикл
Попытка
цНастройки.ПараметрыДанных.УстановитьЗначениеПараметра(цЭлем.Ключ, цЭлем.Значение); //
Исключение
цОш = ОписаниеОшибки();
сооб= Новый СообщениеПользователю;
сооб.Текст = цОш+ ": "+цЭлем.Ключ+ " = "+цЭлем.Значение;
сооб.Сообщить();
КонецПопытки;
КонецЦикла;
КонецЕсли;
ФлагСтрокаСоединенияСКД = цСтруктураЗапускаСКД.Свойство("СтрокаСоединения",цСтрокаСоединения);
ФлагСоединенияWEB = Ложь;
Если ФлагСтрокаСоединенияСКД Тогда
Если НЕ ЗначениеЗаполнено(цСтрокаСоединения) Тогда
цСтрокаСоединения="";
ФлагСтрокаСоединенияСКД =Ложь;
ИначеЕсли ТипЗнч(цСтрокаСоединения)=Тип("Строка") Тогда // COMсоединение
ФлагСтрокаСоединенияСКД = Не ПустаяСтрока(цСтрокаСоединения);
ИначеЕсли ТипЗнч(цСтрокаСоединения)=Тип("Структура") Тогда // WEBсоединение
ФлагСтрокаСоединенияСКД =Ложь;
ФлагСоединенияWEB = Истина;
КонецЕсли;
иначе
цСтрокаСоединения="";
ФлагСтрокаСоединенияСКД =Ложь;
КонецЕсли;
Если ФлагТабДок Тогда
РезультатСКД = Новый ТабличныйДокумент;
ИначеЕсли ФлагТЗ Тогда
#Если не ТонкийКлиент Тогда
РезультатСКД = Новый ТаблицаЗначений;
#КонецЕсли
ИначеЕсли ФлагДЗ Тогда
#Если не ТонкийКлиент Тогда
РезультатСКД = Новый ДеревоЗначений;
#КонецЕсли
КонецЕсли;
#Если Сервер Или ТолстыйКлиент Или ВнешнееСоединение Или ЭтоМобильноеПриложениеСервер Или Клиент Тогда
цКомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
цПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
Если ФлагТабДок Тогда ////получим РезультатСКД
цДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
цМакетКомпоновки = цКомпоновщикМакета.Выполнить(цСхемаКомпоновкиДанных, цНастройки, цДанныеРасшифровки, , , цПроверятьДоступностьПолей, цПараметрыФункциональныхОпций);//СвойМакетОформления);
цПроцессорКомпоновкиДанных.Инициализировать(цМакетКомпоновки, цВнешниеНаборыДанныхСКД, цДанныеРасшифровки, цОбщиеФормулы);
цПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
цПроцессорВывода.УстановитьДокумент(РезультатСКД);
Если ФлагСоединенияWEB Тогда
#Если не ТонкийКлиент Тогда
ПроцессорВывода_ВывестиWEB(цПроцессорВывода ,цПроцессорКомпоновкиДанных, цМакетКомпоновки, цДанныеРасшифровки, цСтрокаСоединения);
#КонецЕсли
ИначеЕсли ФлагСтрокаСоединенияСКД Тогда
ПроцессорВывода_ВывестиCOM(цПроцессорВывода ,цПроцессорКомпоновкиДанных, цМакетКомпоновки, цДанныеРасшифровки, цСтруктураЗапускаСКД);
Иначе
цПроцессорВывода.Вывести(цПроцессорКомпоновкиДанных, цВозможностьПрерыванияПользователем);
КонецЕсли;
Если РезультатСКД.ВысотаТаблицы>500 Тогда
РезультатСКД.ПоказатьУровеньГруппировокСтрок(0);//не обязательно
Иначе
РезультатСКД.ПоказатьУровеньГруппировокСтрок(1);//не обязательно
КонецЕсли;
ИначеЕсли ФлагТЗ ИЛИ ФлагДЗ Тогда
цМакетКомпоновки = цКомпоновщикМакета.Выполнить(цСхемаКомпоновкиДанных, цНастройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"), цПроверятьДоступностьПолей, цПараметрыФункциональныхОпций);//СвойМакетОформления);
цПроцессорКомпоновкиДанных.Инициализировать(цМакетКомпоновки, цВнешниеНаборыДанныхСКД, , Истина);
цПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
цПроцессорВывода.УстановитьОбъект(РезультатСКД);
Если ФлагСоединенияWEB Тогда
#Если не ТонкийКлиент Тогда
ПроцессорВывода_ВывестиWEB(цПроцессорВывода ,цПроцессорКомпоновкиДанных, цМакетКомпоновки, , цСтрокаСоединения);
#КонецЕсли
ИначеЕсли ФлагСтрокаСоединенияСКД Тогда
ПроцессорВывода_ВывестиCOM(цПроцессорВывода ,цПроцессорКомпоновкиДанных, цМакетКомпоновки, , цСтруктураЗапускаСКД );
Иначе
цПроцессорВывода.Вывести(цПроцессорКомпоновкиДанных);
КонецЕсли;
////
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "ай СКД";
//Сообщение.Поле = "";
//Сообщение.УстановитьДанные();
Сообщение.Сообщить();
КонецЕсли;
#КонецЕсли
Если ФлагЕстьАдресРезультатаСКД=Ложь Тогда
ВозвратРезультата = РезультатСКД;
Иначе
СтрукРезультатСКД=Новый Структура;
СтрукРезультатСКД.Вставить("РезультатСКД", РезультатСКД);
#Если не ТонкийКлиент Тогда
Если ФлагЕстьАдресДанныхРасшифровкиСКД Тогда
цАдресДанныхРасшифровкиСКД = ПоместитьВоВременноеХранилище(цДанныеРасшифровки,цАдресДанныхРасшифровкиСКД);
СтрукРезультатСКД.Вставить("ДанныеРасшифровки", цАдресДанныхРасшифровкиСКД);
Иначе
СтрукРезультатСКД.Вставить("ДанныеРасшифровки", цДанныеРасшифровки);
КонецЕсли;
#КонецЕсли
ВозвратРезультата = СтрукРезультатСКД;
КонецЕсли;
Если ФлагЕстьАдресРезультатаСКД Тогда
цАдресРезультатаСКД_=ПоместитьВоВременноеХранилище(ВозвратРезультата,цАдресРезультатаСКД);
Возврат цАдресРезультатаСКД_;
Иначе
возврат ВозвратРезультата;
КонецЕсли;
КонецФункции
Примечание.
Файл УФрезультатСКД_2.zip содержит 1Cv83.dt, 1Cv83.cf и УниверсальнаяФункцияСКД.epf
Для варианта размещения универсальной функции в глобальном модуле следует использовать 1Cv83.dt демонстрационной базы и 1Cv83.cf.
Если функцию нельзя разместить в глобальном модуле, то предложен внешний отчет УниверсальнаяФункцияСКД.epf