├── DT-INF └── PROJECT.PMF ├── .gitignore ├── README.md ├── src ├── Subsystems │ └── KASL │ │ ├── KASL.mdo │ │ └── Subsystems │ │ └── Модели │ │ ├── Модели.mdo │ │ └── Subsystems │ │ └── МодельОтчета │ │ └── МодельОтчета.mdo ├── DataProcessors │ ├── МодельСхемыКомпоновкиДанных │ │ ├── МодельСхемыКомпоновкиДанных.mdo │ │ └── ObjectModule.bsl │ ├── МодельМакетаКомпоновкиДанных │ │ ├── МодельМакетаКомпоновкиДанных.mdo │ │ └── ObjectModule.bsl │ ├── МодельНастройкиКомпоновкиДанных │ │ ├── МодельНастройкиКомпоновкиДанных.mdo │ │ └── ObjectModule.bsl │ └── МодельМакетаОбластиКомпоновкиДанных │ │ ├── МодельМакетаОбластиКомпоновкиДанных.mdo │ │ └── ObjectModule.bsl └── Configuration │ └── Configuration.mdo ├── .project └── LICENSE /DT-INF/PROJECT.PMF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Runtime-Version: 8.3.25 3 | Base-Project: KASL-extentions 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # IDE 2 | /.metadata/ 3 | /.settings/ 4 | 5 | # Binary 6 | bin 7 | InfoBases 8 | tools 9 | examples -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Модель отчета на компоновке данных 2 | 3 | Смотрите описание в статье на Инфостарт [Модель СКД](https://infostart.ru/1c/tools/1973473/) 4 | 5 | ![Инфостарт](https://infostart.ru/bitrix/templates/sandbox_empty/assets/tpl/abo/img/logo.svg) 6 | -------------------------------------------------------------------------------- /src/Subsystems/KASL/KASL.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | KASL 4 | 5 | ru 6 | Библиотека подсистем КА 7 | 8 | true 9 | true 10 | Модели 11 | 12 | -------------------------------------------------------------------------------- /src/Subsystems/KASL/Subsystems/Модели/Модели.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | Модели 4 | 5 | ru 6 | Модели 7 | 8 | true 9 | МодельОтчета 10 | Subsystem.KASL 11 | 12 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | МодельОтчета 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.xtext.ui.shared.xtextBuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.xtext.ui.shared.xtextNature 16 | com._1c.g5.v8.dt.core.V8ExtensionNature 17 | 18 | 19 | -------------------------------------------------------------------------------- /src/DataProcessors/МодельСхемыКомпоновкиДанных/МодельСхемыКомпоновкиДанных.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | МодельСхемыКомпоновкиДанных 8 | 9 | ru 10 | Модель схемы компоновки данных 11 | 12 | true 13 | 14 | -------------------------------------------------------------------------------- /src/DataProcessors/МодельМакетаКомпоновкиДанных/МодельМакетаКомпоновкиДанных.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | МодельМакетаКомпоновкиДанных 8 | 9 | ru 10 | Модель макета компоновки данных 11 | 12 | true 13 | 14 | -------------------------------------------------------------------------------- /src/DataProcessors/МодельНастройкиКомпоновкиДанных/МодельНастройкиКомпоновкиДанных.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | МодельНастройкиКомпоновкиДанных 8 | 9 | ru 10 | Модель настройки компоновки данных 11 | 12 | true 13 | 14 | -------------------------------------------------------------------------------- /src/DataProcessors/МодельМакетаОбластиКомпоновкиДанных/МодельМакетаОбластиКомпоновкиДанных.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | МодельМакетаОбластиКомпоновкиДанных 8 | 9 | ru 10 | Модель макета области компоновки данных 11 | 12 | true 13 | 14 | -------------------------------------------------------------------------------- /src/Subsystems/KASL/Subsystems/Модели/Subsystems/МодельОтчета/МодельОтчета.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | МодельОтчета 4 | 5 | ru 6 | Модель отчета 7 | 8 | true 9 | DataProcessor.МодельСхемыКомпоновкиДанных 10 | DataProcessor.МодельНастройкиКомпоновкиДанных 11 | DataProcessor.МодельМакетаКомпоновкиДанных 12 | DataProcessor.МодельМакетаОбластиКомпоновкиДанных 13 | Subsystem.KASL.Subsystem.Модели 14 | 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Andrey 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/Configuration/Configuration.mdo: -------------------------------------------------------------------------------- 1 | 2 | 3 | МодельОтчета 4 | 5 | ru 6 | Модель отчета компоновки данных 7 | 8 | Adopted 9 | 10 | Checked 11 | Checked 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | KASL 21 | 8.3.25 22 | AddOn 23 | ManagedApplication 24 | Russian 25 | Калякин Андрей 26 | 1.0.0.4 27 | 28 | ru 29 | https://infostart.ru/profile/16301/ 30 | 31 | 32 | Русский 33 | Adopted 34 | 35 | Checked 36 | 37 | ru 38 | 39 | Subsystem.KASL 40 | DataProcessor.МодельМакетаКомпоновкиДанных 41 | DataProcessor.МодельМакетаОбластиКомпоновкиДанных 42 | DataProcessor.МодельНастройкиКомпоновкиДанных 43 | DataProcessor.МодельСхемыКомпоновкиДанных 44 | 45 | -------------------------------------------------------------------------------- /src/DataProcessors/МодельМакетаОбластиКомпоновкиДанных/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // Подсистема "Модель отчета" 2 | // Автор: Калякин Андрей Г. 3 | // https://github.com/KalyakinAG/kassl 4 | // https://github.com/KalyakinAG/report-model 5 | 6 | Перем 7 | МакетОбласти Экспорт, 8 | СтрокаТаблицы Экспорт, 9 | ЯчейкаТаблицы Экспорт, 10 | ПолеОбласти Экспорт, 11 | ОформлениеЯчейки Экспорт 12 | ; 13 | 14 | Функция СтрокаТаблицы() Экспорт 15 | СтрокаТаблицы = МакетОбласти.Добавить(Тип("СтрокаТаблицыОбластиКомпоновкиДанных")); 16 | Возврат ЭтотОбъект; 17 | КонецФункции 18 | 19 | Функция ЯчейкаТаблицы() Экспорт 20 | ЯчейкаТаблицы = СтрокаТаблицы.Ячейки.Добавить(); 21 | ОформлениеЯчейки = ЯчейкаТаблицы.Оформление; 22 | Возврат ЭтотОбъект; 23 | КонецФункции 24 | 25 | Функция ПолеОбласти(Значение, ФорматЗначения = Неопределено) Экспорт 26 | ПолеОбласти = ЯчейкаТаблицы.Элементы.Добавить(Тип("ПолеОбластиКомпоновкиДанных")); 27 | ПолеОбласти.Значение = Значение; 28 | Если ЗначениеЗаполнено(ФорматЗначения) Тогда 29 | ПолеОбласти.Оформление.УстановитьЗначениеПараметра("Формат", ФорматЗначения); 30 | КонецЕсли; 31 | Возврат ЭтотОбъект; 32 | КонецФункции 33 | 34 | // Для оформления ячейки таблицы используются следующие параметры оформления: 35 | // 1. ЦветФона (BackColor) - тип значения Цвет; 36 | // 2. ЦветТекста (TextColor) - тип значения Цвет; 37 | // 3. ЦветГраницы (BorderColor) - тип значения Цвет; 38 | // 4. СтильГраницы (BorderStyle) - тип значения Линия; 39 | // 5. СтильГраницы.Слева (BorderStyle.Left) - тип значения Линия; 40 | // 6. СтильГраницы.Сверху (BorderStyle.Top) - тип значения Линия; 41 | // 7. СтильГраницы.Справа (BorderStyle.Right) - тип значения Линия; 42 | // 8. СтильГраницы.Снизу (BorderStyle.Bottom) - тип значения Линия; 43 | // 9. Шрифт (Font) - тип значения Шрифт; 44 | // 10. Отступ (Indent) - тип значения Число; 45 | // 11. ГоризонтальноеПоложение (HorizontalAlign) - тип значения ГоризонтальноеПоложение; 46 | // 12. ВертикальноеПоложение (VerticalAlign) - тип значения ВертикальноеПоложение; 47 | // 13. Размещение (Placement) - размещение текста - тип значения ТипРазмещенияТекстаКомпоновкиДанных; 48 | // 14. ОриентацияТекста (TextOrientation) - тип значения Число; 49 | // 15. ВыделятьОтрицательные (MarkNegatives) - тип значения Булево; 50 | // 16. МинимальнаяШирина (MinWidth) - тип значения Число; 51 | // 17. МаксимальнаяШирина (MaxWidth) - тип значения Число; 52 | // 18. МинимальнаяВысота (MinHeight) - тип значения Число; 53 | // 19. МаксимальнаяВысота (MaxHeight) - тип значения Число; 54 | // 20. ОбъединятьПоГоризонтали (HorizontalMerge) - тип значения Булево; 55 | // 21. ОбъединятьПоВертикали (VerticalMerge) - тип значения Булево; 56 | // 22. ГоризонтальныйУровень (HorizontalLevel) - тип значения Число; 57 | // 23. ВертикальныйУровень (VerticalLevel) - тип значения Число; 58 | // 24. Расшифровка (Details) - тип ИдентификаторРасшифровкиКомпоновкиДанных; 59 | // 25. РежимИзмененияРазмераКолонки (ColumnSizeChangeMode) - возможность изменять размер колонки ячейки РежимИзмененияРазмера; 60 | // 26. ОтметкаНезаполненного (MarkIncomplete) - отмечать ячейку как незаполненную - тип значения Булево; 61 | // 27. ФиксироватьСлева (FixLeft) - признак того, что ячейку нужно фиксировать слева Булево; 62 | // 28. ФиксироватьСверху (FixTop) - признак того, что ячейку нужно фиксировать сверху Булево; 63 | // 29. РастягиватьПоГоризонтали (HorizontalStretch) - тип значения Булево. Указывает, что ширина текущей колонки рассчитывается автоматически; 64 | // 30. ВесовойКоэффициентШирины (WidthWeightFactor) - тип значения Число. Весовой коэффициент для автоматического расчета ширины колонки; 65 | // 31. Картинка (Picture) - тип ПараметрКомпоновкиДанных или Картинка. Если содержит параметр, то картинка получается из выражения параметра. 66 | // 32. РазмерКартинки (PictureSize) - тип РазмерКартинки. Способ определения размера картинки; 67 | // 33. ПоложениеТекстаОтносительноКартинки (PictureSizeTextPositionRelativeToPicture) - тип ПоложениеТекстаОтносительноКартинки. Положение текста относительно картинки; 68 | // 34. ГоризонтальноеПоложениеКартинки (PictureHorizontalAlign)- тип ГоризонтальноеПоложение. Размещение картинки по горизонтали; 69 | // 35. ВертикальноеПоложениеКартинки (PictureVerticalAlign) - тип ВертикальноеПоложение. Размещение картинки по вертикали; 70 | // 36. ОтступСлева (LeftMargin) - тип значения {ссылка:Объекты; 154; Число}; 71 | // 37. ОтступСправа (RightMargin) - тип значения {ссылка:Объекты; 154; Число}; 72 | // 38. ОтступСверху (TopMargin) - тип значения {ссылка:Объекты; 154; Число}; 73 | // 39. ОтступСнизу (BottomMargin) - тип значения {ссылка:Объекты; 154; Число}. 74 | Функция Оформление(ИмяПараметра, Значение) Экспорт 75 | ОформлениеЯчейки.УстановитьЗначениеПараметра(ИмяПараметра, Значение); 76 | Возврат ЭтотОбъект; 77 | КонецФункции 78 | 79 | Функция Ширина(Значение) Экспорт 80 | Оформление("МинимальнаяШирина", Значение); 81 | Оформление("МаксимальнаяШирина", Значение); 82 | Возврат ЭтотОбъект; 83 | КонецФункции 84 | 85 | Функция Высота(Значение) Экспорт 86 | Оформление("МинимальнаяВысота", Значение); 87 | Оформление("МаксимальнаяВысота", Значение); 88 | Возврат ЭтотОбъект; 89 | КонецФункции 90 | 91 | Функция Объединять(НомерСтроки1, НомерКолонки1, НомерСтроки2, НомерКолонки2) Экспорт 92 | Для Строка = НомерСтроки1 По НомерСтроки2 Цикл 93 | СтрокаТаблицы = МакетОбласти[Строка - 1]; 94 | Для Колонка = НомерКолонки1 По НомерКолонки2 Цикл 95 | ЯчейкаТаблицы = СтрокаТаблицы.Ячейки[Колонка - 1]; 96 | ОформлениеЯчейки = ЯчейкаТаблицы.Оформление; 97 | Если Колонка > НомерКолонки1 Тогда 98 | Оформление("ОбъединятьПоГоризонтали", Истина); 99 | КонецЕсли; 100 | Если Строка > НомерСтроки1 Тогда 101 | Оформление("ОбъединятьПоВертикали", Истина); 102 | КонецЕсли; 103 | КонецЦикла; 104 | КонецЦикла; 105 | Возврат ЭтотОбъект; 106 | КонецФункции 107 | 108 | МакетОбласти = Новый МакетОбластиКомпоновкиДанных; 109 | -------------------------------------------------------------------------------- /src/DataProcessors/МодельНастройкиКомпоновкиДанных/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // Подсистема "Модель отчета" 2 | // Автор: Калякин Андрей Г. 3 | // https://github.com/KalyakinAG/kassl 4 | // https://github.com/KalyakinAG/report-model 5 | 6 | Перем Настройки Экспорт; 7 | Перем ВыбранноеПоле; 8 | Перем ГруппаВыбранныхПолей; 9 | Перем ГруппаОтбора; 10 | Перем ЭлементОтбора; 11 | Перем Группировка; 12 | Перем ПолеГруппировки; 13 | Перем Таблица; 14 | Перем ЭлементУсловногоОформления; 15 | Перем ОформляемоеПоле; 16 | 17 | Перем Раздел; 18 | Перем Разделы; 19 | 20 | Функция ЭлементОформления() Экспорт 21 | ЭлементУсловногоОформления = Настройки.УсловноеОформление.Элементы.Добавить(); 22 | Возврат ЭтотОбъект; 23 | КонецФункции 24 | 25 | Функция Оформление(ИмяПараметра, ЗначениеПараметра) Экспорт 26 | ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра); 27 | Возврат ЭтотОбъект; 28 | КонецФункции 29 | 30 | Функция ОформляемоеПоле(ИмяПоля) 31 | ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); 32 | ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); 33 | ОформляемоеПоле.Использование = Истина; 34 | Возврат ЭтотОбъект; 35 | КонецФункции 36 | 37 | Функция Выбор() Экспорт 38 | Возврат ЭтотОбъект; 39 | КонецФункции 40 | 41 | Функция Поле(ИмяПоля, Заголовок = "") Экспорт 42 | Если Раздел = Разделы.УсловноеОформление Тогда 43 | Возврат ОформляемоеПоле(ИмяПоля); 44 | КонецЕсли; 45 | ЭтоАвтоПоле = ПустаяСтрока(ИмяПоля) ИЛИ ИмяПоля = "*"; 46 | Если ЭтоАвтоПоле Тогда 47 | ТипПоля = Тип("АвтоВыбранноеПолеКомпоновкиДанных"); 48 | Иначе 49 | ТипПоля = Тип("ВыбранноеПолеКомпоновкиДанных"); 50 | КонецЕсли; 51 | Если ГруппаВыбранныхПолей = Неопределено Тогда 52 | Если Группировка = Неопределено Тогда 53 | ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(ТипПоля); 54 | Иначе 55 | ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(ТипПоля); 56 | КонецЕсли; 57 | Иначе 58 | ВыбранноеПоле = ГруппаВыбранныхПолей.Элементы.Добавить(ТипПоля); 59 | КонецЕсли; 60 | ВыбранноеПоле.Использование = Истина; 61 | Если ЭтоАвтоПоле Тогда 62 | Возврат ЭтотОбъект; 63 | КонецЕсли; 64 | ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); 65 | Если ЗначениеЗаполнено(Заголовок) Тогда 66 | ВыбранноеПоле.Заголовок = Заголовок; 67 | КонецЕсли; 68 | Возврат ЭтотОбъект; 69 | КонецФункции 70 | 71 | Функция Поля(Поля) Экспорт 72 | Для Каждого ЭлементПоля Из ОбщийКлиентСервер.Массив(Поля) Цикл 73 | Если ТипЗнч(ЭлементПоля) = Тип("Строка") Тогда 74 | Поле(ЭлементПоля); 75 | Продолжить; 76 | КонецЕсли; 77 | Поле(ЭлементПоля.Имя, ЭлементПоля.Заголовок); 78 | КонецЦикла; 79 | Возврат ЭтотОбъект; 80 | КонецФункции 81 | 82 | Функция ГруппаНачать(Заголовок, Расположение = Неопределено) Экспорт 83 | Если ГруппаВыбранныхПолей = Неопределено Тогда 84 | Если Группировка = Неопределено Тогда 85 | ГруппаВыбранныхПолей = Настройки.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); 86 | Иначе 87 | ГруппаВыбранныхПолей = Группировка.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); 88 | КонецЕсли; 89 | Иначе 90 | ГруппаВыбранныхПолей = ГруппаВыбранныхПолей.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); 91 | КонецЕсли; 92 | ГруппаВыбранныхПолей.Использование = Истина; 93 | ГруппаВыбранныхПолей.Расположение = ?(Расположение = Неопределено, РасположениеПоляКомпоновкиДанных.Авто, Расположение); 94 | ГруппаВыбранныхПолей.Заголовок = Заголовок; 95 | Возврат ЭтотОбъект; 96 | КонецФункции 97 | 98 | Функция ГруппаЗавершить() Экспорт 99 | ГруппаВыбранныхПолей = ГруппаВыбранныхПолей.Родитель; 100 | Возврат ЭтотОбъект; 101 | КонецФункции 102 | 103 | Функция ОтборГруппаНачать(ТипГруппы) Экспорт 104 | Если ГруппаОтбора = Неопределено Тогда 105 | ГруппаОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); 106 | Иначе 107 | ГруппаОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); 108 | КонецЕсли; 109 | ГруппаОтбора.Использование = Истина; 110 | ГруппаОтбора.ТипГруппы = ТипГруппы; 111 | Возврат ЭтотОбъект; 112 | КонецФункции 113 | 114 | Функция ОтборГруппаИНачать() Экспорт 115 | ОтборГруппаНачать(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ); 116 | Возврат ЭтотОбъект; 117 | КонецФункции 118 | 119 | Функция ОтборГруппаИЛИНачать() Экспорт 120 | ОтборГруппаНачать(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли); 121 | Возврат ЭтотОбъект; 122 | КонецФункции 123 | 124 | Функция ОтборГруппаНЕНачать() Экспорт 125 | ОтборГруппаНачать(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе); 126 | Возврат ЭтотОбъект; 127 | КонецФункции 128 | 129 | Функция ОтборГруппаЗавершить() Экспорт 130 | ГруппаОтбора = ГруппаОтбора.Родитель; 131 | Возврат ЭтотОбъект; 132 | КонецФункции 133 | 134 | Функция Отбор(ИмяПоля, ВидСравнения = Неопределено, Значение) Экспорт 135 | Если ГруппаОтбора = Неопределено Тогда 136 | ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); 137 | Иначе 138 | ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); 139 | КонецЕсли; 140 | ЭлементОтбора.Использование = Истина; 141 | ЭлементОтбора.ЛевоеЗначение = ?(ТипЗнч(ИмяПоля) = Тип("Строка"), Новый ПолеКомпоновкиДанных(ИмяПоля), ИмяПоля); 142 | ЭлементОтбора.ПравоеЗначение = Значение; 143 | ЭлементОтбора.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения); 144 | Возврат ЭтотОбъект; 145 | КонецФункции 146 | 147 | Функция Порядок(ИмяПоля, ТипУпорядочивания = Неопределено) Экспорт 148 | ЭлементПорядка = Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); 149 | ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); 150 | Если ТипЗнч(ТипУпорядочивания) = Тип("Строка") Тогда 151 | Если ТипУпорядочивания = "-" Тогда 152 | ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; 153 | Иначе 154 | ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; 155 | КонецЕсли; 156 | Иначе 157 | ЭлементПорядка.ТипУпорядочивания = ?(ТипУпорядочивания = Неопределено, НаправлениеСортировкиКомпоновкиДанных.Возр, ТипУпорядочивания); 158 | КонецЕсли; 159 | ЭлементПорядка.Использование = Истина; 160 | Возврат ЭтотОбъект; 161 | КонецФункции 162 | 163 | Функция ГруппировкаНачать(ИмяГруппировки = Неопределено) Экспорт 164 | Если Группировка = Неопределено Тогда 165 | Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); 166 | ИначеЕсли ТипЗнч(Группировка) = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда 167 | Группировка = Группировка.Структура.Добавить(); 168 | Иначе 169 | Группировка = Группировка.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); 170 | КонецЕсли; 171 | Группировка.Использование = Истина; 172 | Если ИмяГруппировки <> Неопределено Тогда 173 | Группировка.Имя = ИмяГруппировки; 174 | КонецЕсли; 175 | // ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 176 | // ВыбранноеПоле.Использование = Истина; 177 | Возврат ЭтотОбъект; 178 | КонецФункции 179 | 180 | Функция ПолеГруппировки(ПутьКДанным) Экспорт 181 | Если ПутьКДанным = "*" Тогда 182 | ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("АвтоПолеГруппировкиКомпоновкиДанных")); 183 | Возврат ЭтотОбъект; 184 | КонецЕсли; 185 | ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); 186 | ПолеГруппировки.Использование = Истина; 187 | ПолеГруппировки.Поле = ?(ТипЗнч(ПутьКДанным) = Тип("Строка"), Новый ПолеКомпоновкиДанных(ПутьКДанным), ПутьКДанным); 188 | Возврат ЭтотОбъект; 189 | КонецФункции 190 | 191 | Функция ГруппировкаЗавершить() Экспорт 192 | Группировка = Группировка.Родитель; 193 | Возврат ЭтотОбъект; 194 | КонецФункции 195 | 196 | Функция ТаблицаНачать() Экспорт 197 | Если Группировка = Неопределено Тогда 198 | Таблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); 199 | Иначе 200 | Таблица = Группировка.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); 201 | КонецЕсли; 202 | Возврат ЭтотОбъект; 203 | КонецФункции 204 | 205 | Функция ТаблицаЗавершить() Экспорт 206 | Группировка = Таблица.Родитель; 207 | Таблица = Неопределено; 208 | Возврат ЭтотОбъект; 209 | КонецФункции 210 | 211 | Функция Строки() Экспорт 212 | Группировка = Таблица.Строки.Добавить(); 213 | Группировка.Использование = Истина; 214 | ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 215 | ВыбранноеПоле.Использование = Истина; 216 | Возврат ЭтотОбъект; 217 | КонецФункции 218 | 219 | Функция Колонки() Экспорт 220 | Группировка = Таблица.Колонки.Добавить(); 221 | Группировка.Использование = Истина; 222 | ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 223 | ВыбранноеПоле.Использование = Истина; 224 | Возврат ЭтотОбъект; 225 | КонецФункции 226 | 227 | Функция Параметр(ИмяПараметра, Значение) Экспорт 228 | Если Раздел = Разделы.ПараметрыВывода Тогда 229 | Если Группировка = Неопределено Тогда 230 | Параметр = Настройки.ПараметрыВывода.Элементы.Найти(ИмяПараметра); 231 | Иначе 232 | Параметр = Группировка.ПараметрыВывода.Элементы.Найти(ИмяПараметра); 233 | КонецЕсли; 234 | Если Параметр = Неопределено Тогда 235 | ВызватьИсключение "Неизвестный параметр вывода " + ИмяПараметра; 236 | КонецЕсли; 237 | Параметр.Значение = Значение; 238 | Параметр.Использование = Истина; 239 | ИначеЕсли Раздел = Разделы.ПараметрыДанных Тогда 240 | Параметр = Настройки.ПараметрыДанных.Элементы.Добавить(); 241 | Параметр.Параметр = Новый ПараметрКомпоновкиДанных(ИмяПараметра); 242 | Параметр.Значение = Значение; 243 | Параметр.Использование = Истина; 244 | Иначе 245 | ВызватьИсключение "Не задан контекст для параметра настройки СКД!"; 246 | КонецЕсли; 247 | Возврат ЭтотОбъект; 248 | КонецФункции 249 | 250 | Функция Измерения() Экспорт 251 | Раздел = Разделы.Измерения; 252 | НомерПериода = 0; 253 | Возврат ЭтотОбъект; 254 | КонецФункции 255 | 256 | Функция Реквизиты() Экспорт 257 | Раздел = Разделы.Реквизиты; 258 | Возврат ЭтотОбъект; 259 | КонецФункции 260 | 261 | Функция Ресурсы() Экспорт 262 | Раздел = Разделы.Ресурсы; 263 | Возврат ЭтотОбъект; 264 | КонецФункции 265 | 266 | Функция Условия() Экспорт 267 | Раздел = Разделы.Условия; 268 | Возврат ЭтотОбъект; 269 | КонецФункции 270 | 271 | Функция УсловноеОформление() Экспорт 272 | Раздел = Разделы.УсловноеОформление; 273 | Возврат ЭтотОбъект; 274 | КонецФункции 275 | 276 | Функция Структура() Экспорт 277 | Раздел = Разделы.Структура; 278 | Возврат ЭтотОбъект; 279 | КонецФункции 280 | 281 | Функция ПараметрыДанных() Экспорт 282 | Раздел = Разделы.ПараметрыДанных; 283 | Возврат ЭтотОбъект; 284 | КонецФункции 285 | 286 | Функция ПараметрыВывода() Экспорт 287 | Раздел = Разделы.ПараметрыВывода; 288 | Возврат ЭтотОбъект; 289 | КонецФункции 290 | 291 | Разделы = Новый Структура("Измерения, Реквизиты, Ресурсы, Условия, УсловноеОформление, Структура, ПараметрыДанных, ПараметрыВывода", 1, 2, 3, 4, 5, 6, 7, 8); 292 | -------------------------------------------------------------------------------- /src/DataProcessors/МодельМакетаКомпоновкиДанных/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // Подсистема "Модель отчета" 2 | // Автор: Калякин Андрей Г. 3 | // https://github.com/KalyakinAG/kassl 4 | // https://github.com/KalyakinAG/report-model 5 | 6 | //@skip-check object-module-export-variable 7 | //@skip-check module-accessibility-at-client 8 | 9 | #Область ОписаниеПеременных 10 | 11 | Перем СхемаКомпоновкиДанных Экспорт; 12 | Перем НастройкиКомпоновкиДанных Экспорт; 13 | Перем ДанныеРасшифровки Экспорт; 14 | Перем КомпоновщикМакета Экспорт; 15 | Перем МакетКомпоновкиДанных Экспорт; 16 | Перем МенеджерВременныхТаблиц Экспорт; 17 | Перем ВнешниеНаборыДанных Экспорт; 18 | 19 | Перем СтруктураМакета Экспорт; 20 | Перем ГруппировкиМакета Экспорт; 21 | Перем ТипГенератора; 22 | Перем ТипыГенераторов; 23 | 24 | #КонецОбласти 25 | 26 | Функция Схема(_Схема) Экспорт 27 | СхемаКомпоновкиДанных = _Схема; 28 | Возврат ЭтотОбъект; 29 | КонецФункции 30 | 31 | Функция Настройки(Настройки) Экспорт 32 | НастройкиКомпоновкиДанных = Настройки; 33 | Возврат ЭтотОбъект; 34 | КонецФункции 35 | 36 | Функция МенеджерВременныхТаблиц(_МенеджерВременныхТаблиц) Экспорт 37 | МенеджерВременныхТаблиц = _МенеджерВременныхТаблиц; 38 | Возврат ЭтотОбъект; 39 | КонецФункции 40 | 41 | Функция ВнешниеНаборыДанных(_ВнешниеНаборыДанных) Экспорт 42 | ВнешниеНаборыДанных = _ВнешниеНаборыДанных; 43 | Возврат ЭтотОбъект; 44 | КонецФункции 45 | 46 | Функция НаборДанных(Данные, Имя = "НаборДанных") Экспорт 47 | Если ТипЗнч(Данные) = Тип("Структура") Тогда 48 | ВнешниеНаборыДанных = Данные; 49 | Возврат ЭтотОбъект; 50 | КонецЕсли; 51 | ВнешниеНаборыДанных.Вставить(Имя, Данные); 52 | Возврат ЭтотОбъект; 53 | КонецФункции 54 | 55 | // ТипГенератора = "ТабличныйДокумент", "ДеревоЗначений", "ТаблицаЗначений" 56 | Функция Скомпоновать(Расшифровка = Неопределено, Генератор = "ТабличныйДокумент") Экспорт 57 | ТипГенератора = ТипыГенераторов[Генератор]; 58 | ГруппировкиМакета = Новый Массив; 59 | СтруктураМакета = Новый Массив; 60 | ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных(); 61 | КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных(); 62 | Если ТипГенератора = ТипыГенераторов.ТабличныйДокумент Тогда 63 | МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных, ДанныеРасшифровки); 64 | Иначе 65 | МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных, ДанныеРасшифровки, , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); 66 | КонецЕсли; 67 | Расшифровка = ДанныеРасшифровки; 68 | Возврат ЭтотОбъект; 69 | КонецФункции 70 | 71 | Функция СкомпоноватьДеревоЗначений(Расшифровка = Неопределено) Экспорт 72 | Возврат Скомпоновать(Расшифровка, "ДеревоЗначений"); 73 | КонецФункции 74 | 75 | Функция СкомпоноватьТаблицуЗначений(Расшифровка = Неопределено) Экспорт 76 | Возврат Скомпоновать(Расшифровка, "ТаблицаЗначений"); 77 | КонецФункции 78 | 79 | Функция ВывестиВТабличныйДокумент(Результат = Неопределено) Экспорт 80 | Если Результат = Неопределено Тогда 81 | Результат = Новый ТабличныйДокумент; 82 | КонецЕсли; 83 | ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; 84 | ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, , , МенеджерВременныхТаблиц); 85 | // Вывод результата в отчет 86 | ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; 87 | ПроцессорВывода.УстановитьДокумент(Результат); 88 | ПроцессорВывода.Вывести(ПроцессорКомпоновки); 89 | Возврат Результат; 90 | КонецФункции 91 | 92 | Функция ВывестиВКоллекциюЗначений(Коллекция) Экспорт 93 | ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; 94 | ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, ВнешниеНаборыДанных, ДанныеРасшифровки, , , МенеджерВременныхТаблиц); 95 | // Вывод результата в дерево значений 96 | ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; 97 | ПроцессорВывода.УстановитьОбъект(Коллекция); 98 | ПроцессорВывода.Вывести(ПроцессорКомпоновки); 99 | Возврат Коллекция; 100 | КонецФункции 101 | 102 | Функция Вывести(ТабличныйДокумент = Неопределено) Экспорт 103 | Если ТипГенератора = ТипыГенераторов.ТабличныйДокумент Тогда 104 | Возврат ВывестиВТабличныйДокумент(ТабличныйДокумент); 105 | ИначеЕсли ТипГенератора = ТипыГенераторов.ДеревоЗначений Тогда 106 | Возврат ВывестиВКоллекциюЗначений(Новый ДеревоЗначений); 107 | ИначеЕсли ТипГенератора = ТипыГенераторов.ТаблицаЗначений Тогда 108 | Возврат ВывестиВКоллекциюЗначений(Новый ТаблицаЗначений); 109 | Иначе 110 | ВызватьИсключение "Неизвестный тип генератора компоновки: " + ТипГенератора; 111 | КонецЕсли; 112 | КонецФункции 113 | 114 | Функция ИдентификаторТаблицы(ИдентификаторТаблицы = "") Экспорт 115 | Для Каждого ОписаниеМакета Из МакетКомпоновкиДанных.Макеты Цикл 116 | Макет = ОписаниеМакета.Макет; 117 | Если ТипЗнч(Макет) <> Тип("МакетОбластиКомпоновкиДанных") Тогда 118 | Продолжить; 119 | КонецЕсли; 120 | Для Каждого СтрокаТаблицыОбласти Из Макет Цикл 121 | СтрокаТаблицыОбласти.ИдентификаторТаблицы = ИдентификаторТаблицы; 122 | КонецЦикла; 123 | КонецЦикла; 124 | Возврат ЭтотОбъект; 125 | КонецФункции 126 | 127 | Процедура ЗаполнитьСтруктуруМакета(ЭлементыМакета, ЭлементМакета, МакетКомпоновкиДанных) 128 | ТипЭлемента = ТипЗнч(ЭлементМакета); 129 | 130 | Если ТипЭлемента = Тип("ВложенныйОбъектМакетаКомпоновкиДанных") Тогда 131 | ОписаниеЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 132 | ОписаниеЭлементаМакета.Тип = "ВложенныйОбъектМакетаКомпоновкиДанных"; 133 | ЗаполнитьЗначенияСвойств(ОписаниеЭлементаМакета, ЭлементМакета); 134 | ПодчиненныеЭлементы = Новый Массив; 135 | ЗаполнитьСтруктуруМакета(ПодчиненныеЭлементы, ЭлементМакета.КомпоновкаДанных, ЭлементМакета.КомпоновкаДанных); 136 | ОписаниеЭлементаМакета.ПодчиненныеЭлементы = ПодчиненныеЭлементы; 137 | // Для Каждого ОписаниеМакета Из ЭлементМакета.КомпоновкаДанных.Макеты Цикл 138 | // Макет = ОписаниеМакета.Макет; 139 | // Если ТипЗнч(Макет) <> Тип("МакетОбластиКомпоновкиДанных") Тогда 140 | // Продолжить; 141 | // КонецЕсли; 142 | // Макет[0].ИдентификаторТаблицы = ИдентификаторТаблицы; 143 | // КонецЦикла; 144 | Возврат; 145 | КонецЕсли; 146 | 147 | Для Каждого ПодчиненныйЭлементМакета Из ЭлементМакета.Тело Цикл 148 | ТипПодчиненногоЭлемента = ТипЗнч(ПодчиненныйЭлементМакета); 149 | Если ТипПодчиненногоЭлемента = Тип("МакетОбластиМакетаКомпоновкиДанных") Тогда 150 | ОписаниеЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 151 | ОписаниеЭлементаМакета.Тип = "МакетОбластиМакетаКомпоновкиДанных"; 152 | ОписаниеЭлементаМакета.Макет = ПодчиненныйЭлементМакета.Макет; 153 | Если ЗначениеЗаполнено(ПодчиненныйЭлементМакета.Макет) Тогда 154 | ОписаниеМакета = МакетКомпоновкиДанных.Макеты.Найти(ПодчиненныйЭлементМакета.Макет); 155 | Параметры = РаботаСМассивом.АТДМассив(ОписаниеМакета.Параметры) 156 | .Отобрать("ТипЗнч(Элемент) = Тип('ПараметрОбластиВыражениеКомпоновкиДанных')") 157 | .Отобразить("Новый Структура('Выражение, Имя', Элемент.Выражение, Элемент.Имя)") 158 | .ВМассив() 159 | ; 160 | ПараметрыРасшифровки = РаботаСМассивом.АТДМассив(ОписаниеМакета.Параметры) 161 | .Отобрать("ТипЗнч(Элемент) = Тип('ПараметрОбластиРасшифровкаКомпоновкиДанных')") 162 | .Отобразить("Новый Структура('ВыраженияПолей, Имя', Элемент.ВыраженияПолей, Элемент.Имя)") 163 | .ВМассив() 164 | ; 165 | Для Каждого Элемент Из ПараметрыРасшифровки ЦИкл 166 | Элемент.ВыраженияПолей = РаботаСМассивом.АТДМассив(Элемент.ВыраженияПолей) 167 | .Отобразить("Новый Структура('Поле, Выражение', Элемент.Поле, Элемент.Выражение)") 168 | .ВМассив() 169 | ; 170 | КонецЦикла; 171 | ОписаниеЭлементаМакета.Параметры = Параметры; 172 | ОписаниеЭлементаМакета.ПараметрыРасшифровки = ПараметрыРасшифровки; 173 | КонецЕсли; 174 | ЭлементыМакета.Добавить(ОписаниеЭлементаМакета); 175 | Продолжить; 176 | КонецЕсли; 177 | 178 | Если ТипПодчиненногоЭлемента = Тип("ГруппировкаМакетаКомпоновкиДанных") Тогда 179 | ПоляГруппировки = РаботаСМассивом.АТДМассив(ПодчиненныйЭлементМакета.Группировка) 180 | .Отобразить("Элемент.ИмяПоля") 181 | .ВМассив() 182 | ; 183 | ОписаниеЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 184 | ОписаниеЭлементаМакета.Тип = Строка(ТипПодчиненногоЭлемента); 185 | ЗаполнитьЗначенияСвойств(ОписаниеЭлементаМакета, ПодчиненныйЭлементМакета); 186 | ОписаниеЭлементаМакета.ПоляГруппировки = ПоляГруппировки; 187 | ГруппировкиМакета.Добавить(Новый Структура("Имя, Макет", ОписаниеЭлементаМакета.Имя, ОписаниеЭлементаМакета)); 188 | ПодчиненныеЭлементы = Новый Массив; 189 | ЗаполнитьСтруктуруМакета(ПодчиненныеЭлементы, ПодчиненныйЭлементМакета, МакетКомпоновкиДанных); 190 | ОписаниеЭлементаМакета.ПодчиненныеЭлементы = ПодчиненныеЭлементы; 191 | Если ЗначениеЗаполнено(ПодчиненныйЭлементМакета.МакетПодвала) Тогда 192 | ОписаниеМакета = МакетКомпоновкиДанных.Макеты.Найти(ПодчиненныйЭлементМакета.МакетПодвала); 193 | Параметры = РаботаСМассивом.АТДМассив(ОписаниеМакета.Параметры) 194 | .Отобрать("ТипЗнч(Элемент) = Тип('ПараметрОбластиВыражениеКомпоновкиДанных')") 195 | .Отобразить("Новый Структура('Выражение, Имя', Элемент.Выражение, Элемент.Имя)") 196 | .ВМассив() 197 | ; 198 | ПараметрыРасшифровки = РаботаСМассивом.АТДМассив(ОписаниеМакета.Параметры) 199 | .Отобрать("ТипЗнч(Элемент) = Тип('ПараметрОбластиРасшифровкаКомпоновкиДанных')") 200 | .Отобразить("Новый Структура('ВыраженияПолей, Имя', Элемент.ВыраженияПолей, Элемент.Имя)") 201 | .ВМассив() 202 | ; 203 | Для Каждого Элемент Из ПараметрыРасшифровки ЦИкл 204 | Элемент.ВыраженияПолей = РаботаСМассивом.АТДМассив(Элемент.ВыраженияПолей) 205 | .Отобразить("Новый Структура('Поле, Выражение', Элемент.Поле, Элемент.Выражение)") 206 | .ВМассив() 207 | ; 208 | КонецЦикла; 209 | ОписаниеЭлементаМакета.Параметры = Параметры; 210 | ОписаниеЭлементаМакета.ПараметрыРасшифровки = ПараметрыРасшифровки; 211 | КонецЕсли; 212 | ЭлементыМакета.Добавить(ОписаниеЭлементаМакета); 213 | Продолжить; 214 | КонецЕсли; 215 | 216 | Если ТипПодчиненногоЭлемента = Тип("МакетГруппировкиТаблицыМакетаКомпоновкиДанных") Тогда 217 | ОписаниеЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 218 | ОписаниеЭлементаМакета.Тип = Строка(ТипПодчиненногоЭлемента); 219 | ОписаниеЭлементаМакета.Макет = ПодчиненныйЭлементМакета.Макет; 220 | ЭлементыМакета.Добавить(ОписаниеЭлементаМакета); 221 | Продолжить; 222 | КонецЕсли; 223 | 224 | Если ТипПодчиненногоЭлемента = Тип("ТаблицаМакетаКомпоновкиДанных") Тогда 225 | ОписаниеЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 226 | ОписаниеЭлементаМакета.Тип = Строка(ТипПодчиненногоЭлемента); 227 | ЗаполнитьЗначенияСвойств(ОписаниеЭлементаМакета, ПодчиненныйЭлементМакета); 228 | Колонки = Новый Массив; 229 | Для Каждого ЭлементМакетаКолонки Из ПодчиненныйЭлементМакета.Колонки Цикл 230 | ТипПодчиненногоЭлемента = ТипЗнч(ЭлементМакетаКолонки); 231 | 232 | ПоляГруппировки = РаботаСМассивом.АТДМассив(ЭлементМакетаКолонки.Группировка) 233 | .Отобразить("Элемент.ИмяПоля") 234 | .ВМассив() 235 | ; 236 | ОписаниеПодчиненногоЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 237 | ОписаниеПодчиненногоЭлементаМакета.Тип = Строка(ТипПодчиненногоЭлемента); 238 | ЗаполнитьЗначенияСвойств(ОписаниеПодчиненногоЭлементаМакета, ЭлементМакетаКолонки, "Имя, Идентификатор"); 239 | ОписаниеПодчиненногоЭлементаМакета.ПоляГруппировки = ПоляГруппировки; 240 | ОписаниеПодчиненногоЭлементаМакета.МакетШапки = ЭлементМакетаКолонки.МакетШапки.Макет; 241 | ОписаниеПодчиненногоЭлементаМакета.МакетПодвала = ЭлементМакетаКолонки.МакетПодвала.Макет; 242 | 243 | ПодчиненныеЭлементы = Новый Массив; 244 | ЗаполнитьСтруктуруМакета(ПодчиненныеЭлементы, ЭлементМакетаКолонки, МакетКомпоновкиДанных); 245 | ОписаниеПодчиненногоЭлементаМакета.ПодчиненныеЭлементы = ПодчиненныеЭлементы; 246 | 247 | Колонки.Добавить(ОписаниеПодчиненногоЭлементаМакета); 248 | КонецЦикла; 249 | 250 | Строки = Новый Массив; 251 | Для Каждого ЭлементМакетаСтроки Из ПодчиненныйЭлементМакета.Колонки Цикл 252 | ТипПодчиненногоЭлемента = ТипЗнч(ЭлементМакетаСтроки); 253 | 254 | ПоляГруппировки = РаботаСМассивом.АТДМассив(ЭлементМакетаСтроки.Группировка) 255 | .Отобразить("Элемент.ИмяПоля") 256 | .ВМассив() 257 | ; 258 | ОписаниеПодчиненногоЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 259 | ОписаниеПодчиненногоЭлементаМакета.Тип = Строка(ТипПодчиненногоЭлемента); 260 | ЗаполнитьЗначенияСвойств(ОписаниеПодчиненногоЭлементаМакета, ЭлементМакетаСтроки, "Имя, Идентификатор"); 261 | ОписаниеПодчиненногоЭлементаМакета.ПоляГруппировки = ПоляГруппировки; 262 | ОписаниеПодчиненногоЭлементаМакета.МакетШапки = ЭлементМакетаСтроки.МакетШапки.Макет; 263 | ОписаниеПодчиненногоЭлементаМакета.МакетПодвала = ЭлементМакетаСтроки.МакетПодвала.Макет; 264 | 265 | ПодчиненныеЭлементы = Новый Массив; 266 | ЗаполнитьСтруктуруМакета(ПодчиненныеЭлементы, ЭлементМакетаСтроки, МакетКомпоновкиДанных); 267 | ОписаниеПодчиненногоЭлементаМакета.ПодчиненныеЭлементы = ПодчиненныеЭлементы; 268 | 269 | Строки.Добавить(ОписаниеПодчиненногоЭлементаМакета); 270 | КонецЦикла; 271 | 272 | ОписаниеЭлементаМакета.Вставить("Колонки", Колонки); 273 | ОписаниеЭлементаМакета.Вставить("Строки", Строки); 274 | 275 | ЭлементыМакета.Добавить(ОписаниеЭлементаМакета); 276 | Возврат; 277 | КонецЕсли; 278 | 279 | ОписаниеЭлементаМакета = Новый Структура("Тип, Имя, Идентификатор, МакетШапки, МакетПодвала, ПоляГруппировки, Макет, ПодчиненныеЭлементы, Параметры, ПараметрыРасшифровки"); 280 | ОписаниеЭлементаМакета.Тип = Строка(ТипЭлемента); 281 | ЗаполнитьЗначенияСвойств(ОписаниеЭлементаМакета, ПодчиненныйЭлементМакета); 282 | ПодчиненныеЭлементы = Новый Массив; 283 | ЗаполнитьСтруктуруМакета(ПодчиненныеЭлементы, ПодчиненныйЭлементМакета, МакетКомпоновкиДанных); 284 | ОписаниеЭлементаМакета.ПодчиненныеЭлементы = ПодчиненныеЭлементы; 285 | ЭлементыМакета.Добавить(ОписаниеЭлементаМакета); 286 | КонецЦикла; 287 | КонецПроцедуры 288 | 289 | Функция СтруктураМакета() Экспорт 290 | Если ЗначениеЗаполнено(СтруктураМакета) Тогда 291 | Возврат СтруктураМакета; 292 | КонецЕсли; 293 | ГруппировкиМакета = Новый Массив; 294 | СтруктураМакета = Новый Массив; 295 | ЗаполнитьСтруктуруМакета(СтруктураМакета, МакетКомпоновкиДанных, МакетКомпоновкиДанных); 296 | Возврат СтруктураМакета; 297 | КонецФункции 298 | 299 | Функция ГруппировкиМакета() Экспорт 300 | Если ЗначениеЗаполнено(СтруктураМакета) Тогда 301 | Возврат ГруппировкиМакета; 302 | КонецЕсли; 303 | ГруппировкиМакета = Новый Массив; 304 | СтруктураМакета = Новый Массив; 305 | ЗаполнитьСтруктуруМакета(СтруктураМакета, МакетКомпоновкиДанных, МакетКомпоновкиДанных); 306 | Возврат ГруппировкиМакета; 307 | КонецФункции 308 | 309 | ТипыГенераторов = Новый Структура("ТабличныйДокумент, ДеревоЗначений, ТаблицаЗначений", 1, 2, 3); 310 | ВнешниеНаборыДанных = Новый Структура; -------------------------------------------------------------------------------- /src/DataProcessors/МодельСхемыКомпоновкиДанных/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | // Подсистема "Модель отчета" 2 | // Автор: Калякин Андрей Г. 3 | // https://github.com/KalyakinAG/kassl 4 | // https://github.com/KalyakinAG/report-model 5 | 6 | //@skip-check object-module-export-variable 7 | //@skip-check module-accessibility-at-client 8 | 9 | #Область ОписаниеПеременных 10 | 11 | Перем СхемаКомпоновкиДанных Экспорт; 12 | Перем НаборДанных; 13 | Перем ПолеНабораДанных; 14 | Перем ПолеРесурса; 15 | Перем ВычисляемоеПоле; 16 | Перем ПараметрСхемы; 17 | Перем Раздел; 18 | Перем Разделы; 19 | Перем НомерПериода; 20 | Перем Роль; 21 | Перем ВнешниеНаборыДанных Экспорт; 22 | Перем НаборыДанных Экспорт; 23 | Перем КолонкиНабораДанных; 24 | Перем Соединение; 25 | Перем ВариантНастроек; 26 | 27 | Перем Настройки; 28 | Перем ВыбранноеПоле; 29 | Перем ГруппаВыбранныхПолей; 30 | Перем ГруппаОтбора; 31 | Перем ЭлементОтбора; 32 | Перем Группировка; 33 | Перем ПолеГруппировки; 34 | Перем Таблица; 35 | Перем ЭлементУсловногоОформления; 36 | Перем ОформляемоеПоле; 37 | 38 | #КонецОбласти 39 | 40 | #Область ПрограммныйИнтерфейс 41 | 42 | Функция НаборДанныхЗапрос(ТекстЗапроса, ИмяНабораДанных = "НаборДанных") Экспорт 43 | НомерПериода = 0; 44 | НаборДанных = НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных")); 45 | НаборДанных.Имя = ИмяНабораДанных; 46 | НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина; 47 | НаборДанных.ИспользоватьГруппировкиЗапросаЕслиВозможно = Истина; 48 | НаборДанных.Запрос = ТекстЗапроса; 49 | НаборДанных.ИсточникДанных = "ИсточникДанных"; 50 | Возврат ЭтотОбъект; 51 | КонецФункции 52 | 53 | Функция НаборДанныхОбъект(Данные, ИмяНабораДанных = "НаборДанных", ИмяОбъекта = Неопределено) Экспорт 54 | КолонкиНабораДанных = Данные.Колонки; 55 | Если НЕ ЗначениеЗаполнено(ИмяОбъекта) Тогда 56 | ИмяОбъекта = ОбщийКлиентСервер.ИмяПоУникальномуИдентификатору(); 57 | КонецЕсли; 58 | ВнешниеНаборыДанных.Вставить(ИмяОбъекта, Данные); 59 | НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных")); 60 | НаборДанных.Имя = ИмяНабораДанных; 61 | НаборДанных.ИмяОбъекта = ИмяОбъекта; 62 | НаборДанных.ИсточникДанных = "ИсточникДанных"; 63 | Возврат ЭтотОбъект; 64 | КонецФункции 65 | 66 | Функция ВнутреннееСоединение(НаборДанныхИсточник, НаборДанныхПриемник, Связь = Неопределено) Экспорт 67 | Соединение = СхемаКомпоновкиДанных.СвязиНаборовДанных.Добавить(); 68 | Соединение.Обязательная = Истина; 69 | Соединение.НаборДанныхИсточник = НаборДанныхИсточник; 70 | Соединение.НаборДанныхПриемник = НаборДанныхПриемник; 71 | 72 | Если ЗначениеЗаполнено(Связь) Тогда 73 | Связь(Связь); 74 | КонецЕсли; 75 | 76 | Возврат ЭтотОбъект; 77 | КонецФункции 78 | 79 | Функция ЛевоеСоединение(НаборДанныхИсточник, НаборДанныхПриемник) Экспорт 80 | Соединение = СхемаКомпоновкиДанных.СвязиНаборовДанных.Добавить(); 81 | Соединение.НаборДанныхИсточник = НаборДанныхИсточник; 82 | Соединение.НаборДанныхПриемник = НаборДанныхПриемник; 83 | Возврат ЭтотОбъект; 84 | КонецФункции 85 | 86 | Функция Связь(СоответствиеПолей) Экспорт 87 | ЭтоПервое = Истина; 88 | Для Каждого Выражение Из ОбщийКлиентСервер.Массив(СоответствиеПолей) Цикл 89 | Если НЕ ЭтоПервое Тогда 90 | Соединение1 = Соединение; 91 | Соединение = СхемаКомпоновкиДанных.СвязиНаборовДанных.Добавить(); 92 | ЗаполнитьЗначенияСвойств(Соединение, Соединение1); 93 | КонецЕсли; 94 | ЭтоПервое = Ложь; 95 | Состав = СтрРазделить(Выражение, "= ", Ложь); 96 | Если Состав.Количество() = 1 Тогда 97 | Поле = Состав[0]; 98 | Соединение.ВыражениеИсточник = Поле; 99 | Соединение.ВыражениеПриемник = Поле; 100 | Продолжить; 101 | КонецЕсли; 102 | Соединение.ВыражениеИсточник = Состав[0]; 103 | Соединение.ВыражениеПриемник = Состав[1]; 104 | КонецЦикла; 105 | Возврат ЭтотОбъект; 106 | КонецФункции 107 | 108 | Функция УсловиеСвязи(ВыражениеУсловия) Экспорт 109 | Соединение.УсловиеСвязи = ВыражениеУсловия; 110 | Возврат ЭтотОбъект; 111 | КонецФункции 112 | 113 | Функция ПараметрСвязи(Параметр) Экспорт 114 | Соединение.Параметр = Параметр; 115 | Возврат ЭтотОбъект; 116 | КонецФункции 117 | 118 | Функция НачальноеВыражение(НачальноеВыражениеСвязи) Экспорт 119 | Соединение.НачальноеВыражение = НачальноеВыражениеСвязи; 120 | Возврат ЭтотОбъект; 121 | КонецФункции 122 | 123 | Функция Счет(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", ВыражениеВидаСчета = Неопределено) Экспорт 124 | Если НЕ ЗначениеЗаполнено(ПутьКДанным) Тогда 125 | ПутьКДанным = ИмяПоля; 126 | КонецЕсли; 127 | Если НЕ ЗначениеЗаполнено(ВыражениеВидаСчета) Тогда 128 | ВыражениеВидаСчета = ИмяПоля + "." + "Вид"; 129 | КонецЕсли; 130 | ПолеНабораДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); 131 | ПолеНабораДанных.Поле = ИмяПоля; 132 | ПолеНабораДанных.ПутьКДанным = ПутьКДанным; 133 | ПолеНабораДанных.Заголовок = Заголовок; 134 | Роль = ПолеНабораДанных.Роль; 135 | Если Раздел = Разделы.Измерения Тогда 136 | ПолеНабораДанных.Роль.Измерение = Истина; 137 | КонецЕсли; 138 | Роль.ВыражениеВидаСчета = ВыражениеВидаСчета; 139 | Если КолонкиНабораДанных <> Неопределено Тогда 140 | ПолеНабораДанных.ТипЗначения = КолонкиНабораДанных[ИмяПоля].ТипЗначения; 141 | КонецЕсли; 142 | Возврат ЭтотОбъект; 143 | КонецФункции 144 | 145 | Функция Поле(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Выражение = "", Группировки = Неопределено) Экспорт 146 | Если Настройки <> Неопределено Тогда 147 | ПолеНастройки(ИмяПоля, Заголовок); 148 | Возврат ЭтотОбъект; 149 | КонецЕсли; 150 | Если НЕ ЗначениеЗаполнено(ПутьКДанным) Тогда 151 | ПутьКДанным = ИмяПоля; 152 | КонецЕсли; 153 | ПолеНабораДанных = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); 154 | ПолеНабораДанных.Поле = ИмяПоля; 155 | ПолеНабораДанных.Заголовок = Заголовок; 156 | ПолеНабораДанных.ПутьКДанным = ПутьКДанным; 157 | Роль = ПолеНабораДанных.Роль; 158 | Если Раздел = Разделы.Измерения Тогда 159 | ПолеНабораДанных.Роль.Измерение = Истина; 160 | ИначеЕсли Раздел = Разделы.Ресурсы Тогда 161 | ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить(); 162 | ПолеРесурса.ПутьКДанным = ПутьКДанным; 163 | ПолеРесурса.Выражение = Выражение; 164 | Если ЗначениеЗаполнено(Группировки) Тогда 165 | ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПолеРесурса.Группировки, ОбщийКлиентСервер.Массив(Группировки)); 166 | КонецЕсли; 167 | КонецЕсли; 168 | Если КолонкиНабораДанных <> Неопределено Тогда 169 | ПолеНабораДанных.ТипЗначения = КолонкиНабораДанных[ИмяПоля].ТипЗначения; 170 | КонецЕсли; 171 | Возврат ЭтотОбъект; 172 | КонецФункции 173 | 174 | //Для оформления используются следующие элементы оформления: 175 | //ЦветФона (BackColor) - тип значения Цвет; 176 | //ЦветТекста (TextColor) - тип значения Цвет; 177 | //ЦветГраницы (BorderColor) - тип значения Цвет; 178 | //СтильГраницы (BorderStyle) - тип значения Линия; 179 | //СтильГраницы.Слева (BorderStyle.Left) - тип значения Линия; 180 | //СтильГраницы.Сверху (BorderStyle.Top) - тип значения Линия; 181 | //СтильГраницы.Справа (BorderStyle.Right) - тип значения Линия; 182 | //СтильГраницы.Снизу (BorderStyle.Bottom) - тип значения Линия; 183 | //Шрифт (Font) - тип значения Шрифт; 184 | //Отступ (Indent) - тип значения Число; 185 | //АвтоОтступ (AutoIndent) - тип значения Число; 186 | //ГоризонтальноеПоложение (HorizontalAlign) - тип значения ГоризонтальноеПоложение; 187 | //ВертикальноеПоложение (VerticalAlign) - тип значения ВертикальноеПоложение; 188 | //Размещение (Placement) - размещение текста - тип значения ТипРазмещенияТекстаКомпоновкиДанных; 189 | //ОриентацияТекста (TextOrientation) - тип значения Число; 190 | //Формат (Format) - тип значения Строка (форматная строка); 191 | //ВыделятьОтрицательные (MarkNegatives) - тип значения Булево; 192 | //МинимальнаяШирина (MinWidth) - тип значения Число; 193 | //МаксимальнаяШирина (MaxWidth) - тип значения Число; 194 | //МинимальнаяВысота (MinHeight) - тип значения Число; 195 | //МаксимальнаяВысота (MaxHeight) - тип значения Число; 196 | //Текст (Text) - тип значения Строка; 197 | //ОтметкаНезаполненного (MarkIncomplete) - отмечать ячейку как незаполненную - тип значения Булево; 198 | //Видимость (Visible) - Булево. Используется только для поля, расположенного в таблице (колонки); 199 | //Доступность (Enabled) - Булево. Используется только для поля, расположенного в таблице (колонки); 200 | //ТолькоПросмотр (ReadOnly) - Булево. Используется только для поля, расположенного в таблице (колонки); 201 | //Отображать (Show) - Булево. Используется только для поля, расположенного в таблице (колонки); 202 | //ЦветВДиаграмме (ColorInChart) - тип значения Цвет. Используется только для серии диаграммы; 203 | //ОтображатьГрафическоеПредставлениеДанныхВДиаграмме (ShowGraphicalRepresentationOfDataOnChart) тип значения ОтображениеВДиаграмме. Используется только для серий диаграммы; 204 | //ОтображатьГрафическоеПредставлениеДанныхВЛегендеДиаграммы (ShowGraphicalRepresentationOfDataInChartLegend) - тип значения ОтображениеВЛегендеДиаграммы. Используется только для серий диаграммы; 205 | //ЛинииТрендаВДиаграмме (ChartTrendlines) - тип значения ЛинииТрендаДиаграммы. Используется только для серий диаграммы; 206 | //ЛинияВДиаграмме (LineInChart) - тип значения Линия. Тип линии серии, полученной из данной группировки. Используется только для серий диаграммы; 207 | //МаркерВДиаграмме (MarkerInChart) - тип значения ТипМаркераДиаграммы. Тип маркера серии, полученной из данной группировки. Используется только для серий диаграммы; 208 | //ИндикаторВДиаграмме (IndicatorInChart) - тип значения Булево. Указывает, что серия, полученная из данной группировки является индикатором. Используется только для серий диаграммы; 209 | //РастягиватьПоГоризонтали (HorizontalStretch) - тип значения Булево. Указывает, что ширина текущей колонки рассчитывается автоматически; 210 | //ВесовойКоэффициентШирины (WidthWeightFactor) - тип значения Число. Весовой коэффициент для автоматического расчета ширины колонки; 211 | //ИнформационнаяЛинияВДиаграмме (ReferenceLineInChart) - тип значения ИнформационнаяЛинияДиаграммы. Информационная линия в диаграмме; 212 | //ИнформационныйИнтервалВДиаграмме (ReferenceBandInChart) - тип значения ИнформационныйИнтервалДиаграммы. Информационный интервал в диаграмме; 213 | //ВыводитьКартинку (PictureOutput) - тип значения ТипВыводаКартинкиКомпоновкиДанных. Способ вывода картинки; 214 | //РазмерКартинки (PictureSize) - тип значения ПоложениеТекстаОтносительноКартинки. Положение текста относительно картинки; 215 | //ПоложениеТекстаОтносительноКартинки (TextPositionRelativeToPicture) - тип значения ПоложениеТекстаОтносительноКартинки. Положение текста относительно картинки; 216 | //ГоризонтальноеПоложениеКартинки (PictureHorizontalAlign) - тип значения ГоризонтальноеПоложение. Размещение картинки по горизонтали; 217 | //ВертикальноеПоложениеКартинки (PictureVerticalAlign) - тип значения ВертикальноеПоложение. Размещение картинки по вертикали; 218 | //ТипГрафическогоПредставленияВДиаграмме (VisualTypeInChart) - тип значения ТипГрафическогоПредставленияСерииДиаграммы.Тип графического представления серии в диаграмме; 219 | //ТипНакопленияВДиаграмме (StackTypeInChart) - тип значения ТипНакопленияСерииДиаграммы. Тип накопления серии, отличный от типа диаграммы. Группа накопления серии создаётся автоматически, на основе элемента условного оформления. Разные элементы условного оформления будут имеют разные группы накопления; 220 | //ИспользуемаяОсьЗначенийВДиаграмме (UsedValueAxisInChart) - тип значения ИспользуемаяОсьЗначенийДиаграммы Настраивает использование дополнительной оси значений в диаграмме; 221 | //Картинка (Picture) - тип значения Картинка; 222 | //РазделительМножественныхЗначений (MultipleValuesSeparator) - тип значения Строка. Содержит разделитель, который вставляется между значениями множественных характеристик. Если параметр не задан, то используется запятая с пробелом; 223 | //ОтступСлева (LeftMargin) - тип значения Число; 224 | //ОтступСправа (RightMargin) - тип значения Число; 225 | //ОтступСверху (TopMargin) - тип значения Число; 226 | //ОтступСнизу (BottomMargin) - тип значения Число. 227 | Функция Оформление(ИмяПараметра, ЗначениеПараметра) Экспорт 228 | Если ЭлементУсловногоОформления <> Неопределено Тогда 229 | ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра); 230 | ИначеЕсли ПолеНабораДанных <> Неопределено Тогда 231 | ПолеНабораДанных.Оформление.УстановитьЗначениеПараметра(ИмяПараметра, ЗначениеПараметра); 232 | Иначе 233 | ВызватьИсключение "Неопределен элемент оформления!"; 234 | КонецЕсли; 235 | Возврат ЭтотОбъект; 236 | КонецФункции 237 | 238 | Функция ТипЗначения(Тип) Экспорт 239 | ПолеНабораДанных.ТипЗначения = Тип; 240 | Возврат ЭтотОбъект; 241 | КонецФункции 242 | 243 | // Группировки 244 | // Массив, содержащий имена полей, для которых данное поле будет вычисляться в итогах. Через пробел после имени поля возможно указание ключевого слова Иерархия. Добавление данного ключевого слова обозначает, что выражение будет использоваться для иерархических записей группировки по полю, указанному перед словом, и всех вложенных группировок, для которых не задано собственное выражение данного ресурса. В случае, если массив пуст, итог будет вычисляться для всех полей. Может содержать строку ОбщийИтог для указания необходимости вычисления в общем итоге. 245 | Функция ВычисляемоеПоле(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Выражение, ВыражениеИтога = Неопределено, Группировки = Неопределено) Экспорт 246 | Если НЕ ЗначениеЗаполнено(ПутьКДанным) Тогда 247 | ПутьКДанным = ИмяПоля; 248 | КонецЕсли; 249 | ВычисляемоеПоле = СхемаКомпоновкиДанных.ВычисляемыеПоля.Добавить(); 250 | ВычисляемоеПоле.ПутьКДанным = ПутьКДанным; 251 | ВычисляемоеПоле.Выражение = Выражение; 252 | ВычисляемоеПоле.Заголовок = Заголовок; 253 | Если Раздел = Разделы.Ресурсы Тогда 254 | ПолеРесурса = СхемаКомпоновкиДанных.ПоляИтога.Добавить(); 255 | ПолеРесурса.ПутьКДанным = ПутьКДанным; 256 | ПолеРесурса.Выражение = ?(ЗначениеЗаполнено(ВыражениеИтога), ВыражениеИтога, СтрШаблон("СУММА(%1)", ИмяПоля)); 257 | Если ЗначениеЗаполнено(Группировки) Тогда 258 | ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ПолеРесурса.Группировки, Группировки); 259 | КонецЕсли; 260 | КонецЕсли; 261 | Возврат ЭтотОбъект; 262 | КонецФункции 263 | 264 | Функция Обязательное() Экспорт 265 | Роль.Обязательное = Истина; 266 | Возврат ЭтотОбъект; 267 | КонецФункции 268 | 269 | Функция Сумма(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Группировки = Неопределено) Экспорт 270 | Поле(ИмяПоля, Заголовок, ПутьКДанным, СтрШаблон("СУММА(%1)", ?(ЗначениеЗаполнено(ПутьКДанным), ПутьКДанным, ИмяПоля)), Группировки); 271 | Возврат ЭтотОбъект; 272 | КонецФункции 273 | 274 | Функция Максимум(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Группировки = Неопределено) Экспорт 275 | Поле(ИмяПоля, Заголовок, ПутьКДанным, СтрШаблон("МАКСИМУМ(%1)", ?(ЗначениеЗаполнено(ПутьКДанным), ПутьКДанным, ИмяПоля)), Группировки); 276 | Возврат ЭтотОбъект; 277 | КонецФункции 278 | 279 | Функция Минимум(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Группировки = Неопределено) Экспорт 280 | Поле(ИмяПоля, Заголовок, ПутьКДанным, СтрШаблон("МИНИМУМ(%1)", ?(ЗначениеЗаполнено(ПутьКДанным), ПутьКДанным, ИмяПоля)), Группировки); 281 | Возврат ЭтотОбъект; 282 | КонецФункции 283 | 284 | Функция Среднее(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Группировки = Неопределено) Экспорт 285 | Поле(ИмяПоля, Заголовок, ПутьКДанным, СтрШаблон("СРЕДНЕЕ(%1)", ?(ЗначениеЗаполнено(ПутьКДанным), ПутьКДанным, ИмяПоля)), Группировки); 286 | Возврат ЭтотОбъект; 287 | КонецФункции 288 | 289 | Функция Количество(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Группировки = Неопределено) Экспорт 290 | Поле(ИмяПоля, Заголовок, ПутьКДанным, СтрШаблон("КОЛИЧЕСТВО(%1)", ?(ЗначениеЗаполнено(ПутьКДанным), ПутьКДанным, ИмяПоля)), Группировки); 291 | Возврат ЭтотОбъект; 292 | КонецФункции 293 | 294 | Функция КоличествоРазличных(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Группировки = Неопределено) Экспорт 295 | Поле(ИмяПоля, Заголовок, ПутьКДанным, СтрШаблон("КОЛИЧЕСТВО(РАЗЛИЧНЫЕ %1)", ?(ЗначениеЗаполнено(ПутьКДанным), ПутьКДанным, ИмяПоля)), Группировки); 296 | Возврат ЭтотОбъект; 297 | КонецФункции 298 | 299 | Функция НачальныйОстаток(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", ИмяРесурса, ТипОстаткаДбКт = "Нет", ПолеСчета = "") Экспорт 300 | Если Раздел <> Разделы.Ресурсы Тогда 301 | ВызватьИсключение "Ресурсы указываются в разделе Ресурсов"; 302 | КонецЕсли; 303 | Если НЕ ЗначениеЗаполнено(ИмяРесурса) Тогда 304 | ВызватьИсключение "Для остатка необходимо определить имя ресурса"; 305 | КонецЕсли; 306 | Сумма(ИмяПоля, Заголовок, ПутьКДанным); 307 | Роль.Остаток = Истина; 308 | Роль.ТипОстатка = ТипОстаткаКомпоновкиДанных.НачальныйОстаток; 309 | Роль.ГруппаОстатка = ИмяРесурса; 310 | Роль.ТипБухгалтерскогоОстатка = ТипБухгалтерскогоОстаткаКомпоновкиДанных[ТипОстаткаДбКт]; 311 | Роль.ПолеСчета = ПолеСчета; 312 | Возврат ЭтотОбъект; 313 | КонецФункции 314 | 315 | Функция КонечныйОстаток(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", ИмяРесурса, ТипОстаткаДбКт = "Нет", ПолеСчета = "") Экспорт 316 | Если Раздел <> Разделы.Ресурсы Тогда 317 | ВызватьИсключение "Ресурсы указываются в разделе Ресурсов"; 318 | КонецЕсли; 319 | Если НЕ ЗначениеЗаполнено(ИмяРесурса) Тогда 320 | ВызватьИсключение "Для остатка необходимо определить имя ресурса"; 321 | КонецЕсли; 322 | Сумма(ИмяПоля, Заголовок, ПутьКДанным); 323 | Роль.Остаток = Истина; 324 | Роль.ТипОстатка = ТипОстаткаКомпоновкиДанных.КонечныйОстаток; 325 | Роль.ГруппаОстатка = ИмяРесурса; 326 | Роль.ТипБухгалтерскогоОстатка = ТипБухгалтерскогоОстаткаКомпоновкиДанных[ТипОстаткаДбКт]; 327 | Роль.ПолеСчета = ПолеСчета; 328 | Возврат ЭтотОбъект; 329 | КонецФункции 330 | 331 | // Период. 332 | // 333 | // Параметры: 334 | // ИмяПоля - Строка - Имя поля 335 | // ПутьКДанным - Строка - Путь к данным 336 | // Дополнительный - Булево - данный период не определяет порядок для дочернего периода. Например 337 | // для секунды период день не является необходимым для порядка. Для Регистратора наоборот родительский период Секунда 338 | // определяет порядок 339 | // 340 | // Возвращаемое значение: 341 | // ОбработкаОбъект.МодельСхемыКомпоновкиДанных - Период 342 | Функция Период(ИмяПоля, Знач Заголовок = "", Знач ПутьКДанным = "", Дополнительный = Ложь) Экспорт 343 | Поле(ИмяПоля, Заголовок, ПутьКДанным); 344 | НомерПериода = НомерПериода + 1; 345 | ПолеНабораДанных.Роль.НомерПериода = НомерПериода; 346 | ПолеНабораДанных.Роль.ТипПериода = ?(Дополнительный, ТипПериодаКомпоновкиДанных.Дополнительный, ТипПериодаКомпоновкиДанных.Основной); 347 | Возврат ЭтотОбъект; 348 | КонецФункции 349 | 350 | // ПараметрСхемыКомпоновкиДанных 351 | Функция Параметр(Имя, Значение = null, ТипЗначения = null, Выражение = null) Экспорт 352 | Если Настройки <> Неопределено Тогда 353 | Если Значение = null Тогда 354 | ВызватьИсключение "Не задано значение параметра настройки " + Имя; 355 | КонецЕсли; 356 | ПараметрНастройки(Имя, Значение); 357 | Возврат ЭтотОбъект; 358 | КонецЕсли; 359 | ПараметрСхемы = СхемаКомпоновкиДанных.Параметры.Добавить(); 360 | ПараметрСхемы.Имя = Имя; 361 | Если ТипЗначения <> null Тогда 362 | ПараметрСхемы.ТипЗначения = ТипЗначения; 363 | КонецЕсли; 364 | Если Значение <> null Тогда 365 | ПараметрСхемы.Значение = Значение; 366 | КонецЕсли; 367 | Если Выражение <> null Тогда 368 | ПараметрСхемы.Выражение = Значение; 369 | КонецЕсли; 370 | ПараметрСхемы.Использование = ИспользованиеПараметраКомпоновкиДанных.Авто; 371 | Возврат ЭтотОбъект; 372 | КонецФункции 373 | 374 | Функция Выражение(Выражение) Экспорт 375 | Если Раздел = Разделы.Параметры Тогда 376 | ПараметрСхемы.Выражение = Выражение; 377 | Возврат ЭтотОбъект; 378 | КонецЕсли; 379 | Возврат ЭтотОбъект; 380 | КонецФункции 381 | 382 | Функция Измерения() Экспорт 383 | Раздел = Разделы.Измерения; 384 | Возврат ЭтотОбъект; 385 | КонецФункции 386 | 387 | Функция Реквизиты() Экспорт 388 | Раздел = Разделы.Реквизиты; 389 | Возврат ЭтотОбъект; 390 | КонецФункции 391 | 392 | Функция Ресурсы() Экспорт 393 | Раздел = Разделы.Ресурсы; 394 | Возврат ЭтотОбъект; 395 | КонецФункции 396 | 397 | Функция Условия() Экспорт 398 | Раздел = Разделы.Условия; 399 | Возврат ЭтотОбъект; 400 | КонецФункции 401 | 402 | Функция УсловноеОформление() Экспорт 403 | Раздел = Разделы.УсловноеОформление; 404 | Возврат ЭтотОбъект; 405 | КонецФункции 406 | 407 | Функция ВариантНастроек(Имя, Представление = "") Экспорт 408 | ВариантНастроек = СхемаКомпоновкиДанных.ВариантыНастроек.Добавить(); 409 | ВариантНастроек.Имя = Имя; 410 | ВариантНастроек.Представление = Представление; 411 | Настройки = ВариантНастроек.Настройки; 412 | Возврат ЭтотОбъект; 413 | КонецФункции 414 | 415 | Функция Параметры() Экспорт 416 | Раздел = Разделы.Параметры; 417 | Возврат ЭтотОбъект; 418 | КонецФункции 419 | 420 | #Область ВариантыНастроек 421 | 422 | Функция НастройкиПоУмолчанию() Экспорт 423 | Возврат СхемаКомпоновкиДанных.НастройкиПоУмолчанию; 424 | КонецФункции 425 | 426 | Функция ЭлементОформления() Экспорт 427 | ЭлементУсловногоОформления = Настройки.УсловноеОформление.Элементы.Добавить(); 428 | Возврат ЭтотОбъект; 429 | КонецФункции 430 | 431 | Функция ОформляемоеПоле(ИмяПоля) 432 | ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); 433 | ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); 434 | ОформляемоеПоле.Использование = Истина; 435 | Возврат ЭтотОбъект; 436 | КонецФункции 437 | 438 | Функция Выбор() Экспорт 439 | Возврат ЭтотОбъект; 440 | КонецФункции 441 | 442 | Функция ПолеНастройки(ИмяПоля, Заголовок = "") Экспорт 443 | Если Раздел = Разделы.УсловноеОформление Тогда 444 | Возврат ОформляемоеПоле(ИмяПоля); 445 | КонецЕсли; 446 | ЭтоАвтоПоле = ПустаяСтрока(ИмяПоля) ИЛИ ИмяПоля = "*"; 447 | Если ЭтоАвтоПоле Тогда 448 | ТипПоля = Тип("АвтоВыбранноеПолеКомпоновкиДанных"); 449 | Иначе 450 | ТипПоля = Тип("ВыбранноеПолеКомпоновкиДанных"); 451 | КонецЕсли; 452 | Если ГруппаВыбранныхПолей = Неопределено Тогда 453 | Если Группировка = Неопределено Тогда 454 | ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(ТипПоля); 455 | Иначе 456 | ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(ТипПоля); 457 | КонецЕсли; 458 | Иначе 459 | ВыбранноеПоле = ГруппаВыбранныхПолей.Элементы.Добавить(ТипПоля); 460 | КонецЕсли; 461 | ВыбранноеПоле.Использование = Истина; 462 | Если ЭтоАвтоПоле Тогда 463 | Возврат ЭтотОбъект; 464 | КонецЕсли; 465 | ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); 466 | Если ЗначениеЗаполнено(Заголовок) Тогда 467 | ВыбранноеПоле.Заголовок = Заголовок; 468 | КонецЕсли; 469 | Возврат ЭтотОбъект; 470 | КонецФункции 471 | 472 | Функция ГруппаНачать(Заголовок, Расположение = Неопределено) Экспорт 473 | Если ГруппаВыбранныхПолей = Неопределено Тогда 474 | Если Группировка = Неопределено Тогда 475 | ГруппаВыбранныхПолей = Настройки.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); 476 | Иначе 477 | ГруппаВыбранныхПолей = Группировка.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); 478 | КонецЕсли; 479 | Иначе 480 | ГруппаВыбранныхПолей = ГруппаВыбранныхПолей.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных")); 481 | КонецЕсли; 482 | ГруппаВыбранныхПолей.Использование = Истина; 483 | ГруппаВыбранныхПолей.Расположение = ?(Расположение = Неопределено, РасположениеПоляКомпоновкиДанных.Авто, Расположение); 484 | ГруппаВыбранныхПолей.Заголовок = Заголовок; 485 | Возврат ЭтотОбъект; 486 | КонецФункции 487 | 488 | Функция ГруппаЗавершить() Экспорт 489 | ГруппаВыбранныхПолей = ГруппаВыбранныхПолей.Родитель; 490 | Возврат ЭтотОбъект; 491 | КонецФункции 492 | 493 | Функция ОтборГруппаНачать(ТипГруппы) Экспорт 494 | Если ГруппаОтбора = Неопределено Тогда 495 | ГруппаОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); 496 | Иначе 497 | ГруппаОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); 498 | КонецЕсли; 499 | ГруппаОтбора.Использование = Истина; 500 | ГруппаОтбора.ТипГруппы = ТипГруппы; 501 | Возврат ЭтотОбъект; 502 | КонецФункции 503 | 504 | Функция ОтборГруппаИНачать() Экспорт 505 | ОтборГруппаНачать(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ); 506 | Возврат ЭтотОбъект; 507 | КонецФункции 508 | 509 | Функция ОтборГруппаИЛИНачать() Экспорт 510 | ОтборГруппаНачать(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли); 511 | Возврат ЭтотОбъект; 512 | КонецФункции 513 | 514 | Функция ОтборГруппаНЕНачать() Экспорт 515 | ОтборГруппаНачать(ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаНе); 516 | Возврат ЭтотОбъект; 517 | КонецФункции 518 | 519 | Функция ОтборГруппаЗавершить() Экспорт 520 | ГруппаОтбора = ГруппаОтбора.Родитель; 521 | Возврат ЭтотОбъект; 522 | КонецФункции 523 | 524 | Функция Отбор(ИмяПоля, Значение, ВидСравнения = Неопределено) Экспорт 525 | Если ГруппаОтбора = Неопределено Тогда 526 | ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); 527 | Иначе 528 | ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); 529 | КонецЕсли; 530 | ЭлементОтбора.Использование = Истина; 531 | ЭлементОтбора.ЛевоеЗначение = ?(ТипЗнч(ИмяПоля) = Тип("Строка"), Новый ПолеКомпоновкиДанных(ИмяПоля), ИмяПоля); 532 | ЭлементОтбора.ПравоеЗначение = Значение; 533 | ЭлементОтбора.ВидСравнения = ?(ВидСравнения = Неопределено, ВидСравненияКомпоновкиДанных.Равно, ВидСравнения); 534 | Возврат ЭтотОбъект; 535 | КонецФункции 536 | 537 | Функция Порядок(ИмяПоля, ТипУпорядочивания = Неопределено) Экспорт 538 | ЭлементПорядка = Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); 539 | ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных(ИмяПоля); 540 | Если ТипЗнч(ТипУпорядочивания) = Тип("Строка") Тогда 541 | Если ТипУпорядочивания = "-" Тогда 542 | ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; 543 | Иначе 544 | ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Возр; 545 | КонецЕсли; 546 | Иначе 547 | ЭлементПорядка.ТипУпорядочивания = ?(ТипУпорядочивания = Неопределено, НаправлениеСортировкиКомпоновкиДанных.Возр, ТипУпорядочивания); 548 | КонецЕсли; 549 | ЭлементПорядка.Использование = Истина; 550 | Возврат ЭтотОбъект; 551 | КонецФункции 552 | 553 | Функция ГруппировкаНачать(ИмяГруппировки = Неопределено) Экспорт 554 | Если Группировка = Неопределено Тогда 555 | Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); 556 | ИначеЕсли ТипЗнч(Группировка) = Тип("ГруппировкаТаблицыКомпоновкиДанных") Тогда 557 | Группировка = Группировка.Структура.Добавить(); 558 | Иначе 559 | Группировка = Группировка.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных")); 560 | КонецЕсли; 561 | Группировка.Использование = Истина; 562 | Если ИмяГруппировки <> Неопределено Тогда 563 | Группировка.Имя = ИмяГруппировки; 564 | КонецЕсли; 565 | // ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 566 | // ВыбранноеПоле.Использование = Истина; 567 | Возврат ЭтотОбъект; 568 | КонецФункции 569 | 570 | Функция ПолеГруппировки(ПутьКДанным) Экспорт 571 | Если ПутьКДанным = "*" Тогда 572 | ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("АвтоПолеГруппировкиКомпоновкиДанных")); 573 | Возврат ЭтотОбъект; 574 | КонецЕсли; 575 | ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); 576 | ПолеГруппировки.Использование = Истина; 577 | ПолеГруппировки.Поле = ?(ТипЗнч(ПутьКДанным) = Тип("Строка"), Новый ПолеКомпоновкиДанных(ПутьКДанным), ПутьКДанным); 578 | Возврат ЭтотОбъект; 579 | КонецФункции 580 | 581 | Функция ГруппировкаЗавершить() Экспорт 582 | Группировка = Группировка.Родитель; 583 | Возврат ЭтотОбъект; 584 | КонецФункции 585 | 586 | Функция ТаблицаНачать() Экспорт 587 | Если Группировка = Неопределено Тогда 588 | Таблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); 589 | Иначе 590 | Таблица = Группировка.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных")); 591 | КонецЕсли; 592 | Возврат ЭтотОбъект; 593 | КонецФункции 594 | 595 | Функция ТаблицаЗавершить() Экспорт 596 | Группировка = Таблица.Родитель; 597 | Таблица = Неопределено; 598 | Возврат ЭтотОбъект; 599 | КонецФункции 600 | 601 | Функция Строки() Экспорт 602 | Группировка = Таблица.Строки.Добавить(); 603 | Группировка.Использование = Истина; 604 | ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 605 | ВыбранноеПоле.Использование = Истина; 606 | Возврат ЭтотОбъект; 607 | КонецФункции 608 | 609 | Функция Колонки() Экспорт 610 | Группировка = Таблица.Колонки.Добавить(); 611 | Группировка.Использование = Истина; 612 | ВыбранноеПоле = Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); 613 | ВыбранноеПоле.Использование = Истина; 614 | Возврат ЭтотОбъект; 615 | КонецФункции 616 | 617 | Функция ПараметрНастройки(ИмяПараметра, Значение) Экспорт 618 | Если Раздел = Разделы.ПараметрыВывода Тогда 619 | Параметр = Настройки.ПараметрыВывода.Элементы.Найти(ИмяПараметра); 620 | Если Параметр = Неопределено Тогда 621 | ВызватьИсключение "Неизвестный параметр вывода " + ИмяПараметра; 622 | КонецЕсли; 623 | Параметр.Значение = Значение; 624 | Параметр.Использование = Истина; 625 | ИначеЕсли Раздел = Разделы.ПараметрыДанных Тогда 626 | Параметр = Настройки.ПараметрыДанных.Элементы.Добавить(); 627 | Параметр.Параметр = Новый ПараметрКомпоновкиДанных(ИмяПараметра); 628 | Параметр.Значение = Значение; 629 | Параметр.Использование = Истина; 630 | Иначе 631 | ВызватьИсключение "Не задан контекст для параметра настройки СКД!"; 632 | КонецЕсли; 633 | Возврат ЭтотОбъект; 634 | КонецФункции 635 | 636 | Функция Структура() Экспорт 637 | Раздел = Разделы.Структура; 638 | Возврат ЭтотОбъект; 639 | КонецФункции 640 | 641 | Функция ПараметрыДанных() Экспорт 642 | Раздел = Разделы.ПараметрыДанных; 643 | Возврат ЭтотОбъект; 644 | КонецФункции 645 | 646 | Функция ПараметрыВывода() Экспорт 647 | Раздел = Разделы.ПараметрыВывода; 648 | Возврат ЭтотОбъект; 649 | КонецФункции 650 | 651 | #КонецОбласти 652 | 653 | #КонецОбласти 654 | 655 | #Область Инициализация 656 | 657 | СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных; 658 | Разделы = Новый Структура("Измерения, Реквизиты, Ресурсы, Условия, УсловноеОформление, Структура, Параметры, ПараметрыДанных, ПараметрыВывода", 1, 2, 3, 4, 5, 6, 7, 8, 9); 659 | 660 | // Добавление источника данных по-умолчанию 661 | ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить(); 662 | ИсточникДанных.Имя = "ИсточникДанных"; 663 | ИсточникДанных.ТипИсточникаДанных = "Local"; 664 | 665 | НаборыДанных = СхемаКомпоновкиДанных.НаборыДанных; 666 | ВнешниеНаборыДанных = Новый Структура; 667 | 668 | #КонецОбласти --------------------------------------------------------------------------------