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