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

Опубликовал tormozit в раздел Программирование - Практика программирования

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

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

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

См. также

Лучшие комментарии

7. therva 31.05.2009 21:37
(6) Переменную "ДанныеРасшифровки" нужно создавать конструктором:

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

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

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

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


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


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

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

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

КонецПроцедуры
+ 1 [ Larkin; ]
# Ответить

Комментарии

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

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

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

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

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

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

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


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


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

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

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

КонецПроцедуры
+ 1 [ Larkin; ]
# Ответить
8. anig99 03.06.2009 09:39
Ещё бы сделать автофиксацию первой колонки
# Ответить
9. defor 08.08.2009 16:10
Предлагаю фиксацию устанавливать при анализе ячеек результата:

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

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

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

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

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

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

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

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

КонецЕсли;
# Ответить
16. 1СПрограммер 17.09.2009 10:33
у меня постоянно пишет, что не может найти макет ;(((

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