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