#Область БиблиотекаЗапускОтчета
&НаКлиенте
//Процедура получает форму типового отчета. Отчет без формы. Т.е. общая форма "ФормаОтчета"
//Инициализирует и создает отбор и структуру по переданным массивам параметров полей.
//Создает поля фильтров на форме отчета.
//Применяет сделанные настройки формирует табличный документ и открывает форму отчета.
//Параметры:
// - ИмяФормыОтчета - Строка. Полное имя формы. Передается в формате "Отчет.Взаиморасчеты.ФормаОбъекта"
// - СтруктураФильтровИГруппировок - Структура из трех массивов:
// - МассивИменФильтров (имена полей группировок и фильтров)
// - МассивЗначенийФильтров (правых значений полей фильтров)
// - МассивВыделений (Истина, Ложь - выделяет соответствующее по индексу поле группировки жирным шрифтом)
Процедура ОткрытьФормуОтчета(ИмяФормыОтчета, СтруктураФильтровИГруппировок)
МассивИменФильтров = СтруктураФильтровИГруппировок.МассивИменФильтров;
МассивЗначенийФильтров = СтруктураФильтровИГруппировок.МассивЗначенийФильтров;
МаксимальныйИндекс = МассивИменФильтров.Количество() - 1;
Если СтруктураФильтровИГруппировок.Свойство("МассивВыделений") Тогда
МассивВыделений = СтруктураФильтровИГруппировок.МассивВыделений;
Иначе
МассивВыделений = Новый Массив();
Для Индекс = 0 По МаксимальныйИндекс Цикл
МассивВыделений.Добавить(Ложь);
КонецЦикла;
КонецЕсли;
//Получаем форму отчета
Форма = ПолучитьФорму(ИмяФормыОтчета);
//Форма.УстановитьТекущийВариант("ВедомостьКраткоКонтекст");
//Достаем настройки
КомпоновщикНастроекКД = Форма.Отчет.КомпоновщикНастроек;
Настройки = ПолучитьНастройки(КомпоновщикНастроекКД);
//Инициализируем и создаем отбор и структуру с полями фильтров на форме отчета и выделением выбранных группировок жирным шрифтом
Настройки.Отбор.Элементы.Очистить();
Структура = Настройки.Структура;
Структура.Очистить();
СтруктураГоловнойГруппировки = Структура;
Для Индекс = 0 По МаксимальныйИндекс Цикл
ДобавитьЭлементОтбора(Настройки, МассивИменФильтров[Индекс], МассивЗначенийФильтров[Индекс]);
НоваяГруппировка = НоваяГруппировка(СтруктураГоловнойГруппировки, МассивИменФильтров[Индекс], МассивВыделений[Индекс]);
СтруктураГоловнойГруппировки = НоваяГруппировка.Структура;
КонецЦикла;
ГруппировкаРегистратор = НоваяГруппировка(СтруктураГоловнойГруппировки, "Регистратор");
//Загружаем настройки
КомпоновщикНастроекКД.ЗагрузитьНастройки(Настройки);
//Применяем настройки (с выводом полей на форму) и запускаем построение отчета
Результат = Новый Структура();
Результат.Вставить("ИмяСобытия", "ФормаНастроек");
Результат.Вставить("ВариантМодифицирован", Ложь);
Результат.Вставить("КомпоновщикНастроекКД", КомпоновщикНастроекКД);
Результат.Вставить("Переформировать", Истина);
Результат.Вставить("ВыводитьЗаголовкиНастроек", Истина);
Попытка
//Новая версия БСП
Форма.ПрименитьНастройкиИПереформироватьОтчет(Результат, Неопределено);
Исключение
Попытка
//Старая версия БСП
Форма.ВсеНастройкиЗавершение(Результат, Неопределено);
Исключение
КонецПопытки;
КонецПопытки;
//Открываем таки форму
Форма.Открыть();
КонецПроцедуры
//Процедура добавляет элемент отбора в структуру отчета по переданному имени и значению.
//И выводит поле фильтра на форму отчета.
//Параметры:
// - Настройки - НастройкиКомпоновкиДанных
// - ИмяЭлементаОтбора - строка
// - ЗначениеЭлементаОтбора - Произвольное значение
&НаКлиенте
Процедура ДобавитьЭлементОтбора(Настройки, ИмяЭлементаОтбора, ЗначениеЭлементаОтбора)
ПолеОтбора = Новый ПолеКомпоновкиДанных(ИмяЭлементаОтбора);
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = ПолеОтбора;
//ЭлементОтбора.Использование = ЗначениеЗаполнено(ЗначениеЭлементаОтбора);
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = ЗначениеЭлементаОтбора;
ЭлементОтбора.ИдентификаторПользовательскойНастройки = Строка(Новый УникальныйИдентификатор());
КонецПроцедуры
//Функция получает настройки компоновцика на сервере.
//Параметры:
// - КомпоновщикНастроек - КомпоновщикНастроекКомпоновкиДанных
//Возвращаемое значение:
// - НастрокиКомпоновкиДанных
&НаСервереБезКонтекста
Функция ПолучитьНастройки(КомпоновщикНастроек)
Возврат КомпоновщикНастроек.ПолучитьНастройки();
КонецФункции
//Функция создает и возвращает новую группировку по заданным параметрам.
//Параметры:
// - СтруктураРодителя - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных. Структура родительской группировки.
// - ИмяПоляГруппировки - Строка. Имя поля создаваемой группировки.
// - ЖирныйШрифт - Булево. Признак использования жирного шрифта для создаваемой группировки.
//Возвращаемое значение:
// - ГруппировкаКомпоновкиДанных. Созданная группировка
&НаКлиенте
Функция НоваяГруппировка(СтруктураРодителя, ИмяПоляГруппировки, ЖирныйШрифт = Ложь)
НоваяГруппировка = СтруктураРодителя.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
НоваяГруппировка.Использование = Истина;
ПолеГруппировки = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
ПолеГруппировки.Использование = Истина;
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(ИмяПоляГруппировки);
НоваяГруппировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
Если ЖирныйШрифт Тогда
УстановитьЖирныйШрифт(НоваяГруппировка, ПолеГруппировки.Поле);
КонецЕсли;
Возврат НоваяГруппировка;
КонецФункции
//Процедура добавляет элемент условного оформления в структуру отчета
//для переданной группировки и поля компоновки данных.
//Параметры:
// - Группировка - ГруппировкаКомпоновкиДанных
// - ПолеКомпоновки - ПолеКомпоновкиДанных
&НаКлиенте
Процедура УстановитьЖирныйШрифт(Группировка, ПолеКомпоновки)
ЭлементОформления = Группировка.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных = ЭлементОформления.Поля.Элементы.Добавить();
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
ВыбранноеПолеКомпоновкиДанных.Поле = ПолеКомпоновки;
Шрифт = ЭлементОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Шрифт"));
ЭлементОформления.Оформление.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Шрифт")
, Новый Шрифт(Шрифт.Значение, , , Истина));
КонецПроцедуры
#КонецОбласти
#Область СозданиеЭлементовФормы
&НаСервере
Функция ПараметрыПрограммногоСписка()
МассивКолонок = Новый Массив();
Если ЭтоТорговля() Тогда
ТекстЗапроса = "ВЫБРАТЬ
| ОбъектыРасчетов.Ссылка КАК ОбъектРасчетов,
| ОбъектыРасчетов.Контрагент КАК Контрагент,
| ОбъектыРасчетов.Договор КАК Договор,
| ОбъектыРасчетов.Сумма КАК СуммаДокумента
|ИЗ
| Справочник.ОбъектыРасчетов КАК ОбъектыРасчетов
|ГДЕ
| ОбъектыРасчетов.Объект ССЫЛКА Документ.ЗаказКлиента";
Иначе
ТекстЗапроса = "ВЫБРАТЬ
| ДокументЗаказПокупателя.Ссылка КАК Заказ,
| ДокументЗаказПокупателя.Договор КАК Договор,
| ДокументЗаказПокупателя.Контрагент КАК Контрагент,
| ДокументЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
|ИЗ
| Документ.ЗаказПокупателя КАК ДокументЗаказПокупателя";
КонецЕсли;
МассивКолонок.Добавить(ИмяЗаказа());
МассивКолонок.Добавить("Контрагент");
МассивКолонок.Добавить("Договор");
МассивКолонок.Добавить("СуммаДокумента");
Ответ = Новый Структура("ТекстЗапроса, МассивКолонок", ТекстЗапроса, МассивКолонок);
Возврат Ответ;
КонецФункции
&НаСервере
Процедура СоздатьСписокЗаказов(ОсновнаяТаблица)
ИмяСписка = ИмяСписка();
ТипыРеквизита = Новый Массив();
ТипыРеквизита.Добавить(Тип("ДинамическийСписок"));
ОписаниеТиповДляРеквизита = Новый ОписаниеТипов(ТипыРеквизита);
ДобавляемыеРеквизиты = Новый Массив();
ДинамическийСписок = Новый РеквизитФормы(ИмяСписка(), ОписаниеТиповДляРеквизита, , "", ЛОЖЬ); //Имя реквизита
ДобавляемыеРеквизиты.Добавить(ДинамическийСписок);
ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ПараметрыСписка = ПараметрыПрограммногоСписка();
МассивКолонок = ПараметрыСписка.МассивКолонок;
СозданиеДинамическогоСписка(ИмяСписка, ПараметрыСписка.ТекстЗапроса, МассивКолонок);
Элементы[ИмяСписка].УстановитьДействие("Выбор", "Отчет");
Элементы[ИмяСписка].ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
ЭтотОбъект[ИмяСписка].ОсновнаяТаблица = ОсновнаяТаблица;
КонецПроцедуры
&НаСервере
Процедура СозданиеДинамическогоСписка(ИмяСписка, ТекстЗапроса, МассивКолонок)
РеквизитДинамическийСписок = ЭтаФорма[ИмяСписка];
РеквизитДинамическийСписок.ПроизвольныйЗапрос = ИСТИНА;
РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса;
ТаблицаФормы = Элементы.Добавить(ИмяСписка, Тип("ТаблицаФормы"),ЭтаФорма);
ТаблицаФормы.ПутьКДанным = ИмяСписка;
Для Каждого Элемента Из МассивКолонок Цикл
ПараметрыКолонки = СтрЗаменить(Элемента,",",Символы.ПС);
Если СтрЧислоСтрок(ПараметрыКолонки) > 1 Тогда
ЗаголовокПоля = СтрПолучитьСтроку(ПараметрыКолонки, 1);
ИмяКолонки = СтрПолучитьСтроку(ПараметрыКолонки, 2);
Иначе
ЗаголовокПоля = "";
ИмяКолонки = ПараметрыКолонки;
КонецЕсли;
НоваяКолонкаТаблицы = Элементы.Добавить(ИмяСписка + ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы);
Если ЗаголовокПоля <> "" Тогда НоваяКолонкаТаблицы.Заголовок = ЗаголовокПоля; КонецЕсли;
НоваяКолонкаТаблицы.ПутьКДанным = ИмяСписка + "." + ИмяКолонки;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ИмяСписка()
Возврат "Список";
КонецФункции
&НаСервере
Функция ИмяОтчета()
Ответ = "Отчет.Взаиморасчеты.ФормаОбъекта";
Если ЭтоТорговля() Тогда
Ответ = "Отчет.ВедомостьРасчетовСКлиентами.ФормаОбъекта";
КонецЕсли;
Возврат Ответ;
КонецФункции
&НаСервере
Функция МассивИменФильтров()
Ответ = Новый Массив();
Ответ.Добавить("Контрагент");
Ответ.Добавить("Договор");
Ответ.Добавить(ИмяЗаказа());
Возврат Ответ;
КонецФункции
&НаСервере
Функция ИмяЗаказа()
Если ЭтоТорговля() Тогда
Ответ = "ОбъектРасчетов";
Иначе
Ответ = "Заказ";
КонецЕсли;
Возврат Ответ;
КонецФункции
&НаСервере
Функция ЭтоТорговля()
Ответ = Ложь;
ИменаТорговли = Новый Массив();
ИменаТорговли.Добавить("УправлениеТорговлей");
ИменаТорговли.Добавить("КомплекснаяАвтоматизация");
ИменаТорговли.Добавить("УправлениеПредприятием");
Для Каждого ИмяТорговли Из ИменаТорговли Цикл
Если СтрНайти(Метаданные.Имя, ИмяТорговли) > 0 Тогда
Ответ = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Ответ;
КонецФункции
#КонецОбласти
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЭтоТорговля() Тогда
СоздатьСписокЗаказов("Справочник.ОбъектыРасчетов");
Иначе
СоздатьСписокЗаказов("Документ.ЗаказПокупателя");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Отчет(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ТекДанные = Элементы[ИмяСписка()].ТекущиеДанные;
Если Не ТекДанные = Неопределено Тогда
ИмяФормыОтчета = ИмяОтчета();
МассивИменФильтров = МассивИменФильтров();
МассивЗначенийФильтров = Новый Массив();
МассивВыделений = Новый Массив();
СтруктураФильтровИГруппировок = Новый Структура();
ИмяЗаказа = ИмяЗаказа();
Для Каждого Фильтр Из МассивИменФильтров Цикл
МассивЗначенийФильтров.Добавить(ТекДанные[Фильтр]);
МассивВыделений.Добавить(Фильтр = ИмяЗаказа);
КонецЦикла;
СтруктураФильтровИГруппировок = Новый Структура("МассивИменФильтров, МассивЗначенийФильтров, МассивВыделений"
, МассивИменФильтров, МассивЗначенийФильтров, МассивВыделений);
ОткрытьФормуОтчета(ИмяФормыОтчета, СтруктураФильтровИГруппировок);
КонецЕсли;
КонецПроцедуры