#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
Функция ИерархияАналитик(МодельБюджетирования, СтатьяБюджета, ИсточникЗаданнойИерархии) Экспорт
МетаданныеТаблицы = Метаданные.Справочники.ПравилаЛимитовПоДаннымБюджетирования.ТабличныеЧасти.ИерархияАналитик.Реквизиты;
ДлинаПредставления = Метаданные.ПланыВидовХарактеристик.АналитикиСтатейБюджетов.ДлинаНаименования;
ТипПредставлениеАналитики = Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(ДлинаПредставления, ДопустимаяДлина.Переменная));
Если НЕ ЗначениеЗаполнено(МодельБюджетирования)
ИЛИ НЕ ЗначениеЗаполнено(СтатьяБюджета) Тогда
ИерархияАналитик = Новый ТаблицаЗначений();
ИерархияАналитик.Колонки.Добавить("ВидАналитики", МетаданныеТаблицы.ВидАналитики.Тип);
ИерархияАналитик.Колонки.Добавить("ИмяИзмерения", МетаданныеТаблицы.ИмяИзмерения.Тип);
ИерархияАналитик.Колонки.Добавить("Используется", МетаданныеТаблицы.Используется.Тип);
ИерархияАналитик.Колонки.Добавить("Представление", ТипПредставлениеАналитики);
Возврат ИерархияАналитик;
КонецЕсли;
РеквизитыМодели = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(МодельБюджетирования,
"БюджетыПоПодразделениям, БюджетыПоОрганизациям");
ИерархияАналитикПоУмолчанию = Новый ТаблицаЗначений();
ИерархияАналитикПоУмолчанию.Колонки.Добавить("ВидАналитики", МетаданныеТаблицы.ВидАналитики.Тип);
ИерархияАналитикПоУмолчанию.Колонки.Добавить("ИмяИзмерения", МетаданныеТаблицы.ИмяИзмерения.Тип);
ИерархияАналитикПоУмолчанию.Колонки.Добавить("Представление", ТипПредставлениеАналитики);
ИерархияАналитикПоУмолчанию.Колонки.Добавить("МестоВИерархии", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный)));
Если РеквизитыМодели.БюджетыПоОрганизациям Тогда
СтрокаАналитики = ИерархияАналитикПоУмолчанию.Добавить();
СтрокаАналитики.ИмяИзмерения = "Организация";
СтрокаАналитики.Представление = БюджетнаяОтчетностьКлиентСервер.ПредставлениеИзмеренияБюджетирования(
"Организация");
СтрокаАналитики.МестоВИерархии = ИерархияАналитикПоУмолчанию.Количество();
КонецЕсли;
Если РеквизитыМодели.БюджетыПоПодразделениям Тогда
СтрокаАналитики = ИерархияАналитикПоУмолчанию.Добавить();
СтрокаАналитики.ИмяИзмерения = "Подразделение";
СтрокаАналитики.Представление = БюджетнаяОтчетностьКлиентСервер.ПредставлениеИзмеренияБюджетирования(
"Подразделение");
СтрокаАналитики.МестоВИерархии = ИерархияАналитикПоУмолчанию.Количество();
КонецЕсли;
ПутьКАналитикамСтатьиБюджетов = ПутьКАналитикамСтатьиБюджетов();
РеквизитыАналитикиСтатьи = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СтатьяБюджета,
ПутьКАналитикамСтатьиБюджетов);
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
Для НомерАналитики = 1 По МаксимальноеКоличествоАналитик Цикл
ВидАналитики = РеквизитыАналитикиСтатьи["ВидАналитики" + НомерАналитики];
Если Не ЗначениеЗаполнено(ВидАналитики) Тогда
Продолжить;
КонецЕсли;
СтрокаАналитики = ИерархияАналитикПоУмолчанию.Добавить();
СтрокаАналитики.ВидАналитики = ВидАналитики;
СтрокаАналитики.Представление = РеквизитыАналитикиСтатьи["ВидАналитики" + НомерАналитики + "Наименование"];
СтрокаАналитики.МестоВИерархии = ИерархияАналитикПоУмолчанию.Количество();
КонецЦикла;
Если ТипЗнч(ИсточникЗаданнойИерархии) = Тип("ТаблицаЗначений") Тогда
ИерархияАналитикОбъекта = ИсточникЗаданнойИерархии;
Иначе
ИерархияАналитикОбъекта = ИсточникЗаданнойИерархии.ИерархияАналитик.Выгрузить(,"НомерСтроки, ВидАналитики, ИмяИзмерения, Используется");
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИерархияАналитикПоУмолчанию", ИерархияАналитикПоУмолчанию);
Запрос.УстановитьПараметр("ИерархияАналитикОбъекта", ИерархияАналитикОбъекта);
Запрос.Текст =
"ВЫБРАТЬ
| ИерархияАналитикПоУмолчанию.ВидАналитики КАК ВидАналитики,
| ИерархияАналитикПоУмолчанию.ИмяИзмерения КАК ИмяИзмерения,
| ИерархияАналитикПоУмолчанию.Представление КАК Представление,
| ИерархияАналитикПоУмолчанию.МестоВИерархии КАК МестоВИерархии
|ПОМЕСТИТЬ ИерархияАналитикПоУмолчанию
|ИЗ
| &ИерархияАналитикПоУмолчанию КАК ИерархияАналитикПоУмолчанию
|;
|
|ВЫБРАТЬ
| ИерархияАналитикОбъекта.НомерСтроки КАК НомерСтроки,
| ИерархияАналитикОбъекта.ВидАналитики КАК ВидАналитики,
| ИерархияАналитикОбъекта.ИмяИзмерения КАК ИмяИзмерения,
| ИерархияАналитикОбъекта.Используется КАК Используется
|ПОМЕСТИТЬ ИерархияАналитикОбъекта
|ИЗ
| &ИерархияАналитикОбъекта КАК ИерархияАналитикОбъекта
|;
|
|ВЫБРАТЬ
| ИерархияАналитикПоУмолчанию.ВидАналитики КАК ВидАналитики,
| ИерархияАналитикПоУмолчанию.ИмяИзмерения КАК ИмяИзмерения,
| ИерархияАналитикПоУмолчанию.Представление КАК Представление,
| ЕСТЬNULL(ИерархияАналитикОбъекта.Используется, ЛОЖЬ) КАК Используется
|ИЗ
| ИерархияАналитикПоУмолчанию КАК ИерархияАналитикПоУмолчанию
|ЛЕВОЕ СОЕДИНЕНИЕ
| ИерархияАналитикОбъекта КАК ИерархияАналитикОбъекта
|ПО
| ИерархияАналитикПоУмолчанию.ВидАналитики = ИерархияАналитикОбъекта.ВидАналитики
| И ИерархияАналитикПоУмолчанию.ИмяИзмерения = ИерархияАналитикОбъекта.ИмяИзмерения
|УПОРЯДОЧИТЬ ПО
| ЕСТЬNULL(ИерархияАналитикОбъекта.НомерСтроки, 999),
| ИерархияАналитикПоУмолчанию.МестоВИерархии";
ИерархияАналитик = Запрос.Выполнить().Выгрузить();
Возврат ИерархияАналитик;
КонецФункции
Функция ИерархияАналитикПоПравиламСУказаниемКолонокИсточника(Правила) Экспорт
Результат = Новый Соответствие;
ШаблонТаблицыИерархии = Новый ТаблицаЗначений();
ШаблонТаблицыИерархии.Колонки.Добавить("НомерВИерархии", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)));
ШаблонТаблицыИерархии.Колонки.Добавить("НомерВИерархииСредиИспользуемых", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0, ДопустимыйЗнак.Неотрицательный)));
ШаблонТаблицыИерархии.Колонки.Добавить("ИзмерениеВидАналитики", Новый ОписаниеТипов("Строка, ПланВидовХарактеристикСсылка.АналитикиСтатейБюджетов",, Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная)));
ШаблонТаблицыИерархии.Колонки.Добавить("Используется", Новый ОписаниеТипов("Булево"));
ШаблонТаблицыИерархии.Колонки.Добавить("ПутьКАналитике", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(100, ДопустимаяДлина.Переменная)));
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Правила", Правила);
ТекстыЗапроса = Новый Массив;
Разделитель = ";
|
|//////////////////////////////////////////////////////
|";
ТекстыЗапросаПорядокИзмерений = Новый Массив();
ТекстОбъединить = "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|";
Текст =
"ВЫБРАТЬ
| Правила.Ссылка КАК ПравилоЛимитов,
| 1 КАК НомерИзмеренияВидаАналитикиПоУмолчанию,
| ""Организация"" КАК ИзмерениеВидАналитики,
| ""Организация"" КАК ПутьКАналитике
|ПОМЕСТИТЬ АналитикиПоУмолчанию
|ИЗ
| Справочник.ПравилаЛимитовПоДаннымБюджетирования КАК Правила
|ГДЕ
| Правила.Ссылка В (&Правила)
| И Правила.Владелец.БюджетыПоОрганизациям
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Правила.Ссылка КАК ПравилоЛимитов,
| 2 КАК НомерИзмеренияВидаАналитикиПоУмолчанию,
| ""Подразделение"" КАК ИзмерениеВидАналитики,
| ""Подразделение"" КАК ПутьКАналитике
|ИЗ
| Справочник.ПравилаЛимитовПоДаннымБюджетирования КАК Правила
|ГДЕ
| Правила.Ссылка В (&Правила)
| И Правила.Владелец.БюджетыПоПодразделениям";
ТекстыЗапросаПорядокИзмерений.Добавить(Текст);
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
Для НомерАналитики = 1 По МаксимальноеКоличествоАналитик Цикл
Текст =
"ВЫБРАТЬ
| Правила.Ссылка КАК ПравилоЛимитов,
| &НомерИзмеренияВидаАналитикиПоУмолчанию КАК НомерИзмеренияВидаАналитикиПоУмолчанию,
| &ВидАналитики КАК ИзмерениеВидАналитики,
| &ПутьКАналитике КАК ПутьКАналитике
|ИЗ
| Справочник.ПравилаЛимитовПоДаннымБюджетирования КАК Правила
|ГДЕ
| Правила.Ссылка В (&Правила)";
Текст = СтрЗаменить(Текст, "&НомерИзмеренияВидаАналитикиПоУмолчанию", НомерАналитики + 2);
Текст = СтрЗаменить(Текст, "&ВидАналитики", "Правила.СтатьяБюджета.ВидАналитики" + НомерАналитики);
Текст = СтрЗаменить(Текст, "&ПутьКАналитике", """Аналитика" + НомерАналитики + """");
ТекстыЗапросаПорядокИзмерений.Добавить(Текст);
КонецЦикла;
Текст = СтрСоединить(ТекстыЗапросаПорядокИзмерений, ТекстОбъединить);
ТекстыЗапроса.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| ПравилаИерархияАналитик.Ссылка КАК ПравилоЛимитов,
| ПравилаИерархияАналитик.НомерСтроки КАК НомерСтроки,
| ПравилаИерархияАналитик.Используется КАК Используется,
| ВЫБОР
| КОГДА ПравилаИерархияАналитик.ИмяИзмерения <> """"
| ТОГДА ПравилаИерархияАналитик.ИмяИзмерения
| ИНАЧЕ ПравилаИерархияАналитик.ВидАналитики
| КОНЕЦ КАК ИзмерениеВидАналитики
|ПОМЕСТИТЬ ИерархияИзПравил
|ИЗ
| Справочник.ПравилаЛимитовПоДаннымБюджетирования.ИерархияАналитик КАК ПравилаИерархияАналитик
|ГДЕ
| ПравилаИерархияАналитик.Ссылка В (&Правила)";
ТекстыЗапроса.Добавить(Текст);
Текст =
"ВЫБРАТЬ
| АналитикиПоУмолчанию.ПравилоЛимитов КАК ПравилоЛимитов,
| АналитикиПоУмолчанию.ИзмерениеВидАналитики КАК ИзмерениеВидАналитики,
| АналитикиПоУмолчанию.ПутьКАналитике КАК ПутьКАналитике,
| ЕСТЬNULL(ИерархияИзПравил.Используется, ЛОЖЬ) КАК Используется,
| ЕСТЬNULL(ИерархияИзПравил.НомерСтроки, 999) * 100 +
| АналитикиПоУмолчанию.НомерИзмеренияВидаАналитикиПоУмолчанию КАК УровеньВИерархии
|ИЗ
| АналитикиПоУмолчанию КАК АналитикиПоУмолчанию
| ЛЕВОЕ СОЕДИНЕНИЕ ИерархияИзПравил КАК ИерархияИзПравил
| ПО АналитикиПоУмолчанию.ПравилоЛимитов = ИерархияИзПравил.ПравилоЛимитов
| И АналитикиПоУмолчанию.ИзмерениеВидАналитики = ИерархияИзПравил.ИзмерениеВидАналитики
|УПОРЯДОЧИТЬ ПО
| ПравилоЛимитов,
| УровеньВИерархии
|ИТОГИ
|ПО
| ПравилоЛимитов,
| УровеньВИерархии";
ТекстыЗапроса.Добавить(Текст);
Запрос.Текст = СтрСоединить(ТекстыЗапроса, Разделитель);
ВыборкаПравил = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "ПравилоЛимитов");
Пока ВыборкаПравил.Следующий() Цикл
ВыборкаУровеньВИерархии = ВыборкаПравил.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "УровеньВИерархии");
Правило = ВыборкаПравил.ПравилоЛимитов;
ИерархияАналитик = ШаблонТаблицыИерархии.СкопироватьКолонки();
НомерВИерархии = 0;
НомерВИерархииСредиИспользуемых = 0;
Пока ВыборкаУровеньВИерархии.Следующий() Цикл
ВыборкаЗаписей = ВыборкаУровеньВИерархии.Выбрать();
Пока ВыборкаЗаписей.Следующий() Цикл
НомерВИерархии = НомерВИерархии + 1;
Если ВыборкаЗаписей.Используется Тогда
НомерВИерархииСредиИспользуемых = НомерВИерархииСредиИспользуемых + 1;
КонецЕсли;
НоваяСтрока = ИерархияАналитик.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаЗаписей, "ИзмерениеВидАналитики, Используется, ПутьКАналитике");
НоваяСтрока.НомерВИерархии = НомерВИерархии;
НоваяСтрока.НомерВИерархииСредиИспользуемых = ?(ВыборкаЗаписей.Используется, НомерВИерархииСредиИспользуемых, 0);
КонецЦикла;
КонецЦикла;
Результат.Вставить(Правило, ИерархияАналитик);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ПредставлениеАналитик(ИсточникЗаданнойИерархии) Экспорт
Если ТипЗнч(ИсточникЗаданнойИерархии) = Тип("ТаблицаЗначений") Тогда
ИерархияАналитик = ИсточникЗаданнойИерархии;
Иначе
ИерархияАналитик = ИсточникЗаданнойИерархии.ИерархияАналитик.Выгрузить();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ИерархияАналитик", ИерархияАналитик);
Запрос.Текст =
"ВЫБРАТЬ
| ИерархияАналитик.ВидАналитики КАК ВидАналитики,
| ИерархияАналитик.ИмяИзмерения КАК ИмяИзмерения,
| ИерархияАналитик.Используется КАК Используется,
| ИерархияАналитик.НомерСтроки КАК НомерСтроки
|ПОМЕСТИТЬ ИерархияАналитик
|ИЗ
| &ИерархияАналитик КАК ИерархияАналитик
|;
|
|ВЫБРАТЬ
| ВЫБОР
| КОГДА ИерархияАналитик.ИмяИзмерения = ""Организация""
| ТОГДА &ПредставлениеОрганизации
| КОГДА ИерархияАналитик.ИмяИзмерения = ""Подразделение""
| ТОГДА &ПредставлениеПодразделения
| ИНАЧЕ ПРЕДСТАВЛЕНИЕ(ИерархияАналитик.ВидАналитики)
| КОНЕЦ КАК Представление
|ИЗ
| ИерархияАналитик КАК ИерархияАналитик
|ГДЕ
| ИерархияАналитик.Используется
|УПОРЯДОЧИТЬ ПО
| ИерархияАналитик.НомерСтроки";
КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
ПредставлениеОрганизации = БюджетнаяОтчетностьКлиентСервер.ПредставлениеИзмеренияБюджетирования("Организация",
КодОсновногоЯзыка);
ПредставлениеПодразделения = БюджетнаяОтчетностьКлиентСервер.ПредставлениеИзмеренияБюджетирования("Подразделение",
КодОсновногоЯзыка);
Запрос.УстановитьПараметр("ПредставлениеОрганизации", ПредставлениеОрганизации);
Запрос.УстановитьПараметр("ПредставлениеПодразделения", ПредставлениеПодразделения);
ПеречислениеАналитик = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Представление");
ПредставлениеАналитик = СтрСоединить(ПеречислениеАналитик, ", ");
Возврат ПредставлениеАналитик;
КонецФункции
#Область ДляВызоваИзДругихПодсистем
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
Ограничение.Текст =
"РазрешитьЧтениеИзменение
|ГДЕ
| ЭтоГруппа ИЛИ
| ( Сценарий = Значение(Справочник.Сценарии.ПустаяСсылка)
| ИЛИ ЗначениеРазрешено(Сценарий)
| ) И ЗначениеРазрешено(СтатьяБюджета)";
КонецПроцедуры
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт
Результат = Новый Массив;
Результат.Добавить("СтатьяБюджета");
Результат.Добавить("Сценарий");
Результат.Добавить("Периодичность");
Результат.Добавить("ТипЛимита");
Возврат Результат;
КонецФункции
Процедура ПроверитьИспользованиеОбъекта(Параметры, АдресХранилища) Экспорт
ЕстьСсылки = ОбщегоНазначенияВызовСервера.ЕстьСсылкиНаОбъект(Параметры.Объект);
Если Не ЕстьСсылки Тогда
ЕстьСсылки = ПроверитьНаличиеОборотовБюджетов(Параметры.Объект);
КонецЕсли;
ПоместитьВоВременноеХранилище(ЕстьСсылки, АдресХранилища);
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ПроверитьНаличиеОборотовБюджетов(ПравилоПолученияФакта)
Если ТипЗнч(ПравилоПолученияФакта) = Тип("СправочникСсылка.ПравилаЛимитовПоДаннымБюджетирования")
И НЕ ЗначениеЗаполнено(ПравилоПолученияФакта) Тогда
Возврат Ложь;
ИначеЕсли ТипЗнч(ПравилоПолученияФакта) = Тип("СправочникОбъект.ПравилаЛимитовПоДаннымБюджетирования")
И НЕ ЗначениеЗаполнено(ПравилоПолученияФакта.Ссылка) Тогда
Возврат Ложь;
КонецЕсли;
Если ТипЗнч(ПравилоПолученияФакта) = Тип("СправочникСсылка.ПравилаЛимитовПоДаннымБюджетирования") Тогда
РеквизитыОбъекта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ПравилоПолученияФакта, "СтатьяБюджета, Сценарий");
СтатьяБюджета = РеквизитыОбъекта.СтатьяБюджета;
Сценарий = РеквизитыОбъекта.Сценарий;
Иначе
СтатьяБюджета = ПравилоПолученияФакта.СтатьяБюджета;
Сценарий = ПравилоПолученияФакта.Сценарий;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ОборотыБюджетов.СтатьяБюджетов КАК СтатьяБюджетов
|ИЗ
| РегистрНакопления.ОборотыБюджетов.Обороты(
| ,
| ,
| ,
| СтатьяБюджетов = &СтатьяБюджета
| И (Сценарий = &Сценарий
| ИЛИ &ПоВсемСценариям)) КАК ОборотыБюджетов";
Запрос.УстановитьПараметр("СтатьяБюджета", СтатьяБюджета);
Запрос.УстановитьПараметр("Сценарий", Сценарий);
Запрос.УстановитьПараметр("ПоВсемСценариям", НЕ ЗначениеЗаполнено(Сценарий));
Результат = Запрос.Выполнить();
Возврат НЕ Результат.Пустой();
КонецФункции
Функция ПутьКАналитикамСтатьиБюджетов()
ПутьКРеквизитамАналитики = Новый Массив();
МаксимальноеКоличествоАналитик = БюджетированиеКлиентСервер.МаксимальноеКоличествоАналитик();
Для НомерАналитики = 1 По МаксимальноеКоличествоАналитик Цикл
ПутьКРеквизитамАналитики.Добавить("ВидАналитики" + НомерАналитики);
ПутьКРеквизитамАналитики.Добавить("ВидАналитики" + НомерАналитики + ".Наименование");
КонецЦикла;
Возврат СтрСоединить(ПутьКРеквизитамАналитики, " ,");
КонецФункции
#КонецОбласти
#КонецЕсли