RDT1C/DataProcessors/ирКлсПолеТабличногоДокументаСГруппировками/Ext/ObjectModule.bsl
Администратор 1456e97cdc Интерфейсная панель
*Исправлена ошибка открытия форм отчетов через контекстное меню
        *Ускорена фильтрация по подсистемам
    Редактор объекта БД
        *Устранен избыточный вызов перезаполнения данных на закладке "Связанные колонки", если тип объекта не менялся
    Консоль запросов
        *Устранено в некоторых случаях ошибочное применение выборок итогов при выгрузке в дерево
        +Над деревом запросов добавлено поле строки поиска
        *Исправлено в дерево запроса некорректное определение имени создаваемой временной таблицы при наличии в выбранных полях запроса выражения "<Таблица>.*"
        +В контекстном меню дерева запроса добавлена команда "Выполнить запросы пакета (F9)"
        +При выполнении пакетного запроса теперь обновляется колонка "Количество строк" в дереве запроса
    Конструктор запроса
        *Звездочка в предложении ВЫБРАТЬ при сборке текста теперь не вставляется в объединениях
        *Исправлено разворачивание звездочки в некоторых случаях
        *Исправлено обнаружение параметров в логических выражениях
    Контекстная подсказка
        *Исправлена ошибка при вычислении свойств виртуальной таблицы с некорректными параметрами
    Консоль кода
        +Над деревом алгоритмов добавлено поле строки поиска
    Динамический список
        *Исправлена доступность сортировки по номеру стандартными средствами
    Функции режима отладки
        +В функции От() добавлен учет уничтожений временных таблиц при поиске использованных в запросе временных таблиц
2016-12-04 00:34:24 +03:00

347 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] = "" Тогда
МассивИзмерений.Очистить();
КонецЕсли;
Возврат МассивИзмерений;
КонецФункции // ПолучитьМассивИзмеренийКолонокНастройкиКомпоновкиПоУровням()
// Получает массив представлений измерений по уровням построителя.
//
// Параметры:
// Измерения ИзмеренияПостроителяОтчета.
//
// Возвращаемое значение:
// МассивИзмерений индекс элемента массива соотвествует уровню.
//
Функция ПолучитьМассивИзмеренийПостроителяПоУровням(Измерения)
МассивИзмерений = Новый Массив;
Для Каждого Измерение Из Измерения Цикл
МассивИзмерений.Добавить(Измерение.Представление);
Если Измерение.ТипИзмерения <> ТипИзмеренияПостроителяОтчета.Элементы Тогда
МассивИзмерений[МассивИзмерений.ВГраница()] = МассивИзмерений[МассивИзмерений.ВГраница()] + " (иерархия)";
Прервать;
КонецЕсли;
КонецЦикла;
Возврат МассивИзмерений;
КонецФункции // ПолучитьМассивИзмеренийПостроителяПоУровням()
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
// К нему привязаны имена методов-трансляторов событий
ИмяКласса = "ПолеТабличногоДокументаСГруппировками";
СсылочнаяФормаКласса = Ложь;
МаркерСвернутьДоУровня = "СвернутьДоУровня";
#КонецЕсли