// Запрашивает основные способы заполнения детального и итогового выражений пользовательского поля "Выражение",
// предоставляет выбор наиболее часто нужных сведений, автоматически добавляет пользовательское поле в настройки.
// Может вызываться как принудительно из кода, так и как событие обработки команды формы.
// Рекурсивно вызывается при обработке описаний оповещений из диалогов.
//
// Параметры:
// Параметр1 - Неопределено или КомандаФормы (первый запуск), строка (ввод выражения), элемент списка значений (выбор режимов и полей);
// Параметр2 - Неопределено (первый запуск), структура (параметры обработки описания оповещения, постепенно накапливается по мере заполнения).
//
&НаКлиенте
Процедура ДобавитьПользовательскоеПолеВыражение(Параметр1=Неопределено, Параметр2=Неопределено) Экспорт
рНастройки=Отчет.КомпоновщикНастроек.Настройки;
спв=Новый СписокЗначений;
Если Параметр1=Неопределено или ТипЗнч(Параметр1)=Тип("КомандаФормы") Тогда
// первый запуск (возможно, тут же проверка на релиз не ниже 8.3.10)
//
спв.Добавить(0,"<Не использовать>");
спв.Добавить(1,"""1"", для подсчёта записей отчёта");
спв.Добавить(2,"Выражение записи отчёта");
спв.Добавить(3,"Поле записи отчёта");
спв.Добавить(4,"Параметр отчёта");
//
Параметр2=Новый Структура("Шаг",1);
опоп=Новый ОписаниеОповещения("ДобавитьПользовательскоеПолеВыражение",ЭтотОбъект,Параметр2);
спв.ПоказатьВыборЭлемента(опоп,"Выражение записи:");
ИначеЕсли ТипЗнч(Параметр1)=Тип("Строка") Тогда
// ввели выражение детального или итогового поля
спв=Новый СписокЗначений;
спв.Добавить(Неопределено);
Если Параметр2.Шаг=2 Тогда
Параметр2.Вставить("ВыражениеДетальныхЗаписей",Параметр1);
ИначеЕсли Параметр2.Шаг=4 Тогда
Параметр2.Вставить("ВыражениеИтоговыхЗаписей",Параметр1);
КонецЕсли;
Параметр2.Вставить("Шаг",Параметр2.Шаг+1);
ДобавитьПользовательскоеПолеВыражение(спв.Получить(0),Параметр2);
ИначеЕсли ТипЗнч(Параметр1)=Тип("ЭлементСпискаЗначений") Тогда
Если Параметр2.Шаг=1 Тогда
// выбрали вид детального поля
Если Параметр1.Значение=0 Тогда
// не используем
рВыражениеДетЗаписей="";
ИначеЕсли Параметр1.Значение=1 Тогда
// статистический подсчёт детальных записей
рВыражениеДетЗаписей="1";
ИначеЕсли Параметр1.Значение=2 Тогда
// требуется ввод выражения
рВыражение="";
Параметр2.Вставить("Шаг",2);
опоп=Новый ОписаниеОповещения("ДобавитьПользовательскоеПолеВыражение",ЭтотОбъект,Параметр2);
ПоказатьВводСтроки(опоп,рВыражение,"Укажите дет.выражение строкой:",0,Истина);
Возврат;
ИначеЕсли Параметр1.Значение=3 Тогда
// требуется выбор поля отчёта
Для каждого рПоле Из рНастройки.ДоступныеПоляВыбора.Элементы Цикл
Если рПоле.Папка или рПоле.Таблица или рПоле.Ресурс Тогда Продолжить КонецЕсли;
Если рНастройки.ПользовательскиеПоля.ДоступныеПоляЗначений.НайтиПоле(рПоле.Поле)=Неопределено Тогда Продолжить КонецЕсли;
спв.Добавить(Строка(рПоле.Поле),рПоле.Заголовок+" ("+Строка(рПоле.ТипЗначения)+")"); // квадратные скобки поставит само
КонецЦикла;
спв.СортироватьПоПредставлению();
Параметр2.Вставить("Шаг",2);
опоп=Новый ОписаниеОповещения("ДобавитьПользовательскоеПолеВыражение",ЭтотОбъект,Параметр2);
спв.ПоказатьВыборЭлемента(опоп,"Выберите поле:");
Возврат;
ИначеЕсли Параметр1.Значение=4 Тогда
// требуется выбор параметра отчёта
Для каждого рПараметр Из рНастройки.ПараметрыДанных.ДоступныеПараметры.Элементы Цикл
спв.Добавить("&"+Строка(рПараметр.Параметр),рПараметр.Заголовок+" ("+Строка(рПараметр.ТипЗначения)+")"); // квадратные скобки поставит само
КонецЦикла;
спв.СортироватьПоПредставлению();
Параметр2.Вставить("Шаг",2);
опоп=Новый ОписаниеОповещения("ДобавитьПользовательскоеПолеВыражение",ЭтотОбъект,Параметр2);
спв.ПоказатьВыборЭлемента(опоп,"Выберите параметр:");
Возврат;
КонецЕсли;
//
спв=Новый СписокЗначений;
спв.Добавить(Неопределено);
Параметр2.Вставить("Шаг",3); // сразу
Параметр2.Вставить("ВыражениеДетальныхЗаписей",рВыражениеДетЗаписей);
ДобавитьПользовательскоеПолеВыражение(спв.Получить(0),Параметр2);
//
ИначеЕсли Параметр2.Шаг=2 Тогда
// выбрали поле СКД
спв=Новый СписокЗначений;
спв.Добавить(Неопределено);
Параметр2.Вставить("Шаг",3);
Параметр2.Вставить("ВыражениеДетальныхЗаписей",Параметр1.Значение);
ДобавитьПользовательскоеПолеВыражение(спв.Получить(0),Параметр2);
//
ИначеЕсли Параметр2.Шаг=3 Тогда
// выбрали выражение детальных записей
Параметр2.Вставить("Шаг",4);
//
спв.Добавить("","<Не использовать>");
спв.Добавить("!","Выражение итогов отчёта");
спв.Добавить("СУММА(","Сумма");
спв.Добавить("МИНИМУМ(","Минимум");
спв.Добавить("МАКСИМУМ(","Максимум");
спв.Добавить("СРЕДНЕЕ(","Среднее");
спв.Добавить("КОЛИЧЕСТВО(","Количество");
спв.Добавить("ПОДСТРОКА");
спв.Добавить("ГОД");
спв.Добавить("КВАРТАЛ");
спв.Добавить("МЕСЯЦ");
спв.Добавить("ДЕНЬ");
спв.Добавить("НЕДЕЛЯ");
спв.Добавить("ДЕНЬНЕДЕЛИ");
спв.Добавить("ЧАС");
спв.Добавить("МИНУТА");
спв.Добавить("СЕКУНДА");
спв.Добавить("НАЧАЛОПЕРИОДА");
спв.Добавить("КОНЕЦПЕРИОДА");
спв.Добавить("ДОБАВИТЬКДАТЕ");
спв.Добавить("РАЗНОСТЬДАТ");
спв.Добавить("ЕСТЬNULL");
// желающие могут добавить сюда же функции СКД
//
опоп=Новый ОписаниеОповещения("ДобавитьПользовательскоеПолеВыражение",ЭтотОбъект,Параметр2);
спв.ПоказатьВыборЭлемента(опоп,"Выражение итогов:");
//
ИначеЕсли Параметр2.Шаг=4 Тогда
Если Параметр1.Значение="!" Тогда
опоп=Новый ОписаниеОповещения("ДобавитьПользовательскоеПолеВыражение",ЭтотОбъект,Параметр2);
ПоказатьВводСтроки(опоп,рВыражение,"Укажите ит.выражение строкой:",0,Истина);
Иначе
рВыражениеИтЗаписей=Параметр1.Значение;
Если СтрЗаканчиваетсяНа(ПустаяСтрока(рВыражениеИтЗаписей),"(") Тогда // простая агрегатная функция
рВыражениеИтЗаписей=рВыражениеИтЗаписей+Параметр2.ВыражениеДетальныхЗаписей+")";
КонецЕсли;
Параметр2.Вставить("Шаг",5); // переходим напрямую
Параметр2.Вставить("ВыражениеИтоговыхЗаписей",рВыражениеИтЗаписей);
ДобавитьПользовательскоеПолеВыражение(Параметр1,Параметр2);
КонецЕсли;
//
ИначеЕсли Параметр2.Шаг=5 Тогда
// всё выбрано, собственно вносим
рТипППоля=Тип("ПользовательскоеПолеВыражениеКомпоновкиДанных");
рВыражениеДетЗаписей=Параметр2.ВыражениеДетальныхЗаписей;
рВыражениеИтЗаписей=Параметр2.ВыражениеИтоговыхЗаписей;
Если ПустаяСтрока(рВыражениеДетЗаписей) и ПустаяСтрока(рВыражениеИтЗаписей) Тогда
ПоказатьПредупреждение(,"Все выражения пользовательского поля пусты; нет смысла его добавлять!");
Возврат;
КонецЕсли;
//
Для каждого рППоле Из рНастройки.ПользовательскиеПоля.Элементы Цикл
Если ТипЗнч(рППоле)=рТипППоля и рППоле.ПолучитьВыражениеДетальныхЗаписей()=рВыражениеДетЗаписей и рППоле.ПолучитьВыражениеИтоговыхЗаписей()=рВыражениеИтЗаписей Тогда
ПоказатьПредупреждение(,"Пользовательское поле с указанными настройками уже существует!"); Возврат;
КонецЕсли;
КонецЦикла;
//
// добавляем
рППоле=рНастройки.ПользовательскиеПоля.Элементы.Добавить(рТипППоля);
рППоле.Заголовок="Поле"+Строка(рНастройки.ПользовательскиеПоля.Элементы.Количество());
//рППоле.ПутьКДанным // автоприсваивается, вручную не ставится
// Доступен, начиная с версии 8.3.10.
рППоле.УстановитьВыражения(рВыражениеДетЗаписей,рВыражениеИтЗаписей);
рППоле.Использование=Истина;
//
ПоказатьОповещениеПользователя("Готово!",,"Пользовательское поле успешно добавлено в текущие настройки отчёта.");
//
КонецЕсли;
//
КонецЕсли;
КонецПроцедуры