Зачем нужен файл ОтладкаПереводаСКДнаУправляемоеПриложение.erf?
Примечание. Нижеследующие ответы перенесены из обсуждения.
Ответ_1.
В платформе 8.2 предусмотрена совместная работа обычного (ОП) и управляемого приложений(УП). В типовых программах постепенно УП вытесняет ОП. Наблюдая эту тенденцию, следует заранее готовиться к переходу на УП и, желательно, избежать авральных ситуаций.
При плановом переходе с ОП на УП неизбежен некоторый период, в течение которого обе формы должны работать параллельно. Длительность периода включает время отладки программистом, время обучения персонала и тестирование. В течение этого периода могут поступать заявки на изменение алгоритма функционирования ОП. В предложенном инструменте все изменения алгоритма в ОП синхронно транслируются в УП. Этот эффект получен за счёт того, что макет и процедуры (функции), определяющие результат СКД, общие для ОП И УП. Этими процедурами являются: УстановитьСтартовыеПараметрыЭтойФормы(), УстановитьЗаголовокЭкрана(), ЗаполнитьПараметрыСКД(), ВыполнитьПоАлгоритмуНажатие1_общ(), УбратьНедопустимыеЗнаки().
В итоге имеем, что после изменения алгоритма в ОП , не требуется корректировать алгоритм в УП. Результат СКД будет одинаковым.
Зачем нужен файл ОтладкаПереводаСКДнаУправляемоеПриложение.erf?
Ответ_2. Рассмотрим вариант тонкого клиента.
Тонкий клиент не работает с коллекциями значений и не поддерживает функционал "данные расшифровки". Поэтому, в существующей версии инструмента предусмотрено принудительное переключение результатаСКД на тип «ТабличныйДокумент». Однако, такое решение не может быть удовлетворительным. Правильнее, вначале, выполнить на сервере процедуру «ВыполнитьПоАлгоритмуНажатие1_общ()». Затем, преобразовать полученную коллекциюЗначений в ТабличныйДокумент, который поместить во временноеХранилище по адресуРезультатСКД.
Зачем нужен файл ОтладкаПереводаСКДнаУправляемоеПриложение.erf?
Ответ_3. Распределенные базы данных.
При работе с распределенными базами данных, тождественность ОП и УП на период совместной работы обеспечивает функционал страницы «Параметры базы данных (Источник)». Чтение внешней базы с применением СКД возможно, если текст запроса одновременно корректен в базах принимающей и передающей.
Зачем нужен файл ОтладкаПереводаСКДнаУправляемоеПриложение.erf?
Ответ_4. Удобство программирования.
Две ключевые процедуры СформироватьРезультатСКД() и ОбновитьКолонкиТЗ() обеспечивают удобство программирования. Процедуры упрощают вызов СКД.
Например, чтобы изменить тип РезультатаСКД с ТабличныйДокумент на ДеревоЗначений или ТаблицаЗначений, достаточно указать требуемый тип в параметре РезультатСКДТип.
Поэтому, эти процедуры, желательно, поместить в глобальный модуль. Выбранный вариант размещения процедур указан в переменной «ВариантРазмещенияМодуля».
Зачем нужен файл ОтладкаПереводаСКДнаУправляемоеПриложение.erf?
Ответ_5. Удобство программирования_2.
Обработку можно использовать в качестве шаблона для СКД. Так как, она работает одинаково в Управляемом и Обычном приложениях, то через некоторое не приходится сожалеть о неправильно выбранной среде разработки.
Описание возможностей инструмента.
Внешний отчет (инструмент), представляет результат СКД как ТабличныйДокумент или КоллекциюЗначений. Работает в обычном и управляемом приложениях одновременно. Применяет СКД для чтения внешней базы. Читает файлы *.xls. Удобен при переходе на управляемое приложение. Удобно использовать в качестве шаблона для СКД.
Детализация возможностей инструмента:
a) Инструмент представляет результат работы СКД на двух страницах в форматах табличного документа и дереваЗначений или ТаблицыЗначений.
b) Инструмент покажет одинаковый результат при запусках внешнего отчета в режимах обычного и управляемого приложения. Следует иметь в виду, что в режиме тонкого клиента результат СКД может быть представлен только табличным документом без расшифровки.
c) Инструмент в качестве источника данных СКД может использовать внешнюю базу. Чтобы активировать эту возможность, во внешней базе следует разместить два общих модуля, «ФункцииДляОтчетовСервер» и «ФункцииДляОтчетов». Образцы этих модулей представлены в модуле инструмента, а также в приложенной конфигурации. Идея модулей взята из книги «Разработка сложных отчетов в 1С:Предприятии 8» автора Е.Ю.Хрусталева.
d) В инструмент добавлена часто востребованная функция - преобразовывание файл.xls в таблицу значений.
e) Конвертация на платформу 8.3 выполняется обычным способом.
Порядок работы.
- Заполнить макет СхемыКомпоновкиДанных или использовать тестовый пример.
- Запустить Процедуру «Сформировать СКД» в режимах:
- Обычное приложение, страница «Табличный документ».
- Обычное приложение, страница «Коллекция значений».
- Управляемое приложение, толстый клиент, страница «Табличный документ».
- Управляемое приложение, толстый клиент, страница «Коллекция значений».
- Управляемое приложение, тонкий клиент, страница «Табличный документ».
Проверить, что результат СКД одинаковый во всех режимах.
Рекомендация. Удобно из конфигуратора одновременно запустить приложения обычное, управляемое-толстыйКлиент и управляемое-тонкийКлиент. Далее, одновременно наблюдать работу инструмента по позициям 2.1 – 2.5. Следует иметь в виду, что разделение исполнения кода &НаКлиенте или &НаСервере можно наблюдать только в базе SQL.
- На странице «Параметры базы данных» выбрать режимы:
- Получать данные из внешней файловой информационной базы
- Получать данные из внешней серверной информационной базы
- Примечание. Для работы СКД в режиме внешнего соединения, необходимо во внешней базе разместить два общих модуля «ФункцииДляОтчетовСервер» и «ФункцииДляОтчетов». Образцы этих модулей приведены в модуле внешнего отчета.
- Для каждого режима выполнить пункт «Запустить Процедуру «СформироватьСКД». Проверить, что результат СКД одинаковый во всех режимах.
- На странице «Загрузить *.xls» проверить загрузку файла в обычном и управляемом приложениях.
- В процедуре «ВыполнитьПоАлгоритмуНажатие1_общ(цАдрес)» написать обработку таблицы значений или использовать тестовый вариант. Выполнить проверку «СформироватьСКД» в режимах «Коллекция значений».
- В процедуре «ЗаполнитьПараметрыСКД(СтрукПараметрыСКД)» заполнить параметры. Выполнить «СформироватьСКД» во всех режимах.
- После проверки внешнюю обработку можно использовать в практической деятельности как конструктор, который преобразует результат работы СКД в форматы табличныйДокумент, таблицаЗначений или ДеревоЗначений.
- После размещения общего модуля «ОбщегоНазначенияСКД» в конфигурации, преобразование РезультатаСКД в ТабличныйДокумент, ТаблицуЗначений или ДеревоеЗначений будет доступно в прикладном решении.
Далее, приведено описание двух ключевых процедур СформироватьРезультатСКД() и ОбновитьКолонкиТЗ(). Размещение этих процедур в общем модуле конфигурации повысит комфортность использования СКД. Пример конфигурации прикладывается.
СформироватьРезультатСКД()
Синтаксис:
СформироватьРезультатСКД(<ПараметрыЗапускаСКД>)
Параметры:
<ПараметрыЗапускаСКД> (обязательный)
Тип: Структура.
Задает настройки и параметры запуска системы компоновки данных: ключ структуры определяет имя параметраЗапускаСКД, а значение структуры - значение параметраЗапускаСКД
ключ1 = "АдресРезультатаСКД", тип:строка. (Необязательный)
Значение1, тип:Строка. Адрес временного хранилища, в которое помещен результат работы системы компоновки данных. Наличие или отсутствие ключа1 определяет тип возвращаемого значения.
ключ2 = "АдресМакетаСКД", тип:строка. (обязательный)
Значение2, тип: Строка. Адрес временного хранилища, в которое помещен макет схемы компоновки данных (Тип:СхемаКомпоновкиДанных).
ключ3 = "ВариантНастройкиСКД", тип:Строка. (необязательный).
Значение3= тип:Строка, НастройкиКомпоновкиДанных. Если указано Имя варианта, как указано в схеме компоновки данных, тогда РезультатСКД будет получен с настройками по умолчанию указанного вариантаСКД. Если указаны текущие настройки (КомпоновщикНастроек.Настройки), то с этими настройками будет получен РезультатСКД. Если ВариантНастройкиСКД не указан, то РезультатСКД будет получен с настройками по умолчанию.
ключ4 = "ПараметрыСКД", тип:Строка
Значение4 , тип:Структура. Структура4 содержит параметры схемы компоновки данных.
Структура4.Ключ = Имя параметра, как оно задано в схеме компоновки данных.
Структура4.Значение = Значение параметра.
ключ5 = "СтрокаСоединения", тип:Строка. (необязательный).
Значение5 , тип:Строка. Строка соединения с внешней базой. Если СтрокаСоединения не указана, то источником данных считается текущая база.
Ключ6 = "РезультатСКДТип", тип:Строка. (необязательный).
Значение6 = Тип:Строка,ТабличныйДокумент, ТаблицаЗначений, ДеревоЗначений, ДанныеФормыКоллекция, ДанныеФормыДерево. Задает тип результатаСКД. Обрабатываются следующие значения строки: «ТабличныйДокумент» , «ТонкийКлиент», «ТаблицаЗначений» и «ДеревоЗначений». Другие значения строки будут интерпретироваться как «ТабличныйДокумент».
Если РезультатСКДТип не указан, то во временное хранилище будет назначен тип ТабличныйДокумент.
Ключ7 = «ВнешниеНаборыДанныхСКД». Тип:Строка (необязательный)
Значени7 = ВнешниеНаборыДанныхСКД,
Возвращаемое значение:
Тип: Строка, Структура. Если тип строка, то возвращен адрес временного хранилища, в котором размещена структура. Структура содержит, ТабличныйДокумент, ДанныеРасшифровки, ТаблицаЗначений, ДеревоЗначений.
Возвращаемое значение помещается во временное хранилище по адресу "АдресРезультатаСКД".
Вариант 1 возвращаемого значения.
Структура.РезультатСКД = Тип:ТабличныйДокумент
Структура.ДанныеРасшифровки = Тип:ДанныеРасшифровкиКомпоновкиДанных
Вариант 2 возвращаемого значения.
Структура.РезультатСКД = Тип:ТаблицаЗначений
Структура.ДанныеРасшифровки = Неопределено
Вариант 3 возвращаемого значения.
Структура.РезультатСКД = Тип:ДеревоЗначений
Структура.ДанныеРасшифровки = Неопределено
Вариант 4 возвращаемого значения, для тонкого клиента.
РезультатСКД = Тип:ТабличныйДокумент
Описание:
Возвращает или записывает во временное хранилище структуру, содержащую результат работы Системы компоновки данных (РезультатСКД) и ДанныеРасшифровки. Тип результатаСКД может быть ТабличныйДокумент, ТаблицаЗначений, ДеревоЗначений.
Возвращаемое значение помещается во временное хранилище по адресу "АдресРезультатаСКД".
Доступность:
Сервер, Толстый клиент, тонкий клиент
Примечание:
Процедура может быть размещена либо в модуле обработки, либо в общем модуле конфигурации.
ОбновитьКолонкиТЗ()
Синтаксис:
ОбновитьКолонкиТЗ(<ФормаЭта>, <ИмяРеквизита>, <КоллекцияЗначений>)
Параметры:
<ФормаЭта> (обязательный)
Тип:УправляемаяФорма. Форма, в реквизите которой следует определить состав колонок.
<ИмяРеквизита> (обязательный)
Тип:Строка. Имя реквизита как указано в управляемой форме. Этому реквизиту следует определить состав колонок. Тип реквизита должен быть либо ТаблицаЗначений, либо ДеревоЗначений.
<КоллекцияЗначений> (обязательный)
Тип:ТаблицаЗначений, ДеревоЗначений. Источник данных, который следует вывести на экран.
Описание:
Определяет состав колонок реквизита управляемой формы. Тип реквизита должен быть либо ТаблицаЗначений, либо ДеревоЗначений. Применяется в случаях, когда состав колонок заранее неизвестен.
Доступность:
Сервер
Примечание.
Процедура ОбновитьКолонкиТЗ() используется для управляемого приложения.
//////////////////////////
////Обычное приложение /////
Процедура ПриОткрытии()
цУникальныйИдентификатор = Новый УникальныйИдентификатор;
АдресРезультатаСКД = ПоместитьВоВременноеХранилище(Неопределено ,цУникальныйИдентификатор);
цУникальныйИдентификатор = Новый УникальныйИдентификатор;
МакетСКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных") ;
АдресМакетаСКД = ПоместитьВоВременноеХранилище( МакетСКД ,цУникальныйИдентификатор);
КонецПроцедуры
//Вариант 1. Формируем табличный документ с настройками по умолчанию.
Процедура ДействияФормыСформироватьСКД(Кнопка)
цПараметрыСКД =Новый Структура();
цПараметрыСКД.Вставить("ДатаНач", ДатаНач);
// и так далее
струк =Новый Структура("АдресРезультатаСКД, АдресМакетаСКД, ПараметрыСКД" , АдресРезультатаСКД, АдресМакетаСКД, цПараметрыСКД) ;
ВариантРазмещенияМодуля=1;
//ВариантРазмещенияМодуля=2;
Если ВариантРазмещенияМодуля=1 Тогда
ОбщегоНазначенияСКД_СформироватьРезультатСКД(струк); //модуль обработки
ИначеЕсли ВариантРазмещенияМодуля=2 Тогда
//ОбщегоНазначенияСКД.СформироватьРезультатСКД(струк);//общий модуль
КонецЕсли;
струкРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);
цРезультатСКД = струкРезультатСКД.РезультатСКД;
ДанныеРасшифровки = струкРезультатСКД.ДанныеРасшифровки;
текЭлФрм = ЭлементыФормы.ТабДок;
текЭлФрм.Очистить();
текЭлФрм.Вывести(цРезультатСКД);
КонецПроцедуры
//Вариант 2. Формируем таблицуЗначений по текущим настройкам схемы компоновки данных.
Процедура ДействияФормыСформироватьСКД(Кнопка)
РезультатСКД = ЭтаФорма[СтраницаВывода_Имя];
цПараметрыСКД =Новый Структура();
цПараметрыСКД.Вставить("ДатаНач", ДатаНач)
// и так далее
цНастройки = КомпоновщикНастроек.Настройки;
струк =Новый Структура("АдресРезультатаСКД,АдресМакетаСКД, ВариантНастройкиСКД,ПараметрыСКД,СтрокаСоединения,РезультатСКДТип,ОбщиеФормулы" ,АдресРезультатаСКД,АдресМакетаСКД, цНастройки ,ПараметрыСКД, , «ТаблицаЗначений», Истина) ;
ВариантРазмещенияМодуля=1;
//ВариантРазмещенияМодуля=2;
Если ВариантРазмещенияМодуля=1 Тогда
ОбщегоНазначенияСКД_СформироватьРезультатСКД(струк); //модуль обработки
ИначеЕсли ВариантРазмещенияМодуля=2 Тогда
//ОбщегоНазначенияСКД.СформироватьРезультатСКД(струк);//общий модуль
КонецЕсли;
струкРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);
цРезультатСКД = струкРезультатСКД.РезультатСКД;
текЭлФрм = ЭлементыФормы.ТаблицаЗначений;
текЭлФрм.Значение.Колонки.Очистить();
текЭлФрм.Значение = цРезультатСКД;
текЭлФрм.СоздатьКолонки();
КонецПроцедуры
////////////////////////////////
////Управляемое приложение //////
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
цОтчОб = РеквизитФормыВЗначение("Отчет");
МакетСКД = цОтчОб.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
АдресМакетаСКД = ПоместитьВоВременноеХранилище(МакетСКД ,УникальныйИдентификатор);
ЭтаФорма.КлючТекущегоВарианта = МакетСКД.ВариантыНастроек[0].Имя;
КонецПроцедуры
//Вариант 3. Формируем табличный документ по выбранному варианту схемы компоновки данных.
&НаКлиенте
Процедура ДействияФормыСформироватьСКД(Команда)
ДанныеФормы = ЭтаФорма.КоллекцияЗначений;
цПараметрыСКД =Новый Структура();
цПараметрыСКД.Вставить("ДатаНач", ДатаНач);
// и так далее
цВариантСКД = этаформа.КлючТекущегоВарианта;
структ =Новый Структура("АдресРезультатаСКД,АдресМакетаСКД,ВариантНастройкиСКД,ПараметрыСКД,СтрокаСоединения,РезультатСКДТип,ОбщиеФормулы" ,АдресРезультатаСКД,АдресМакетаСКД, цВариантСКД , цПараметрыСКД , , ДанныеФормы , Истина) ;
ВариантРазмещенияМодуля=1;
//ВариантРазмещенияМодуля=2;
Если ВариантРазмещенияМодуля=1 Тогда
ОбщегоНазначенияСКД_СформироватьРезультатСКД(струк); //модуль обработки
ИначеЕсли ВариантРазмещенияМодуля=2 Тогда
//ОбщегоНазначенияСКД.СформироватьРезультатСКД(струк);//общий модуль
КонецЕсли;
струкРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);
цРезультатСКД = струкРезультатСКД.РезультатСКД;
ИмяРеквизита =ИмяРеквизита;
ОбновитьКолонкиТЗсрв( ИмяРеквизита, цРезультатСКД, ВариантРазмещенияМодуля);
КонецПроцедуры
&НаСервере
Процедура СформироватьРезультатСКДсрв(струк)
цОтчОб = РеквизитФормыВЗначение("Отчет");
цОтчОб.ОбщегоНазначенияСКД_СформироватьРезультатСКД(струк);
КонецПроцедуры
//Вариант 4. Формируем деревоЗначений по текущим настройкам схемы компоновки данных. Источником данных выбрана внешняя файловая база МТС.
&НаКлиенте
Процедура ДействияФормыСформироватьСКД(Команда)
Перем цВариантСКД;
цРезультатСКДТип = «ДеревоЗначений»;
ПараметрыСКД =Новый Структура();
цНастройки = отчет.КомпоновщикНастроек.Настройки;
ПараметрыСКД.Вставить("ДатаНач", ДатаНач);
структ =Новый Структура("АдресРезультатаСКД, АдресМакетаСКД, ВариантНастройкиСКД, ПараметрыСКД, СтрокаСоединения, РезультатСКДТип, ОбщиеФормулы" , АдресРезультатаСКД,АдресМакетаСКД, цНастройки , ПараметрыСКД, "File=E:\1С_Базы\МТС;Usr=Панкратов_Павел;Pwd=pavley",цРезультатСКДТип, Истина) ;
СформироватьРезультатСКДсрв(структ);
струкРезультатСКД = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);
цРезультатСКД = струкРезультатСКД.РезультатСКД;
ИмяРеквизита ="ТаблицаЗначений";
ОбновитьКолонкиТЗсрв( ИмяРеквизита, цРезультатСКД);
КонецПроцедуры
//Вариант5. Формируем ТабличныйДокумент по текущим настройкам схемы компоновки данных в тонком клиенте
&НаКлиенте
Процедура ДействияФормыСформироватьСКД(Команда)
#Если ТонкийКлиент Тогда
ФлагЭтоТонкийКлиент = Истина;
#Иначе
ФлагЭтоТонкийКлиент = Ложь;
#КонецЕсли
ПараметрыСКД =Новый Структура();
цНастройки = отчет.КомпоновщикНастроек.Настройки;
ПараметрыСКД.Вставить("ДатаНач", ДатаНач);
структ =Новый Структура("АдресРезультатаСКД, АдресМакетаСКД, ВариантНастройкиСКД, ПараметрыСКД, СтрокаСоединения, РезультатСКДТип, ОбщиеФормулы" , АдресРезультатаСКД,АдресМакетаСКД, цНастройки , ПараметрыСКД, , , Истина) ;
Если ФлагЭтоТонкийКлиент Тогда
цц="";
ФлагЕстьРезультатСКДТип = структ.Свойство("РезультатСКДТип",цц);
Если ФлагЕстьРезультатСКДТип Тогда
структ.РезультатСКДТип = "ТонкийКлиент";
Иначе
структ.Вставить("РезультатСКДТип","ТонкийКлиент")
КонецЕсли;
КонецЕсли;
СформироватьРезультатСКДсрв(структ);
РезультатСКД_ТабДок = ПолучитьИзВременногоХранилища(АдресРезультатаСКД);
ЭтаФорма.ТабДок = РезультатСКД_ТабДок;
КонецПроцедуры
&НаСервере
Процедура СформироватьРезультатСКДсрв(струк)
цОтчОб = РеквизитФормыВЗначение("Отчет");
цОтчОб.ОбщегоНазначенияСКД_СформироватьРезультатСКД(струк);
КонецПроцедуры
&НаСервере
Процедура ОбновитьКолонкиТЗсрв( ИмяРеквизита, цРезультатСКД)
цОтчОб = РеквизитФормыВЗначение("Отчет");
цОтчОб.ОбщегоНазначенияСКД_ОбновитьКолонкиТЗ(ЭтаФорма, ИмяРеквизита, цРезультатСКД);
КонецПроцедуры