СКД набір даних об'єкта. СКД та зовнішні джерела даних

У минулій статті я вже писав, що 1С це парадоксальна платформа. Система компанування даних відноситься до таких парадоксів. СКД призначена для конструювання складних звітів та передбачає заміну "ручного" програмування звітів конструюванням у багатофункціональному інструментарії. Можливість використання СКД з'явилася у восьмій версії, але знадобився довгий час щоб з'явилася версія 8.2 щоб 1С змогла використовувати її у своїх типових продуктах. З одного боку, СКД це функціональний інструментарій, використовуючи який можна скласти дуже складні звіти без єдиного рядка коду. Однак у СКД досить високий поріг входження, вивчити і почати повноцінно користуватися нею "з наскоку" дуже важко, бо інтерфейс не зовсім інтуїтивно зрозумілий, а повніші керівництва використання є тільки у вигляді платної літератури.

У процесі мого вивчення СКД постало завдання. Необхідно отримати дані зі сторонньої таблиці значень за допомогою мови запитів і далі оперувати цими даними як з аналогічними таблиць бази даних (операції відомості, угруповання і так далі). У класичному форматі ми склали б запит, який отримує інформацію з таблиці переданої в запит в іде параметра.

Запит = Новий Запит(
"ВИБРАТИ
| Номенклатура,
| Таблиця.

| &ТЗ ЯК Таблиця");
Запит.ВстановитиПараметр("ТЗ", ТЗ);

Але зі СКД не все так просто. На жаль, операцію, описану вище, зробити в системі компанування даних неможливо. Проте можливість підвантаження зовнішніх таблиць значень у системі реалізовано.

Тут варто зробити невеликий ліричний відступ та поговорити про Набори даних. Набори даних є джерелами інформації, у тому числі СКД отримує дані, які пізніше компонує у звіт. Набори даних поділяються на типи, переважно використовує тип " Запит " , у тілі якого програміст пише запит базі даних. Тип "Об'єкт" використовується для завантаження даних із зовнішніх об'єктів. В обох випадках на виході ми маємо певний набір полів, отриманих у результаті виконання запиту чи підвантаження зовнішнього об'єкта. Пізніше ці поля можна оперувати на вкладці "Налаштування" разом з детальним налаштуванням структури звіту. Для взаємозв'язку різних наборів СКД передбачена можливість зазначення зв'язків наборів даних в однойменній вкладці. Ці зв'язки є прямим аналогом лівого з'єднання у класичному запиті. Слід, однак, врахувати, що запити в якомусь наборі даних не знають про існування інших наборів даних, в кінцевому рахунку зв'язку наборів даних будуть впливати на компонування даних за структурою зазначеної у вкладці "Налаштування".

Деталізуємо завдання до прикладу. Є типовий звіт Розрахункові відомості організації зміни ЗиК 8. Необхідно щоб види розрахунків у звіті групувалися за деяким групам. Відповідності ВидРозрахунку-Група зберігаються у зовнішній таблиці значень. Для підвантаження її в основну схему компанування даних створюємо "набір даних об'єкта" з ім'ям "Групи" (рисунок 2). Зв'язок провадимо з "набором даних запит" - "Нарахування" за видом розрахунку (рисунок 3). У "наборі даних запит" - "Нарахування" значиться інформація щодо груп, видаляємо всі входження. Після цього, на вкладці "Параметри" ми можемо використовувати поле "Група", значення якого підвантажується із зовнішнього джерела даних (рисунок 4). До функцій формування звіту доповнюємо підвантаження зовнішніх даних.

Функція Сформувати Звіт (Результат = Невизначено, Дані Розшифровки = Невизначено, Висновок у Форму Звіту = Істина) Експорт

//отримання або формування шуканої таблиці значень "Групи" та її запис до однойменної змінної

ЗовнішніДані = Новий Структура();//створюємо та заповнюємо структуру зовнішніх даних
ЗовнішніДані.Вставити(Групи);

ЗначенняПанелікористувача = Типові Звіти.
НалаштуванняЗа замовчуванням = КомпонувальникНалаштувань.ОтриматиНалаштування();
ТиповіЗвіти.ОтриматиЗастосовануНалаштування(ЦейОб'єкт);
Типові Звіти.
КомпонувальникНалаштувань.ЗавантажитиНалаштування(НалаштуванняЗа замовчуванням);
Повернення Результат;

КінецьФункції

Якщо б ми робили звіт "з нуля", то код запуску формування звіту виглядав би наступним чином:

ЗовнішніНабориДаних = Новий Структура;
ЗовнішніНабориДаних.Вставити("Групи", Групи); //Групи - шукана таблиця значень
СхемаКомпонуванняДаних = ОтриматиМакет("ОсновнаСхемаКомпонуванняДаних"); //наш макет із схемою команівки даних
Параметри = СхемаКомпонуванняДаних.ПараметриЗа замовчуванням;
КомпонувальникМакета = Новий КомпонувальникМакетаКомпонуванняДаних;
МакетКомпонування = КомпонувальникМакета.Виконати(СхемаКомпонуванняДаних, Налаштування);
ПроцесорКомпонуванняДаних = Новий ПроцесорКомпонуванняДаних;
ПроцесорКомпонівкиДаних.Ініціалізувати(МакетКомпонівки, ЗовнішніНабориДаних);
ТабДок = Новий Табличний Документ;
ПроцесорВиводу = Новий ПроцесорВиводуРезультатуКомпонуванняДанихВТабличнийДокумент;
ПроцесорВиводу.ВстановитиДокумент(ТабДок);
Процесор Виводу.Вивести(ПроцесорКомпонівкиДаних);

Прочитано 9660 раз

При відкритті нових філій компанії, для розрахунку навантаження на сервер 1С:Підприємства та інших завдань буде потрібно подивитися динаміку роботи користувачів в інформаційній базі у вигляді діаграми.

Динаміку потрібно показати за вибраний користувачем період. Як відображені дані буде кількість дій на даними користувачами в розрізі годин. Інформація для такого звіту може бути одержана з журналу реєстрації.

Розглянемо поетапне створення такого звіту і з допомогою зовнішнього набору даних побудуємо їх у системі компонування даних.

Читаємо журнал реєстрації

І так, звіт будуватимемо на СКД. Дані ми будемо отримувати не за допомогою запиту з бази даних, а з журналу реєстрації. Про спосіб зберігання журналу реєстрації платформою писав у попередній статті.

Відповідно до заданого періоду, у звіті нам потрібно отримати всі дії користувача над даними інформаційної бази. Отриману таблицю згрупувати за користувачем та вивести у вигляді діаграми (див. скріншот вище).

Для отримання інформації з журналу реєстрації будемо використовувати метод глобального контексту "Вивантажити ЖурналРеєстрації()". У події "ПриКомпонівціРезультату" створеного звіту додамо наступний програмний код:

Процедура ПриКомпонівціРезультату(ДокументРезультат, ДаніРозшифрування, СтандартнаОбробка) СтандартнаОбробка = Брехня ; // відключаємо стандартний висновок звіту - виводитимемо програмно // Отримуємо налаштування звіту, в т.ч. періодНалаштування = Компонувальник Налаштувань. ОтриматиНалаштування() ; // Отримуємо налаштування звітуПараметрПеріод = КомпонувальникНалаштувань. ОтриматиНалаштування() . Параметри даних. Елементи. Знайти ("Період"). значення; ЖурТаб = Новий ТаблицяЗначень; ВідбірЖурналу = Новий Структура;// Створимо структуру відбору журналу реєстрації // Заповнимо відбір за періодомВідбірЖурналу. Вставити("ДатаПочатку", ПараметрПеріод. ДатаПочатку); ВідбірЖурналу. Вставити("ДатаЗакінчення", ПараметрПеріод. ДатаЗакінчення);// Встановимо відбір на подіїМасивПодії = Новий Масив; Масив подій. Додати(" _$Data$_МасивПодії = Новий Масив; . DeleteМасивПодії = Новий Масив; . NewМасивПодії = Новий Масив; " ) ; МасивПодії. Додати(" _$Data$_. Post . TotalsPeriodUpdate. Unpost . Update" ) ; ОтборЖурнала. Вставити(" Подія " , МасивПодії) ; // Вивантажуємо журнал реєстраціїВивантажитиЖурналРеєстрації(ЖурТаб, МасивПодії) ; // Створюємо та заповнюємо дані для виведення у звітЖурТаб. Колонки. Додати ("Час"); ЖурТаб. Колонки. Додати("" , " // Вивантажуємо журнал реєстрації" ) ; // ..............

КількістьПодії

" ) ; Для Кожного Стр З ЖурТаб Цикл Стр. Час = Час(Стор. Дата) ; стор Кількість Події = 1 ;

// Групуємо результат

ЖурТаб. Згорнути("

Ім'я Користувача, Час
Перший параметр методу "Вивантажити ЖурналРеєстрації" встановлює таблицю значень, в яку буде вивантажено результат вибірки з журналу реєстрації. Другий параметр встановлюємо фільтр на обрані записи. Філтр є структурою, ключі в якому - це поля, за якими встановлюється відбір. Ми використовуємо поля "ДатаПочатку" та "ДатаЗакінчення" для встановлення періоду аналізу журналу реєстрації, а також поле "Подія", в який передаємо масив рядків (найменувань подій). Додані до масиву події відповідають діям на даними в базі.

// Створюємо та заповнюємо дані для виведення у звітЖурТаб. Колонки. Додати ("Час"); ЖурТаб. Колонки. Додати("" , " // Вивантажуємо журнал реєстраціїДокладніше про використання методу "Вивантажити ЖурналРеєстрації" Ви можете прочитати в синтаксис-помічнику. Передаємо таблицю значень у СКДДля того, щоб СКД змогла працювати з отриманою таблицею значень, потрібно зробити наступні дії: 1) Створити набір даних у схемі компонування та задати його поля. // Ініціалізуємо макет компонування використовуючи схему компонування даних // і створені раніше налаштування та дані розшифровкиСхемаКомпонуванняДаних = ОтриматиМакет(" ОсновнаСхемаКомпонівкиДаних" ) ; МакетКомпонування = КомпонувальникМакета. Виконати (СхемаКомпонуванняДаних, Налаштування, ДаніРозшифрування) ; // Скомпонуємо результатПроцесорКомпонування = Новий ПроцесорКомпонуванняДаних; ПроцесорКомпонування. Ініціалізувати(МакетКомпонівки,// !!! Передаємо таблицю "ЖурТаб" у процесор компонування! Новий Структура("Журнал реєстрації " , ЖурТаб) , ДаніРозшифровки) ; ДокументРезультат. Очистити() ;// Виводимо результат у табличний документ

ПроцесорВиводу = Новий ПроцесорВиводуРезультатуКомпонуванняДанихВТабличнийДокумент;

Процесор Висновку. ВстановитиДокумент(ДокументРезультат);

Процесор Висновку. Вивести(ПроцесорКомпонівки) ;

КінецьПроцедури

3) Налаштовуємо ресурси та структуру звіту (докладніше дивись у файлі звіту, посилання на який дано наприкінці статті).

На цьому налаштування звіту завершено, і ми можемо запустити його в режимі підприємства. Підсумок.

Зовнішнє джерело даних у СКД дозволяє використовувати у звітах дані практично з будь-яких джерел, включаючи ті, дані яких ми не зможемо отримати запитами.
Використання СКД для таких джерел дозволяє створювати звіти з гнучкою системою налаштувань, а також дозволяє користувачеві змінювати висновок звіту, його структуру. Всі можливості системи компонування даних будуть задіяні для таких джерел у повній мірі.

Завантажити звіт із прикладу Ви можете

за наступним посиланням

Вітання!


Сьогодні хочу описати тему, з якою без «аквалангу» не розберешся:);)

