Книга знаний

1С:Предприятие / v8

v8: Программное добавление полей в построителе отчета

Программное выполнение интерактивных действия табличного поля, отображающего доступные поля. Это действия "Добавить в условия", "Добавить в поля", "Добавить в порядок", "Добавить в строки", "Добавить в колонки".Автор статьи: PR | Редакторы:
Последняя редакция №3 от 07.02.07 | История
URL: http://kb.mista.ru/article.php?id=469

Ключевые слова: Добавление, поле, построитель, отчет, интерактивное, действие, доступное, измерение, строки, колонки, отбор, порядок.


Если, скажем, для отчета на базе построителя отчета на форму поместить табличное поле, в котором в качестве данных указать доступные поля построителя отчета, то можно обнаружить, что у табличного поля появляется контекстное меню со следующим списком элементов: "Добавить в условия", "Добавить в поля", "Добавить в порядок", "Добавить в строки", "Добавить в колонки".

Это конечно очень хорошо.
Например можно запрограммировать обработку событий "Drag&Drop" и таскать поля в условия, выбранные поля и т. д.
Плохо другое, то, что программно эти действия выполнить нельзя.
Точнее можно, но не одной строкой, типа, например "ДобавитьВПорядок("Код")".

Поэтому приходится делать все самому.

Приведу небольшой пример с Drag&Drop.
В примере будет рассмотрено, как перетаскивать поля из доступных в измерения строки.
При желании по аналогии можно реализовать таким же способом перетаскивание полей и в условия, выбранные поля, порядок и измерения колонки.

Сначала на форму отчета с использованием построителя отчета добавляем табличные поля, отображающие доступные поля и измерения строки.

У обоих табличных полей включаем галочки "Разрешить начало перетаскивания" и "Разрешить перетаскивание".

Для табличного поля, отображающего доступные поля, создаем обработчик события "Выбор":
Процедура ДоступныеПоляВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка) Экспорт
    
    ИмяПоля = ВыбраннаяСтрока.Имя;
    
    Пока (ПостроительОтчета.ИзмеренияСтроки.Найти(ИмяПоля) <> Неопределено)
        ИЛИ (ПостроительОтчета.ИзмеренияКолонки.Найти(ИмяПоля) <> Неопределено) Цикл
        ИмяПоля = ИмяПоля + "1";
    КонецЦикла;
    
    Поле = ПостроительОтчета.ИзмеренияСтроки.Добавить(ВыбраннаяСтрока.ПутьКДанным, ИмяПоля, ТипИзмеренияПостроителяОтчета.Элементы);
    
    ЭтаФорма.ЭлементыФормы.ИзмеренияСтроки.ТекущаяСтрока = Поле;
    
    СтандартнаяОбработка = Ложь;
    
КонецПроцедуры


Для табличного поля, отображающего измерения строки, создаем обработчики событий "Проверка перетаскивания", "Окончание перетаскивания" и "Перетаскивание":
Процедура ИзмеренияСтрокиПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)
    
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ПолеНастройки") Тогда
        СтандартнаяОбработка = Ложь;
    ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ИзмерениеПостроителяОтчета") Тогда
    
        Если ПостроительОтчета.ИзмеренияСтроки.Найти(ПараметрыПеретаскивания.Значение.Имя) = Неопределено Тогда
            СтандартнаяОбработка = Ложь;
        ИначеЕсли ПараметрыПеретаскивания.Значение <> Строка Тогда
        
            ИндексЗначенияПеретаскивания = ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение);
            
            Если Строка <> Неопределено Тогда
                
                ИндексСтроки = ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка);
                
                Если ИндексЗначенияПеретаскивания > ИндексСтроки Тогда
                    СтандартнаяОбработка = Ложь;
                ИначеЕсли (ИндексЗначенияПеретаскивания + 1) < ИндексСтроки Тогда
                    СтандартнаяОбработка = Ложь;
                КонецЕсли;
                
            ИначеЕсли ИндексЗначенияПеретаскивания < (ПостроительОтчета.ИзмеренияСтроки.Количество() - 1) Тогда
                СтандартнаяОбработка = Ложь;
            КонецЕсли;
            
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Процедура ИзмеренияСтрокиОкончаниеПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
    
    Если ПараметрыПеретаскивания.Действие <> ДействиеПеретаскивания.Отмена Тогда
        ПостроительОтчета.ИзмеренияСтроки.Удалить(ПараметрыПеретаскивания.Значение);
    КонецЕсли;
    
КонецПроцедуры

Процедура ИзмеренияСтрокиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Колонка)
    
    Если ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена Тогда
        Возврат;
    КонецЕсли;
    
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ИзмерениеПостроителяОтчета")
        И (ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение) <> -1) Тогда
        
        Если Строка = Неопределено Тогда
            Смещение = ПостроительОтчета.ИзмеренияСтроки.Количество() - ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение);
        Иначе
            
            Смещение = ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка) - ПостроительОтчета.ИзмеренияСтроки.Индекс(ПараметрыПеретаскивания.Значение);
            
            Если Смещение > 0 Тогда
                Смещение = Смещение - 1;
            КонецЕсли;
            
        КонецЕсли;
        
        ПостроительОтчета.ИзмеренияСтроки.Сдвинуть(ПараметрыПеретаскивания.Значение, Смещение);
        
        ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Отмена;
        
    Иначе
        
        Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ИзмерениеПостроителяОтчета") Тогда
            
            ИмяПоля = ПараметрыПеретаскивания.Значение.Имя;
            
            Пока (ПостроительОтчета.ИзмеренияСтроки.Найти(ИмяПоля) <> Неопределено)
                ИЛИ (ПостроительОтчета.ИзмеренияКолонки.Найти(ИмяПоля) <> Неопределено) Цикл
                ИмяПоля = ИмяПоля + "1";
            КонецЦикла;
            
            Если Строка = Неопределено Тогда
                Поле = ПостроительОтчета.ИзмеренияСтроки.Добавить(ПараметрыПеретаскивания.Значение.ПутьКДанным, ИмяПоля, ПараметрыПеретаскивания.Значение.ТипИзмерения, ПараметрыПеретаскивания.Значение.Макет, ПараметрыПеретаскивания.Значение.МакетИерархии);
            Иначе
                Поле = ПостроительОтчета.ИзмеренияСтроки.Вставить(ПараметрыПеретаскивания.Значение.ПутьКДанным, ИмяПоля, ПараметрыПеретаскивания.Значение.ТипИзмерения, ПараметрыПеретаскивания.Значение.Макет, ПараметрыПеретаскивания.Значение.МакетИерархии, ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка));
            КонецЕсли;
            
        ИначеЕсли ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("ПолеНастройки") Тогда
            
            ИмяПоля = ПараметрыПеретаскивания.Значение.Имя;
            
            Пока (ПостроительОтчета.ИзмеренияСтроки.Найти(ИмяПоля) <> Неопределено)
                ИЛИ (ПостроительОтчета.ИзмеренияКолонки.Найти(ИмяПоля) <> Неопределено) Цикл
                ИмяПоля = ИмяПоля + "1";
            КонецЦикла;
            
            Если Строка = Неопределено Тогда
                Поле = ПостроительОтчета.ИзмеренияСтроки.Добавить(ПараметрыПеретаскивания.Значение.ПутьКДанным, ИмяПоля, ТипИзмеренияПостроителяОтчета.Элементы);
            Иначе
                Поле = ПостроительОтчета.ИзмеренияСтроки.Вставить(ПараметрыПеретаскивания.Значение.ПутьКДанным, ИмяПоля, ТипИзмеренияПостроителяОтчета.Элементы, , , ПостроительОтчета.ИзмеренияСтроки.Индекс(Строка));
            КонецЕсли;
            
        КонецЕсли;
        
        Элемент.ТекущаяСтрока = Поле;
        
    КонецЕсли;
    
КонецПроцедуры


После выполненных манипуляций табличные поля можно будет таскать из доступных полей в измерения строки.

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика