1c изчислени полета. Изразен език на системата за съставяне на данни (1Cv8). Операцията за проверка на стойност за не-NULL

  • 1C-Битрикс
  • Една от най-важните области на бизнес софтуера е отчитането. Колко лесно е да персонализирате съществуващ отчет към променящите се нужди на бизнеса (и законодателството) или да направите нов, може да зависи (а не в преносен смисъл!) съдбата на даден бизнес, независимо дали е отчет за данъчен офисили диаграма на търсенето на стоки в зависимост от сезона и други фактори. Мощна и гъвкава система за отчитане, която ви позволява лесно да извличате точните данни от системата, да ги представяте в разбираема форма, позволявайки на крайния потребител да преконфигурира стандартния отчет, за да види данните в нова светлина - това е идеалът, който всеки бизнес системата трябва да се стреми.

    В платформата 1C:Enterprise механизъм, наречен Data Composition System (накратко ACS), отговаря за генерирането на отчети. В тази статия ще се опитаме да дадем Кратко описаниеидеи и архитектура на механизма ACS и неговите възможности.


    ACS е механизъм, базиран на декларативното описание на отчетите. ACS е проектиран да създава отчети и да показва информация, която има сложна структура. Между другото, в допълнение към разработването на отчети, механизмът ACS се използва и в 1C:Enterprise в динамичен списък, инструмент за показване на информация от списък с богата функционалност (показване на плоски и йерархични списъци, условно форматиране на редове, групиране и др.) .

    Малко история

    В първата версия на платформата 1C:Enterprise 8, версия 8.0, отчетите бяха направени, както следва:
    1. Една или повече заявки са написани на езика за заявки 1C (език, подобен на SQL, повече за него по-долу).
    2. Написан е код, който прехвърля резултатите от изпълнените заявки в документ с електронна таблица или диаграма. Кодът може също така да върши работа, която не може да бъде извършена в заявка - например той изчислява стойности с помощта на вградения език 1C.
    Подходът е ясен, но не е от най-удобните - има минимум визуални настройки, всичко трябва да се програмира от ръка на ръка. И един от козовете по това време беше напълно нова платформа"1C:Enterprise 8" е минимизиране в приложното решение на количеството код, който трябва да бъде написан ръчно, по-специално поради визуалния дизайн. Би било логично да следваме същия път и в механизма за докладване. Това беше направено чрез разработването на нов механизъм - Data Composition System.

    Една от идеите, които са в основата на ACS, е гъвкавостта и персонализирането на отчетите, които са достъпни както за разработчика, така и за крайния потребител. В идеалния случай бихме искали да дадем на крайния потребител достъп до същия набор от инструменти за проектиране на отчети като разработчика. Би било логично да се направи един набор от инструменти, достъпен за всички. Е, тъй като инструментите включват участието на крайния потребител, това означава, че използването на програмиране в тях трябва да бъде премахнато до минимум (най-доброто от всичко, напълно елиминирано), а визуалните настройки трябва да се използват максимално.

    Формулиране на проблема

    Задачата пред екипа за разработка беше следната - да се направи система за отчети, базирана не на алгоритмичен (т.е. чрез писане на код), а на декларативен подход за създаване на отчети. И смятаме, че проблемът е успешно решен. Според нашия опит около 80% от необходимото отчитане може да се реализира с помощта на ACS без нито един ред код (с изключение на писане на формули за изчисляеми полета), в по-голямата си част - чрез визуални настройки.
    Разработването на първата версия на ACS отне около 5 човеко-години.

    Два езика

    Два езика участват в създаването на отчети. Единият е езикът за заявки, използван за извличане на данните. Вторият е езикът за изразяване на съставяне на данни, предназначен за писане на изрази, използвани в различни частисистема, например, в настройките за съставяне на данни, за да опише персонализирани изрази на полето.

    Език за заявки

    Езикът за заявки е базиран на SQL и се овладява лесно от тези, които познават SQL. Пример за заявка:

    Лесно е да видите аналози на стандартни секции на SQL заявки - SELECT, FROM, GROUP BY, ORDER BY.

    В същото време езикът на заявките съдържа значителен брой разширения, насочени към отразяване на спецификата на финансовите и икономическите задачи и максимално намаляване на усилията за разработване на приложни решения:

    • Рефериране на полета чрез точка. Ако полетата на която и да е таблица са от референтен тип (съхраняват връзки към обекти от друга таблица), разработчикът може да ги посочи в текста на заявката чрез ".", докато броят на нивата на влагане на такива връзки не е ограничен от системата (например Клиентска поръчка.Споразумение.Организация. Телефон).
    • Многомерно и многостепенно формиране на резултатите. Общите и междинните суми се формират, като се вземат предвид групирането и йерархията, нивата могат да бъдат заобиколени в произволен ред с сумиране на междинни суми, осигурява се правилната конструкция на сумите по времеви измерения.
    • Поддръжка на виртуални маси. Предоставените от системата виртуални таблици ви позволяват да получите почти готови данни за повечето приложни задачибез необходимост от сложни заявки. По този начин виртуална таблица може да предостави данни за баланса на стоките в контекста на периоди в определен момент от време. В същото време виртуалните таблици се възползват максимално от съхранената информация, например предварително изчислени суми и т.н.
    • Временни маси. Езикът на заявките ви позволява да използвате временни таблици в заявки. С тяхна помощ можете да подобрите производителността на заявките, в някои случаи да намалите броя на заключванията и да направите текста на заявката по-лесен за четене.
    • партидни заявки. За по-удобна работа с временни таблици, езикът на заявките поддържа работа с пакетни заявки - по този начин създаването на временна таблица и нейното използване се поставят в една заявка. Пакетната заявка е поредица от заявки, разделени с точка и запетая (";"). Заявките в пакета се изпълняват една след друга. Резултатът от изпълнението на групова заявка, в зависимост от използвания метод, ще бъде или резултатът, върнат от последната заявка на групата, или масив от резултатите на всички пакетни заявки в реда, в който заявките в групата следват .
    • Получаване на референтни полеви изгледи. Всяка обектна таблица (в която се съхранява дадена директория или документ) има виртуално поле - "Представяне". Това поле съдържа текстово представяне на обекта и улеснява работата на репортера. И така, за документ това поле съдържа цялата ключова информация - името на типа документ, неговия номер и дата (например "Продажба 000000003 от 06.07.2017 г. 17:49:14"), спестявайки на разработчика от писане на изчисляемо поле.
    • и т.н.
    Машината за заявки автоматично променя заявката, като взема предвид ролите на потребителя, от чието име се изпълнява заявката (т.е. потребителят ще вижда само данните, които има право да вижда) и функционалните опции (т.е. в съответствие с тази, конфигурирана във функционалността на приложното решение).

    Има и специални разширения за език за заявки за SKD. Разширяването се извършва с помощта на специални синтактични инструкции, затворени във фигурни скоби и поставени директно в текста на заявката. С помощта на разширения разработчикът определя какви операции ще може да извършва крайният потребител, като персонализира отчета.

    Например:

    • ИЗБИРАМ. Това изречение описва полетата, които потребителят ще може да избира за извеждане. След това ключова думапсевдоними на полета от основния списък за избор на заявка, които ще бъдат достъпни за персонализиране, са изброени разделени със запетаи. Пример: (ИЗБЕРЕТЕ номенклатура, склад)
    • КЪДЕТО. Описва полетата, върху които потребителят може да приложи селекция. Това предложение използва таблични полета. Използването на псевдоними на полета в списъка за избор не е разрешено. Всяка обединена част може да съдържа свой собствен елемент WHERE. Примери: (WHERE Номенклатура.*, Склад), (WHERE Document.Date >= &StartDate, Document.Date<= &ДатаКонца}
    • и т.н.
    Пример за използване на разширения:

    Език за изразяване на състава на данни

    Езикът за съставяне на данни е проектиран да пише изрази, използвани по-специално за описване на потребителски изрази на полета. ACS ви позволява да дефинирате персонализирани полета в отчет, като използвате вашите собствени изрази или набори от опции с условия за техния избор (аналогично на CASE в SQL). Персонализираните полета са аналогични на изчислените полета. Те могат да бъдат зададени както в конфигуратора, така и в режим 1C:Enterprise, но функциите на общите модули не могат да се използват в персонализирани изрази на полета. Следователно персонализираните полета са повече за потребителя, отколкото за разработчика.

    Пример:

    Процесът на създаване на отчет за ACS

    Когато създаваме отчет, трябва да създадем оформление, което определя как данните ще бъдат показани в отчета. Можете да създадете оформление въз основа на схема за съставяне на данни. Схемата за съставяне на данни описва същността на данните, които се предоставят на отчета (откъде да вземете данните и как можете да контролирате състава им). Схемата за съставяне на данни е основата, на която могат да се генерират всякакви отчети. Схемата за съставяне на данни може да съдържа:
    • текст на заявка със системни инструкции за съставяне на данни;
    • описание на няколко набора от данни;
    • подробно описание на наличните полета;
    • описание на връзките между няколко набора от данни;
    • описание на параметрите за събиране на данни;
    • описание на оформлението и групирането на полета;
    • и т.н.

    Например, можете да добавите заявка към схемата за съставяне на данни като набор от данни и да извикате конструктора на заявка, който ви позволява да съставите графично заявка с произволна сложност:

    Резултатът от стартирането на конструктора на заявки ще бъде текстът на заявката (на езика на заявките 1C:Enterprise). Този текст може да бъде коригиран ръчно, ако е необходимо:

    Може да има няколко набора от данни в схема за съставяне на данни, набори от данни могат да бъдат свързани в оформление по произволен начин, могат да се добавят изчислени полета, могат да се задават параметри на отчета и т.н. Струва си да се спомене една интересна функция на механизма за заявки в 1C:Enterprise. В крайна сметка заявките се превеждат в диалект на SQL, специфичен за СУБД, с която приложението работи директно. Като цяло се опитваме да използваме максимално възможностите на СУБД сървърите (ограничени сме от факта, че използваме само тези възможности, които са едновременно налични във всички СУБД, поддържани от платформата 1C:Enterprise - MS SQL, Oracle, IBM DB2 , PostgreSQL). Така на ниво заявка в изчисляеми полета можем да използваме само онези функции, които са преведени в SQL.

    Но на ниво схема за съставяне на данни вече можем да добавяме потребителски полета и да използваме функции в тях във вградения език за разработка на 1C (включително написаните от нас), което значително разширява възможностите на отчетите. Технически изглежда така - всичко, което може да се преведе в SQL, се превежда в SQL, заявката се изпълнява на ниво СУБД, резултатите от заявката се поставят в паметта на сървъра на приложения 1C и ACS изчислява стойностите изчислени полета за всеки запис, чиито формули са написани на езика 1C.


    Добавяне на персонализирани полета

    Можете да добавите произволен брой таблици и диаграми към отчета:


    Дизайнер на отчети


    Докладвайте по време на изпълнение

    С помощта на ACS потребителят може да добави сложни селекции към отчета (които ще бъдат добавени към заявката на правилните места), условен дизайн (позволяващ ви да форматирате различно - шрифт, цвят и т.н. - изходни полета в зависимост от техните стойности) и много повече.

    Опишете накратко процеса на изграждане и генериране на отчет, както следва:

    • Разработчикът по време на проектиране с помощта на дизайнера (или по време на изпълнение с помощта на код) дефинира схемата за оформление на данните:
      • Текст на искане/заявки
      • Описание на изчисляемите полета
      • Връзки между заявки (ако има повече от една)
      • Опции за отчет
      • Настройките по подразбиране
      • и т.н.
    • Горните настройки се записват в оформлението
    • Потребителят отваря отчет
      • Евентуално прави допълнителни настройки (например променя стойностите на параметрите)
      • Натиска бутона "Генериране".
    • Потребителските настройки се прилагат към схемата за съставяне на данни, дефинирана от разработчика.
    • Формира се междинно оформление на състава на данните, съдържащо инструкции откъде да се вземат данните. По-специално заявките, посочени в оформлението, са коригирани. Така че полетата, които не се използват в отчета, се премахват от заявката (това се прави, за да се сведе до минимум количеството получени данни). Всички полета, които се използват във формули за изчислени полета, се добавят към заявката.
    • Процесорът за композиране на данни е включен в кутията. Процесорът за оформление изпълнява заявки, свързва набори от данни, изчислява стойностите на изчислените полета и ресурси, извършва групиране. С една дума, той прави всички изчисления, които не са извършени на ниво СУБД.
    • Процесорът за извеждане на данни стартира заявка за изпълнение и извежда получените данни в документ с електронна таблица, диаграма и др.


    Процесът на генериране на отчет от ACS механизма

    Опитваме се да сведем до минимум количеството отчетни данни, прехвърлени от сървъра към клиентското приложение. Когато показваме данни в документ с електронна таблица, когато отваряме документ с електронна таблица, ние прехвърляме от сървъра само онези редове, които потребителят вижда в началото на документа. Докато потребителят се движи по редовете на документа, липсващите данни се изтеглят от сървъра към клиента.

    Потребителски настройки

    Всички ACS инструменти са достъпни както за разработчика, така и за крайния потребител. Но практиката показва, че крайният потребител често е уплашен от изобилието от възможности на инструмента. Освен това в повечето случаи крайният потребител не се нуждае от цялата мощ на настройките - достатъчно е той да има бърз достъп до настройка на един или два параметъра на отчета (например период и контрагент). Започвайки с определена версия на платформата, разработчикът на отчети има възможност да маркира кои настройки на отчета са достъпни за потребителя. Това става чрез квадратчето за отметка „Включване в потребителските настройки“. Освен това настройките на отчета вече имат флаг „Режим на показване“, който приема една от трите стойности:
    • Бърз достъп. Настройката ще се покаже директно в горната част на прозореца на отчета.
    • Обикновен. Настройката ще бъде достъпна чрез бутона "Настройки".
    • Не е наличен. Настройката няма да бъде достъпна за крайния потребител.


    Задаване на режим на показване във времето за проектиране


    Показване на настройката в режим на бърз достъп по време на изпълнение (под бутона Генериране)

    Планове за развитие

    Един от приоритетите в развитието на ACS за нас е опростяването на потребителските настройки. Нашият опит показва, че за някои крайни потребители работата с потребителските настройки все още е сериозна работа. Отчитаме това и работим в тази посока. Съответно, за разработчиците ще стане по-лесно да работят с ACS, защото ние, както и преди, искаме да предоставим единен инструментариум за настройка на отчети както за разработчика, така и за крайния потребител.

    В светлината на предстоящото издание на 8.2.14, ще се опитам да опиша някои от новите функции на системата за съставяне на данни.

    Отворете схемата за съставяне на данни, за предпочитане във външен отчет, за да улесните редактирането.

    Добавяме набор от данни за заявка и пишем, ръчно или с помощта на конструктора на заявки, най-простата заявка:

    1. Настройте заявка в ACS.

    2. Настройте изчислени полета в ACS

    3. Конфигурираме оформлението на данните в раздела с настройки

    4. Стартираме 1C Enterprise 8.2.14. Отваряме отчета. Формираме, получаваме.

    Описание на самите нови функции:

    1. Текущата дата ()

    Връща системната дата. Когато оформяте оформлението на оформлението, във всички изрази, които присъстват в оформлението, функцията CurrentDate() се заменя със стойността на текущата дата.

    2. ИЗЧИСЛЕН ИЗРАЗ()

    Синтаксис:

    Изчисляване на израз (<Выражение>, <Группировка>, <ОбластьВычисления>, <Начало>, <Конец>, <Сортировка>, <ИерархическаяСортировка>, <ОбработкаОдинаковыхЗначенийПорядка>)

    Описание:

    Функцията е предназначена да оценява израз в контекста на някакво групиране.

    Функцията взема предвид избора на групи, но не взема под внимание йерархичния избор.

    Функцията не може да бъде приложена към групиране в груповия избор на това групиране. Например при избора на групирането на номенклатурата не можете да използвате израза Изчисляване на израз ("Сума(Сумаоборот)", "ОбщоОбщо") > 1000. Но такъв израз може да се използва в йерархичен избор.

    Ако крайният запис предшества началния запис, тогава се счита, че няма записи за изчисляване на подробни данни и изчисляване на агрегатни функции.

    При изчисляване на интервални изрази за общия сбор (параметърът Групиране е зададен на GrandTotal), се счита, че няма записи за изчисляване на подробни данни и изчисляване на агрегатни функции.

    Конструкторът на оформление, когато генерира израза на функцията Calculate Expression, ако подреждащият израз съдържа полета, които не могат да се използват при групиране, замества функцията Calculate Expression с NULL.

    Настроики

    <Выражение>

    __________________________

    Тип: низ. Изразът, който трябва да се оцени.

    <Группировка>

    __________________________

    Тип: низ. Съдържа името на групирането, в чийто контекст изразът трябва да бъде оценен. Ако празен низ се използва като име на групиране, изчислението ще се извърши в контекста на текущото групиране. Ако низът GrandTotal се използва като име на групиране, изчислението ще се извърши в контекста на общата сума. В противен случай изчислението ще се извърши в контекста на родителската група с това име.

    Например:

    Sum(Sales.SumTurnover)/Calculate("Sum(Sales.SumTurnover)", "TotalTotal")

    В този пример резултатът ще бъде съотношението на сумата за полето Sales.AmountVolume на групиращия запис към сумата на същото поле в цялото оформление;

    <ОбластьВычисления>

    _________________________

    Тип: низ. Параметърът може да приема следните стойности:

    · GeneralTotal - изразът ще бъде изчислен за всички групиращи записи.

    · Йерархия – изразът ще бъде оценен за родителския йерархичен запис, ако има такъв, и за цялата група, ако няма родителски йерархичен запис.

    · Групиране - изразът ще бъде оценен за текущия запис на групиране.

    · GroupingNotResource- при изчисляване на функция за групов запис по ресурси, изразът ще се изчислява за първия групов запис от първоначалното групиране.

    Когато се изчислява функцията CalculateExpression() със стойността GroupingNotResource за групови записи, които не са групирани по ресурси, функцията се изчислява по същия начин, както би била изчислена, ако стойността на параметъра е равна на стойността на групирането.

    Конструкторът на оформление за съставяне на данни, когато генерира оформление за съставяне на данни, когато показва ресурсно поле, което е групирано по, поставя израз в оформлението, което се изчислява с помощта на функцията Calculate Expression(), като указва параметъра GroupingNotResource. За други ресурси, групирани по ресурс, се поставят регулярни изрази за ресурси.

    <Начало>

    _____________________

    Тип: низ. Указва кой запис да започне фрагмента, в който да се изчислят агрегатните функции на израза и от кой запис да се получат стойностите на полетата извън агрегатните функции. Стойността може да бъде една от следните:

    · Предишен

    <Конец>

    ____________________

    Тип: низ. Показва към кой запис да продължи фрагментът, в който да се изчислят агрегатните функции на израза. Стойността може да бъде една от следните:

    · Първи (Първи) . Трябва да получите първия групиращ запис. След думата в скоби можете да посочите израз, резултатът от който ще се използва като отместване от началото на групирането. Получената стойност трябва да е цяло число, по-голямо от нула. Например First(3) - получаване на третия запис от началото на групирането.

    Ако първият запис е извън групата, тогава се счита, че няма записи. Например, ако има 3 записа и искате да получите Първия (4), тогава се счита, че няма записи.

    Последен (Последен) . Трябва да получите последния запис за групиране. След думата в скоби можете да посочите израз, резултатът от който ще се използва като отместване от края на групирането. Получената стойност трябва да е цяло число, по-голямо от нула. Например Last(3) - вземете третия запис от края на групирането.

    Ако последният запис е извън групирането, тогава се счита, че няма записи. Например, ако има 3 записа и искате да получите Last(4), тогава се счита, че няма записи.

    · Предишен. Трябва да получите предишния запис за групиране. След думата в скоби можете да посочите израз, резултатът от който ще се използва като преместване назад от текущия групиращ запис. Например Previous(2) - вземете предишния от предишния запис.

    Ако предишният запис е извън групирането (например, вторият групиращ запис трябва да получи Previous(3), тогава се получава първият групиращ запис.

    При получаване на предишния запис за общия сбор се счита, че е получен първият запис.

    · Напред (Напред) . Трябва да получите следващия запис за групиране. След думата в скоби можете да зададете израз, резултатът от който ще се използва като преместване напред от текущия групиращ запис. Например Next(2) - вземете следващия от следващия запис.

    Ако следващият запис надхвърли групирането, тогава се счита, че няма записи. Например, ако има 3 записа и третият запис получава Next(), тогава се счита, че няма записи.

    При получаване на следващия запис за сумата на групирането се счита, че няма запис.

    · Текущи (Текущи) . Трябва да получите текущия запис.

    Когато се извлича за обща сума за групиране, се извлича първият запис.

    · Гранична стойност. Необходимостта да се получи записът с определената стойност. След думата RestrictingValue в скоби, трябва да посочите израза, с чиято стойност искате да стартирате фрагмента, първото поле за подреждане.

    Записът ще бъде първият запис, чиято стойност на полето за подреждане е по-голяма или равна на указаната стойност. Например, ако полето Период се използва като поле за подреждане и има стойностите 01/01/2010, 02/01/2010, 03/01/2010 и искате да получите LimitValue(DateTime(2010) , 1, 15)), тогава ще бъде получен запис с дата 02/01. 2010 г.

    <Сортировка>

    _____________________

    Тип: низ. Изброени са изрази, разделени със запетая, които описват правилата за подреждане. Ако не е посочено, подреждането се извършва по същия начин, както за групирането, за което се оценява изразът. След всеки израз можете да посочите ключовите думи Asc (за сортиране във възходящ ред), Descending (за сортиране в низходящ ред) и AutoOrder (за сортиране на референтните полета по полетата, по които искате да сортирате реферирания обект). Думата AutoOrder може да се използва както с възходящи, така и с низходящи думи.

    <ИерархическаяСортировка>

    _____________________

    Тип: низ. Подобно на опцията Сортиране. Използва се за подреждане на йерархични записи. Ако не е посочено, конструкторът на оформление генерира подреждане според подреждането, указано в параметъра за сортиране.

    <ОбработкаОдинаковыхЗначенийПорядка>

    ____________________

    Тип: низ. Указва правило за определяне на предишния или следващия запис, ако има множество записи с една и съща подредена стойност:

    · Отделно означава, че последователност от подредени записи се използва за определяне на предишния и следващия запис. Стойност по подразбиране.

    · Заедно (Заедно) показва, че предишните и следващите записи се определят въз основа на стойностите на изразите за подреждане.

    Например, ако получената последователност е подредена по дата:
    |дата|Пълно име|Значение
    1 | 01 януари 2001 | Иванов М. | 10
    2 | 02 януари 2001 | Петров С. | 20
    3 | 03 януари 2001 | Сидоров Р. | тридесет
    4 | 04 януари 2001 | Петров С. | 40

    Ако стойността на параметъра е Отделно, тогава:

    § предишният запис към запис 3 ще бъде запис 2.

    § ако изчислителният фрагмент е дефиниран като Current, Current (съответно параметрите Start и End), тогава за запис 2 този фрагмент ще се състои от един запис 2. Изразът Calculate Expression ("Sum (Value)", Current, Current) ще бъде равно на 20.

    Ако стойността на параметъра е Заедно, тогава:

    § предишният запис към запис 3 ще бъде запис 1.

    § ако изчислителният фрагмент е дефиниран като Current, Current (съответно параметрите Start и End), тогава за запис 2 този фрагмент ще се състои от записи 2 и 3. Изразът Calculate Expression ("Сума (стойност)", Current, Current ) ще бъде равно на 50.

    Когато зададете стойността на параметъра, равна на Together, в параметрите Start и End, не можете да посочите отместване за позициите First, Last, Previous, Next.

    CalculateExpression("Сума(СумаОборот)", "Първа", "Текуща")

    Ако искате да получите стойността на групирането в предишния ред, можете да използвате следния израз:

    CalculateExpression("Курс", "Предишен")

    Списък с нови функции:

    ComputeExpressionGroupedArray(<Выражение>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>) -

    Функцията връща масив, всеки елемент от който съдържа резултата от изчисляването на израза за групиране по зададеното поле.

    CalculateExpressionWithGroupValueTable(<Выражения>, <ВыражениеПолейГруппировки>, <ОтборЗаписей>, <ОтборГруппировок>) -

    Функцията връща таблица със стойности, всеки ред от която съдържа резултата от изчисляването на изрази за групиране по указаното поле

    ValueFilled(<Выражение>) - Връща True, ако стойността е различна от стойността по подразбиране за този тип, различна от NULL, различна от нулева препратка, различна от Undefined. Булевите стойности се тестват за NULL. Низовете се проверяват за знаци, които не са интервали.

    формат (<Выражение>, <Форматная строка>) - Вземете форматирания низ на предадената стойност. Форматният низ се задава в съответствие с форматния низ на системата 1C:Enterprise.

    подниз(<Выражение>, <Начальные символ>, <ДлинаПодстроки>) - Тази функция е предназначена да избира подниз от низ.

    StringLength(<Выражение>) - Функцията е предназначена да определя дължината на низ. Параметър - израз тип низ

    Линия (<Выражение>) - Ако масив е предаден като параметър, тогава функцията връща низ, съдържащ низови представяния на всички елементи на масива, разделени със знаци "; ". Ако таблица със стойности е предадена като параметър, тогава функцията връща низ, съдържащ низови представяния на всички редове на таблицата със стойности, а представянията на клетките на всеки ред са разделени със знаците "; ", и линиите са разделени със знака за нов ред. Ако някой елемент има празно представяне на низ, тогава вместо неговото представяне се показва низ<Пустое значение>.

    [трябва да се регистрирате, за да видите връзката]

    Влезте като студент

    Влезте като ученик за достъп до училищно съдържание

    1C 8.3 система за съставяне на данни за начинаещи: преброяване на резултатите (ресурси)

    Целта на този урок ще бъде:

    • Напишете отчет, който показва списък с продукти (Директория с храни), тяхното съдържание на калории и вкус.
    • Групирайте продуктите по цвят.
    • Запознайте се с функцията за обобщаване (ресурси) и изчисляемите полета.

    Създаване на нов отчет

    Както в предишните уроци, отворете базата данни " Деликатес" в конфигуратора и създайте нов отчет през менюто " Файл"->"Нов...":

    Тип на документа - външен доклад:

    Във формата за настройки на отчета напишете името " Урок 3"и натиснете бутона" Отворена диаграма на състава на данните":

    Оставете името на схемата по подразбиране и щракнете върху „ Готов":

    Добавяне на заявка чрез конструктора

    В раздела " Набор от данни"щракване зеленознак плюс и изберете " Добавяне на набор от данни - Заявка":

    Вместо да пишете текста на заявката ръчно, стартирайте отново конструктор на заявки:

    В раздела " маси"плъзнете масата" Храна" от първата колона към втората:

    Изберете от таблицата Храна" полетата, които ще поискаме. За да направите това, плъзнете полетата " Име", "вкус", "Цвят" И " калории"от втора колона до трета:

    Оказа се така:

    Натисни бутона " Добре" - текстът на заявката се генерира автоматично:

    Формиране на настройки за представяне на отчет

    Отидете на отметка Настройки"и щракнете върху магическа пръчка, да се обади конструктор на настройки:

    Изберете вида на отчета списък..." и натиснете бутона " По-нататък":

    Плъзнете и пуснете от лявата колона вдясно полетата, които ще се показват в списъка, и щракнете върху " По-нататък":

    Плъзнете от лявата колона към дясното поле " Цвят„- според това ще стане групиранередове в отчета. Натиснете " Добре":

    И ето резултата от конструктора. Йерархия на нашия доклад:

    • отчет като цяло
    • групиране "Цвят"
    • подробни записи - редове с имена на храни

    Запазване на отчета (бутон дискета) И без затварянеконфигуратор, веднага ще го отворим в потребителски режим. Оказа се така:

    Промяна на реда на колоните

    Но нека промени редаколони (стрелки нагоре и надолу), така че да изглежда като на снимката по-долу:

    Запазете отчета и го отворете отново в потребителски режим:

    Страхотно, така е много по-добре.

    Обобщаване (сумиране) по съдържание на калории

    Би било хубаво да се показва общото калорично съдържание на храните по групи. За да видите сумата от съдържанието на калории на всички продукти, да речем, бяло или жълто. Или разберете общото съдържание на калории на всички храни в базата данни.

    За това има механизъм за изчисляване на ресурсите.

    Отидете на раздела " Ресурси" и плъзнете полето " калории„(ще го обобщим) от лявата колона в дясната.

    В същото време в полето за израз изберете от падащия списък " Количество (калории)", тъй като общата сума ще бъде сумата от всички елементи, включени в общата сума:

    Запазване и генериране на отчет:

    Разполагаме с резултатите за всяка от групите и за доклада като цяло.

    Обобщаване (средно) по съдържание на калории

    Сега нека направим така, че да се показва друга колона средно аритметичнокалорично съдържание на продукти по групи и общо за отчета.

    Невъзможно е да се докосне вече съществуващата колона „Съдържание на калории“ - общата сума вече се показва в нея, следователно нека добавим още едно поле, което ще бъде точно копие на полето "Калории".

    За да създадем такова "виртуално" поле, използваме механизма изчислени полета.

    Отидете на отметка Изчисляеми полета"и натиснете зеленознак плюс:

    В колона " Път на данни"напишете името на новото поле ( заедно, без интервали). Нека се нарича Средни калории", и в колоната " Изразяване" пишем името на вече съществуващо поле, на базата на което ще се изчислява новото поле. Пишем там " калории". Колона " заглавка“ ще се попълни автоматично.

    Добавихме ново поле (" Средни калории“), но няма да се появи в отчета сам – трябва или да го извикате отново конструктор на настройки("вълшебна пръчка") или добавете това поле ръчно.

    Да действаме второначин. За да направите това, отидете на раздела " Настройки", избирам " Докладвай" (все пак искаме да добавим полето като цяло към отчета), изберете раздела по-долу " Избрани полета" и плъзнете полето " Средни калории“ от лявата колона надясно:

    Оказа се така:

    Запазване и генериране на отчет:

    Полето се появи и виждаме, че неговите стойности са стойностите на полето "Калории". Страхотен!

    За да направим това, ние отново използваме вече познатия ни механизъм. ресурси(обобщаване). Отидете на отметка Ресурси" и плъзнете полето " Средни калории“ от лявата колона надясно:

    В същото време в колоната Изразяване"избирам" Средно (средна калория)":

    Запазване и генериране на отчет:

    Виждаме, че за групите, тоест за всеки цвят и за отчета като цяло, средната стойност е изчислена съвсем правилно. Но присъства допълнителни записиза отделни продукти (не за групи), които искате да премахнете от отчета.

    Знаете ли защо са се появили (тоест не групово)? Защото, когато добавихме полето " Средни калории“ в настройките на отчета, във втората стъпка, която избрахме целия доклади това ново поле удари елемента " Подробно записи".

    Нека поправим грешката. За да направите това, върнете се в раздела " Настройки", избирам " Подробни записи" първо отгоре (стъпка 2) и след това " Подробни записи"отдолу (стъпка 3), отидете на отметка" Избрано полета" и вижте в дясната му колона елемента " Автоматичен".

    елемент " Автоматичен" - това не е едно поле. Това са няколко полета, които автоматично стигат тук въз основа на по-високи настройки.

    За да видите какви са тези полета - щракнете върху елемента " Автоматичен" точнои изберете " Разширяване":

    елемент " Автоматичен“ се разширява в следните полета:

    Тук е нашето поле Средни калории"което стигна до тук от параграф" Докладвай"когато го завлечехме там. Просто да излитамеотметнете до това поле, за да премахнете изхода му.

    Схема за съставяне на данни (1C SKD)- удобен дизайнер за създаване на сложни отчети в софтуерни продукти 1C:Enterprise, които допринасят за развитието и проследяването на автоматизацията на производството, което ви позволява да ги направите възможно най-гъвкави и красиви за минимално време. Допълнителен плюс на схемите за съставяне на данни (1C SKD) е автоматичното генериране на контролирана форма на отчет и с по-нататъшното развитие на тази посока е важен фактор при избора на метод за разработване на отчет. Но поради сложността на структурата на схемата за съставяне на данни (1C SKD) и огромен брой настройки, това често води до по-дълго разработване на отчет, отколкото чрез „конструктора на изходна форма“. Следователно програмистът на 1C трябва да разбере всички тънкости на схемата за съставяне на данни (1C SKD), за да ускори допълнително времето за разработка за генериране на отчети.

    Нека анализираме първите три раздела на схемата за съставяне на данни (1C SKD) - набор от данни, връзки към набор от данни и изчисляеми полета.

    Набор от данни в 1C SKD

    Наборът от данни включва възможност за създаване на три обекта - заявка, обект и обединение, нека се спрем на всеки от тях по-подробно:

    Представлява обикновена заявка, която се генерира от бутона Query Constructor. Ако флагът за автоматично довършване е зададен, всички избрани детайли автоматично ще попаднат в полетата на набора от данни. Също така е възможно да персонализирате попълването на полетата в заявката в раздела Състав на данни, където има три раздела:

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

    Полета, тук избираме тези обекти, които трябва да бъдат включени в отчета, дъщерният флаг показва дали ще има налични дъщерни елементи за обекта или не, логично е, че за низови, числови и подобни данни няма да може да се зададе флага на True.

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

    Част от работата се извършва в схемата за съставяне на данни, част програмно, нека да разгледаме един прост пример:

    Първо, нека създадем оформление на схемата за оформление на данни за документа и да го наречем SKD (например: 1C SKD), създаваме набор от обектни данни в него, след което попълваме полетата, например имаме таблична част от документалната стока с реквизити - номенклатура, количество и цена.

    Нека добавим три полета и попълним полето за всяка колона с името на детайлите, останалите колони ще бъдат попълнени автоматично:

    Нека създадем бутон във формуляра на документа, опишем механизма на работа в управлявани формуляри:

    &При клиент

    Процедура Print()

    Нашият отчет = PrintOnServer(); // извикване на функцията на сървъра

    Нашият отчет.Покажи(); //изведете генерирания отчет

    EndProcedure

    &На сървъра

    Функция PrintOnServer()

    DocumentObject = FormAttributeToValue("Обект");

    //поставяме табличната част Стоки в структурата с име Стоки SKD по същия начин, както посочихме името на обекта, съдържащ данните в самата ACS

    DataSet = Нова структура;

    DataSet.Insert(“SKD Стоки”, DocumentObject.Goods);

    //вземете нашето оформление и задайте настройките по подразбиране, така че всички настройки за изход на отчета да бъдат взети от нашето оформление

    OurLayout = DocumentObject.GetLayout(“SKD”);

    Настройки = OurLayout.Default Settings;

    //създайте оформление на оформление на данни с нашите настройки

    Layout Layout Builder = Ново оформление на данни Layout Layout Builder;

    LayoutLayout = LayoutComposer.Run(OurLayout, Settings);

    //извършване на съставяне на данни с нашия набор от данни

    DataCompositionProcessor = Нов DataCompositionProcessor;

    DataCompositionProcessor.Initialize(LayoutLayout, DataSet);

    //формираме документ с електронна таблица и показваме нашия отчет в него

    ReportDocument = Нов документ за електронна таблица;

    OutputProcessor = Нов OutputProcessorofDataCompositionResultIntoSpreadsheetDocument;

    OutputProcessor.SetDocument(ReportDocument);

    OutputProcessor.Output(DataCompositionProcessor);

    ReturnDocumentReport;

    Крайни функции

    Ако желаете, можете да получите области от всяко друго оформление и също да го покажете в този отчет, например имаме типично оформление за генериране на платежно нареждане и в него е много добре създаден заглавен текст, така че да не Не трябва да вършим допълнителна работа, просто първо получаваме оформлението, показваме заглавката, след което ще генерираме и показваме нашия отчет в ACS.

    ОТНОСНО обединение

    Можем да поставим нашите заявки и обекти в него, но за разлика от връзката, той просто добавя таблици една към друга, тоест, ако свържем две еднакви таблици, ще получим една, а когато се комбинира, тя ще се удвои, помислете за прост пример:

    Имаме маси:

    При контакт ще получим:

    И когато се комбинират:

    Нека сега обмислим попълването на колоните в наборите от данни (ще пропуснем някои, тъй като са свързани с други раздели, ще се върнем към тях в бъдещи статии):

    - поле, посочете общото име на атрибута;

    ­­- път, посочете името на атрибута, с който ще се позоваваме на него в ACS, например в Изчисляеми полета;

    - заглавка, посочете името на атрибута, който ще се показва в отчета;

    - марж ограничение, посочете наличието на този атрибут;

    - ограничение на реквизита, ние посочваме наличието на дъщерни елементи, важно е, че ако е посочена наличността на подробности, тогава самото поле ще бъде налично, може би тази механика ще бъде променена в бъдещи издания;

    - израз, чрез който се изчислява представянето на полето, удобно е да се използва, когато трябва да променим малко изхода на детайли, например трябва да след името номенклатураПоказва наличност, където се намира, след което попълнете: Номенклатура + „има на склад“ + Склад. Повтарям, че адресът на детайлите се извършва чрез името, посочено в колоната пътека;

    - нареждащ израз, удобен механизъм за настройка на подреждането на отчета, където условието може да бъде зададено ръчно, подобно на предишния параграф, но както показва практиката, този механизъм често не работи, както бихме искали, и ви съветвам да използвате стандартния сортиране;

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

    - налични стойности, работи само когато е запълнен тип стойност, отворете формата за попълване и в колоната Значениение посочваме елемента, който трябва да се промени, според типа, той може да бъде предварително дефинирани обекти или числови, например атрибутите имат прости стойности, в подаванепосочете към какво трябва да променим, пример за булев тип:

    - декор– стандартната настройка на формата на полето, подобна на настройката в управляваните формуляри, ви позволява по-точно и красиво да персонализирате изхода на определен атрибут.

    Връзки към набор от данни в 1C SKD

    Само тук ляво присъединяване, по начин, подобен на връзкив заявки, източник на комуникацияпосочете основната таблица за връзката, в приемникдопълнителен. IN източник изразИ приемник изразпосочете подробностите, чрез които ще се осъществи връзката. Ще разгледаме останалите колони по-подробно, когато анализираме раздела Настроики. Ако няма допълнителна връзка с параметри, тогава се препоръчва да направите връзката в заявката, това ще ускори отчета.

    Пример за това как можете да получите полетата от предишния запис в групиране и не само. Удобен за изчисляване на разликата между стойностите на предишната цена и текущата.

    Същността на решението е да се използва функцията на езика за изразяване SKD Изчисляване на израз ()в добавеното изчислено поле, което извиках Делта. Функцията има следните параметри:

    Настроики:

    • Изразяване. Тип Линия;
    • групиране. Тип Линия;
    • Тип изчисление. Тип Линия;
    • Започнете
    • Край. Низ, съдържащ една от опциите;
    • Сортиране. линия;
    • Йерархично сортиране;
    • Обработка на реда на еднакви стойности

    Интересуваме се от параметри 4 и 5 ( ЗапочнетеИ Край). Изразът ще изглежда така:

    isNULL((ИЗЧИСЛЯВАНЕ НА ИЗРАЗ("Цена", "Предишен", "Предишен") - Цена), 0)

    Тук изчисляваме предишната стойност на полето Ценаи извадете текущата стойност на полето от него Цена. Естествено, за първия запис предишната стойност няма да бъде изчислена и резултатът от изваждане със стойността на текущото поле ще бъде Null, така че за да направим всичко „чисто“, използваме функцията isNULL(isNull), за да преобразуваме Null в нула .

    Поставете таблица със стойности в клетка на документ на електронна таблица

    Понякога е необходимо да поставите табличната част на документа или данните, които са редовете на табличната част, в една клетка на документа с електронна таблица, например така:

    За да направите това, трябва да използвате функцията: ComputeExpressionGroupedValueTable() , който има параметри:

    • Изразяванее изразът, който трябва да бъде оценен. Тип String. Един ред може да съдържа множество изрази, разделени със запетаи. Всеки израз може да бъде последван от незадължителната ключова дума AS и името на колоната на таблицата със стойности. Например: „Изпълнител, сума (сума оборот) като обем на продажбите“.
    • Групиране на изрази на полета- групиране на полеви изрази, разделени със запетаи. Например „Изпълнител, страна“;
    • Избор на записе израз, приложен към подробни записи. Например "DeletionMark = False";
    • Избор на групиране- избор, приложен към групови записи. Например: „Сума(СумаОборот) > &Параметър1“.

    За да направим това, създаваме изчислено поле, в което ще покажем получената таблица, след което поставяме това поле в ресурсите с израза CalculateExpressionGroupedValueTable("Номенклатура, Количество")

    Брой колони

    Пример за това как колоните могат да бъдат номерирани в SKD.

    Същността на решението:

    1. Създаваме заявка, в която номерираме редовете на резултата от заявката в определена подчиненост
    2. Показване на резултата в кръстосана таблица

    ВАЖНО!

    След като редовете в заявката са номерирани, те трябва да бъдат поставени в BT и след това избрани от този BT, в противен случай ACS ще направи всичко по свой начин и грешните полета ще попаднат в групирането

    За да получите резултата, трябва да създадете изчисляемо поле с израза "Служител" + формат (NPP, "FH=3; FH=")и името на изчисленото поле, в което е лесно да поставите Служителя, след което поставяме полето Пълно имекъм ресурс с израз Максимум (пълно име)или просто Пълно име- няма разлика

    Редуващи се групи с цветно подчертаване

    Някъде на Mista или на същия 1Cskd.ru имаше въпрос как да се подчертае различен цвятнизове, образуващи групи

    Това се постига чрез създаване на изчисляемо поле:

    Изчисляване на израз ("Количество (Различни артикули)", "Първи", "Предишен", "Заедно") % 2

    Преброяваме броя на различните „групирания“ на полето „Номенклатура“, групировките могат да бъдат преброени чрез задаване на стойността на параметъра ProcessingSameOrderValues ​​​​= „Заедно“

    Остатъкът от разделянето на две ще изясни дали тази група е четна или не, съответно създаваме условен елемент на дизайна с условието Поле = 1

    Оставайки в контекста на характеристиките. Характеристики на ред с количество в скоби

    На същия 1CSkd.ru имаше такава тема, в която авторът моли за помощ при изготвянето на отчет, където в една от колоните се изисква списък с характеристики (размери на обувки) с техния номер. http://1cskd.ru/2013/05/podskazhite-novichku-v-skd/

    Това се постига с помощта на същата функция Изчислете ExpressionWith GroupingArray()

    В този пример функцията изглежда така:

    Изчислете ExpressionWith GroupingArray("Характеристика на номенклатурата.Описание +
    ""("" + Формат (Брой на остатъка, ""CH=0"") + "")""",
    ,
    "Попълнена стойност (Номенклатура на характеристики)")

    Третият параметър е селекция, той ви позволява да избегнете представянето на празен низ "" - съответно няма да видите остатъци без характеристики

    Свържете две таблици с ключ String = Number

    Или вариант как да преобразувате стойност от числов тип в низ в SKD

    Периодично във форумите виждам тема като "Как да конвертирам число в низ в заявка." Ако пишете отчет за ACS и трябва да извършите такава трансформация, тогава не е необходимо да пишете никакви трикове в заявката.

    За да преобразувате число в низ, просто използвайте функцията за изразен език на системата за съставяне на данни SKD линия()или формат()

    За да конвертирате низ в число, можете да използвате функцията Изчисли()

    Сортиране по низ като по число

    В моя пример просто ще покажа директорията на служителите, сортирайки я по личен номер(код)

    Резултатът ще изглежда така:

    Това се постига чрез създаване на изчисляемо поле и използване на езиковата функция на израза SKD Изчисли()

    1. Създайте изчисляемо поле TabNumberNumber, с израза: Изчисли(Служител.Код)
    2. Сортиране по това поле

    всъщност това е преобразуване на низ в число с помощта на функцията на изразния език SKD Изчисли()

    Също така ви съветвам да погледнете "Видео уроци по skd" (лесно се търси в Google)

    Когато разработвам, използвам конвертиран .