RDT1C/DataProcessors/ирКлсПолеТабличногоДокументаСГруппировками/Ext/ObjectModule.bsl
Администратор 78068c27a6 .
2016-12-04 00:16:49 +03:00

343 lines
26 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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