gifts2017

Вертикальная автофиксация для СКД

Опубликовал Сергей Старых (tormozit) в раздел Программирование - Практика программирования

В СКД очень не хватает возможности автофиксации строк. Обусловлено это невозможностью однозначно определить их количество в общем случае. Однако в большинстве случаев это можно сделать

Обращаю ваше внимание, что приведенная процедура работает не всегда корректно. Но в большинстве случаев она сделает свое дело.

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

См. также

Подписаться Добавить вознаграждение

Комментарии

2. Сергей Старых (tormozit) 25.12.08 22:22
Вот параметры вывода, которые влияют на корректность работы:
Выводить заголовок
Выводить параметры данных
Выводить отбор

Для каждого надо делать "смещение". Попробую решить эту проблему
3. Сергей Старых (tormozit) 25.12.08 22:49
Сделал намного более интеллектуальный анализ. Теперь (2) не влияет на корректность определения.
4. sh4d0w (alexeys81@ukr.net) 15.01.09 17:34
Я чо-то туплю. А как получить ПроцессорКомпоновкиДанных, чтобы передать его в процелуру ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок()?
5. sh4d0w (alexeys81@ukr.net) 15.01.09 18:18
Сорри, уже вдуплил. Отлично всё работает!
6. sh4d0w (alexeys81@ukr.net) 16.01.09 10:52
Ещё вопросик. Отчёт выводится, строки фиксируются, но пропала расшифровка. Когда кликаю по какой-либо ячейке, чтобы расшифровать, никакое меню не выпадает. Выскакивает окно с кодом элемента. Что делаю не так? Вызываю указанную процедуру из отчёта след образом:

Перем ДанныеРасшифровки;
ЭлементыФормы.Результат.Очистить();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,, ДанныеРасшифровки);
ЛксВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ЭлементыФормы.Результат, ПроцессорКомпоновкиДанных, ДанныеРасшифровки.Элементы);
7. Вадим Чернявский (therva) 31.05.09 21:37
(6) Переменную "ДанныеРасшифровки" нужно создавать конструктором:

Процедура ДействияФормыДействиеСформировать(Кнопка)
// Вставить содержимое обработчика.

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;


ЭлементыФормы.Результат.Очистить();


МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);

ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,ДанныеРасшифровки);

ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ЭлементыФормы.Результат, ПроцессорКомпоновкиДанных, ДанныеРасшифровки.Элементы);

КонецПроцедуры
8. Александр Медведев (anig99) 03.06.09 09:39
Ещё бы сделать автофиксацию первой колонки
9. defor (Defor) 08.08.09 16:10
Предлагаю фиксацию устанавливать при анализе ячеек результата:

// Автофиксация таблицы
//
// Параметры
// Результат - <Тип.ТабличныйДокумент> - Табличный документ формы
Процедура Автофиксация(Результат)

Для индСтр=1 По Результат.ВысотаТаблицы Цикл
Для индКол=1 По Результат.ШиринаТаблицы Цикл
Ячейка = Результат.Область("R"+индСтр+"C"+индКол);
Если не Ячейка.Расшифровка = Неопределено Тогда
Результат.ФиксацияСверху = индСтр - 1;
возврат;
КонецЕсли;
КонецЦикла;
КонецЦикла;

КонецПроцедуры
10. Сергей Старых (tormozit) 11.08.09 12:48
(9) Можно, но зачем 2 раза вместо одного обходить возможно огромный табличный документ?
11. defor (Defor) 17.08.09 12:25
Обход происходит только до первой ячейки, в которой имеется расшифровка.

В принципе можно оставить перебор только строк.

До конца цикла выполнение произойдет только в том случае когда отчет пустой.
12. Fargoth (Fargoth) 03.09.09 20:13
(3) А как бы листинг намного более интеллектуального анализа получить?
13. Сергей Старых (tormozit) 04.09.09 09:47
(12) Он здесь (синим цветом).
14. Fargoth (Fargoth) 04.09.09 16:53
(13) А чего то оно мне при использовании вывода параметров не корректно высоту шапки определяет...
15. Женя Мохин (mevgenym) 14.09.09 10:38
вариант из типовых

Если Не ТаблицаЗафиксирована
И ЭлементРезультата.ЗначенияПараметров.Количество() > 0
И ТипЗнч(КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда

ТаблицаЗафиксирована = Истина;

ДокументРезультат.ФиксацияСверху = ДокументРезультат.ВысотаТаблицы;

КонецЕсли;
16. Андрей (1СПрограммер) 17.09.09 10:33
у меня постоянно пишет, что не может найти макет ;(((

{Отчет.БДДС.Форма.ФормаОтчета(301)}: Ошибка при вызове метода контекста (Вывести): Ошибка вывода результата
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
по причине:
Ошибка вывода результата
по причине:
Макет не найден "Макет1"
17. Сергей Старых (tormozit) 17.09.09 11:01
Теперь будем вообще все ошибки по СКД писать сюда?) Лучше их писать в форуме.
18. Iom Nuerto (n949eo) 09.11.11 12:07
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа