Пример за използване на външен източник на данни в система за съхранение. Набори от данни SKD набор от данни обект таблица със стойности

В последната си статия вече писах, че 1C е парадоксална платформа. Системата за съставяне на данни е един от тези парадокси. SKD е предназначен за проектиране на сложни отчети и включва замяна на „ръчното“ програмиране на отчети с проектиране в многофункционален инструментариум. Възможността за използване на системи за контрол на достъпа се появи в осмата версия, но отне много време, за да се появи версия 8.2, за да може 1C да я използва в стандартните си продукти. От една страна, ACS е многофункционален инструментариум, с помощта на който можете да създавате много сложни отчети без нито един ред код. Системата за контрол на достъпа обаче има доста висока бариера за навлизане; научаването и започването на пълното й използване „в движение“ е много трудно, тъй като интерфейсът не е напълно интуитивен и най-пълните ръководства за употреба са достъпни само в форма на платена литература.

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

Заявка = Нова заявка(
"ИЗБИРАМ
| Таблица. Номенклатура,
| Маса.Склад
| ОТ
| &TK AS Table");
Request.SetParameter("TZ", TZ);

Но с SKD всичко не е толкова просто. Уви, невъзможно е да се извърши описаната по-горе операция в системата за съставяне на данни. Системата обаче има въведена възможност за зареждане на външни таблици със стойности.

Тук си струва да направим кратко отклонение и да поговорим за набори от данни. Наборите от данни са източници на информация, от които системата за управление на данни получава данни, които по-късно компилира в отчет. Наборите от данни са разделени на типове, като основно се използва типът „Заявка“, в тялото на който програмистът пише заявка към базата данни. Типът "Обект" се използва за зареждане на данни от външни обекти. И в двата случая изходът е определен набор от полета, получен в резултат на изпълнение на заявка или зареждане на външен обект. По-късно тези полета могат да бъдат манипулирани в раздела „Настройки“, заедно с подробни настройки за структурата на отчета. За да свърже различни набори, ACS предоставя възможност за посочване на връзки между набори от данни в раздела със същото име. Тези връзки са директен аналог на лявото съединение в класическа заявка. Трябва обаче да се има предвид, че заявките във всеки набор от данни не „знаят“ за съществуването на други набори от данни, в крайна сметка връзките между наборите от данни ще повлияят на оформлението на данните според структурата, посочена в „; Настройки”.

Нека детайлизираме проблема до пример. Има стандартна справка: Ведомости за заплати за организацията на конфигурация ZiK 8. Необходимо е видовете изчисления в справката да бъдат групирани в определени групи. Съответствията Изглед-Група на изчисленията се съхраняват във външна таблица със стойности. За да го заредим в основната схема за оформление на данни, създаваме „обект на набор от данни“ с името „Групи“ (Фигура 2). Правим връзка с „набора от данни за заявка“ - „Начисления“ по вид изчисление (Фигура 3). В „набор от данни за заявка“ - „Начисления“ има информация за групи, ние изтриваме всички записи. След това в раздела „Настройки“ можем да използваме полето „Група“, чиято стойност се зарежда от външен източник на данни (Фигура 4). Във функцията за генериране на отчет ние допълваме зареждането на външни данни.

Функция GenerateReport(Резултат = Недефиниран, Данни за декриптиране = Недефиниран, OutputInReportForm = True) Експорт

//получаване или формиране на необходимата таблица със стойности на „Групи“ и записването й в променливата със същото име

ExternalData = New Structure();//създайте и попълнете структурата на външните данни
ExternalData.Insert(Groups);

UserPanelValue = TypicalReports.GetUserPanelSettingValuesofObject(ThisObject);
DefaultSettings = SettingsComposer.GetSettings();
TypicalReports.GetAppliedSetting(ThisObject);
TypicalReports.GenerateTypicalReport(ThisObject, Result, Decryption Data, OutputToReportForm, ExternalData);
SettingsLinker.LoadSettings(DefaultSetting);
Връщане на резултат;

EndFunction

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

ExternalDataSets = нова структура;
ExternalDataSets.Insert("Групи", Групи); //Групи - желаната таблица със стойности
DataCompositionSchema = GetLayout("MainDataCompositionSchema"); //нашето оформление с диаграма на потока от данни
Настройки = DataCompositionScheme.DefaultSettings;
LayoutLinker = newDataLayoutLayoutLinker;
LayoutLayout = LayoutComposer.Execute(DataLayoutSchema, Настройки);
DataCompositionProcessor = newDataCompositionProcessor;
DataCompositionProcessor.Initialize(LayoutLayout, ExternalDataSets);
TabDoc = Нов табличен документ;
OutputProcessor = Нов OutputProcessorDataCompositionResultInTabularDocument;
Изходен процесор.SetDocument(TabDoc);
OutputProcessor.Output(DataCompositionProcessor);

Прочети 9660 веднъж

41
Наскоро направих отчет с неопределен брой колони. Не исках да се занимавам с кода, затова реших да го направя в системата за контрол на достъпа. Нямаше проблем с това, беше необходимо да разтегнете резултата върху произволно оформление (вашето собствено заглавие +... 27
Въпреки че CDS студентите се натъкват на това на първия или втория ден, то трябва да бъде в секцията с често задавани въпроси. Прост пример за програмно извеждане на отчет за оформление, като се използват настройките по подразбиране. //Вземете диаграмата от... 18
При генериране на отчети на системата за контрол на достъпа, по подразбиране всички групи се разширяват, но понякога е необходимо да се покаже отчет със свити групи веднага след генерирането! Този код в модула за отчет ви позволява да свиете... 10
В този раздел можете да посочите какви връзки се правят между два или повече набора от данни, според какви параметри и условия..png 1. “Източник на връзка” - показва първия набор от данни, от... 9
Това, което се изисква при разработване на справки е за потребител с ограничени права справката да се генерира изцяло без проверка на правата! Особено ако RLS е конфигуриран Има няколко начина да направите това: 1. Инсталирайте...

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

Схемата за оформление на данни, реализирана в 1C, поддържа три типа източници на данни (фиг. 1)

Източници на данни

Най-очевидният и често използван източник на данни от разработчиците е заявката.

Дизайнерът на заявки, внедрен във версия 8 на 1C, е много удобен и в повечето случаи можете да свържете няколко таблици заедно и да направите необходимите групи и селекции директно в него.

В сложни случаи, когато е необходимо или по-подходящо да се използва изпълнението на някакъв код (например зареждане на данни от файл на трета страна) или когато не е възможно да се използва заявка, източникът на данни „Обект“ идва до спасяването. Произволният код, изпълняван в модула, трябва да има определена структура на изхода, до която системата за контрол на достъпа да има достъп.

Третият източник на данни е „Съюз“. Всъщност този източник може да се разглежда като един от видовете комуникация. Комбинира (свежда няколко таблици в една), без съвпадение, а съвпадение на определени полета. Тоест, ако две таблици, които се обединяват, имат съответно 3 и 4 реда, тогава полученият източник на данни ще има 7 реда.

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

Като тестова площадка ще изберем базата на UPP, версия 1.3.92.3, работеща в нормален режим на приложение.

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

Така че ние трябва:

  1. Вземете табличната част на документа за получаване;
  2. Качете файла в източника на данни „Обект“;
  3. Свържете тези два източника с определен параметър (в нашия случай това ще бъде код);
  4. Покажете получената таблица.

Процес на изпълнение

Нека да преминем през всички изброени стъпки:

  • Създаваме заявка за табличната част на документа за получаване (фиг. 2)

Фиг.2

  • Създайте обект на набор от данни (фиг. 3);

Фиг.3

Тук е важно да обърнем внимание на „Името на обекта, съдържащ данните“, това е името, което ще трябва да посочим в кода на модула за отчет.

  • Отиваме в модула за отчет и там създаваме процедурата „При композиране на резултат“ (фиг. 4);


Фиг.4

Няма да описваме процедурата за получаване на данни от външен файл, а ще обърнем внимание на тази част от кода, която трябва да присъства в оформлението, за да можем да получим данни за „Набор от данни 2“ (фиг. 5).

Фиг.5

важно! Когато създавате „Обект“ в кода на процедурата по време на свързване, стойността на параметъра StandardProcessing трябва да е False.

Отидете в раздела „Връзки към набор от данни“.

Свързване на комплекти

Отидете в съответния раздел на диаграмата (фиг. 6).

Виждаме част от таблица, която е много подобна на частта от таблицата, която е в дизайнера на заявки, с някои изключения. Квадратчето „Всички“ не може да бъде отметнато за набора източник на комуникация и набора дестинация за комуникация, но са добавени няколко допълнителни колони.

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

Преди да създадем връзка, нека решим за целта на колоните:

  1. Източникът на връзката е първият набор от данни, от който ще бъдат взети всички налични стойности;
  2. Комуникационен приемник – набор от данни, от които ще бъдат избрани стойности, съответстващи на нашето състояние;
  3. Изходен израз – поле или израз на първия набор от данни, спрямо който ще се извърши сравнението;
  4. Дестинационният израз е поле или израз на зависимия набор;
  5. Параметър – ако посочите името на параметъра в това поле, тогава комуникацията с приемника ще се осъществява само според стойността, посочена в параметъра;
  6. Списък с параметри – определя възможността за използване на списък със стойности като параметър;
  7. Условие за връзка – чрез указване на израз тук, използвайки полета източник, можете да създадете условие, чието изпълнение ще служи като сигнал за установяване на връзка;
  8. Начална стойност – показва началната стойност на връзката;
  9. Задължителна връзка – Определя дали полетата, използвани в източника (настроен на FALSE) или местоназначение (настроен на TRUE), са активирани и въз основа на това добавя връзката към оформлението.

По този начин:

  • Източникът на комуникация ще бъде резултатът от нашето искане;
  • Обектът ще действа като приемник;
  • Изходният израз ще бъде „Номенклатурен код“;
  • Получател израз “Номенклатура”;
  • Комуникацията ще бъде задължителна (фиг. 7).

Ако бяхме посочили името на която и да е номенклатура, или вида й на възпроизвеждане, или нещо друго като условие за връзка, бихме могли да получим по-точен образец за нашата задача. Резултатът от нашите действия може да се види на Фиг. 8

Фиг.8

Нямаше съвпадение за долните два реда на отчета във файла с цените.

Понякога се случва данните в отчета да не могат да бъдат получени чрез заявка или комбинация от заявки. Трябва да използвате някои процедури за събиране на данни и данните се поставят в таблица със стойности. Възниква въпросът - могат ли тези данни да се използват в схема за съставяне на данни? В крайна сметка инструментът SKD е мощен и удобен. Оказва се, че е възможно да се използват данни от таблицата със стойности като източник на данни за отчет в системата за контрол на достъп и това не е никак трудно да се направи. Тази статия ще ви покаже как да създадете такъв отчет за обикновени формуляри.
И така, как да създадете ACS отчет, като използвате данни от таблица със стойности? Първо най-важното.
Първо отворете конфигуратора и създайте нов външен отчет.

Отворете обектния модул и създайте предварително дефинирана процедура при композиране на резултат (DocumentResult, Decryption Data, StandardProcessing)

В рамките на тази процедура ще събираме данни и ще генерираме отчет.
В процедурата При композиране на резултат деактивираме стандартната обработка. StandardProcessing = False;
След това формираме таблица със стойности по произволен начин. Имената на колоните на таблицата със стойности трябва да съвпадат с бъдещите полета на набора от данни в ACS:


Например, нека добавим три реда данни. След това създаваме изхода на отчета стъпка по стъпка.

  • От диаграмата получаваме настройките по подразбиране.

  • Изпращаме данни за декриптиране на съответната променлива.

  • Ние създаваме оформлението с помощта на конструктора на оформление.

  • Прехвърляме диаграмата, настройките и данните за дешифриране в оформлението на оформлението.

  • Извършваме оформлението с помощта на процесора за оформление. За да направите това, изпълнете метода на процесора за композиране на данни Initialize(). Като параметри предаваме оформлението на състава на данни, външни набори от данни (тип: Структура, ключът на структурата трябва да съвпада с името на обекта в схемата за съставяне на данни, стойността е генерираната таблица със стойности), данни за дешифриране.

  • Изчистете полето на документа с електронна таблица.

  • Показваме резултата в документ с електронна таблица.
Резултатът е следният код:
DataLayoutScheme = GetLayout( "MainDataCompositionSchema"); //Настройки = DataCompositionScheme.DefaultSettings; // - Ако го направите, както е показано по-горе (препоръчва се на някои ресурси), тогава, когато промените настройките в клиентски режим // няма да видите тези промени, защото настройките винаги ще бъдат по подразбиране. Как да го направите правилно - опция по-долуНастройки = Композитор на настройките. GetSettings(); DecryptionData = newDataCompositionDecryptionData; LayoutLinker = newDataLayoutLayoutLinker; LayoutLayout = LayoutLocker. Изпълнение (Схема за съставяне на данни, Настройки, Декриптиране на данни); ExternalDataSet = Нова структура( „Пример на таблица със стойности“, TZOoutput); DataCompositionProcessor = newDataCompositionProcessor; DataCompositionProcessor. Инициализиране (LayoutLayout, ExternalDataSet, DecryptionData); Резултат от документа. Изчистване(); OutputProcessor = Нов OutputProcessorDataCompositionResultInTabularDocument; Изходен процесор. SetDocument(DocumentResult); Изходен процесор. Изход (DataCompositionProcessor); Добавяне на оформление на диаграма на оформление. Можем да оставим името по подразбиране.

Ние създаваме набор от данни. За да направите това, добавете нов набор от данни от типа Обект. В полето Name на обекта, съдържащ данните, поставяме името, което сме посочили като ключ при създаването на структурата External DataSet. След това добавяме полета. Имената трябва да съвпадат точно с имената на колоните в таблицата със стойности. След това можем да посочим приемливи стойности, формати и т.н.

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

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

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


Това е всичко. Достатъчно просто, нали?

Полученият примерен отчет може да бъде изтеглен

Здравейте!
Днес искам да опиша една тема, която не можете да разберете без водолазно оборудване :) ;)

Гмуркането означава, че гмуркането е доста дълбоко. Има малко препратки към тази тема в литературата и няма да я разберете, докато не получите желание. Няма дори да има съобщение за такова действие;) Между другото, документацията говори за това много слабо и непоследователно; трябва да се обърнете към литература на трети страни.

Например силно препоръчвам „Разработване на сложни отчети в 1C:Enterprise 8.2“. Система за съставяне на данни", (по-конкретно, вижте страници 224, 267 и 473)

В ACS има 2 вида източници на данни: Query, object и union (това нещо не се брои, не е източник на данни, а процесор на съществуващи данни). Вижте фигура 1:


Така че, ако повече или по-малко разбираме как да работим с източник (набор) от данни от типа „Заявка“, тогава има трудности с набора от данни „Обект“.

Първо ще опиша какво искаме да получим като резултат:

Докладвайте, потребителят е кликнал върху „ форма» и се показва списък с елементи (вижте фиг. 2):

Да, допуснах една неточност, а именно: няма бутон “ форма", но има бутон " ново действие"(Ще обясня малко по-късно защо се случи това;)

Да да! Друг момент: целият този списък е извлечен от набора от данни „Обект“:

Решение:

  1. Създаване на външен отчет;
  2. Добавете оформление на ACS, нека го наречем „Схема за оформление на основните данни“;
  3. Към него добавяме набора от данни „Обект“, присвояваме му името „Номенклатурен списък“ (трябва да е същото като на фиг. 3);
  4. Не експериментираме твърде много с настройките на отчета, нека всичко е просто (вижте фиг. 4)

Добре, половината работа е свършена ;)

Сега нека генерираме основния формуляр за отчет (да, още нещо! Моята конфигурация работи на обикновен интерфейс, но мисля, че ще намерите решение на управлявани формуляри;) И така, формулярът:

Тук възниква проблемът! Ако щракнем върху бутона “generate” (фиг. 5.), ще видим грешка!


Посветих тази статия на решаването на този проблем!

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

Вмъкнах процедурата „Генериране“ във формуляра, но няма записи в него, трябваше да предефинирам действието на бутона „формуляр“, преди да отворя формуляра:


На фиг. В допълнение към промяната на действието на формата, Фигура 8 показва пример за заявка, нейната обработка и предаване на генерираните данни към системата за контрол на достъпа. Нека го проучим по-внимателно:

  1. Генерираме входни данни за системата за контрол на достъпа;
  2. Инициализираме системата за контрол на достъп;
  3. Показваме резултата ВЪРХУ ФОРМУЛЯРА (обърнете внимание и на това!).

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

Схемата за оформление на данни във външен отчет е достъпна като глобален обект в метод на формуляр Схема за съставяне на данни.Можете също да получите достъп до него по име, като го предадете на метода GetLayout(виж Фиг. 8)

Основната част от кода е по-долу:

Заявка = Нова заявка; Query.Text = "ИЗБЕРЕТЕ | Номенклатура. Име като номенклатура | ОТ | Директория. Номенклатура КАТО номенклатура"; NomenclatureList = Request.Run().Upload(); Набори от данни = Нова структура ("Номенклатурен списък", Номенклатурен списък); //SKD = ​​​​GetLayout("MainData LayoutScheme"); SKD = ​​​​Схема за съставяне на данни; LayoutComp = нов DataLayoutComposer; layoutComp = LayoutComp.Execute(SKD, SKD.DefaultSettings); CompDataProcessor = нов DataCompositionProcessor; ProcessorCompData.Initialize(layoutComp, DataSets); изход = нов DataCompositionResultOutputProcessorInTabularDocument; изход.SetDocument(FormElements.Result); output.Output(ProcessorCompData, true);

да Ето още един хубав момент!!!

В този пример, както можете да видите (вижте фиг. 2), изходът се извършва във форма, а не в таблица. документ! И това е много добре, защото можем да работим с формуляра (програмно да прихващаме събитията на елемента на формуляра, да правим всякакви трикове с плъзгане и пускане и т.н.;)

В документ с електронна таблица можем просто да покажем обработените данни на екрана и да прехвърлим контрола върху документа на потребителя и не можем по никакъв начин да повлияем на по-нататъшния процес на редактиране на това съдържание!

Вижте системата за помощ " Поле на документа на електронната таблица “ и ще дам само извадка от вградената документация на системата 1c Enterprise 8.2:

„Полето на документ в електронна таблица е документ в електронна таблица, поставен във формуляр. Заедно с разнообразието от възможности за проектиране на документ с електронна таблица, това ви позволява да организирате обработката на събития, които възникват при избиране на клетки, картини, както и други контроли, поставени в поле на документ с електронна таблица.

Добре, както се казва, успех в битката;)

Публикации по темата