Функция СоздатьСхемуКомпоновкиДанных(НаборыДанных) Экспорт
СКД = Новый СхемаКомпоновкиДанных;
Если ТипЗнч(НаборыДанных) = Тип("Строка")
ИЛИ ТипЗнч(НаборыДанных) = Тип("Запрос")
ИЛИ ТипЗнч(НаборыДанных) = Тип("ТаблицаЗначений")
ИЛИ ТипЗнч(НаборыДанных) = Тип("ДеревоЗначений") Тогда
СоздатьНаборДанных(СКД, НаборыДанных);
ИначеЕсли ТипЗнч(НаборыДанных) = Тип("МенеджерВременныхТаблиц") Тогда
Для каждого Таблица Из НаборыДанных.Таблицы Цикл
тз = Таблица.ПолучитьДанные().Выгрузить();
СоздатьНаборДанных(СКД, тз, Таблица.ПолноеИмя);
КонецЦикла;
ИначеЕсли ТипЗнч(НаборыДанных) = Тип("Структура") Тогда
Для каждого ЭлементСтруктуры Из НаборыДанных Цикл
Если ТипЗнч(ЭлементСтруктуры.Значение) = Тип("ТаблицаЗначений") Тогда
СоздатьНаборДанных(СКД, ЭлементСтруктуры.Значение, ЭлементСтруктуры.Ключ);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат СКД;
КонецФункции
Процедура СоздатьНаборДанных(СКД, НаборДанных, ИмяНабораДанных = "ИсточникДанных", СтруктураРесурсов = Неопределено, АвтоЗаполнениеДоступныхПолей = Истина, ИмяСтандартногоМакетаОформления = "")
// Заполнение основных данных схемы
ИсточникДанных = СКД.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = ИмяНабораДанных;
ИсточникДанных.ТипИсточникаДанных = "Local";
Если ТипЗнч(НаборДанных) = Тип("Строка") или ТипЗнч(НаборДанных) = Тип("Запрос") Тогда
ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
ТекущийНаборДанных.Имя = ИмяНабораДанных;
ТекущийНаборДанных.Запрос = ?(ТипЗнч(НаборДанных) = Тип("Строка"),НаборДанных,НаборДанных.Текст);
ТекущийНаборДанных.ИсточникДанных = ИмяНабораДанных;
ТипНабора = "Запрос";
ТекущийНаборДанных.АвтоЗаполнениеДоступныхПолей = АвтоЗаполнениеДоступныхПолей;
ИначеЕсли ТипЗнч(НаборДанных) = Тип("ТаблицаЗначений") или ТипЗнч(НаборДанных) = Тип("ДеревоЗначений") Тогда
ТекущийНаборДанных = СКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
ТекущийНаборДанных.Имя = ИмяНабораДанных;
ТекущийНаборДанных.ИмяОбъекта = ИмяНабораДанных;
ТекущийНаборДанных.ИсточникДанных = ИмяНабораДанных;
ТипНабора = "Объект";
Иначе
Возврат;
КонецЕсли;
НастройкиПоУмолчанию = СКД.НастройкиПоУмолчанию;
// Создание структуры.
// Группировка, детальные записи и автовыбранное поле
Если НастройкиПоУмолчанию.Структура.Количество() = 0 Тогда
ГруппировкаСКД = НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
ГруппировкаСКД.Использование = Истина;
АвтоПоле = ГруппировкаСКД.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
АвтоПоле.Использование = Истина;
КонецЕсли;
КоллекцияКолонок = Новый ТаблицаЗначений;
КоллекцияКолонок.Колонки.Добавить("Имя");
КоллекцияКолонок.Колонки.Добавить("ТипЗначения");
КоллекцияКолонок.Колонки.Добавить("Заголовок");
Если ТипНабора = "Запрос" Тогда
ПостроительЗапроса = Новый ПостроительЗапроса;
Если ТипЗнч(НаборДанных) = Тип("Строка") Тогда
ПостроительЗапроса.Текст = СокрЛП(НаборДанных);
Иначе
ПостроительЗапроса.Текст = СокрЛП(НаборДанных.Текст);
КонецЕсли;
ПостроительЗапроса.ЗаполнитьНастройки();
Для каждого ВыбранноеПоле Из ПостроительЗапроса.ВыбранныеПоля Цикл
НоваяКолонка = КоллекцияКолонок.Добавить();
НоваяКолонка.Имя = ВыбранноеПоле.Имя;
НоваяКолонка.ТипЗначения = ПостроительЗапроса.ДоступныеПоля[ВыбранноеПоле.ПутьКДанным].ТипЗначения;
НоваяКолонка.Заголовок = ВыбранноеПоле.Представление
КонецЦикла;
ИначеЕсли ТипНабора = "Объект" Тогда
Для каждого Колонка Из НаборДанных.Колонки Цикл
НоваяКолонка = КоллекцияКолонок.Добавить();
НоваяКолонка.Имя = Колонка.Имя;
НоваяКолонка.ТипЗначения = Колонка.ТипЗначения;
НоваяКолонка.Заголовок = Синоним(Колонка.Имя);
КонецЦикла;
КонецЕсли;
// Добавление ресурсов
Если ТипЗнч(СтруктураРесурсов) = Тип("Структура") Тогда
Для Каждого ЭлСтруктуры Из СтруктураРесурсов Цикл
// Проверка, а существует ли поле ресурса среди полей набора
Если КоллекцияКолонок.Найти(ЭлСтруктуры.Ключ) <> Неопределено Тогда
// Проверка на правильность указания агрегатной функции
Если ЭлСтруктуры.Значение = "Сумма"
ИЛИ ЭлСтруктуры.Значение = "Среднее"
ИЛИ ЭлСтруктуры.Значение = "Максимум"
ИЛИ ЭлСтруктуры.Значение = "Минимум"
ИЛИ ЭлСтруктуры.Значение = "Количество" Тогда
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
ПолеРесурса.Выражение = ЭлСтруктуры.Значение + "(" + ЭлСтруктуры.Ключ + ")";
ИначеЕсли ЭлСтруктуры.Значение = "КоличествоРазличные" Тогда
ПолеРесурса = СКД.ПоляИтога.Добавить();
ПолеРесурса.ПутьКДанным = ЭлСтруктуры.Ключ;
ПолеРесурса.Выражение = "Количество(Различные " + ЭлСтруктуры.Ключ + ")";
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Добавление полей в набор
Для каждого НоваяКолонка Из КоллекцияКолонок Цикл
ПолеНабора = ТекущийНаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
ПолеНабора.Заголовок = СокрЛП(НоваяКолонка.Заголовок);
ПолеНабора.Поле = СокрЛП(НоваяКолонка.Имя);
ПолеНабора.ПутьКДанным = СокрЛП(НоваяКолонка.Имя);
// Удалим неопределено и NULL
Массив = Новый Массив;
Для каждого ТекущийТип Из НоваяКолонка.ТипЗначения.Типы() Цикл
Если ТекущийТип = Тип("Неопределено") или ТекущийТип = Тип("NULL") или ТекущийТип = Неопределено или ТекущийТип = Null Тогда
Продолжить;
КонецЕсли;
Массив.Добавить(ТекущийТип);
КонецЦикла;
ПолеНабора.ТипЗначения = Новый ОписаниеТипов(Массив,НоваяКолонка.ТипЗначения.КвалификаторыЧисла,НоваяКолонка.ТипЗначения.КвалификаторыСтроки,НоваяКолонка.ТипЗначения.КвалификаторыДаты);
ВыбранноеПолеКомпоновкиДанных = НастройкиПоУмолчанию.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ПолеНабора.ПутьКДанным);
ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
КонецЦикла;
// Оформление
Если не ПустаяСтрока(ИмяСтандартногоМакетаОформления) Тогда
ЗначениеПараметраВывода = НастройкиПоУмолчанию.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));
ЗначениеПараметраВывода.Значение = ИмяСтандартногоМакетаОформления;
ЗначениеПараметраВывода.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Функция Синоним(Знач Имя) Экспорт
НовоеИмя = "";
Имя = СтрЗаменить(Имя, "СНДС", "_сНДС");
Имя = СтрЗаменить(Имя, "ФСС", "_ФСС_");
Имя = СтрЗаменить(Имя, "ФОМС", "_ФОМС_");
Имя = СтрЗаменить(Имя, "ФОМС", "_ФОМС_");
Имя = СтрЗаменить(Имя, "ПФР", "_ПФР_");
Имя = СтрЗаменить(Имя, "ИПрочих", "_иПрочих");
Имя = СтрЗаменить(Имя, "ИВредных", "_иВредных");
Длина = СтрДлина(Имя);
Для Индекс = 1 По Длина Цикл
Символ = Сред(Имя, Индекс, 1);
Если Символ = НРег(Символ) И Найти("1234567890", Символ) = 0 Тогда
НовоеИмя = НовоеИмя + Символ;
Продолжить;
КонецЕсли;
Если Символ = ВРег(Символ) Тогда
Если Индекс > 1 Тогда
НовоеИмя = НовоеИмя + " "
КонецЕсли;
Аббревиатура = (Сред(Имя, Индекс, 3) = ВРег(Сред(Имя, Индекс, 3))) И (Длина - Индекс > 1);
Предлог = (Сред(Имя, Индекс, 2) = ВРег(Сред(Имя, Индекс, 2))) И (Длина > Индекс);
Если Аббревиатура Тогда
ДлинаАббревиатуры = 3;
Пока Сред(Имя, Индекс, ДлинаАббревиатуры) = ВРег(Сред(Имя, Индекс, ДлинаАббревиатуры))
И Индекс + ДлинаАббревиатуры <= Длина + 1 Цикл
ДлинаАббревиатуры = ДлинаАббревиатуры + 1
КонецЦикла;
ДлинаАббревиатуры = ДлинаАббревиатуры - 1;
Если (Индекс + ДлинаАббревиатуры - 1) = Длина Тогда
НовоеИмя = НовоеИмя + Сред(Имя, Индекс, ДлинаАббревиатуры);
Иначе
ДлинаАббревиатуры = ДлинаАббревиатуры - 1;
НовоеИмя = НовоеИмя + Сред(Имя, Индекс, ДлинаАббревиатуры) + " " + НРег(Сред(Имя, Индекс + ДлинаАббревиатуры, 1));
КонецЕсли;
Индекс = Индекс + ДлинаАббревиатуры;
Продолжить;
КонецЕсли;
Если Предлог Тогда
НовоеИмя = НовоеИмя + НРег(Символ) + " " + НРег(Сред(Имя, Индекс + 1, 1)) + " ";
Индекс = Индекс + 1;
Продолжить;
КонецЕсли;
НовоеИмя = НовоеИмя + НРег(Символ);
КонецЕсли;
КонецЦикла;
НовоеИмя = СтрЗаменить(НовоеИмя, "_", " ");
Пока Найти(НовоеИмя, " ") <> 0 Цикл
НовоеИмя = СтрЗаменить(НовоеИмя, " ", " ");
КонецЦикла;
НовоеИмя = ВРег(Лев(НовоеИмя, 1)) + Прав(НовоеИмя, СтрДлина(НовоеИмя) - 1);
Возврат НовоеИмя;
КонецФункции