Каталог решений - Даты в динамическом списке

Даты в динамическом списке

Даты в динамическом списке

В наличии

Красивые представления и функции от дат — простой способ сделать.

Категория:

Описание

Сразу оговорюсь: конечно, это баян, т.к. это всего лишь описание ещё одного способа. Наряду с множеством других.

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

При этом, есть сравнительно простой способ показать "производные" поля от даты, не вставляя никаких функций в запрос дин.списка, и вообще без обращения к серверу явным образом. Речь идёт об условном оформлении колонки, чьи данные имеют тип "Дата". Как известно, условное оформление позволяет использовать поля компоновки данных, и при упоминании такого вызова СКД после получения порции выборки, но до вызова "ПриПолученииДанныхНаСервере" выполняет обработку выборки своими, хорошо нам известными, функциями "НачалоПериода", "КонецПериода" и т.д., а также форматированием. Это и будем применять.

Нам доступны следующие пути к данным для полей:

производная "ДатыНачала": НачалоДня, НачалоНедели, НачалоДекады, НачалоМесяца, НачалоКвартала, НачалоПолугодия,  НачалоГода

производная "ДатыКонца": КонецДня, КонецНедели, КонецДекады, КонецМесяца, КонецКвартала, КонецПолугодия, КонецГода

производная "ЧастиДат": День, ДеньНедели, НазваниеДняНедели, ДеньГода, НеделяГода, Месяц, НазваниеМесяца, Квартал, Год
 

Рассмотрим на примере.

Допустим, дин.список даёт нам колонку "ТестДата". Пользователю надо вывести на интерфейсе не только сами даты, а ещё названия дней недели, или концы декад этих дат.

Если условия задачи позволяют, создаём элементы формы в таб.поле дин.списка, называем их "ДеньНедели" и "КонецДекады", в качестве пути к данным у них — та же "ТестДата". Если условия не позволяют (например, мы в расширении и хочется обойтись только своим программным кодом), то придётся на сервере добавлять элементы:

  рИмя="СписокТестДата_ДеньНедели";
  элфУО=Элементы.ТабличноеПолеСписок.ПодчиненныеЭлементы.Найти(рИмя);
  Если элфУО=Неопределено Тогда
  	элфУО=Элементы.Добавить(рИмя, Тип("ПолеФормы"), Элементы.ТабличноеПолеСписок);
  	элфУО.ПутьКДанным="Список.ТестДата"; // какой-то путь нужен
  	элфУО.Вид=ВидПоляФормы.ПолеВвода;
  КонецЕсли;	
  элфУО.Заголовок="День недели";
  
  // для конца декады аналогично

Собственно, добавим условное оформление, которое решает поставленную задачу:

  идУО="ДеньНедели";
  
  элУО=Неопределено; // ищем, создан ли элемент УО
  Для каждого эл Из Список.УсловноеОформление.Элементы Цикл
  	Если эл.ИдентификаторПользовательскойНастройки=идУО Тогда элУО=эл; Прервать КонецЕсли;
  КонецЦикла;
  Если элУО=Неопределено Тогда
  	элУО=Список.УсловноеОформление.Элементы.Добавить();
  	элУО.ИдентификаторПользовательскойНастройки=идУО;
  КонецЕсли;
  	
  элУО.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("ТестДата.ЧастиДат.НазваниеДняНедели"));
  // или
  элУО.Оформление.УстановитьЗначениеПараметра("Текст", Новый ПолеКомпоновкиДанных("ТестДата.ДатыКонца.КонецДекады"));
  	
  Если элУО.Поля.Элементы.Количество()=0 Тогда
  	полеУО=элУО.Поля.Элементы.Добавить();
  	полеУО.Поле=Новый ПолеКомпоновкиДанных("ТестДата");
  	полеУО.Использование=Истина;
  КонецЕсли;
  	
  элУО.Использование=Истина;
  

Никакие условия не задаём, хотя при необходимости, конечно, можно.

В результате колонка дин.списка с, например, днями недели, примет вид, как на рис.1

Конечно, условное оформление текстом — это красиво, но пользователь захочет отборы и сортировки. Отбор пользователь может сам установить, см. рис.2 и 3. Соответствующие производные от даты платформа "разыменовывает" и поддерживает сама. Сортировки, к сожалению, платформа нам  в интерфейсе "быстро и просто" не предоставляет, и это печально, т.к. вот тут уж придётся допиливать запрос, но это объяснимо с точки зрения порционной работы дин.списков и связанных с этим требований к производительности. По той же причине производные от даты недоступны в группировках списка.

Недостатком этого способа является невозможность СКД привязывать условное оформление к чему-либо, кроме поля выборки. Таким образом, мы можем оформить неким УО только некую одну колонку дин.списка, неважно, сколько у неё интерфейсных элементов — привязка идёт не к ним, а к самому реквизиту дин.списка. Это, в принципе, тоже обходится несколькими способами, но уже не является темой данной заметки.

 

has been added to your cart:
Оформление заказа