Обчислити вираз із угрупованням масив. Функції мови виразів системи компонування даних. Змінюємо порядок колонок

Доброї доби, шановні читачі нашого блогу! Сьогодні я хочу розповісти, на реальному прикладі, як
використовувати функції СКД Масив (Array) та З'єднатиРядки (JoinStrings). У статті про

трохи згадувалося, як працювати з
на закладці
, також вже пояснювалося як
, використовуючи закладку "Ресурси". Сьогодні ми ще раз звернемо увагу на ці
закладки у світлі нашої теми.

Зовнішній вигляд прикладу звіту 1С із використанням двох функцій СКД Масиві З'єднатиРядкинаступний:

Постановка задачі для застосування функцій СКД Масив (Array) та З'єднати Рядки (JoinStrings)

Завдання: Потрібно всі номери реалізацій по одному товару вставити в один осередок.

Щось на кшталт: номенклатура | у | 001, 002 і т.д. |

Використовуватимемо запит до регістру накопичення «РеалізаціяТМЗ».

ВИБРАТИ
Реалізація ТМЗ. Реєстратор. Номер,
Реалізація ТМЗ. Номенклатура,
Реалізація ТМЗ. Реєстратор,
Реалізація ТМЗ. КількістьОборот
З
Регістр Накопичення. Реалізація ТМЗ. Обороти
(, , Реєстратор, ) ЯК РеалізаціяТМЗ

Регістру накопичення «РеалізаціяТМЗ» існує як у конфігурації Бухгалтерія, і у конфігурації Управління торговим підприємством (УТП). Дізнайтеся, як у конфігурації УТП в елементі довідника «Номенклатура». Тому після скачування, для перевірки його працездатності ви можете запускати цей звіт в обох конфігураціях.

Реалізація поставленої задачі із застосуванням функцій СКД Масив та З'єднатиРядки


Такі самі кроки, але з деякими доповненнями, були використані при створенні
.

Опис функції З'єднати Рядки (JoinStrings)

З'єднатиРядки (JoinStrings)

Використовується для поєднання рядків в один рядок.

Синтаксис:

З'єднатиРядки (Значення, РозділювачЕлементів, РозділювачіКолонок)

Параметри:

  1. Значення- Вирази, які потрібно об'єднати в один рядок.
    Якщо є Масивом, то рядок об'єднуватимуться елементи масиву.
    Якщо є ТаблицяЗначень, то рядок об'єднуватимуться всі колонки і рядки таблиці;
  2. РозділникЕлементів— рядок, що містить текст, який потрібно використовувати як
    роздільника між елементами масиву та рядками таблиці значень. За замовчуванням символ перекладу рядків;
  3. РозділювачіКолонок-рядок, що містить текст, який потрібно використовувати як роздільник
    між колонками таблиці значень За замовчуванням ";".

Увійдіть на сайт як учень

Увійдіть як учень, щоб отримати доступ до матеріалів школи

Система компонування даних 1С 8.3 для початківців: рахуємо підсумки (ресурси)

Метою цього уроку буде:

  • Написати звіт, який виводить список продуктів (довідник Їжа), їх калорійність та смак.
  • Зробити групування продуктів за кольором.
  • Познайомитися з можливістю підбиття підсумків (ресурси) та полями, що обчислюються.

Створюємо новий звіт

Як і на попередніх уроках відкриваємо базу Гастрономв конфігураторі і створюємо новий звітчерез меню " Файл"->"Новий...":

Вид документа - зовнішній звіт:

У формі налаштування звіту пишемо ім'я Урок3"і натискаємо кнопку" Відкрити схему компонування даних":

Залишаємо ім'я схеми за замовчуванням та натискаємо кнопку " Готово":

Додаємо запит через конструктор

На закладці Набір данихнатискаємо зеленийплюс і вибираємо пункт " Додати набір даних - запит":

Замість того, щоб писати текст запиту вручну, знову запускаємо конструктор запиту:

На вкладці " Таблиці"перетягуємо таблицю" Їжаз першої колонки в другу:

Вибираємо із таблиці " Їжа" поля, які будемо просити. Для цього перетягуємо поля " Найменування", "Смак", "Колір"і" Калорійністьз другої колонки в третю:

Вийшло ось так:

Натискаємо кнопку " ОК" - текст запиту сформувався автоматично:

Формуємо налаштування подання звіту

Переходимо на закладку " Налаштуванняі натискаємо на чарівну паличку, щоб визвати конструктор налаштувань:

Вибираємо вид звіту " перелік..." і натискаємо кнопку " Далі":

Перетягуємо з лівої колонки у праву поля, які відображатимуться у списку та натискаємо " Далі":

Перетягуємо з лівої колонки у праве поле. Колір- по ньому буде відбуватися угрупованнярядків у звіті. Натискаємо " ОК":

А ось і результат роботи конструктора. Ієрархія нашого звіту:

  • звіт загалом
  • угруповання "Колір"
  • детальні записи - рядки з назвами їжі

Збережемо звіт (кнопка дискета) та не закриваючиконфігуратора відразу відкриємо його в режимі користувача. Вийшло ось так:

Змінюємо порядок колонок

Але давайте змінимо порядокколонок (стрілки вгору-вниз), щоб він був таким як на малюнку нижче:

Збережемо звіт і знову відкриємо в режимі користувача:

Добре, так набагато краще.

Підбиваємо підсумок (суму) за калорійністю

Було б непогано виводити результат калорійності товарів за групами. Щоб бачити суму калорійності всіх продуктів, скажімо, білого чи жовтого кольору. Або дізнатися про загальну калорійність взагалі всіх продуктів у базі.

І тому існує механізм обчислення ресурсів.

Переходимо на вкладку " Ресурси" і перетягуємо поле " Калорійність(Ми ж по ньому збираємося підводити підсумок) з лівої колонки в праву.

При цьому в полі вираз вибираємо з списку " Сума (калорійність)", тому що результатом буде сума всіх елементів, що входять в результат:

Зберігаємо та формуємо звіт:

У нас з'явилися підсумки по кожній із груп та з звіту загалом.

Підбиваємо підсумок (середнє) за калорійністю

Тепер давайте зробимо так, щоб ще в одній колонці виводилася середнякалорійність продуктів за групами та загалом за звітом.

Торкати вже наявну колонку "Калорійність" не можна - до неї вже виводиться підсумок-сума, тому заведемо ще одне поле, яка буде точною копією поля "Калорійність".

Щоб завести таке "віртуальне" поле скористаємося механізмом обчислюваних полів.

Переходимо на закладку " Обчислювані поляі натискаємо зеленийплюсік:

У колонці " Шлях до данихпишемо ім'я нового поля ( разом, Без пропусків). Нехай воно називатиметься " Середнякалорійність", а в колонці" Вираз" пишемо ім'я вже існуючого поля, на підставі якого розраховуватиметься нове поле. Пишемо туди " Калорійність". Колонка" Заголовокзаповнюється автоматично.

Ми додали нове поле (" Середнякалорійність"), але у звіті воно саме по собі не з'явиться - потрібно або знову викликати конструктор налаштувань("чарівна паличка") або додати це поле вручну.

Вчинимо другимспособом. Для цього переходимо на закладку " Налаштування", вибираємо " Звіт(адже ми хочемо додати поле в цілому до звіту), вибираємо внизу закладку " Вибрані поля" і перетягуємо поле " Середнякалорійністьз лівої колонки в праву:

Вийшло ось так:

Зберігаємо та формуємо звіт:

Поле з'явилося і бачимо, що його значеннями є значення поля " Калорійність " . Чудово!

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

При цьому в колонці Вираз" вибираємо " Середнє(СередняКалорійність)":

Зберігаємо та формуємо звіт:

Бачимо, що у групах, тобто у кожному кольору, і з звіту загалом цілком вірно порахувалося середнє значення. Але присутні зайві записиза окремими продуктами (не за групами), які хотілося б прибрати зі звіту.

Знаєте, чому вони з'явилися (значення не по групах)? Тому що коли ми додавали поле " Середнякалорійністьу налаштування звіту, на другому кроці ми виділили весь звіт загаломі це нове поле потрапило до елементу " Детальні записи".

Виправимо помилку. Для цього повернемося на закладку " Налаштування", оберемо " Детальні записиспочатку зверху (крок 2), а потім Детальні записи" знизу (крок 3), перейдемо на закладку " Вибрані поляі побачимо в її правій колонці елемент Авто".

Елемент " АвтоЦе не одне поле. Це кілька полів, які потрапляють сюди автоматично на підставі вищих налаштувань.

Щоб побачити, що це за поля – натиснемо на елемент. Авто" правоюкнопкою та оберемо пункт " Розгорнути":

Елемент " АвтоРозкрився в наступні поля:

А ось і наше поле Середнякалорійність", яке потрапило сюди з пункту" Звіт"Коли ми його туди перетягували. Просто знімемогалку поруч із цим полем, щоб прибрати його виведення.

У даній невеликій нотатці хочу показати, як можна зробити підсумовування значень на різних рівнях угруповання, у звіті з використанням системи компонування даними.
Як показано на зображенні, лише на рівні угруповання «Групи номенклатури», розраховується ресурс «Замовити», в ньому відображається скільки потрібно замовити за поточною групою номенклатури виходячи з певних умов:


Дане значення може бути розраховане тільки на даному рівні угруповання, оскільки вище або нижче відсутні значення для розрахунку. Наприклад, на рівні детальних записів немає даних за максимальною кількістю в групі, тому що ці дані вірні тільки для групи в цілому, а не для окремих її складових.

Відповідно, тепер необхідно розрахувати підсумки, за вище угрупуванням («Склади», «ТипиСкладів») і загальний підсумок.
Для цього використовується функція ОбчислитиВираз СгрупуваннямМасив:
ВИЧИСЛИТИ ВИРАЖЕННЯ ГРУПІРОВКОЙ МАСИВ (EVALEXPRESSIONWITHGROUPARRAY)
Синтаксис:
ОбчислитиВираз СгрупуваннямМасив(,)
Опис:
Функція повертає масив, кожен елемент якого містить результат обчислення виразу для угруповання по вказаному полю.
Компонувальник макета при генерації макета перетворює параметри функції терміни полів макета компонування даних. Наприклад, поле Контрагент буде перетворено в НаборДаних.Контрагент.
Компонувальник макету при генерації виразів для виведення поля користувача, у виразі якого присутня тільки функція ОбчислитиМассивСГруппировкойМассив(), генерує вираз, що виводиться таким чином, щоб виведена інформація була впорядкована. Наприклад, для поля користувача з виразом:

ОбчислитиВираз СгрупуваннямМасив("Сума(СумаОборот)", "Контрагент")
Компонувальник макету згенерує для виведення такий вираз:

З'єднатиРядки(Масив(Упорядкувати(ОбчислитиВираз зУгрупуваннямТаблицяЗначень("Подання(Сума(НаборДаних.СумаОборот)),Сума(НаборДанних.СуммаОборот)","НаборДанних.Контрагент"),"2

Параметри:

Тип: Рядок. Вираз, який слід обчислити. Рядок, наприклад, Сума(СуммаОборот).

Тип: Рядок. Вирази полів угруповання – вирази полів угруповання, перераховані через кому. Наприклад, Контрагент, Партія.

Тип: Рядок. Вираз, що описує відбір, який застосовується до детальних записів. У виразі не підтримується використання агрегатних функцій. Наприклад, Позначка Видалення = Брехня.

Тип: Рядок. Вираз, що описує добір, що застосовується до групових записів. Наприклад, Сума(СуммаОборот) > &Параметр1.
Приклад:

Максимум(ОбчислитиВираз ЗУгрупуваннямМасив ("Сума(СумаОборот)", "Контрагент"));

