В рамках проекта Фарма МПД была поставлена задача возможности деления плана продаж области на пользователей, которые закреплены за этим регионом. Для удобства ввода данных задача решалась путем формирования кросс-таблицы на форме обработки в управляемом интерфейсе. Данное решение работает как в толстом клиенте так и в веб-клиенте.
Для упрощения демонстрации кросс-таблица в примере строится на основании данных справочника Номенклатура и Пользователи. При формировании таблицы строятся строки таблицы по номенклатуре и колонки по пользователям.
В таблице есть колонки:
- Регион. Случайное число, которое надо распределить между всеми пользователями
- Разница. Вычисляемая колонка, по которой можно контролировать правильность распределения. Вычисляется как разница между значением Регион и всеми значениями пользователей по строке.
Интересные куски кода:
#НаСервере
Процедура СформироватьКолонки()
ОчиститьРеквизиты();
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("План", Новый ОписаниеТипов("ТаблицаЗначений")));
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
Запрос = Новый Запрос;
Запрос.текст = "ВЫБРАТЬ
| Пользователи.Ссылка
|ИЗ
| Справочник.Пользователи КАК Пользователи
|ГДЕ
| Пользователи.ПометкаУдаления = ЛОЖЬ";
Выборка = Запрос.Выполнить().Выбрать();
КоличествоСотрудниковВТаблице = 0;
МассивДобавляемыхРеквизитов.Очистить();
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"План" ,"Номенклатура"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Регион", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Регион"));
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Разница", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План" , "Осталось распределить"));
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
МассивДобавляемыхРеквизитов.Очистить();
СписокСоответствийСотрудниковНомерам.Очистить();
Пока Выборка.Следующий() Цикл
КоличествоСотрудниковВТаблице = КоличествоСотрудниковВТаблице + 1;
СписокСоответствийСотрудниковНомерам.Добавить(Выборка.Ссылка);
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Сотрудник" + Строка(КоличествоСотрудниковВТаблице), Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,2)),"План", Строка(Выборка.Ссылка.Наименование)));
КонецЦикла;
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
ТаблицаФормы = Элементы.Добавить("План", Тип("ТаблицаФормы"));
ТаблицаФормы.ПутьКДанным = "План";
ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
ТаблицаФормы.ФиксацияСлева = 3;
ТаблицаФормы.УстановитьДействие("ПередУдалением", "ПланПередУдалением");
ТаблицаФормы.УстановитьДействие("ПередНачаломДобавления", "ПланПередНачаломДобавления");
ДобавитьКолонку("План", "Номенклатура", "Номенклатура");
ДобавитьКолонку("План", "Регион", "Регион");
ДобавитьКолонку("План", "Разница", "Разница");
Для Каждого ТекЭлемент Из МассивДобавляемыхРеквизитов Цикл
ДобавитьКолонку("План", ТекЭлемент.Имя, ТекЭлемент.Заголовок);
КонецЦикла;
КонецПроцедуры
Скачать конфигурацию с примером
DemoCrossTable.dt (28,2 KiB, 1 164 скачиваний)
Рад буду, если для кого-то эта информация окажется полезной.
Похожие записи: