-
Вводная
В крупных компаниях, помимо использования типовой регламентированной отчетности, зачастую бывает потребность и в своих специфических бухгалтерских отчетах, базой для них служат данные регистра бухгалтерии. Подобного рода отчеты можно и нужно реализовывать через механизм настройки заполнения бухгалтерской отчетности.
Подобная задача была поставлена на одном из проектов. Для компании необходимо было разработать отчет «Динамический баланс», используя разбираемый механизм. Отчет похож на типовой регламентированный отчет «Бухгалтерский баланс» с одной «маленькой» оговоркой: создание всех строк отчета должно быть отдано на растерзание пользователям, чтобы сотрудники компании сами могли определять состав строк, входящих в отчет. Отсюда и его название. Да, можно сказать, что управлять составом строк в пользовательском режиме возможно и из коробки, но на самом деле это лишь иллюзия, т.к. управление весьма ограничено, ниже будут описаны эти самые ограничения.
А для начала немного теории.
-
Что это за зверь?
Что же из себя представляет механизм настройки заполнения бухгалтерской отчетности?
Настройки заполнения бухгалтерской отчетности - механизм, позволяющий управлять структурой и алгоритмами заполнения форм регламентированной бухгалтерской отчетности. Если совсем по-простому, то механизм предоставляет возможность пользователю самому определять состав строк, а также алгоритмов их заполнения.
Сам механизм представлен в виде набора справочников:
- «Настройки заполнения бухгалтерской отчетности»;
- «Строки бухгалтерской отчетности»;
- «Графы бухгалтерской отчетности»;
- «Алгоритмы сбора данных бухгалтерской отчетности»
и двух общих модулей:
- «НастраиваемаяБухгалтерскаяОтчетность»;
- «НастраиваемаяБухгалтерскаяОтчетностьВызовСервера».
Стоит отметить, что данный механизм при вычислении значений строк отчетности будет использовать данные регистра бухгалтерии.
Включить использования данного механизма можно в форме учетной политики бухгалтерского учета (рисунок 1), выбрав одну из настроек (рисунок 2).
Рисунок 1. Учетная политика бухгалтерского учета
Рисунок 2. Настройки заполнения бухгалтерской отчетности
Если ничего не выбрано или выбран предопределенный элемент «Не настраивается», то механизм использоваться не будет.
-
Ограничения типового механизма
Почему же под имеющуюся задачу не использовать механизм в первозданном виде?
Для этого давайте пробежимся по тем возможностям, которые предоставляет механизм в части управления составом строк отчетности.
Во – первых, это возможность из рабочего места настройки создавать дополнительные строки отчетности (рисунок 3).
Рисунок 3. Рабочее место настройки.
Во – вторых, если для строки отчетности или для ее граф удалить все алгоритмы сбора данных, то такая строка в отчет выводиться не будет.
В – третьих, это возможность управлять видимостью предопределенных дополнительных строк отчета (рисунок 4).
Рисунок 4. Настройка состава строк.
В – четвертых, это действие в лоб: добавить и заполнить строку в макет вручную (рисунок 5), но делать это придется для каждого отчета.
Рисунок 5. Добавление строки отчета вручную.
Как видим, управлять составом строк отчетности можно, но управление представлено именно для дополнительных строк отчетности. Основные же строки отчетности и предопределенные дополнительные можно добавлять только через конфигуратор. Делается это через макет справочника «НастройкиЗаполненияБухОтчетности», в котором содержится структура строк и алгоритмов (рисунок 6, рисунок 7).
Рисунок 6. Макет структуры строк отчетности.
Рисунок 7. Макет структуры алгоритмов строк отчетности.
Генерация настроек из макета происходит в модуле менеджера справочника «НастройкиЗаполненияБухОтчетности», в процедуре «СгенерироватьНастройкиПоУмолчанию». Здесь происходит разбор макета и создание необходимых элементов справочников. Это очень кратко, за подробностями можно обратиться к коду указанной процедуры.
-
Расширение механизма настройки
Теперь давайте поговорим о том, что можно сделать для того, чтобы рассматриваемый механизм стал более гибким и дружелюбным к пользователям.
Нужно предоставить пользователям возможность самим формировать структуру отчета. Для этого необходимо:
- доработать перечисление «ФормыБухгалтерскойОтчетности», добавив в него свое значение (в нашем случае это «ДинамическийБаланс»);
- в справочник "НастройкиЗаполненияБухОтчетности" добавить 2 реквизита:
- СпециализированнаяНастройка,
- ФормаОтчетности (рисунок 8);
- добавить форму элемента справочника (рисунок 9) и форму «НастройкиЗаполненияОтчетности» (рисунок 11).
Рисунок 8 – Реквизиты справочника «Настройки заполнения бухгалтерской отчетности».
Рисунок 9 – Форма элемента справочника «Настройки заполнения бухгалтерской отчетности».
Общие пояснения к программным и интерактивным изменениям, внесенным в типовую конфигурацию:
В процедуре «ПриСозданииНаСервере», в строке «МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере» происходит добавление на форму необходимых элементов.
Программный текст модуля формы:
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
УстановитьСвойстваЭлементовФормы(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписиПосле(ПараметрыЗаписи)
УстановитьСвойстваЭлементовФормы(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СпециализированнаяНастройкаПриИзменении(Элемент)
УстановитьСвойстваЭлементовФормы(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СоздатьФормуОтчета(Команда)
Если СоздатьФормуОтчетаНаСервере() Тогда
ОбщегоНазначенияКлиент.СообщитьПользователю("Успешно создана новая форма отчетности.
|Для перехода к настройке строк формы
|необходимо нажать ""Открыть рабочее место настройки""");
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ФормаОтчетностиПриИзменении(Элемент)
УстановитьСвойстваЭлементовФормы(ЭтотОбъект);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыФункции
// Устанавливает свойства элементов формы
// Параметры:
// Форма - ФормаКлиентскогоПриложения
//
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьСвойстваЭлементовФормы(Форма)
Элементы = Форма.Элементы;
Объект = Форма.Объект;
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ГруппаФормаОтчетности",
"Видимость",
Объект.СпециализированнаяНастройка);
КонецПроцедуры
// Создает корневой элемент справочника СтрокиБухОтчетности
// Возвращаемое значение:
// Булево - Значение результата создания групп строк бух отчетности
//
&НаСервере
Функция СоздатьФормуОтчетаНаСервере()
Результат = Истина;
Попытка
ГруппаСтрок = Справочники.СтрокиБухОтчетности.НайтиПоНаименованию(Строка(Объект.ФормаОтчетности), Истина);
Если НЕ ЗначениеЗаполнено(ГруппаСтрок) Тогда
НоваяФорма = Справочники.СтрокиБухОтчетности.СоздатьГруппу();
НоваяФорма.Наименование = Строка(Объект.ФормаОтчетности);
НоваяФорма.Владелец = Объект.Ссылка;
НоваяФорма.ФормаОтчетности = Объект.ФормаОтчетности;
НоваяФорма.ВключитьВОтчет = Истина;
НоваяФорма.Записать();
ГруппаСтрок = НоваяФорма.Ссылка;
КонецЕсли;
СоздатьРазделОтчета(ГруппаСтрок, "I. Внеоборотные активы", Объект.Ссылка, Объект.ФормаОтчетности);
СоздатьРазделОтчета(ГруппаСтрок, "II. Оборотные активы", Объект.Ссылка, Объект.ФормаОтчетности);
СоздатьРазделОтчета(ГруппаСтрок, "III. Капитал и резервы", Объект.Ссылка, Объект.ФормаОтчетности);
СоздатьРазделОтчета(ГруппаСтрок, "IV. Долгосрочные пассивы", Объект.Ссылка, Объект.ФормаОтчетности);
СоздатьРазделОтчета(ГруппаСтрок, "V. Краткосрочные пассивы", Объект.Ссылка, Объект.ФормаОтчетности);
СоздатьРазделОтчета(ГруппаСтрок, "Забаланс", Объект.Ссылка, Объект.ФормаОтчетности);
Исключение
Результат = Ложь;
ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат Результат;
КонецФункции
&НаСервереБезКонтекста
Процедура СоздатьРазделОтчета(Родитель, Наименование, Владелец, ФормаОтчетности)
ГруппаСтрок = Справочники.СтрокиБухОтчетности.НайтиПоНаименованию(Наименование, Истина);
Если ЗначениеЗаполнено(ГруппаСтрок) Тогда
Возврат;
КонецЕсли;
НоваяФорма = Справочники.СтрокиБухОтчетности.СоздатьГруппу();
НоваяФорма.Наименование = Наименование;
НоваяФорма.Родитель = Родитель;
НоваяФорма.Владелец = Владелец;
НоваяФорма.ФормаОтчетности = ФормаОтчетности;
НоваяФорма.ВключитьВОтчет = Истина;
НоваяФорма.Записать();
КонецПроцедуры
#КонецОбласти
- СтрокиБухОтчетности, доработать форму «ФормаЭлемента» (рисунок 10, 11).
Рисунок 10. Справочник «Строки бухгалтерской отчетности» вкладка «Основное».
Рисунок 11. Справочник «Строки бухгалтерской отчетности» вкладка «Графы и алгоритмы заполнения».
Для этой формы сделаны следующие доработки: на вкладке «Основное» для создания дополнительных строк отчетности была реализована их автоматическая нумерация в поле «Код строки отчетности» (рисунок 10).
Для вкладки «Графы и алгоритмы заполнения» добавлены кнопки «Создать» и «Создать по умолчанию» (рисунок 11). Последняя нужна для того, чтобы создавать предопределенный перечень граф для строки.
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервереПеред(Отказ, СтандартнаяОбработка)
МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецПроцедуры
&НаСервере
&После("ПриСозданииНаСервере")
Процедура ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая() Тогда
Если Параметры.Свойство("Родитель")
И ЗначениеЗаполнено(Параметры.Родитель) Тогда
ЗаполнитьСтрокуПоРодителю();
ИначеЕсли Параметры.Свойство("ОсновнаяСтрока")
И ЗначениеЗаполнено(Параметры.ОсновнаяСтрока) Тогда
ЗаполнитьДопСтроку();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовФормы
&НаКлиенте
Процедура Подключаемый_СоздатьГрафу(Команда)
Оповещение = Новый ОписаниеОповещения("СоздатьГрафуЗавершение", ЭтотОбъект);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Владелец", Объект.Ссылка);
ОткрытьФорму("Справочник.ГрафыБухОтчетности.Форма.ФормаЭлемента",
ПараметрыОткрытия,
ЭтотОбъект,
,,,
Оповещение,
РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_СоздатьГрафыПоУмолчанию(Команда)
СоздатьГрафыПоУмолчаниюНаСервере();
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(Графы,
"Владелец",
Объект.Ссылка,
ВидСравненияКомпоновкиДанных.Равно);
КонецПроцедуры
&НаКлиенте
Процедура КодСтрокиПриИзмененииПосле(Элемент)
СтрокаСпецНастройки = ОбщегоНазначенияСервер.ЗначениеРеквизитаОбъекта(Объект.Владелец,
"СпециализированнаяНастройка");
Если НЕ СтрокаСпецНастройки Тогда
Объект.КодСтроки = ЛЕВ(Объект.КодСтроки, 5);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СчетаПослеУдаленияПосле(Элемент)
СчетаПриИзмененииНаСервере();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
&Вместо("ЗаписатьТекущиеИзмененияАлгоритма")
Процедура ЗаписатьТекущиеИзмененияАлгоритма()
ТекСтрокаАлгоритма = АлгоритмыСбораДанных.НайтиСтроки(Новый Структура("Ссылка", ТекущийАлгоритм));
Если ТекСтрокаАлгоритма.Количество()>0 Тогда
Если Не ТекСтрокаАлгоритма[0].Ссылка.Пустая() Тогда
Алгоритм = ТекущийАлгоритм.ПолучитьОбъект();
Иначе
Алгоритм = Справочники.АлгоритмыСбораДанныхБухОтчетности.СоздатьЭлемент();
Если Не ТекСтрокаАлгоритма[0].Графа.Пустая() Тогда
Алгоритм.Владелец = ТекСтрокаАлгоритма[0].Графа;
Иначе
Алгоритм.Владелец = Объект.Ссылка;
КонецЕсли;
КонецЕсли;
ОтборЗадан = ОтборУстановлен(НастройкиОтбора);
Алгоритм.НаименованиеРасшифровки = ТекСтрокаАлгоритма[0].НаименованиеРасшифровки;
Алгоритм.АвтоматическаяРасшифровка = ТекСтрокаАлгоритма[0].АвтоматическаяРасшифровка;
Алгоритм.ТипПоказателя = ТипПоказателя;
Алгоритм.Вычитаемый = Вычитаемый;
Алгоритм.ОтборЗадан = ОтборЗадан;
Алгоритм.Счета.Очистить();
Алгоритм.КорСчета.Очистить();
Для Каждого Счет Из Счета Цикл
СтрокаСчет = Алгоритм.Счета.Добавить();
СтрокаСчет.Счет = Счет.Значение;
КонецЦикла;
Для Каждого Счет Из КорСчета Цикл
СтрокаСчет = Алгоритм.КорСчета.Добавить();
СтрокаСчет.Счет = Счет.Значение;
КонецЦикла;
Если ОтборЗадан Тогда
Алгоритм.НастройкиОтбора = Новый ХранилищеЗначения(
НастройкиОтбора.ПолучитьНастройки());
Иначе
Алгоритм.НастройкиОтбора = Новый ХранилищеЗначения(Неопределено);
КонецЕсли;
Алгоритм.Наименование = Справочники.АлгоритмыСбораДанныхБухОтчетности.СформироватьНаименованиеАлгоритма(Алгоритм);
Алгоритм.Записать();
ТекСтрокаАлгоритма[0].ТипПоказателя = ТипПоказателя;
ТекСтрокаАлгоритма[0].Вычитаемый = Вычитаемый;
ТекСтрокаАлгоритма[0].Счета.Загрузить(Алгоритм.Счета.Выгрузить());
ТекСтрокаАлгоритма[0].КорСчета.Загрузить(Алгоритм.КорСчета.Выгрузить());
ТекСтрокаАлгоритма[0].ОтборЗадан = ОтборЗадан;
ТекСтрокаАлгоритма[0].Ссылка = Алгоритм.Ссылка;
АлгоритмИзменен = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
&Вместо("ЗагрузитьАлгоритмы")
Процедура ЗагрузитьАлгоритмы(Владелец)
АлгоритмыСбораДанных.Очистить();
Элементы.АлгоритмыСбораДанных.Обновить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| АлгоритмыСбораДанныхБухОтчетности.Наименование КАК Наименование,
| АлгоритмыСбораДанныхБухОтчетности.ТипПоказателя КАК ТипПоказателя,
| АлгоритмыСбораДанныхБухОтчетности.Вычитаемый КАК Вычитаемый,
| АлгоритмыСбораДанныхБухОтчетности.ОтборЗадан КАК ОтборЗадан,
| АлгоритмыСбораДанныхБухОтчетности.Счета.(
| Ссылка КАК Ссылка,
| НомерСтроки КАК НомерСтроки,
| БезОтбораПоСтатьеДДС КАК БезОтбораПоСтатьеДДС,
| СчитатьНДС20 КАК СчитатьНДС20,
| СчитатьТолькоНДС КАК СчитатьТолькоНДС,
| Счет КАК Счет
| ) КАК Счета,
| АлгоритмыСбораДанныхБухОтчетности.КорСчета.(
| Ссылка КАК Ссылка,
| НомерСтроки КАК НомерСтроки,
| Счет КАК Счет
| ) КАК КорСчета,
| АлгоритмыСбораДанныхБухОтчетности.Ссылка КАК Ссылка,
| АлгоритмыСбораДанныхБухОтчетности.НаименованиеРасшифровки КАК НаименованиеРасшифровки,
| АлгоритмыСбораДанныхБухОтчетности.ОтборНедоступен КАК ОтборНедоступен,
| АлгоритмыСбораДанныхБухОтчетности.ВидДвиженияДенежныхСредств КАК ВидДвиженияДенежныхСредств,
| АлгоритмыСбораДанныхБухОтчетности.АвтоматическаяРасшифровка КАК АвтоматическаяРасшифровка
|ИЗ
| Справочник.АлгоритмыСбораДанныхБухОтчетности КАК АлгоритмыСбораДанныхБухОтчетности
|ГДЕ
| АлгоритмыСбораДанныхБухОтчетности.Владелец = &Владелец
| И НЕ АлгоритмыСбораДанныхБухОтчетности.ПометкаУдаления";
Запрос.УстановитьПараметр("Владелец", Владелец);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Алгоритм = АлгоритмыСбораДанных.Добавить();
ЗаполнитьЗначенияСвойств(Алгоритм, ВыборкаДетальныеЗаписи,,"Счета, КорСчета");
Алгоритм.Счета.Загрузить(ВыборкаДетальныеЗаписи.Счета.Выгрузить());
Алгоритм.КорСчета.Загрузить(ВыборкаДетальныеЗаписи.КорСчета.Выгрузить());
КонецЦикла;
КонецПроцедуры
&НаКлиенте
&Вместо("ЗаполнитьФормуДаннымиАлгоритма")
Процедура ЗаполнитьФормуДаннымиАлгоритма()
Счета.Очистить();
КорСчета.Очистить();
Вычитаемый = Ложь;
ТипПоказателя = "";
НастройкиОтбора.Настройки.Отбор.Элементы.Очистить();
ТекущийАлгоритм = Неопределено;
АлгоритмИзменен = Ложь;
Алгоритм = Элементы.АлгоритмыСбораДанных.ТекущиеДанные;
Если Алгоритм = Неопределено И АлгоритмыСбораДанных.Количество()>0 Тогда
Алгоритм = АлгоритмыСбораДанных[0];
КонецЕсли;
Если Алгоритм <> Неопределено Тогда
ТипПоказателя = Алгоритм.ТипПоказателя;
Вычитаемый = Алгоритм.Вычитаемый;
ТекущийАлгоритм = Алгоритм.Ссылка;
Если Элементы.Графы.ТекущаяСтрока <> Неопределено Тогда
Алгоритм.Графа = Элементы.Графы.ТекущаяСтрока;
КонецЕсли;
Для Каждого СтрокаСчет Из Алгоритм.Счета Цикл
Счета.Добавить(СтрокаСчет.Счет);
СтрокаСчетаТаблица = ЭтотОбъект.СчетаТаблица.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаСчетаТаблица, СтрокаСчет);
КонецЦикла;
Для Каждого СтрокаСчет Из Алгоритм.КорСчета Цикл
КорСчета.Добавить(СтрокаСчет.Счет);
КонецЦикла;
Если Не Алгоритм.ОтборНедоступен Тогда
Если Алгоритм.ОтборЗадан Тогда
ИнициализироватьНастройкиОтбора(НастройкиОтбора, Алгоритм.Ссылка);
КонецЕсли;
УстановитьВидимостьОтбора(Истина);
Иначе
УстановитьВидимостьОтбора(Ложь);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура КорСчетаПриИзмененииПосле(Элемент)
АлгоритмИзменен = Истина;
КонецПроцедуры
&НаКлиенте
Процедура СоздатьГрафуЗавершение(Результат, ДополнительныеПараметры) Экспорт
Элементы.Графы.Обновить();
КонецПроцедуры
// Создает графы по форме отчетности Владельца Строки бух. отчетности
//
&НаСервере
Процедура СоздатьГрафыПоУмолчаниюНаСервере()
Если ГрафыПоСтрокеСозданы(Объект.Ссылка) Тогда
Возврат;
КонецЕсли;
СоздатьГрафуПоСтроке("На начало года", "03");
СоздатьГрафуПоСтроке("Приход", "04");
СоздатьГрафуПоСтроке("Расход", "05");
СоздатьГрафуПоСтроке("На конец отчетного периода", "06");
КонецПроцедуры
// Создает графу по строке бух. отчетности
// Параметры:
// НаименованиеГрафы - Строка
// КодГрафы - Строка
//
&НаСервере
Процедура СоздатьГрафуПоСтроке(НаименованиеГрафы, КодГрафы)
НоваяГрафа = Справочники.ГрафыБухОтчетности.СоздатьЭлемент();
НоваяГрафа.Наименование = НаименованиеГрафы;
НоваяГрафа.КодГрафы = КодГрафы;
НоваяГрафа.Владелец = Объект.Ссылка;
Попытка
НоваяГрафа.Записать();
Исключение
ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ГрафыПоСтрокеСозданы(СтрокаБухОтчетности)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГрафыБухОтчетности.Ссылка КАК Ссылка
|ИЗ
| Справочник.ГрафыБухОтчетности КАК ГрафыБухОтчетности
|ГДЕ
| ГрафыБухОтчетности.Владелец = &Владелец
| И НЕ ГрафыБухОтчетности.ПометкаУдаления";
Запрос.УстановитьПараметр("Владелец", СтрокаБухОтчетности);
РезультатЗапроса = Запрос.Выполнить();
Возврат НЕ РезультатЗапроса.Пустой();
КонецФункции
// Заполняет строку бух отчетности по родителю
//
&НаСервере
Процедура ЗаполнитьСтрокуПоРодителю()
ДанныеРодителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Параметры.Родитель, "ФормаОтчетности, ВключитьВОтчет, Владелец");
Объект.Родитель = Параметры.Родитель;
Объект.ФормаОтчетности = ДанныеРодителя.ФормаОтчетности;
Объект.ВключитьВОтчет = ДанныеРодителя.ВключитьВОтчет;
Объект.Владелец = ДанныеРодителя.Владелец;
Объект.ЭтоОсновнаяСтрока = Истина;
Объект.ЕстьГрафы = Истина;
Объект.ДобавлениеДопСтрок = Истина;
КонецПроцедуры
&НаСервереБезКонтекста
Функция СтрокаДинамическогоБаланса(СтрокаОтчета)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтрокиБухОтчетности.Владелец КАК Ссылка
|ПОМЕСТИТЬ вт_Настройка
|ИЗ
| Справочник.СтрокиБухОтчетности КАК СтрокиБухОтчетности
|ГДЕ
| СтрокиБухОтчетности.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| НастройкиЗаполненияБухОтчетности.Ссылка КАК Ссылка
|ИЗ
| Справочник.НастройкиЗаполненияБухОтчетности КАК НастройкиЗаполненияБухОтчетности
|ГДЕ
| НастройкиЗаполненияБухОтчетности.Ссылка В
| (ВЫБРАТЬ
| вт_Настройка.Ссылка КАК Ссылка
| ИЗ
| вт_Настройка КАК вт_Настройка)
| И НастройкиЗаполненияБухОтчетности.СпециализированнаяНастройка
| И НастройкиЗаполненияБухОтчетности.ФормаОтчетности = ЗНАЧЕНИЕ(Перечисление.ФормыБухгалтерскойОтчетности.ДинамическийБаланс)";
Запрос.УстановитьПараметр("Ссылка", СтрокаОтчета);
РезультатЗапроса = Запрос.Выполнить();
Возврат НЕ РезультатЗапроса.Пустой();
КонецФункции
// Заполняет доп. строку бух отчетности по основной строке
//
&НаСервере
Процедура ЗаполнитьДопСтроку()
Если НЕ СтрокаДинамическогоБаланса(Параметры.ОсновнаяСтрока) Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| СтрокиБухОтчетности.Ссылка КАК Ссылка,
| СтрокиБухОтчетности.КодСтроки КАК КодСтроки
|ИЗ
| Справочник.СтрокиБухОтчетности КАК СтрокиБухОтчетности
|ГДЕ
| НЕ СтрокиБухОтчетности.ПометкаУдаления
| И СтрокиБухОтчетности.ОсновнаяСтрока = &ОсновнаяСтрока
|
|УПОРЯДОЧИТЬ ПО
| СтрокиБухОтчетности.Ссылка УБЫВ";
Запрос.УстановитьПараметр("ОсновнаяСтрока", Параметры.ОсновнаяСтрока);
РезультатЗапроса = Запрос.Выполнить();
КодОсновнойСтроки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Параметры.ОсновнаяСтрока, "КодСтроки");
Если РезультатЗапроса.Пустой() Тогда
РасчетныйКодСтроки = КодОсновнойСтроки;
Иначе
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Попытка
РасчетныйКодСтроки = Выборка.КодСтроки;
Исключение
КонецПопытки;
КонецЕсли;
Цифры = "0123456789";
Если ПРАВ(РасчетныйКодСтроки, 1) = "9" Тогда
Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(РасчетныйКодСтроки) Тогда
ДлинаРасчетнойЧасти = СтрДлина(РасчетныйКодСтроки) - СтрДлина(КодОсновнойСтроки) + 1;
ДлинаРасчетнойЧасти = ?(ДлинаРасчетнойЧасти = 0, 1, ДлинаРасчетнойЧасти);
РасчетныйКодСтроки = ПРАВ(РасчетныйКодСтроки, ДлинаРасчетнойЧасти);
РасчетныйКодСтроки = Число(РасчетныйКодСтроки) + 1;
РасчетныйКодСтроки = СтрШаблон("%1%2", ЛЕВ(КодОсновнойСтроки, СтрДлина(КодОсновнойСтроки) - 1),
Формат(РасчетныйКодСтроки, "ЧГ="));
РасчетныйКодСтроки = Число(РасчетныйКодСтроки);
Иначе
ДлинаРасчетнойЧасти = СтрДлина(РасчетныйКодСтроки) - СтрДлина(КодОсновнойСтроки);
РасчетныйКодСтроки = ПРАВ(РасчетныйКодСтроки, ДлинаРасчетнойЧасти);
Разделитель = ЛЕВ(РасчетныйКодСтроки, 1);
РасчетныйКодСтроки = ПРАВ(РасчетныйКодСтроки, ДлинаРасчетнойЧасти - 1);
Если СтроковыеФункцииКлиентСервер.ТолькоЦифрыВСтроке(РасчетныйКодСтроки) Тогда
РасчетныйКодСтроки = Число(РасчетныйКодСтроки) + 1;
РасчетныйКодСтроки = СтрШаблон("%1%2%3", КодОсновнойСтроки, Разделитель, РасчетныйКодСтроки);
Иначе
РасчетныйКодСтроки = КодОсновнойСтроки;
КонецЕсли;
КонецЕсли;
ИначеЕсли СтрНайти(Цифры, ПРАВ(РасчетныйКодСтроки, 1)) > 0 Тогда
РасчетныйКодСтроки = ЛЕВ(РасчетныйКодСтроки, СтрДлина(РасчетныйКодСтроки) - 1) + (Число(ПРАВ(РасчетныйКодСтроки, 1)) + 1);
Иначе
РасчетныйКодСтроки = КодОсновнойСтроки;
КонецЕсли;
Объект.КодСтроки = ?(ТИПЗНЧ(РасчетныйКодСтроки) = ТИП("Число"), Формат(РасчетныйКодСтроки, "ЧГ="), РасчетныйКодСтроки);
КонецПроцедуры
// Проверяет владельца строки на признак спец настройки.
// Если признак установлен, то создание графов из строки разрешается
// Параметры:
// Владелец - СправочникСсылка.НастройкиЗаполненияБухОтчетности
//
// Возвращаемое значение:
// Булево - Значение признака спец настройки
//
&НаСервереБезКонтекста
Функция ДоступностьСозданияГрафов(Владелец)
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Владелец, "СпециализированнаяНастройка");
КонецФункции
&НаСервере
Процедура УдалитьПустыеСчета()
ЗначенияКУдалению = Новый Массив;
Для Каждого СтрокаСчет ИЗ ЭтотОбъект.Счета Цикл
Если ЗначениеЗаполнено(СтрокаСчет.Значение) Тогда
Продолжить;
КонецЕсли;
ЗначенияКУдалению.Добавить(СтрокаСчет);
КонецЦикла;
Если ЗначениеЗаполнено(ЗначенияКУдалению) Тогда
Для Каждого ПустоеЗначение Из ЗначенияКУдалению Цикл
ЭтотОбъект.Счета.Удалить(ПустоеЗначение);
КонецЦикла;
ОбновитьСхемуОтборов();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТекстДобавитьИзменитьОтборНажатиеПеред(Элемент, СтандартнаяОбработка)
УдалитьПустыеСчета();
КонецПроцедуры
#КонецОбласти
- ГрафыБухОтчетности, доработать процедуру ПриСозданииНаСервере модуля формы «ФормаЭлемента».
&НаСервере
Процедура icl_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
Если Объект.Ссылка.Пустая()
И Параметры.Свойство("Владелец")
И ЗначениеЗаполнено(Параметры.Владелец) Тогда
Объект.Владелец = Параметры.Владелец;
КонецЕсли;
КонецПроцедуры
- Общие модули:
- в существующем общем модуле "НастраиваемаяБухгалтерскаяОтчетность" сделать экспортными процедуры и функции:
- ПолучитьДанныеЗаполнения,
- ДобавитьВЗапросОтборПоДокументам,
- ДопАлгоритмОтбораПоДокументам,
- НастройкиОСВПоСчету,
- НастройкиОСВ,
- НастройкиАнализаСчета,
- ПолучитьПараметрыПоказателя,
- ВычислитьПоказательПоТипу,
- СтрокаЗаполняетсяСтандартно,
- ПоказательЗаполняетсяСтандартно,
- ПолучитьОтборПоВидамСубконто,
- ЗаполнитьПараметризируемыеНаименования.
- создать общий модуль отдельно под корпоративную бухгалтерскую отчетность.
#Область ПрограммныйИнтерфейс
// Заполняет РегламентированныйОтчетДинамическийБаланс по форме.
//
// Параметры:
// ПараметрыОтчета - Структура - набор именованных параметров для определения вариантов заполнения отчета.
// ПараметрыВыполнения - Структура - контекст фонового задания
//
Процедура ЗаполнитьОтчетДинамическийБаланс(ПараметрыОтчета, ПараметрыВыполнения) Экспорт
Перем РассчитанныеПоказатели; // Таблица для сбора сумм показателей по организациям
ТаблицаРасшифровки = Новый ТаблицаЗначений;
ТаблицаРасшифровки.Колонки.Добавить("ИмяПоказателя");
ТаблицаРасшифровки.Колонки.Добавить("НаименованиеПоказателя");
ТаблицаРасшифровки.Колонки.Добавить("ЗнакОперации");
ТаблицаРасшифровки.Колонки.Добавить("НаименованиеСлагаемого");
ТаблицаРасшифровки.Колонки.Добавить("Сумма");
ТаблицаРасшифровки.Колонки.Добавить("ИмяРаздела");
ТаблицаРасшифровки.Колонки.Добавить("ДополнительныеПараметры");
РассчитанныеПоказатели = Новый ТаблицаЗначений;
РассчитанныеПоказатели.Колонки.Добавить("Раздел");
РассчитанныеПоказатели.Колонки.Добавить("Показатель");
РассчитанныеПоказатели.Колонки.Добавить("СлагаемоеДляИтоговРаздела", Новый ОписаниеТипов("Булево"));
РассчитанныеПоказатели.Колонки.Добавить("КодСтроки");
РассчитанныеПоказатели.Колонки.Добавить("ИмяОбласти");
РассчитанныеПоказатели.Колонки.Добавить("Сумма");
// Вспомогательные значения.
ОсновнаяОрганизация = ПараметрыОтчета.Организация;
ПараметрыУчетнойПолитики = НастройкиНалоговУчетныхПолитикПовтИсп.ДействующиеПараметрыНалоговУчетныхПолитик("УчетнаяПолитикаБухУчета",
ОсновнаяОрганизация,
ПараметрыОтчета.мДатаКонцаПериодаОтчета);
Если НЕ (ЗначениеЗаполнено(ПараметрыУчетнойПолитики.НастройкаЗаполненияБухОтчетности)
И ПараметрыУчетнойПолитики.НастройкаЗаполненияБухОтчетности <> Справочники.НастройкиЗаполненияБухОтчетности.НеНастраивается) Тогда
ПоместитьВоВременноеХранилище(Неопределено, ПараметрыОтчета.АдресВоВременномХранилище);
Возврат;
КонецЕсли;
ДоступныеОрганизации = ОбщегоНазначенияБПВызовСервераПовтИсп.ВсеОрганизацииДанныеКоторыхДоступныПоRLS(Ложь);
ПолныйСписокОрганизаций = Новый Массив;
Если ДоступныеОрганизации.Найти(ОсновнаяОрганизация) <> Неопределено Тогда
ПолныйСписокОрганизаций.Добавить(ОсновнаяОрганизация);
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Для Каждого Организация Из ПолныйСписокОрганизаций Цикл
КонтекстВыполнения = Новый Структура;
КонтекстВыполнения.Вставить("Организация", Организация);
КонтекстВыполнения.Вставить("ТаблицаРасшифровки", ТаблицаРасшифровки);
КонтекстВыполнения.Вставить("РассчитанныеПоказатели", РассчитанныеПоказатели);
КонтекстВыполнения.Вставить("КонецОтчетногоПериода", ПараметрыОтчета.мДатаКонцаПериодаОтчета);
КонтекстВыполнения.Вставить("НастройкаЗаполненияБухОтчетности", ПараметрыОтчета.НастройкаЗаполненияБухОтчетности);
КонтекстВыполнения.Вставить("Данные", ПолучитьСальдоПоСчетам(ПараметрыОтчета));
КонтекстОтчета = Новый Структура;
КонтекстВыполнения.Вставить("КонтекстОтчета", КонтекстОтчета);
КонтекстОтчета.Вставить("ФормаОтчетности", ПараметрыОтчета.ФормаОтчетности);
КонтекстОтчета.Вставить("ИмяРаздела", "ДинамическийБаланс");
КонтекстОтчета.Вставить("НачалоПериодаОтчета", ПараметрыОтчета.мДатаНачалаПериодаОтчета);
КонтекстОтчета.Вставить("КонецПериодаОтчета", ПараметрыОтчета.мДатаКонцаПериодаОтчета);
ЗаполнитьФормуОтчетаПоНастройке(КонтекстВыполнения);
КонецЦикла;
УстановитьПривилегированныйРежим(Ложь);
РассчитанныеПоказатели.Свернуть("Раздел, Показатель, СлагаемоеДляИтоговРаздела, КодСтроки, ИмяОбласти", "Сумма");
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("РассчитанныеПоказатели", РассчитанныеПоказатели);
СтруктураДанных.Вставить("ТаблицаРасшифровки", ТаблицаРасшифровки);
ПоместитьВоВременноеХранилище(СтруктураДанных, ПараметрыОтчета.АдресВоВременномХранилище);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ЗаполнениеПоНастройке
Процедура ЗаполнитьФормуОтчетаПоНастройке(КонтекстВыполнения)
ПравилаЗаполнения = ПолучитьПакетыПравилЗаполнения(КонтекстВыполнения);
Если ПравилаЗаполнения = Неопределено Тогда
Возврат;
КонецЕсли;
СтрокиОтчетности = ПравилаЗаполнения[2].Выгрузить();
ОбщиеПравила = ПравилаЗаполнения[3].Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Для Каждого СтрокаОтчетности Из СтрокиОтчетности Цикл
ПравилаСтроки = ОбщиеПравила.Строки.Найти(СтрокаОтчетности.КодСтроки, "КодСтроки");
Если ПравилаСтроки = Неопределено Тогда
Продолжить;
КонецЕсли;
ПараметрыПоказателя = НастраиваемаяБухгалтерскаяОтчетность.ПолучитьПараметрыПоказателя();
ПараметрыПоказателя.КодСтроки = СтрокаОтчетности.КодСтроки;
ПараметрыПоказателя.ДопАлгоритмСтроки = СтрокаОтчетности.ДопАлгоритмСтроки;
ПараметрыПоказателя.Вставить("Раздел", СтрокаОтчетности.Родитель);
ПараметрыПоказателя.Вставить("СлагаемоеДляИтоговРаздела", СтрокаОтчетности.СлагаемоеДляИтоговРаздела);
ЗаполнитьГрафыПоСтроке(КонтекстВыполнения,
КонтекстВыполнения.Данные,
ПравилаСтроки.Строки,
ПараметрыПоказателя);
КонецЦикла;
КонецПроцедуры
Функция ПолучитьПакетыПравилЗаполнения(КонтекстВыполнения)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СтрокиБухОтчетности.Ссылка КАК Строка,
| СтрокиБухОтчетности.Родитель КАК Родитель,
| СтрокиБухОтчетности.КодСтроки КАК КодСтроки,
| СтрокиБухОтчетности.КодСтрокиПрошлогоПериода КАК КодСтрокиПрошлогоПериода,
| СтрокиБухОтчетности.КодЯчейки КАК КодЯчейки,
| СтрокиБухОтчетности.КодЯчейкиПрошлогоПериода КАК КодЯчейкиПрошлогоПериода,
| СтрокиБухОтчетности.НаименованиеРасшифровки КАК СтрокаНаименованиеРасшифровки,
| СтрокиБухОтчетности.ДопАлгоритм КАК ДопАлгоритмСтроки,
| СтрокиБухОтчетности.Регламентированная КАК Регламентированная,
| СтрокиБухОтчетности.ОсновнаяСтрока.КодСтроки КАК КодОсновнойСтроки,
| СтрокиБухОтчетности.СлагаемоеДляИтоговРаздела КАК СлагаемоеДляИтоговРаздела,
| NULL КАК Графа,
| NULL КАК КодГрафы,
| NULL КАК ГрафаНаименование,
| 0 КАК КодГода,
| NULL КАК ДопАлгоритмГрафы,
| АлгоритмыСбораДанныхБухОтчетности.Ссылка КАК АлгоритмСбораДанных,
| АлгоритмыСбораДанныхБухОтчетности.ОтборЗадан КАК ОтборЗадан,
| АлгоритмыСбораДанныхБухОтчетности.ТипПоказателя КАК ТипПоказателя,
| АлгоритмыСбораДанныхБухОтчетности.Вычитаемый КАК Вычитаемый,
| АлгоритмыСбораДанныхБухОтчетности.НастройкиОтбора КАК НастройкиОтбора,
| АлгоритмыСбораДанныхБухОтчетности.ВидДвиженияДенежныхСредств КАК ВидДвиженияДенежныхСредств,
| АлгоритмыСбораДанныхБухОтчетности.НаименованиеРасшифровки КАК АлгоритмНаименованиеРасшифровки
|ПОМЕСТИТЬ Строки
|ИЗ
| Справочник.АлгоритмыСбораДанныхБухОтчетности КАК АлгоритмыСбораДанныхБухОтчетности
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СтрокиБухОтчетности КАК СтрокиБухОтчетности
| ПО АлгоритмыСбораДанныхБухОтчетности.Владелец = СтрокиБухОтчетности.Ссылка
|ГДЕ
| СтрокиБухОтчетности.Владелец = &Настройка
| И СтрокиБухОтчетности.ФормаОтчетности = &ФормаОтчетности
| И НЕ АлгоритмыСбораДанныхБухОтчетности.ПометкаУдаления
| И НЕ СтрокиБухОтчетности.ПометкаУдаления
| И НЕ СтрокиБухОтчетности.ЕстьГрафы
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| СтрокиБухОтчетности.Ссылка,
| СтрокиБухОтчетности.Родитель,
| СтрокиБухОтчетности.КодСтроки,
| СтрокиБухОтчетности.КодСтрокиПрошлогоПериода,
| СтрокиБухОтчетности.КодЯчейки,
| СтрокиБухОтчетности.КодЯчейкиПрошлогоПериода,
| СтрокиБухОтчетности.НаименованиеРасшифровки,
| СтрокиБухОтчетности.ДопАлгоритм,
| СтрокиБухОтчетности.Регламентированная,
| СтрокиБухОтчетности.ОсновнаяСтрока.КодСтроки,
| СтрокиБухОтчетности.СлагаемоеДляИтоговРаздела,
| ГрафыБухОтчетности.Ссылка,
| ГрафыБухОтчетности.КодГрафы,
| ГрафыБухОтчетности.Наименование,
| ГрафыБухОтчетности.КодГода,
| ГрафыБухОтчетности.ДопАлгоритм,
| АлгоритмыСбораДанныхБухОтчетности.Ссылка,
| АлгоритмыСбораДанныхБухОтчетности.ОтборЗадан,
| АлгоритмыСбораДанныхБухОтчетности.ТипПоказателя,
| АлгоритмыСбораДанныхБухОтчетности.Вычитаемый,
| АлгоритмыСбораДанныхБухОтчетности.НастройкиОтбора,
| АлгоритмыСбораДанныхБухОтчетности.ВидДвиженияДенежныхСредств,
| АлгоритмыСбораДанныхБухОтчетности.НаименованиеРасшифровки
|ИЗ
| Справочник.СтрокиБухОтчетности КАК СтрокиБухОтчетности
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГрафыБухОтчетности КАК ГрафыБухОтчетности
| ПО (ГрафыБухОтчетности.Владелец = СтрокиБухОтчетности.Ссылка)
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.АлгоритмыСбораДанныхБухОтчетности КАК АлгоритмыСбораДанныхБухОтчетности
| ПО (АлгоритмыСбораДанныхБухОтчетности.Владелец = ГрафыБухОтчетности.Ссылка)
|ГДЕ
| СтрокиБухОтчетности.Владелец = &Настройка
| И СтрокиБухОтчетности.ФормаОтчетности = &ФормаОтчетности
| И СтрокиБухОтчетности.ЕстьГрафы
| И НЕ ГрафыБухОтчетности.ПометкаУдаления
| И НЕ СтрокиБухОтчетности.ПометкаУдаления
| И НЕ АлгоритмыСбораДанныхБухОтчетности.ПометкаУдаления
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| СтрокиБухОтчетности.Ссылка,
| СтрокиБухОтчетности.Родитель,
| СтрокиБухОтчетности.КодСтроки,
| СтрокиБухОтчетности.КодСтрокиПрошлогоПериода,
| СтрокиБухОтчетности.КодЯчейки,
| СтрокиБухОтчетности.КодЯчейкиПрошлогоПериода,
| СтрокиБухОтчетности.НаименованиеРасшифровки,
| СтрокиБухОтчетности.ДопАлгоритм,
| СтрокиБухОтчетности.Регламентированная,
| СтрокиБухОтчетности.ОсновнаяСтрока.КодСтроки,
| СтрокиБухОтчетности.СлагаемоеДляИтоговРаздела,
| ГрафыБухОтчетности.Ссылка,
| ГрафыБухОтчетности.КодГрафы,
| ГрафыБухОтчетности.Наименование,
| ГрафыБухОтчетности.КодГода,
| ГрафыБухОтчетности.ДопАлгоритм,
| АлгоритмыСбораДанныхБухОтчетности.Ссылка,
| АлгоритмыСбораДанныхБухОтчетности.ОтборЗадан,
| АлгоритмыСбораДанныхБухОтчетности.ТипПоказателя,
| АлгоритмыСбораДанныхБухОтчетности.Вычитаемый,
| АлгоритмыСбораДанныхБухОтчетности.НастройкиОтбора,
| АлгоритмыСбораДанныхБухОтчетности.ВидДвиженияДенежныхСредств,
| АлгоритмыСбораДанныхБухОтчетности.НаименованиеРасшифровки
|ИЗ
| Справочник.СтрокиБухОтчетности КАК СтрокиБухОтчетности
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГрафыБухОтчетности КАК ГрафыБухОтчетности
| ПО (ГрафыБухОтчетности.Владелец = СтрокиБухОтчетности.Ссылка)
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.АлгоритмыСбораДанныхБухОтчетности КАК АлгоритмыСбораДанныхБухОтчетности
| ПО (АлгоритмыСбораДанныхБухОтчетности.Владелец = ГрафыБухОтчетности.Ссылка)
|ГДЕ
| СтрокиБухОтчетности.Владелец = &Настройка
| И СтрокиБухОтчетности.ФормаОтчетности = &ФормаОтчетности
| И АлгоритмыСбораДанныхБухОтчетности.Ссылка ЕСТЬ NULL
| И НЕ ГрафыБухОтчетности.ПометкаУдаления
| И НЕ СтрокиБухОтчетности.ПометкаУдаления
| И СтрокиБухОтчетности.ДопАлгоритм <> """"
|
|ИНДЕКСИРОВАТЬ ПО
| АлгоритмСбораДанных
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Строки.Строка КАК Строка,
| Строки.Родитель.Наименование КАК Родитель,
| Строки.АлгоритмСбораДанных КАК АлгоритмСбораДанных,
| АлгоритмыСбораДанныхБухОтчетностиСчета.Счет КАК Счет,
| АлгоритмыСбораДанныхБухОтчетностиСчета.Счет.Код КАК СчетКод,
| Строки.СлагаемоеДляИтоговРаздела КАК СлагаемоеДляИтоговРаздела,
| Строки.Графа КАК Графа,
| Строки.КодСтроки КАК КодСтроки,
| Строки.КодГрафы КАК КодГрафы,
| Строки.СтрокаНаименованиеРасшифровки КАК СтрокаНаименованиеРасшифровки,
| Строки.ТипПоказателя КАК ТипПоказателя,
| Строки.Вычитаемый КАК Вычитаемый,
| Строки.ДопАлгоритмСтроки КАК ДопАлгоритмСтроки,
| Строки.ДопАлгоритмГрафы КАК ДопАлгоритмГрафы,
| АлгоритмыСбораДанныхБухОтчетностиКорСчета.Счет КАК КорСчет,
| АлгоритмыСбораДанныхБухОтчетностиКорСчета.Счет.Код КАК КорСчетКод,
| Строки.КодСтрокиПрошлогоПериода КАК КодСтрокиПрошлогоПериода,
| Строки.КодГода КАК КодГода,
| Строки.ОтборЗадан КАК ОтборЗадан,
| Строки.НастройкиОтбора КАК НастройкиОтбора,
| Строки.Регламентированная КАК Регламентированная,
| Строки.КодЯчейки КАК КодЯчейки,
| Строки.КодЯчейкиПрошлогоПериода КАК КодЯчейкиПрошлогоПериода,
| Строки.ВидДвиженияДенежныхСредств КАК ВидДвиженияДенежныхСредств,
| Строки.ГрафаНаименование КАК ГрафаНаименование,
| Строки.АлгоритмНаименованиеРасшифровки КАК АлгоритмНаименованиеРасшифровки,
| Строки.КодОсновнойСтроки КАК КодОсновнойСтроки
|ПОМЕСТИТЬ ОбщиеПравила
|ИЗ
| Строки КАК Строки
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.АлгоритмыСбораДанныхБухОтчетности.Счета КАК АлгоритмыСбораДанныхБухОтчетностиСчета
| ПО (АлгоритмыСбораДанныхБухОтчетностиСчета.Ссылка = Строки.АлгоритмСбораДанных)
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.АлгоритмыСбораДанныхБухОтчетности.КорСчета КАК АлгоритмыСбораДанныхБухОтчетностиКорСчета
| ПО (АлгоритмыСбораДанныхБухОтчетностиКорСчета.Ссылка = Строки.АлгоритмСбораДанных)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОбщиеПравила.Строка КАК Строка,
| ОбщиеПравила.Родитель КАК Родитель,
| ОбщиеПравила.КодСтроки КАК КодСтроки,
| ОбщиеПравила.КодСтрокиПрошлогоПериода КАК КодСтрокиПрошлогоПериода,
| ОбщиеПравила.ДопАлгоритмСтроки КАК ДопАлгоритмСтроки,
| ОбщиеПравила.Регламентированная КАК Регламентированная,
| ОбщиеПравила.КодОсновнойСтроки КАК КодОсновнойСтроки,
| ОбщиеПравила.СлагаемоеДляИтоговРаздела КАК СлагаемоеДляИтоговРаздела
|ИЗ
| ОбщиеПравила КАК ОбщиеПравила
|
|УПОРЯДОЧИТЬ ПО
| КодСтроки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОбщиеПравила.Строка КАК Строка,
| ОбщиеПравила.АлгоритмСбораДанных КАК АлгоритмСбораДанных,
| ОбщиеПравила.Счет КАК Счет,
| ОбщиеПравила.СчетКод КАК СчетКод,
| ОбщиеПравила.Графа КАК Графа,
| ОбщиеПравила.КодСтроки КАК КодСтроки,
| ОбщиеПравила.КодГрафы КАК КодГрафы,
| ОбщиеПравила.СтрокаНаименованиеРасшифровки КАК СтрокаНаименованиеРасшифровки,
| ОбщиеПравила.ТипПоказателя КАК ТипПоказателя,
| ОбщиеПравила.Вычитаемый КАК Вычитаемый,
| ОбщиеПравила.ДопАлгоритмСтроки КАК ДопАлгоритмСтроки,
| ОбщиеПравила.ДопАлгоритмГрафы КАК ДопАлгоритмГрафы,
| ОбщиеПравила.КорСчет КАК КорСчет,
| ОбщиеПравила.КорСчетКод КАК КорСчетКод,
| ОбщиеПравила.КодСтрокиПрошлогоПериода КАК КодСтрокиПрошлогоПериода,
| ОбщиеПравила.КодГода КАК КодГода,
| ОбщиеПравила.ОтборЗадан КАК ОтборЗадан,
| ОбщиеПравила.НастройкиОтбора КАК НастройкиОтбора,
| ОбщиеПравила.Регламентированная КАК Регламентированная,
| ОбщиеПравила.КодЯчейки КАК КодЯчейки,
| ОбщиеПравила.КодЯчейкиПрошлогоПериода КАК КодЯчейкиПрошлогоПериода,
| ОбщиеПравила.ВидДвиженияДенежныхСредств КАК ВидДвиженияДенежныхСредств,
| ОбщиеПравила.ГрафаНаименование КАК ГрафаНаименование,
| ОбщиеПравила.АлгоритмНаименованиеРасшифровки КАК АлгоритмНаименованиеРасшифровки
|ИЗ
| ОбщиеПравила КАК ОбщиеПравила
|
|УПОРЯДОЧИТЬ ПО
| КодСтроки,
| КодГрафы,
| СчетКод
|ИТОГИ ПО
| КодСтроки,
| КодГрафы,
| АлгоритмСбораДанных";
Запрос.УстановитьПараметр("Настройка", КонтекстВыполнения.НастройкаЗаполненияБухОтчетности);
Запрос.УстановитьПараметр("ФормаОтчетности", КонтекстВыполнения.КонтекстОтчета.ФормаОтчетности);
РезультатЗапроса = Запрос.ВыполнитьПакет();
Возврат РезультатЗапроса;
КонецФункции
Процедура ЗаполнитьГрафыПоСтроке(КонтекстВыполнения, Данные, Графы, ПараметрыПоказателя)
//Проверка предусмотрен ли для строки отдельный алгоритм заполнения
Если НастраиваемаяБухгалтерскаяОтчетность.СтрокаЗаполняетсяСтандартно(ПараметрыПоказателя.ДопАлгоритмСтроки) Тогда
Для Каждого Графа Из Графы Цикл
АлгоритмСбораДанных = Графа.Строки.Получить(0).АлгоритмСбораДанных;
Если ЗначениеЗаполнено(АлгоритмСбораДанных) Тогда
ЗаполнитьПоказательПоАлгоритмам(КонтекстВыполнения, Данные, Графа.Строки, ПараметрыПоказателя);
КонецЕсли;
КонецЦикла;
Иначе
ПрименитьДопАлгоритм(КонтекстВыполнения, ПараметрыПоказателя);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьПоказательПоАлгоритмам(КонтекстВыполнения, Данные, Алгоритмы, ПараметрыПоказателя)
ЗначениеПоказателя = 0;
ТаблицаРасшифровки = КонтекстВыполнения.ТаблицаРасшифровки;
РассчитанныеПоказатели = КонтекстВыполнения.РассчитанныеПоказатели;
ПараметрыРасшифровки = Новый Структура;
ПараметрыРасшифровки.Вставить("Организация", КонтекстВыполнения.Организация);
Для Каждого Алгоритм Из Алгоритмы Цикл
АлгоритмСтрока = Алгоритм.Строки.Получить(0);
КодГода = АлгоритмСтрока.КодГода;
Если ЗначениеЗаполнено(АлгоритмСтрока.КодГрафы) Тогда
КодГрафы = АлгоритмСтрока.КодГрафы;
ГрафаНаименование = НастраиваемаяБухгалтерскаяОтчетность.ЗаполнитьПараметризируемыеНаименования(АлгоритмСтрока.ГрафаНаименование, КонтекстВыполнения.КонтекстОтчета);
ИначеЕсли ПараметрыПоказателя.РегулярнаяГрафа <> Неопределено Тогда
КодГрафы = ПараметрыПоказателя.РегулярнаяГрафа.Ключ;
Для Каждого РегулярнаяГрафа Из ПараметрыПоказателя.РегулярнаяГрафа.Значение Цикл
ГрафаНаименование = РегулярнаяГрафа.Ключ;
КонецЦикла;
Иначе
Продолжить;
КонецЕсли;
Если ЗначениеЗаполнено(АлгоритмСтрока.КодЯчейки) Тогда
ИмяОбластиБезГрафы = АлгоритмСтрока.КодЯчейки;
ИначеЕсли ЗначениеЗаполнено(ПараметрыПоказателя.КодСтроки) Тогда
Префикс = "П0001";
ОбработанныйКодСтроки = СтрЗаменить(СтрЗаменить(ПараметрыПоказателя.КодСтроки, ".", ""), ",", "");
ИмяОбластиБезГрафы = Префикс + ОбработанныйКодСтроки;
Если СтрДлина(ИмяОбластиБезГрафы) > 15 Тогда
Продолжить;
КонецЕсли;
Пока СтрДлина(ИмяОбластиБезГрафы) < 15 Цикл
Префикс = Префикс + "0";
ИмяОбластиБезГрафы = Префикс + ОбработанныйКодСтроки;
КонецЦикла;
Иначе
Продолжить;
КонецЕсли;
ИмяОбластиПоказателя = ИмяОбластиБезГрафы + КодГрафы;
Если ПараметрыПоказателя.НомерДопСтроки <> 0 Тогда
ИмяОбластиПоказателя = ИмяОбластиПоказателя + "_" + ПараметрыПоказателя.НомерДопСтроки;
КонецЕсли;
ПараметрыПоказателя.КодГрафы = КодГрафы;
ПараметрыПоказателя.ИмяОбластиПоказателя = ИмяОбластиПоказателя;
ПараметрыПоказателя.ДопАлгоритмГрафы = АлгоритмСтрока.ДопАлгоритмГрафы;
ПараметрыПоказателя.КодГода = КодГода;
Если ПараметрыПоказателя.НаименованиеСтроки = "" Тогда
ПараметрыПоказателя.НаименованиеСтроки = АлгоритмСтрока.СтрокаНаименованиеРасшифровки;
КонецЕсли;
ПараметрыПоказателя.НачалоПериода = ДобавитьМесяц(КонтекстВыполнения.КонтекстОтчета.НачалоПериодаОтчета, 12*КодГода);
ПараметрыПоказателя.КонецПериода = ДобавитьМесяц(КонтекстВыполнения.КонтекстОтчета.КонецПериодаОтчета, 12*КодГода);
//Проверка заполняется ли показатель через типовой механизм
Если НастраиваемаяБухгалтерскаяОтчетность.ПоказательЗаполняетсяСтандартно(ПараметрыПоказателя.ДопАлгоритмСтроки) Тогда
УстановитьПривилегированныйРежим(Истина);
ТекДанные = ДанныеДляРасчетаПоказателя(КонтекстВыполнения,
Данные,
АлгоритмСтрока,
КодГода,
ОбщегоНазначенияКлиентСервер.СвернутьМассив(Алгоритм.Строки.ВыгрузитьКолонку("Счет")),
ОбщегоНазначенияКлиентСервер.СвернутьМассив(Алгоритм.Строки.ВыгрузитьКолонку("КорСчет")),
ПараметрыПоказателя);
УстановитьПривилегированныйРежим(Ложь);
Если ТипЗнч(ТекДанные) = Тип("Структура") Тогда
ТаблицаДанных = ТекДанные.ТаблицаДанных;
ОтборПоАналитике = ТекДанные.ОтборПоАналитике;
Иначе
ТаблицаДанных = ТекДанные;
ОтборПоАналитике = Неопределено;
КонецЕсли;
ЗначениеСлагаемогоАлгоритм = 0;
Счета = Новый Массив;
КорСчета = Новый Массив;
Для Каждого СтрокаСчет Из Алгоритм.Строки Цикл
Счета.Добавить(СтрокаСчет.Счет);
КорСчета.Добавить(СтрокаСчет.КорСчет);
ЗначениеСлагаемого = ?(СтрокаСчет.Вычитаемый, -1, 1) * НастраиваемаяБухгалтерскаяОтчетность.ВычислитьПоказательПоТипу(СтрокаСчет.ТипПоказателя, ТаблицаДанных, СтрокаСчет.Счет, СтрокаСчет.КорСчет);
ЗначениеПоказателя = ЗначениеПоказателя + ЗначениеСлагаемого;
ЗначениеСлагаемогоАлгоритм = ЗначениеСлагаемогоАлгоритм + ЗначениеСлагаемого;
КонецЦикла;
Счета = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Счета);
КорСчета = ОбщегоНазначенияКлиентСервер.СвернутьМассив(КорСчета);
ПараметрыРасшифровки.Вставить("НачалоПериода", ПараметрыПоказателя.НачалоПериода);
ПараметрыРасшифровки.Вставить("КонецПериода", ПараметрыПоказателя.КонецПериода);
Если АлгоритмСтрока.ТипПоказателя = "СКДР" ИЛИ АлгоритмСтрока.ТипПоказателя = "СККР"
ИЛИ АлгоритмСтрока.ТипПоказателя = "СНДР" ИЛИ АлгоритмСтрока.ТипПоказателя = "СНКР" Тогда
ПараметрыРасшифровки.Вставить("РазвернутоеСальдо", Истина);
КонецЕсли;
РасшифровкаЗаголовок = НСтр("ru = 'Строка %1, графа ""%2""';
|en = 'Line %1, column ""%2""'");
РасшифровкаЗаголовок = СтрШаблон(РасшифровкаЗаголовок,
НастраиваемаяБухгалтерскаяОтчетность.ЗаполнитьПараметризируемыеНаименования(СтрокаСчет.СтрокаНаименованиеРасшифровки, КонтекстВыполнения.КонтекстОтчета),
ГрафаНаименование);
НастройкиРасшифровки = Неопределено;
Если АлгоритмСтрока.ТипПоказателя = "ОБ" Тогда
Если Счета.Количество() = 1 Тогда
НастройкиРасшифровки = НастраиваемаяБухгалтерскаяОтчетность.НастройкиАнализаСчета(ПараметрыРасшифровки, Счета[0], КорСчета, ОтборПоАналитике);
ИначеЕсли КорСчета.Количество() = 1 Тогда
НастройкиРасшифровки = НастраиваемаяБухгалтерскаяОтчетность.НастройкиАнализаСчета(ПараметрыРасшифровки, КорСчета[0], Счета, ОтборПоАналитике);
КонецЕсли;
Иначе
Если Счета.Количество() = 1 Тогда
НастройкиРасшифровки = НастраиваемаяБухгалтерскаяОтчетность.НастройкиОСВПоСчету(ПараметрыРасшифровки, Счета[0], ОтборПоАналитике);
ИначеЕсли ОтборПоАналитике = Неопределено Тогда
НастройкиРасшифровки = НастраиваемаяБухгалтерскаяОтчетность.НастройкиОСВ(ПараметрыРасшифровки, Счета);
КонецЕсли;
КонецЕсли;
ДобавитьСтрокуРасшифровки(ТаблицаРасшифровки,
ИмяОбластиПоказателя,
РасшифровкаЗаголовок,
?(АлгоритмСтрока.Вычитаемый, "-", "+"),
АлгоритмСтрока.АлгоритмНаименованиеРасшифровки,
ЗначениеСлагаемогоАлгоритм,
КонтекстВыполнения.КонтекстОтчета.ИмяРаздела,
НастройкиРасшифровки);
КонецЕсли;
КонецЦикла;
ПараметрыПоказателя.ЗначениеПоказателя = ЗначениеПоказателя;
ПрименитьДопАлгоритм(КонтекстВыполнения, ПараметрыПоказателя);
УстановитьЗначениеПоказателя(РассчитанныеПоказатели,
ПараметрыПоказателя.Раздел,
ПараметрыПоказателя.НаименованиеСтроки,
ПараметрыПоказателя.КодСтроки,
ПараметрыПоказателя.СлагаемоеДляИтоговРаздела,
ПараметрыПоказателя.ИмяОбластиПоказателя,
ПараметрыПоказателя.ЗначениеПоказателя);
КонецПроцедуры
Функция ДанныеДляРасчетаПоказателя(КонтекстВыполнения, Данные, Алгоритм, КодГода, Счета, КорСчета, ПараметрыПоказателя)
ДанныеГод = Данные.Получить(КодГода);
ВидМакета = ПолучитьВидМакета(Алгоритм.ТипПоказателя, ПараметрыПоказателя);
ИмяПакетаДанных = ВидМакета;
Если Алгоритм.ОтборЗадан Тогда
Параметры = Новый Структура;
Параметры.Вставить("Организация", КонтекстВыполнения.Организация);
Параметры.Вставить("НачалоПериода", ПараметрыПоказателя.НачалоПериода);
Параметры.Вставить("КонецПериода", ПараметрыПоказателя.КонецПериода);
Параметры.Вставить("Счета", Счета);
Параметры.Вставить("КорСчета", КорСчета);
Параметры.Вставить("НастройкиОтбора", Алгоритм.НастройкиОтбора);
Параметры.Вставить("ДопАлгоритм", ПараметрыПоказателя.ДопАлгоритмСтроки);
Возврат ПолучитьДанныеЗаполнения(ВидМакета, Параметры);
КонецЕсли;
Возврат ДанныеГод[ИмяПакетаДанных];
КонецФункции
Функция ПолучитьДанныеЗаполнения(Макет, Параметры)
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("ТаблицаДанных", Неопределено);
ДанныеЗаполнения.Вставить("ОтборПоАналитике", Неопределено);
СхемаКомпоновки = Справочники.АлгоритмыСбораДанныхБухОтчетности.ПолучитьМакет(Макет);
Если Параметры.Свойство("ДопАлгоритм")
И НастраиваемаяБухгалтерскаяОтчетность.ДопАлгоритмОтбораПоДокументам(Параметры.ДопАлгоритм) Тогда
НастраиваемаяБухгалтерскаяОтчетность.ДобавитьВЗапросОтборПоДокументам(СхемаКомпоновки, Параметры.ДопАлгоритм);
КонецЕсли;
КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновки));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновки.НастройкиПоУмолчанию);
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "Организация", Параметры.Организация);
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "НачалоПериода", Параметры.НачалоПериода);
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "КонецПериода", Параметры.КонецПериода);
Если Параметры.Свойство("НастройкиОтбора") Тогда
НастройкиОтбора = Параметры.НастройкиОтбора.Получить();
СкопироватьОтборКомпоновкиДанных(СхемаКомпоновки, Настройки, НастройкиОтбора);
Если Параметры.Свойство("Счета") Тогда
ОтборПоВидамСубконто = НастраиваемаяБухгалтерскаяОтчетность.ПолучитьОтборПоВидамСубконто(Параметры.Счета);
Если ОтборПоВидамСубконто.Количество() > 0 Тогда
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "ВидыСубконто", ОтборПоВидамСубконто);
КонецЕсли;
КорректировкаЗапроса(СхемаКомпоновки, ОтборПоВидамСубконто);
КонецЕсли;
Если Параметры.Свойство("КорСчета") Тогда
ОтборПоВидамКорСубконто = НастраиваемаяБухгалтерскаяОтчетность.ПолучитьОтборПоВидамСубконто(Параметры.КорСчета);
Если ОтборПоВидамКорСубконто.Количество() > 0 Тогда
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "ВидыКорСубконто", ОтборПоВидамКорСубконто);
КонецЕсли;
КонецЕсли;
ОтборПоАналитике = Новый Соответствие;
Для Каждого ЭлементОтбора Из НастройкиОтбора.Отбор.Элементы Цикл
Если ЭлементОтбора.Использование Тогда
ЗначениеОтбора = Новый Структура;
ЗначениеОтбора.Вставить("ВидСравненияКомпоновкиДанных", ЭлементОтбора.ВидСравнения);
ЗначениеОтбора.Вставить("Значение", ЭлементОтбора.ПравоеЗначение);
ОтборПоАналитике.Вставить(ЭлементОтбора.ЛевоеЗначение, ЗначениеОтбора);
КонецЕсли;
КонецЦикла;
Если ОтборПоАналитике.Количество() <> 0 Тогда
ДанныеЗаполнения.ОтборПоАналитике = ОтборПоАналитике;
КонецЕсли;
КонецЕсли;
Если Параметры.Свойство("Счета") Тогда
СписокСчетов = Новый СписокЗначений;
СписокСчетов.ЗагрузитьЗначения(Параметры.Счета);
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "Счета", СписокСчетов);
КонецЕсли;
Если Параметры.Свойство("КорСчета") И (Макет = "ОборотыМеждуСчетами" ИЛИ Макет = "ОборотыМеждуСчетамиПоТипуДокумента") Тогда
СписокСчетов = Новый СписокЗначений;
СписокСчетов.ЗагрузитьЗначения(Параметры.КорСчета);
КомпоновкаДанныхКлиентСервер.УстановитьПараметр(Настройки, "КорСчета", СписокСчетов);
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ТаблицаРезультатов = Новый ТаблицаЗначений();
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки,,,Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультатов);
ТаблицаРезультатов = ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
Если Макет = "СальдоИОборотыПоСчетам" Тогда
ТаблицаРезультатов.Индексы.Добавить("Счет");
ИначеЕсли Макет = "ОборотыМеждуСчетами" Тогда
ТаблицаРезультатов.Индексы.Добавить("Счет0, КорСчет0");
ТаблицаРезультатов.Индексы.Добавить("Счет0, КорСчет1");
ТаблицаРезультатов.Индексы.Добавить("Счет0, КорСчет2");
ТаблицаРезультатов.Индексы.Добавить("Счет1, КорСчет0");
ТаблицаРезультатов.Индексы.Добавить("Счет1, КорСчет1");
ТаблицаРезультатов.Индексы.Добавить("Счет1, КорСчет2");
ТаблицаРезультатов.Индексы.Добавить("Счет2, КорСчет0");
ТаблицаРезультатов.Индексы.Добавить("Счет2, КорСчет1");
ТаблицаРезультатов.Индексы.Добавить("Счет2, КорСчет2");
КонецЕсли;
ДанныеЗаполнения.ТаблицаДанных = ТаблицаРезультатов;
Возврат ДанныеЗаполнения;
КонецФункции
Процедура КорректировкаЗапроса(СхемаКомпоновки, ОтборПоВидамСубконто)
КоличествоСубконто = ОтборПоВидамСубконто.Количество();
Запрос = СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос;
Если КоличествоСубконто = 3 Тогда
Возврат;
ИначеЕсли КоличествоСубконто = 2 Тогда
Запрос = СтрЗаменить(Запрос, "ХозрасчетныйОстаткиИОбороты.Субконто3.*,", "");
Запрос = СтрЗаменить(Запрос, "КОЛИЧЕСТВО(ХозрасчетныйОстаткиИОбороты.Субконто3) КАК Субконто3,", "");
ИначеЕсли КоличествоСубконто = 1 Тогда
Запрос = СтрЗаменить(Запрос, "ХозрасчетныйОстаткиИОбороты.Субконто2.*,", "");
Запрос = СтрЗаменить(Запрос, "ХозрасчетныйОстаткиИОбороты.Субконто3.*,", "");
Запрос = СтрЗаменить(Запрос, "КОЛИЧЕСТВО(ХозрасчетныйОстаткиИОбороты.Субконто2) КАК Субконто2,", "");
Запрос = СтрЗаменить(Запрос, "КОЛИЧЕСТВО(ХозрасчетныйОстаткиИОбороты.Субконто3) КАК Субконто3,", "");
ИначеЕсли КоличествоСубконто = 0 Тогда
Запрос = СтрЗаменить(Запрос, "ХозрасчетныйОстаткиИОбороты.Субконто1.*,", "");
Запрос = СтрЗаменить(Запрос, "ХозрасчетныйОстаткиИОбороты.Субконто2.*,", "");
Запрос = СтрЗаменить(Запрос, "ХозрасчетныйОстаткиИОбороты.Субконто3.*,", "");
Запрос = СтрЗаменить(Запрос, "КОЛИЧЕСТВО(ХозрасчетныйОстаткиИОбороты.Субконто1) КАК Субконто1,", "");
Запрос = СтрЗаменить(Запрос, "КОЛИЧЕСТВО(ХозрасчетныйОстаткиИОбороты.Субконто2) КАК Субконто2,", "");
Запрос = СтрЗаменить(Запрос, "КОЛИЧЕСТВО(ХозрасчетныйОстаткиИОбороты.Субконто3) КАК Субконто3,", "");
КонецЕсли;
СхемаКомпоновки.НаборыДанных.НаборДанных1.Запрос = Запрос;
КонецПроцедуры
// Копирует отбор из одних настроек компоновки данных в другие настройки
//
// Параметры:
// СхемаПриемник - СхемаКомпоновкиДанных - схема КД, в чьи настройки копируется отбор
// НастройкиПриемник - НастройкиКомпоновкиДанных - настройки КД, в которое копируется отбор
// НастройкиИсточник - НастройкиКомпоновкиДанных - настройки КД, из которых копируется отбор
// ПоляИсключения - Строка, Массив, Неопределено - имена полей, которые следует пропустить при копировании.
//
Процедура СкопироватьОтборКомпоновкиДанных(СхемаПриемник, НастройкиПриемник, НастройкиИсточник, Знач ПоляИсключения = Неопределено) Экспорт
ЕстьПоляИсключения = Ложь;
Если ТипЗнч(ПоляИсключения) = Тип("Строка") Тогда
ПоляИсключения = СтрРазделить(ПоляИсключения, ",");
Для Каждого ПолеИсключение Из ПоляИсключения Цикл
ПолеИсключение = СокрЛП(ПолеИсключение);
КонецЦикла;
КонецЕсли;
ЕстьПоляИсключения = ТипЗнч(ПоляИсключения) = Тип("Массив") И ПоляИсключения.Количество() > 0;
Для Каждого ЭлементОтбора Из НастройкиИсточник.Отбор.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Если ЕстьПоляИсключения Тогда
ДобавитьВОтборЭлементОтбораСПроверкой(НастройкиПриемник.Отбор, ЭлементОтбора, ПоляИсключения);
Иначе
ДобавитьВОтборЭлементОтбора(НастройкиПриемник.Отбор, ЭлементОтбора);
КонецЕсли;
Иначе
ДобавитьВОтборГруппуЭлементовОтбора(НастройкиПриемник.Отбор,ЭлементОтбора);
КонецЕсли;
КонецЦикла;
// Нужно исправить настройки приемника, т.к. в отборе источника могут быть поля, которые недоступны в приемнике.
КомпоновщикНастроекЗапроса = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекЗапроса.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаПриемник));
КомпоновщикНастроекЗапроса.ЗагрузитьНастройки(НастройкиПриемник);
//КомпоновщикНастроекЗапроса.Восстановить(СпособВосстановленияНастроекКомпоновкиДанных.Полное);
НастройкиПриемник = КомпоновщикНастроекЗапроса.ПолучитьНастройки();
КонецПроцедуры
Процедура ДобавитьВОтборЭлементОтбораСПроверкой(ОтборПриемник, ЭлементОтбора, ПоляИсключения)
ДобавлятьПолеВОтбор = Истина;
ИмяПоля = Строка(ЭлементОтбора.ЛевоеЗначение);
Для Каждого ПолеИсключение Из ПоляИсключения Цикл
Если СтрНачинаетсяС(ИмяПоля, ПолеИсключение) Тогда
ДобавлятьПолеВОтбор = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ДобавлятьПолеВОтбор Тогда
ДобавитьВОтборЭлементОтбора(ОтборПриемник, ЭлементОтбора);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьВОтборЭлементОтбора(ОтборПриемник,ЭлементОтбора)
НовыйЭлемент = ОтборПриемник.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НовыйЭлемент,ЭлементОтбора);
КонецПроцедуры
// Добавляет группу элементов отбора.
//
// Параметры:
// ОтборПриемник - ГруппаЭлементовОтбораКомпоновкиДанных, ОтборКомпоновкиДанных, ЭлементОтбораКомпоновкиДанных - коллекция, куда добавляется группа.
// ГруппаЭлементов - ЭлементОтбораКомпоновкиДанных, ГруппаЭлементовОтбораКомпоновкиДанных - непоследственное место, куда вставляется группа.
// ПоляИсключения - Неопределено, Массив - Описание
Процедура ДобавитьВОтборГруппуЭлементовОтбора(ОтборПриемник, ГруппаЭлементов, Знач ПоляИсключения = Неопределено)
ЕстьПоляИсключения = Ложь;
Если ТипЗнч(ПоляИсключения) = Тип("Строка") Тогда
ПоляИсключения = СтрРазделить(ПоляИсключения, ",");
Для Каждого ПолеИсключение Из ПоляИсключения Цикл
ПолеИсключение = СокрЛП(ПолеИсключение);
КонецЦикла;
КонецЕсли;
ЕстьПоляИсключения = ТипЗнч(ПоляИсключения) = Тип("Массив") И ПоляИсключения.Количество() > 0;
НоваяГруппа = ОтборПриемник.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ЗаполнитьЗначенияСвойств(НоваяГруппа,ГруппаЭлементов);
Для Каждого ЭлементОтбора Из ГруппаЭлементов.Элементы Цикл
Если ТипЗнч(ЭлементОтбора) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Если ЕстьПоляИсключения Тогда
ДобавитьВОтборЭлементОтбораСПроверкой(НоваяГруппа, ЭлементОтбора, ПоляИсключения);
Иначе
ДобавитьВОтборЭлементОтбора(НоваяГруппа, ЭлементОтбора);
КонецЕсли;
Иначе
ДобавитьВОтборГруппуЭлементовОтбора(НоваяГруппа, ЭлементОтбора, ПоляИсключения);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПрименитьДопАлгоритм(КонтекстВыполнения, ПараметрыПоказателя)
Если ПараметрыПоказателя.ДопАлгоритмГрафы = ">0" Тогда
ПараметрыПоказателя.ЗначениеПоказателя = Макс(ПараметрыПоказателя.ЗначениеПоказателя,0);
ИначеЕсли ПараметрыПоказателя.ДопАлгоритмГрафы = "<0" Тогда
ПараметрыПоказателя.ЗначениеПоказателя = Мин(ПараметрыПоказателя.ЗначениеПоказателя,0);
ИначеЕсли ПараметрыПоказателя.ДопАлгоритмГрафы = "-" Тогда
ПараметрыПоказателя.ЗначениеПоказателя = -ПараметрыПоказателя.ЗначениеПоказателя;
КонецЕсли;
Если ПараметрыПоказателя.ДопАлгоритмСтроки = "-" Тогда
ПараметрыПоказателя.ЗначениеПоказателя = -ПараметрыПоказателя.ЗначениеПоказателя;
ИначеЕсли ПараметрыПоказателя.ДопАлгоритмСтроки = ">0" Тогда
ПараметрыПоказателя.ЗначениеПоказателя = Макс(ПараметрыПоказателя.ЗначениеПоказателя,0);
ИначеЕсли ПараметрыПоказателя.ДопАлгоритмСтроки = "<0" Тогда
ПараметрыПоказателя.ЗначениеПоказателя = Мин(ПараметрыПоказателя.ЗначениеПоказателя,0);
КонецЕсли;
КонецПроцедуры
#Область ПолучениеДанныхДляЗаполнения
Функция ПолучитьСальдоПоСчетам(ПараметрыОтчета) Экспорт
Данные = Новый Соответствие;
Параметры = Новый Структура;
Параметры.Вставить("Организация", ПараметрыОтчета.Организация);
Параметры.Вставить("НачалоПериода", ПараметрыОтчета.мДатаНачалаПериодаОтчета);
Параметры.Вставить("КонецПериода", ПараметрыОтчета.мДатаКонцаПериодаОтчета);
ДанныеЗаПериод = Новый Структура;
ДанныеЗаПериод.Вставить("СальдоИОборотыПоСчетам", НастраиваемаяБухгалтерскаяОтчетность.ПолучитьДанныеЗаполнения("СальдоИОборотыПоСчетам", Параметры));
ДанныеЗаПериод.Вставить("ОборотыМеждуСчетами", НастраиваемаяБухгалтерскаяОтчетность.ПолучитьДанныеЗаполнения("ОборотыМеждуСчетами", Параметры));
ДанныеЗаПериод.Вставить("СальдоИОборотыПоСчетамИСубконто", НастраиваемаяБухгалтерскаяОтчетность.ПолучитьДанныеЗаполнения("СальдоИОборотыПоСчетамИСубконто", Параметры));
Данные.Вставить(0, ДанныеЗаПериод);
Возврат Данные;
КонецФункции
#КонецОбласти
#КонецОбласти
#Область ОберткиПроцедурИФункций
Процедура УстановитьЗначениеПоказателя(ПоказателиПоРазделам, ИмяРаздела, Показатель, КодСтроки, СлагаемоеДляИтоговРаздела, ИмяОбласти, ЗначениеПоказателя)
НоваяСтрока = ПоказателиПоРазделам.Добавить();
НоваяСтрока.Раздел = ИмяРаздела;
НоваяСтрока.Показатель = Показатель;
НоваяСтрока.КодСтроки = КодСтроки;
НоваяСтрока.СлагаемоеДляИтоговРаздела = СлагаемоеДляИтоговРаздела;
НоваяСтрока.ИмяОбласти = ИмяОбласти;
НоваяСтрока.Сумма = ЗначениеПоказателя;
КонецПроцедуры
Процедура ДобавитьСтрокуРасшифровки(ТаблицаРасшифровок, ИмяПоказателя, НаименованиеПоказателя, ЗнакОперации, НаименованиеСлагаемого, Сумма, ИмяРаздела, ДополнительныеПараметры = Неопределено)
ЗаполнениеРасшифровкаРегламентированнойОтчетности.ДобавитьСтрокуРасшифровки(ТаблицаРасшифровок, ИмяПоказателя, НаименованиеПоказателя, ЗнакОперации, НаименованиеСлагаемого, Сумма, ИмяРаздела, ДополнительныеПараметры);
КонецПроцедуры
#КонецОбласти
Функция ПолучитьВидМакета(ТипПоказателя, ПараметрыПоказателя)
Если ТипПоказателя = "ОБ" Тогда
Если НастраиваемаяБухгалтерскаяОтчетность.ДопАлгоритмОтбораПоДокументам(ПараметрыПоказателя.ДопАлгоритмСтроки) Тогда
Возврат "ОборотыМеждуСчетамиПоТипуДокумента";
Иначе
Возврат "ОборотыМеждуСчетами";
КонецЕсли;
ИначеЕсли ТипПоказателя = "СКДР" ИЛИ ТипПоказателя = "СККР"
ИЛИ ТипПоказателя = "СНДР" ИЛИ ТипПоказателя = "СНКР" Тогда
Возврат "СальдоИОборотыПоСчетамИСубконто";
Иначе
Возврат "СальдоИОборотыПоСчетам";
КонецЕсли;
КонецФункции
#КонецОбласти
Что в нем происходит:
- Собираются данные в разрезе строк, граф и алгоритмов отчетности,
- Далее при обходе полученных записей из кодов строк и граф с предопределенным префиксом формируется наименование области для заполнения,
- После чего через механизм СКД по алгоритму для строки происходит расчет значения.
В целом все довольно просто.
Ну и конечно нужен сам отчет.
Описание процесса создания отчета не относится к разбираемой тематике, да и каждый подобный отчет индивидуален.
Единственное, что нужно упомянуть, так это то, что при заполнении макета отчета имена областей необходимо формировать на лету, в отличии от типовых регламентированных отчетов, где имена областей заранее фиксированы в макете.
-
Что получаем
В результате доработок на выходе имеем гибкий механизм настройки состава и заполнения бухгалтерской отчетности, а также удобный механизм дальнейшего создания подобных отчетов. Теперь в пользовательском режиме можно управлять наполнением созданного отчета.