Детальний опис синтаксису функції можна знайти за адресою http://its.1c.ru/db/v837doc#bookmark:dev:TI000000582
Тепер для розрахунку, продублюємо поле «Замовити», з різними значеннями «Розраховувати по…», використовуючи наступні вирази, зверніть увагу, що в кожному вище рівні, що стоїть, використовуються значення рівнів нижче стоїть угруповань.

У результаті отримуємо таку конструкцію:

Грамотне використання схеми компонування даних (СКД) дозволяє:

  • значно знизити час, необхідний розробки звіту;
  • позбавитися необхідності створення керованої форми обробника;
  • отримати на виході гарний результат із можливістю додаткового налаштуваннякористувачем.

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

Що таке поле, що обчислюється

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

Справа в тому, що СКД - це більше, ніж просто відображення результату виконання запиту і це прекрасно видно з форми створення схеми (Рис.1).

Обчислювані поля дозволяють виконувати певні дії зі сформованим набором даних:

  • Виводити в певну комірку масив даних, отриманих запитом, з'єднавши кілька рядків в один;
  • Звертатись до експортних функцій загального модуля;
  • Виконувати різні вирази, доступні для мови компонування та використання спеціальних функційОбчислитиВираз.

Давайте за цим списком і ходімо.

Масив значень в одному осередку

Змоделюємо ситуацію, коли необхідно отримати в окремий осередок усі номери документів надходження за контрагентом:


таким чином, ми у нашій схемі створили додаткове розрахункове поле;


Як видно з наведеного прикладу, жодних складнощів у додаванні та обробці обчислюваних полів немає. Ми використовували дві функції: Масив() та З'єднатиРядки().

Декілька слів про останню. Крім першого параметра, що вказує на ідентифікатор масиву, значень або значення, можуть бути встановлені ще два:

  1. Розділювач Елементів – вказує, який символ відокремлюватиме один елемент масиву або один рядок таблиці значень від іншого (у нашому випадку ми опустили цей параметр і за умовчанням було призначено перенесення рядка);
  2. Розділювач Колонок – символ, який використовується для розділення колонок таблиці значень (за замовчуванням використовується крапка з комою).

Звернення до експортних функцій загального модуля

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

Декілька важливих моментів:

  • Функція обов'язково має бути експортною;
  • Якщо функція розташована в загальному модулі із встановленою ознакою «Глобальний», її виклик здійснюється безпосередньо на ім'я, інакше виклик функції має відбуватися за схемою «Ім'я загального модуля». «Ім'я функції».

Як приклад використання ми візьмемо той самий запит до документів надходження та виведемо в окрему колонку. Сам запит ми описувати не будемо, перейдемо безпосередньо до полів, що обчислюються:


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

Вирази мови компонування

Досить часто у роботі розробника виникає ситуація, як у полі СКД необхідно вивести результат поділу:

  1. Розрахувати середню вартість номенклатури;
  2. всілякі відсотки;
  3. Розрахунки середнього заробітку тощо.

Щоб уникнути проблем, у цих випадках бажано в полі, що обчислюється, ввести перевірку на розподіл на 0.

Зробити це можна за допомогою конструкції «Вибір Коли… Тоді… Інакше… Кінець».

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

Припустимо, отримати Суму Документу з попереднього рядка нашого запиту можна вказавши в полі «Вираз» значення Обчислити Вираз («СумаДокумента», «Попередня Сума»).

Цей спосіб, як мені здається, має мінус, але він працює, але мінус великий. Розглянемо з прикладу: є у конфігурації документ " Надходження товару " з табличною частиною"Товари", необхідно вивести до звіту документи та найменування товару, що надійшов для кожного документа.

Створимо звіт, додамо основну схему компонування даних, до СКД додамо набір даних типу "запит" і сформуємо простенький запит (див. рисунок 1).