Акваланг до того що занурення досить глибоке. У літературі зустрічається мало посилань на цю тему і поки не «закортить» у ній не розберешся. До речі, в документації про це сказано дуже погано і непослідовно, доводиться звертатися до сторонньої літератури.

Наприклад, дуже рекомендую «Розробка складних звітів у «1С:Підприємстві 8.2». Система компонування даних», (якщо конкретніше, дивіться стор. 224, 267 і 473) Сформувати» та відобразився список номенклатури (див. рис. 2):

Так, я припустився однієї неточності, а саме: на знімку немає кнопки « Сформувати", але є кнопка " нове дійство»(трохи пізніше поясню, чому так вийшло;)

Так Так! Ще момент: весь цей список виводиться із набору даних «Об'єкт»:

Рішення:

  1. Створюємо зовнішній звіт;
  2. Додаємо макет СКД, назвемо його «Основна Схема Компанівки Даних»;
  3. Додаємо в нього набір даних «Об'єкт», призначаємо йому ім'я «Список номенклатури» (має бути так само, як і в рис. 3);
  4. У налаштуваннях звіту особливо не експериментуємо, нехай буде все просто (див. рис. 4)

Ок, половину справи зробили;

Тепер згенеруємо основну форму звіту (так, ще момент! Моя конфігурація працює на звичайному інтерфейсі, але думаю, на керованих формах ви знайдете рішення;) Отже, форма:

