Книга знаний

1С:Предприятие / Приемы программирования / Формы

Дополнительная вычисляемая или текстовая колонка в списке

В 7.7 были текстовые колонки, в Формуле которых можно было написать произвольное выражение. В 8.0 программный код может находиться только в модулях, поэтому дополнительные колонки реализуются с помощью события ПриВыводеСтроки табличного поля.Автор статьи: Волшебник | Редакторы: Мелкий бес, Гений 1С, le_
Последняя редакция №10 от 06.02.12 | История
URL: http://kb.mista.ru/article.php?id=48

1-й вариант:

Процедура НоменклатураПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   СамаЯчейка = ОформлениеСтроки.Ячейки.ИмяЯчейки;
   СамаЯчейка.ОтображатьТекст = Истина;
   СамаЯчейка.Текст = "Лалала";
КонецПроцедуры


2-й вариант:

Процедура НоменклатураПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   ОформлениеСтроки.Ячейки.ИмяЯчейки.УстановитьТекст("Лалала");
КонецПроцедуры


3-й вариант:

Процедура НоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)
   Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
    СамаЯчейка = ОформлениеСтроки.Ячейки.ИмяЯчейки;
    СамаЯчейка.ОтображатьТекст = Истина;
    СамаЯчейка.Текст = "Лалала";
   КонецЦикла;
КонецПроцедуры




Обычно колонка должна быть рассчитываемой, или зависимой от данных, поэтому задействуется второй параметр ДанныеСтроки. Этот механизм можно использовать для отображения остатков товаров в форме подбора, текущих цен, долга контрагента, другой информации по строкам.

Но здесь нужно быть осторожным! Событие ПриВыводеСтроки вызывается довольно часто при перерисовке табличного поля. Поэтому процедура должна отрабатывать довольно быстро, чтобы не тормозить вывод списка. Если в ней происходит обращение к базе данных, то вывод может резко замедлиться.

Если начались тормоза, то рекомендуется сделать следующее:

  1. Кеширование результата запроса в переменной модуля формы (таблица значений или массив, еще можно использовать соответствие, которое индексируется для примитивных типов данных, например, код товара или артикул)

  2. При отключенной колонке (видимость) запрос к базе НЕ должен выполняться.
    По умолчанию колонку держать выключенной, включение только по кнопке в форме или при личных настройках определенного пользователя.
  3. Лучше выполнять один большой запрос на несколько товаров, чем несколько маленьких запросов на один товар.

  4. Список товаров нужно передавать как ПАРАМЕТР виртуальной таблицы Остатки, а не как параметр условия ГДЕ.
  5. При повышенных требованиях к скорости отображения списка и большом количестве пользователей можно завести регистр сведений, хранящий актуальные остатки. Для поддержки его актуальности можно создать последовательность.

  6. Еще вариант через обработчик - при ПолученииДанных (вроде так называется)... Там сразу передается массив ОформленияСтрок - в нем все строки сразу и вызывается он реже, чем при выводе строки... От Гения 1С: Именно этот способ и надо использовать в профессиональном подходе.
  7. От Гения 1С:Завести в табличной части реквизит, куда при открытии формы и по мере надобности помещать остатки, это значительно ускорит вывод остатков, правда будет не лучшим образом влиять на флаг Модифицированность




С помощью этого события можно выводить не только текст, но также флажки и картинки, например:

Картинка:
Ячейка = ОформлениеСтроки.Ячейки.ТипСобытия;
Ячейка.ОтображатьТекст    = Ложь;
Ячейка.ОтображатьФлажок   = Ложь;
Ячейка.ОтображатьКартинку = Истина;
Ячейка.ИндексКартинки = 1; 

Установка картинки одной строкой:
ОформлениеСтроки.Ячейки.ТипСобытия.УстановитьКартинку(Картинка);


или другой пример:

ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ПометкаУдаления",,"ПометкаУдаления");
ТЗ.Колонки.Добавить("Проведен",,"Проведен");
    
КолонкаКартинки=ЭлементыФормы.ТЗ.Колонки.Вставить(0,"<");
КолонкаКартинки.Имя="Картинка";
КолонкаКартинки.Ширина=5;
КолонкаКартинки.ДанныеКартинки="ИндексКартинки";
КолонкаКартинки.КартинкиСтрок= БиблиотекаКартинок.СостоянияДокумента;

Процедура ТЗПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.Проведен Тогда
  ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки=0;
ИначеЕсли НЕ ДанныеСтроки.Проведен Тогда
  ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки=2;
ИначеЕсли ДанныеСтроки.ПометкаУдаления Тогда
  ОформлениеСтроки.Ячейки.Картинка.ИндексКартинки=1;
КонецЕсли;


Флажки:
ОформлениеСтроки.Ячейки.Колонка2.ОтображатьФлажок= Истина;
ОформлениеСтроки.Ячейки.Колонка2.УстановитьТекст("");
ОформлениеСтроки.Ячейки.Колонка2.Флажок = Истина; 

Или так:
ОформлениеСтроки.Ячейки.Колонка2.УстановитьФлажок(Истина);




Еще можно менять цвет фона и текста, шрифт и другие характеристики оформления:

ОформлениеСтроки.Ячейки.<ИмяКолонки>.ЦветФона = Новый Цвет (255,100,100);
ОформлениеСтроки.Ячейки.<ИмяКолонки>.Шрифт = Новый Шрифт(,,Истина);




Можно также управлять доступностью отдельных строк и ячеек табличного поля:

ОформлениеСтроки.Ячейки.ХХХ.ТолькоПросмотр = Истина;


Пример реализации:
Книга знаний: Размещение колонки с остатками в списке справочника

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

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