Малюнок 1. Запит набору даних
На вкладці "Обчислювані поля" додамо поле, що обчислюється, під назвою ТабличнаЧастина і в колонці Вираз вкажемо порожній рядок (див. малюнок 2).
Наше поле, що обчислюється, буде використовуватися як ресурс, тому на вкладці "Ресурси" задаємо вираз угрупування: З'єднатиРядки(Масив(Товари.Номенклатура),""). А також вказуємо, що розраховувати цей ресурс потрібно за полем Посилання (див. рисунок 3).
Результат роботи звіту:
Про мінус - це використання угруповання, у нашому випадку виконується угруповання за реквізитом Посилання, інакше не працюватиме. Наявність угруповання накладає деякі обмеження щодо налаштування виведення даних (див. рис. 4).

2) Виклик власної функції із загального модуля.

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

Створимо звіт, додамо основну схему компонування даних, до СКД додамо набір даних типу "запит" і сформуємо простий запит (див. малюнок 6).


Малюнок 6. Запит набору даних
Створимо загальний модуль _ДемоРаботаЗвітами та напишемо експортну функцію ОтриматиПерелікТоварівДляЗвіту(). Програмний кодфункції дивися нижче.
На вкладці "Обчислювані поля" додамо поле, що обчислюється, під назвою ТабличнаЧастина і в колонці Вираз вкажемо виклик функції із загального модуля (див. малюнок 2):
_ДемоРаботаЗвітами.ОтриматиПерелікТоварівДляЗвіту(Посилання)

Перейдемо на вкладку "Налаштування" і створимо налаштування для виведення даних - це буде детальний запис (див. рис. 8).
Результат роботи звіту:

Завантажити приклад звіту

Що потрібно знати при використанні цього способу:
1) Вираз механізму компонування даних може містити виклики функцій глобальних загальних модулів конфігурації. Наприклад:
Скорочене Найменування (Посилання, Дата, Номер)
2) При програмному формуванні звіту використання функцій загальних модулів дозволено лише за умови відповідного параметра процесора компонування даних (4-й параметр):
ПроцесорКомпонування = Новий ПроцесорКомпонуванняДаних;
ПроцесорКомпонівки.Ініціалізувати(МакетКомпонівки, ДаніРозшифровки, Істина);
3) Функції загальних модулів не можуть бути використані у виразах полів користувача.
4) Якщо під час формування звіту викликається виняток із зазначенням на функцію загального модуля, перевірте контекст виконання модуля (див. малюнок 9).

Опис використаних функцій

З'єднатиРядки (Значення, РозділювачЕлементів, РозділювачіКолонок)- призначена для поєднання рядків в один рядок.
  • Значення – вирази, які потрібно об'єднати в один рядок. Якщо є Масивом, то рядок об'єднуватимуться елементи масиву. Якщо є ТаблицяЗначень, то рядок об'єднуватимуться всі колонки і рядки таблиці;
  • Розділювач Елементів - рядок, що містить текст, який потрібно використовувати як роздільник між елементами масиву та рядками таблиці значень. За замовчуванням символ перекладу рядків;
  • Розділювачі Колонок - рядок, що містить текст, який потрібно використовувати як роздільник між колонками таблиці значень. За замовчуванням "; ".
Масив([Різні] Вираз)- Як параметр можна використовувати таблицю значень. При цьому результатом роботи функції буде масив, що містить значення першої колонки таблиці значень, переданої як параметр. Якщо вираз містить функцію Масив, то вважається, що цей вираз є агрегатним. Якщо вказано ключове словоРізні, то одержуваний масив не міститиме дублюючих значень.

ОтриматиПерелікТоварівДля Звіту(ДокументПосилання)- функція формує рядок з переліком товару, що надійшов.
// Параметри:
// ДокументПосилання - ДокументПосилання. НадходженняТовара - Документ "Надходження товару".
// Повертається значення:
// Рядок - рядок із переліком товарів.
Функція ОтриматиПерелікТоварівДля Звіту(ДокументПосилання) Експорт

Перелік Товарів = "";

Для кожного РядокТЧ З ДокументПосилання.Товари Цикл
Перелік Товарів = Перелік Товарів + Рядок ТЧ. Номенклатура;
Перелік Товарів = Перелік Товарів + Символи.ПС;
КінецьЦикл;

Повернення Перелік Товарів;

КінецьФункції // ОтриматиПерелікТоварівДляЗвіту()