Тут і постає проблема! Якщо натиснути кнопку «сформувати» (рис. 5.), ми побачимо помилку!


Вирішенню цієї проблеми я і присвятив цю статтю!

Перехопити подію кнопки «Сформувати» не вдалося, тому вирішив скористатися милицею. Запустив конфігурацію в режимі налагодження і постарався знайти ту кнопку «сформувати».

Вставляв у формі процедуру "Сформувати", але в неї немає заходів, довелося перевизначити дію кнопки "сформувати" перед відкриттям форми:


На рис. 8 крім зміни дії форми наведено приклад запиту, його обробки та передачі згенерованих даних у СКД. Вивчимо його біліша уважно:

  1. Генеруємо вхідні дані для СКД;
  2. Ініціалізуємо СКД;
  3. Виводимо результат НА ФОРМУ (зверніть на це також увагу!).

Згадаймо схему взаємодії об'єктів системи компонування даних:

Схема компонування даних у зовнішньому звіті є як глобальний об'єкт у методі форми СхемаКомпонівкиДаних.До неї так само можна звернутися на ім'я, передавши його в метод ОтриматиМакет(див. мал. 8)

Основний шматок коду наведено нижче:

Запит = Новий Запит; Запрос.Текст = "ВИБРАТИ | Номенклатура. Найменування як Номенклатура | З | Довідник. Номенклатура ЯК Номенклатура"; НоменклатураСписок = Запрос.Выполнить().Выгрузить(); НабориДаних = Новий Структура("СписокНоменклатури", НоменклатураСписок); //СКД = ОтриматиМакет("ОсновнаСхемаКомпонуванняДаних"); СКД = СхемаКомпонівкиДаних; КомпМакет = новий КомпонувальникМакетаКомпонуванняДаних; макетКомп = КомпМакета.Выполнить(СКД, СКД.НастройкиЗа замовчуванням); ПроцесорКомпДанних = новий ПроцесорКомпонуванняДаних; ПроцесорКомпДаних.Ініціалізувати(макетКомп, НабориДаних); висновок = новий ПроцесорВиводуРезультатуКомпонуванняДанихВТабличнийДокумент; висновок.ВстановитиДокумент(ЕлементиФорми.Результат); висновок.Вивести(ПроцесорКомпДаних, істина);

Так! Ось ще приємний момент!

У цьому прикладі, як бачите (див. рис. 2), висновок здійснюється у форму, а не в табл. документ! І це дуже добре, адже ми можемо працювати з формою (програмно перехоплювати події елемента форми, робити всякі фішки з drag and drop тощо);

У табличному документі ми можемо просто вивести оброблені дані на екран і передати керування документом користувачеві і ми не можемо впливати на подальший процес редагування даного контенту!

у довідковій системі « Поле табличного документа «, а я лише наведу витяг з вбудованої документації системи 1с Підприємство 8.2:

«Поле табличного документа є табличний документ, розміщений у формі. Поряд із різноманіттям оформлювальних можливостей табличного документа це дозволяє організовувати обробку подій, що виникають при виборі осередків, картинок, а також інших елементів управління, розміщених у полі табличного документа.

Гаразд, як кажуть, успіхів у бою;)

Іноді трапляється, що дані у звіті не можна отримати за допомогою запиту чи комбінації запитів. Доводиться користуватися якимись процедурами збору даних, а дані поміщаються в таблицю значень. Виникає питання – чи можна ці дані використовувати у схемі компонування даних? Адже СКД інструмент потужний та зручний. Виявляється, що використовувати дані з таблиці значень як джерело даних для звіту в СКД можна зробити це зовсім не складно. У статті буде показано створення такого звіту для звичайних форм.
Отже, як створити звіт СКД із використанням даних із таблиці значень? Про все по порядку.
Насамперед відкриваємо конфігуратор і створюємо новий зовнішній звіт.

Відкриваємо модуль об'єкта та створюємо зумовлену процедуру ПриКомпонівціРезультату(ДокументРезультат, ДаніРозшифровки, СтандартнаОбробка)

Усередині цієї процедури збиратимемо дані та формуватимемо звіт.
У процедурі ПриКомпонівціРезультату відключаємо стандартну обробку. Стандартна Обробка = Брехня;
Потім формуємо таблицю значень довільним чином. Імена колонок таблиці значень повинні збігатися з майбутніми полями набору даних у СКД.


Наприклад додамо три рядки даних. Далі кроками створюємо висновок звіту.

  • Зі схеми отримуємо налаштування за замовчуванням.

  • У відповідну змінну надсилаємо дані про розшифрування.

  • Формуємо макет за допомогою компонувальника макету.

  • Передаємо в макет компонування схему, налаштування та дані розшифрування.

  • Виконуємо компонування за допомогою процесора компонування. Для цього виконуємо метод процесора компонування даних Ініціалізувати(). Як параметр передаємо макет компонування даних, зовнішні набори даних (тип: Структура, ключ структури повинен збігатися з ім'ям об'єкта в схемі компонування даних, значення - сформована таблиця значень), дані розшифровки.

  • Очищаємо поле табличного документа.

  • Виводимо результат у табличний документ.
У результаті виходить наступний код:
СхемаКомпонуванняДаних = ОтриматиМакет( "ОсновнаСхемаКомпонівкиДаних"); //Налаштування = СхемаКомпонуванняДаних.НалаштуванняЗа замовчуванням;// - Якщо зробити так, як показано вище (рекомендують на деяких ресурсах), то при зміні налаштувань у режимі клієнта // цих змін Ви не побачите, тому що налаштування завжди будуть за замовчуванням. Як правильно - варіант нижче Налаштування = Компонувальник Налаштувань. ОтриматиНалаштування();ДаніРозшифрування = Новий ДаніРозшифруванняКомпонуванняДаних;

Створюємо набір даних. Для цього додаємо новий набір даних типу Об'єкт. У полі Ім'я об'єкта, що містить даних, поміщаємо ту назву, яку ми вказали як ключ при створенні структури ЗовнішнійНабірДаних. Потім додаємо поля. Імена повинні точно збігатися з іменами колонок у таблиці значень. Далі можемо вказати допустимі значення, формати тощо.

Додаємо ресурси, якщо це потрібно. За ними рахуватимуться підсумки. У нашому випадку це поля Кількість та Сума.

У закладці Налаштування за допомогою конструктора налаштувань формуємо варіант звіту за умовчанням

Зберігаємо наш звіт. Запускаємо його у клієнті та формуємо. Приклад виконання звіту СКД з використанням даних таблиці значень наведено на картинці.


От і все. Досить просто, чи не так?

Звіт, що вийшов для прикладу, можна скачати

41
Робив нещодавно звіт із невизначеною кількістю колонок. Вовтузитися з кодом було небажання, вирішив зробити на СКД. Із цим проблема не виникла, необхідно було натягнути результат на довільний макет (свій заголовок +... 27
Незважаючи на те, що СКД зустрічаються з цим на перший або другий день, це має бути в розділі FAQ. Простий приклад програмного виведення звіту на компонуванні, який використовує параметри за замовчуванням. 18
//Отримуємо схему з... 10
При формуванні звітів на СКД за умовчанням усі угруповання розгорнуті, але буває що необхідно відразу після формування показати звіт зі згорнутими угрупованнями! Цей код у модулі звіту дозволяє згорнути... 9
На цій закладці можна вказати, які здійснюються зв'язки між двома і більше наборами даних, за якими параметрами та умовами.



Поділитися з друзями: