/////////////////////////////////////////////////////
//Общий модуль: ДополнительныеОтчетыИОбработкиКлиент
Процедура РасшБСП_ОткрытьДопотчетВыведенныйВКоманднуюПанель(Знач МассивСсылок, Знач ПараметрыВыполнения) Экспорт
//Подстановка значений в нужные реквизиты из входных данных
ОбъектыНазначения = МассивСсылок;
ВладелецФормы = ПараметрыВыполнения.Форма;
ВидОбработок = ПараметрыВыполнения.ОписаниеКоманды.Вид;
//Стянуто с "ОбщаяФорма.ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуПоПараметрам"
//ДанныеОбработки = Элементы.ТаблицаКоманд.ТекущиеДанные;
ДанныеОбработки = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры.ДанныеОбработки;
Если ДанныеОбработки = Неопределено Тогда
Возврат;
КонецЕсли;
ВыполняемаяКоманда = Новый Структура(
"Ссылка, Представление,
|Идентификатор, ВариантЗапуска, ПоказыватьОповещение,
|Модификатор, ОбъектыНазначения, ЭтоОтчет, Вид");
ЗаполнитьЗначенияСвойств(ВыполняемаяКоманда, ДанныеОбработки);
//Если НЕ ЭтоГлобальныеОбработки Тогда
// ВыполняемаяКоманда.ОбъектыНазначения = ОбъектыНазначения.ВыгрузитьЗначения();
//КонецЕсли;
ВыполняемаяКоманда.ЭтоОтчет = Истина;//ЭтоОтчеты;
ВыполняемаяКоманда.Вид = ПараметрыВыполнения.ОписаниеКоманды.ДополнительныеПараметры.Вид;//ВидОбработок;
ВыполняемаяКоманда.ОбъектыНазначения = ОбъектыНазначения;
Если ДанныеОбработки.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы") Тогда
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда, ВладелецФормы, ВыполняемаяКоманда.ОбъектыНазначения);
//Закрыть();
ИначеЕсли ДанныеОбработки.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода") Тогда
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКлиентскийМетодОбработки(ВыполняемаяКоманда, ВладелецФормы, ВыполняемаяКоманда.ОбъектыНазначения);
//Закрыть();
ИначеЕсли ВидОбработок = ПредопределенноеЗначение("Перечисление.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма")
И ДанныеОбработки.Модификатор = "ПечатьMXL" Тогда
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеПечатнойФормы(ВыполняемаяКоманда, ВладелецФормы, ВыполняемаяКоманда.ОбъектыНазначения);
//Закрыть();
ИначеЕсли ДанныеОбработки.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода")
Или ДанныеОбработки.ВариантЗапуска = ПредопределенноеЗначение("Перечисление.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме") Тогда
//// Изменение элементов формы
//Элементы.ПоясняющаяДекорация.Заголовок = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
// НСтр("ru = 'Выполняется команда ""%1""...'"),
// ДанныеОбработки.Представление);
//Элементы.Страницы.ТекущаяСтраница = Элементы.СтраницаВыполненияОбработки;
//Элементы.НастроитьСписок.Видимость = Ложь;
//Элементы.ВыполнитьОбработку.Видимость = Ложь;
//
//// Вызов сервера только после перехода формы в консистентное состояние.
//ПодключитьОбработчикОжидания("ВыполнитьСерверныйМетодОбработки", 0.1, Истина);
ВызватьИсключение("Сообщите программисту об этой ошибке!");
//инфо для программиста:
// не должно попадать в эту ветку, т.к. предназначено для допотчетов с вариантом запуска "ОткрытиеФормы"
// Разобраться, пофиксить.
КонецЕсли;
КонецПроцедуры
/////////////////////////////////////////////////////
//Общий модуль: ДополнительныеОтчетыИОбработки
&После("ПриОпределенииКомандПодключенныхКОбъекту")
Процедура РасшБСП_ПриОпределенииКомандПодключенныхКОбъекту(НастройкиФормы, Источники, ПодключенныеОтчетыИОбработки, Команды)
Если не РасшБСП_НадоВыводитьДопОтчетыСписком(Команды) Тогда
Возврат;
КонецЕсли;
///////////////////////////////////////////////////////////////////////
// Вынес основную информацию.
СтруктураКонстант = Новый Структура;
СтруктураКонстант.Вставить("Вид", ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет());
СтруктураИсточника = Новый Структура;
СтруктураИсточника.Вставить("ИмяФормы", НастройкиФормы.ИмяФормы);
СтруктураИсточника.Вставить("ТипЗначенийИсточника", НастройкиФормы.Источники.Строки[0].ТипСсылкиДанных);
СтруктураИсточника.Вставить("МетаданныеРодителя", НастройкиФормы.Источники.Строки[0].Метаданные);
СтруктураИсточника.Вставить("ТипыОтчетов", Новый Массив);
СтруктураИсточника.ТипыОтчетов.Добавить(СтруктураИсточника.ТипЗначенийИсточника);
// подготовка параметров для запроса
///////////////////////////////////////////////////////////////////////
// Стянуто с "ОбщаяФорма.ДополнительныеОтчетыИОбработки.ПриСозданииНаСервере"
//1 параметр запроса
ВидОбработок = ДополнительныеОтчетыИОбработки.ПолучитьВидОбработкиПоСтроковомуПредставлениюВида(СтруктураКонстант.Вид);
//2 параметр запроса
ИнформацияОВладельце = ДополнительныеОтчетыИОбработкиПовтИсп.ПараметрыФормыНазначаемогоОбъекта(СтруктураИсточника.ИмяФормы);
МетаданныеРодителя = СтруктураИсточника.МетаданныеРодителя; //Метаданные.НайтиПоТипу(ТипЗначенийИсточника);
Если МетаданныеРодителя = Неопределено Тогда
СсылкаРодителя = ИнформацияОВладельце.СсылкаРодителя;
Иначе
СсылкаРодителя = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(МетаданныеРодителя);
КонецЕсли;
//3 параметр запроса
Если ТипЗнч(ИнформацияОВладельце) = Тип("ФиксированнаяСтруктура") Тогда
ЭтоФормаОбъекта = ИнформацияОВладельце.ЭтоФормаОбъекта;
Иначе
ЭтоФормаОбъекта = Ложь;
КонецЕсли;
///////////////////////////////////////////////////////////////////////
// Стянуто с "ОбщаяФорма.ДополнительныеОтчетыИОбработки.ЗаполнитьТаблицуОбработок"
//4 параметр запроса
ТипыКоманд = Новый Массив;
ТипыКоманд.Добавить(Перечисления.СпособыВызоваДополнительныхОбработок.ВызовКлиентскогоМетода);
ТипыКоманд.Добавить(Перечисления.СпособыВызоваДополнительныхОбработок.ВызовСерверногоМетода);
ТипыКоманд.Добавить(Перечисления.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы);
ТипыКоманд.Добавить(Перечисления.СпособыВызоваДополнительныхОбработок.СценарийВБезопасномРежиме);
// Запрос по командам
Запрос = ДополнительныеОтчетыИОбработки.НовыйЗапросПоДоступнымКомандам(ВидОбработок, СсылкаРодителя, ЭтоФормаОбъекта, ТипыКоманд);
ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
///////////////////////////////////////////////////////////////////////
// Добавляю команды доп отчетов в общий список команд
Для каждого ИнфоПоКомпанде из ТаблицаРезультат цикл
Команда = Команды.Добавить();
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
Команда.Вид = "Отчеты";
Команда.Важность = "Обычное";//"СмТакже", "Обычное", "Важное";
Команда.Представление = ИнфоПоКомпанде.Представление;
Иначе
Команда.Вид = "КоманднаяПанель";
Команда.Представление = ИнфоПоКомпанде.Представление;
КонецЕсли;
Команда.Порядок = 999;//0; - первый //50 - последний;
Команда.Обработчик = "ДополнительныеОтчетыИОбработкиКлиент.РасшБСП_ОткрытьДопотчетВыведенныйВКоманднуюПанель";
Команда.РежимЗаписи = "Записывать";
Команда.МножественныйВыбор = Истина;
Команда.ТипПараметра = Новый ОписаниеТипов(СтруктураИсточника.ТипыОтчетов);
Команда.ДополнительныеПараметры = Новый Структура("Вид, ЭтоОтчет", СтруктураКонстант.Вид, Истина);
//Добавляем данные по конкретному доп отчету
ДанныеОбработки = РасшБСП_ПреобразоватьСтрокуТаблицыЗначенийВСтруктуру(ТаблицаРезультат.Колонки, ИнфоПоКомпанде);
Команда.ДополнительныеПараметры.Вставить("ДанныеОбработки", ДанныеОбработки);
КонецЦикла;
КонецПроцедуры
Функция РасшБСП_НадоВыводитьДопОтчетыСписком(Команды)
Результат = Ложь;
Команда_ДопОтчеты = Команды.НайтиСтроки(Новый Структура("Обработчик", "ДополнительныеОтчетыИОбработкиКлиент.ОткрытьСписокКоманд"));
Если Команда_ДопОтчеты.Количество() = 1 Тогда
Результат = Истина;
//Команды.удалить(Команда_ДопОтчеты);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция РасшБСП_ПреобразоватьСтрокуТаблицыЗначенийВСтруктуру(КолонкиТЗ, СтрокаТЗ, СписокСвойств = Неопределено, ИсключаяСвойства = Неопределено, ВходнаяСтруктура = Неопределено) Экспорт
//Подготовим структуру для заполнения
Результат = Новый Структура;
Если ВходнаяСтруктура <> Неопределено Тогда
Для каждого КлючЗначние из ВходнаяСтруктура цикл
Результат.Вставить(КлючЗначние.Ключ, КлючЗначние.Значение);
КонецЦикла;
КонецЕсли;
//Подготовим массив свойств
Если СписокСвойств = Неопределено Тогда
МассивСвойств = Новый Массив;
Для Каждого КолонкаТЗ из КолонкиТЗ цикл
МассивСвойств.Добавить(КолонкаТЗ.Имя)
КонецЦикла;
Иначе
МассивСвойств = СтрРазделить(СписокСвойств, ",", Ложь);
КонецЕсли;
//Уберем ненужные из подготовленных свойств
Если ИсключаяСвойства = Неопределено Тогда
МассивСвойствИсключений = СтрРазделить(ИсключаяСвойства, ",", Ложь);
Если МассивСвойствИсключений.Количество() > 0 Тогда
Инд = МассивСвойств.Количество()-1;
Пока Инд >=0 Цикл
Если МассивСвойствИсключений.Найти(МассивСвойств[Инд]) <> Неопределено Тогда
МассивСвойств.Удалить(Инд);
КонецЕсли;
Инд = Инд - 1;
КонецЦикла;
КонецЕсли;
КонецЕсли;
//Заполняем структуру
Для каждого ЭлементМассива из МассивСвойств цикл
Если Результат.Свойство(ЭлементМассива) Тогда
Результат[ЭлементМассива] = СтрокаТЗ[ЭлементМассива];
Иначе
Результат.Вставить(ЭлементМассива, СтрокаТЗ[ЭлементМассива]);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции