Funkce pro práci s řetězci 1s 8. Nové funkce pro práci s řetězci

Existuje několik mechanismů pro práci s řetězci v dotazech 1C. Nejprve lze přidat řádky. Za druhé, můžete vzít podřetězec z řetězce. Za třetí, řetězce lze porovnávat, a to i podle vzoru. To je asi vše, co se dá se strunami dělat.

Doplnění řetězce

K přidání řádků do dotazu se používá operace „+“. Můžete přidat pouze řetězce omezené délky.

SELECT "Název: " + Protistrany. Název AS Sloupec 1 FROM Adresář. Protistrany AS Protistrany WHERE Protistrany. Odkaz = &Odkaz

Funkce podřetězec

SUBSTRING(<Строка>, <НачальнаяПозиция>, <Длина>)

Analoga funkce Environment() z objektového modelu. Funkci Substring() lze použít na data řetězce a umožňuje vybrat fragment <Строки> , počínaje číslem znaku <НачальнаяПозиция> (znaky v řádku jsou číslovány od 1) a délka <Длина> postavy. Výsledek výpočtu funkce má typ řetězce proměnné délky a délka bude považována za neomezenou, jestliže <Строка> má neomezenou délku a parametry <Длина> není konstantní nebo větší než 1024.

Pokud je délka řetězce menší než zadaná v druhém parametru, funkce vrátí prázdný řetězec.

Pozornost! Použití funkce SUBSTRING() k převodu řetězců neomezené délky na řetězce omezené délky se nedoporučuje. Místo toho je lepší použít operátor přetypování EXPRESS().

Funkce podobná

Pokud se potřebujeme ujistit, že atribut řetězce splňuje určitá kritéria, porovnáme jej:

VYBERTE protistrany. Název AS Sloupec 1 FROM Adresář. Protistrany AS Protistrany WHERE Protistrany. Název = "Gazprom"

Ale co když potřebujete jemnější srovnání? Nejen rovnost nebo nerovnost, ale podobnost s určitým vzorem? Přesně k tomu byla vytvořena funkce PODOBNÁ.

LIKE — Operátor pro kontrolu podobnosti řetězce se vzorem. Analog LIKE v SQL.

Operátor SIMILAR umožňuje porovnat hodnotu výrazu zadaného vlevo od něj s řetězcem vzoru zadaným vpravo. Hodnota výrazu musí být typu string. Pokud se hodnota výrazu shoduje se vzorem, výsledek operátoru bude TRUE, jinak bude FALSE.

Následující znaky v řetězci šablony jsou servisní znaky a mají jiný význam než znak řetězce:

  • % (procenta): sekvence obsahující libovolný počet libovolných znaků;
  • _ (podtržítko): jeden libovolný znak;
  • […] (jeden nebo více znaků v hranatých závorkách): jakýkoli jednotlivý znak uvedený v hranatých závorkách. Výčet může obsahovat rozsahy, například a-z, což znamená libovolný znak zahrnutý v rozsahu, včetně konců rozsahu;
  • [^...] (v hranatých závorkách znaménko negace následované jedním nebo více znaky): jakýkoli jednotlivý znak jiný než ty, které jsou uvedeny za znaménkem negace.

Jakýkoli jiný symbol znamená sám sebe a nenese žádnou další zátěž. Pokud je třeba jeden z uvedených znaků zapsat jako samotný, pak mu musí předcházet<Спецсимвол>. Moje maličkost<Спецсимвол>(jakýkoli vhodný znak) je definován ve stejném příkazu za klíčovým slovem SPECIAL CHARACTER.

Implementováno ve verzi 8.3.6.1977.

Rozšířili jsme sadu funkcí určených pro práci s řetězci. Udělali jsme to proto, abychom vám poskytli pokročilejší nástroje pro analýzu řetězcových dat. Nové funkce budou pohodlné a užitečné v technologických úlohách analýzy textu. V úlohách souvisejících s analýzou textu, který obsahuje data ve formátované podobě. Může se jednat o analýzu některých souborů přijatých ze zařízení, nebo například analýzu technologického deníku.

Dříve jste mohli provádět všechny akce, které provádějí nové funkce. Použití více či méně složitých algoritmů napsaných ve vestavěném jazyce. Nové funkce vám tedy neposkytnou žádné zásadně nové schopnosti. Umožňují vám však snížit množství kódu a učinit kód jednodušším a srozumitelnějším. Navíc umožňují zrychlit provádění akcí. Protože funkce implementované v platformě fungují samozřejmě rychleji než podobný algoritmus napsaný ve vestavěném jazyce.

Funkce formátování StrTemplate()

Tato funkce nahradí parametry do řetězce. Potřeba takové konverze často vyvstává například při zobrazování varovných zpráv. Syntaxe této funkce je následující:

StrTemplate(<Шаблон>, <Значение1-Значение10>)

<Шаблон>- toto je řetězec, do kterého musíte nahradit reprezentace parametrů.

<Значение1> , ... <Значение10>- jedná se o parametry (maximálně deset), jejichž reprezentace je nutné do řetězce dosadit.

Chcete-li označit konkrétní místo v šabloně, kde chcete provést náhradu, musíte použít značky jako %1, ... %10. Počet značek zapojených do šablony a počet parametrů obsahujících hodnoty se musí shodovat.

Například výsledek provedení takového operátoru:

bude tam řádek:

Chyba dat na řádku 2 (vyžadován typ data)

Funkce pro práci s řetězci StrCompare()

Tato funkce porovnává dva řetězce bez ohledu na velikost písmen. Například takto:

Stejnou akci můžete provést dříve pomocí objektu Porovnání hodnot:

Použití nové funkce však vypadá snadněji. A kromě toho funkce na rozdíl od objektu Value Comparison funguje jak v tenkém, tak ve webovém klientovi.

Funkce pro práci s řetězci StrStartsWith(), StrEndsAt()

Tyto funkce určují, zda řetězec začíná zadaným podřetězcem nebo zda řetězec končí zadaným podřetězcem. Algoritmus pro tyto funkce není obtížné implementovat ve vestavěném jazyce, ale jejich přítomnost vám umožňuje psát čistší a srozumitelnější kód. A pracují rychleji.

Například je vhodné je použít v příkazu If:

Funkce pro práci s řetězci StrDivide(), StrConnect()

Tyto funkce rozdělují řetězec na části pomocí zadaného oddělovače. Nebo naopak, spojí několik řádků do jednoho a vloží mezi ně vybraný oddělovač. Jsou vhodné pro vytváření nebo analýzu logů a technologických deníků. Záznam technologického protokolu můžete například snadno analyzovat na části vhodné pro další analýzu:

Funkce pro práci s řetězci StrFind()

Místo staré funkce Find() jsme implementovali novou funkci, která má další možnosti:

  • Hledat v různých směrech (od začátku, od konce);
  • Vyhledávání ze zadané pozice;
  • Vyhledejte výskyt se zadaným číslem (druhý, třetí atd.).

Ve skutečnosti duplikuje schopnosti staré funkce. To se provádí za účelem zachování kompatibility s moduly zkompilovanými ve starších verzích. Doporučuje se, abyste již nepoužívali starou funkci Find().

Níže je uveden příklad použití nových možností vyhledávání. Zpětné vyhledávání je užitečné, když potřebujete poslední část formalizovaného řetězce, jako je úplný název souboru v adrese URL. A vyhledávání ze zadané pozice pomáhá v případech, kdy potřebujete hledat ve známém fragmentu, a ne v celém řádku.

Řetězec je jedním z primitivních datových typů v systémech 1C:Enterprise 8. Proměnné s typem čára obsahovat text.

Zadejte hodnoty proměnných čára jsou uzavřeny ve dvojitých uvozovkách. Lze přidat několik proměnných tohoto typu.

Per1 = "Slovo 1" ;
Per2 = "Slovo 2" ;
Per3 = Per1 + " " + Per2;

Nakonec Per3 bude znamenat" Slovo 1 Slovo 2″.

Systémy 1C:Enterprise 8 navíc poskytují funkce pro práci s řetězci. Podívejme se na ty hlavní:

EnterString(<Строка>, <Подсказка>, <Длина>, <Многострочность>) — funkce je navržena tak, aby zobrazila dialogové okno, ve kterém může uživatel zadat hodnotu proměnné typu Čára. Parametr <Строка> je povinný a obsahuje název proměnné, do které se zadaný řetězec zapíše. Parametr <Подсказка> volitelné - toto je název dialogového okna. Parametr <Длина> volitelné, zobrazuje maximální délku vstupního řetězce. Výchozí hodnota je nula, což znamená neomezenou délku. Parametr <Многострочность> volitelný. Definuje režim zadávání víceřádkového textu: True—vkládání víceřádkového textu s oddělovači řádků; False - zadejte jednoduchý řetězec.

Můžete zadat řetězec, pokud znáte kód znaku v Unicode:

Symbol(<КодСимвола>) — kód se zadává jako číslo.

Písmeno= Symbol(1103) ; // Já

K dispozici je také inverzní funkce, která vám umožní zjistit kód symbolu.

Kód symbolu(<Строка>, <НомерСимвола>) — vrátí číslo Unicode zadaného znaku jako číslo.

Funkce převodu malých a velkých písmen:

VReg(<Строка>) — Převede všechny znaky v řetězci na velká písmena.

NReg(<Строка>) — Převede všechny znaky v řetězci na malá písmena.

TReg(<Строка>) — převede všechny znaky v řetězci na velká a malá písmena. To znamená, že první písmena ve všech slovech se převedou na velká písmena a zbývající písmena se převedou na malá.

Funkce pro vyhledávání a nahrazování znaků v řetězci:

Nalézt(<Строка>, <ПодстрокаПоиска>) — vyhledá číslo znaku výskytu hledaného podřetězce. Například:

Najít ("String" , "oka" ) ; // 4

StrFind(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) — vyhledá číslo znaku výskytu hledaného podřetězce, číslo výskytu je uvedeno v odpovídajícím parametru. V tomto případě vyhledávání začíná znakem, jehož číslo je uvedeno v parametru Počáteční pozice. Vyhledávání je možné od začátku nebo konce řetězce. Například:

Počet4 výskytů = Str Najít ( "obrana", "o" ,Směr hledání. Od začátku, 1, 4); // 7

StrReplace(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) – najde všechny výskyty hledaného podřetězce ve zdrojovém řetězci a nahradí jej náhradním podřetězcem.

StrReplace ("String" , "oka" , "" ); // Stránka

Prázdný řádek (<Строка>) – zkontroluje řetězec na významné znaky. Pokud nejsou žádné nebo žádné významné znaky, vrátí se hodnota Skutečný. V opačném případě - Lhát.

StrNumberOccurrences(<Строка>, <ПодстрокаПоиска>) – Vypočítá počet výskytů hledaného podřetězce ve zdrojovém řetězci.

StrNumberOccurrences ( "Studuj, studuj a zase studuj", "studium", ""); // 3

StrTemplate(<Строка>, <ЗначениеПодстановки1>…<ЗначениеПодстановкиN> — dosadí parametry do řetězce číslem. Řádek musí obsahovat substituční značky ve tvaru: “%1..%N”. Číslování značek začíná od 1. Pokud je hodnota parametru Nedefinováno, je nahrazen prázdný řetězec.

StrTemplate ( "Parametr 1 = %1, Parametr 2 = %2", "1" , "2" ) ; // Parametr 1= 1, Parametr 2 = 2

Funkce převodu řetězců:

Lev(<Строка>, <ЧислоСимволов>) – vrátí první znaky řetězce.

Že jo(<Строка>, <ЧислоСимволов>) – vrátí poslední znaky řetězce.

Středa(<Строка>, <НачальныйНомер>, <ЧислоСимволов>) – vrátí řetězec délky<ЧислоСимволов>, počínaje symbolem<НачальныйНомер>.

AbbrL(<Строка>) ořízne nevýznamné znaky vlevo od prvního významného znaku v řetězci.

Zkratka(<Строка>) — ořízne nevýznamné znaky vpravo od posledního významného znaku v řádku.

AbbrLP(<Строка>) – ořízne nevýznamné znaky vlevo od prvního významného znaku v řádku a vpravo od posledního významného znaku v řádku.

StrGetString(<Строка>, <НомерСтроки>) – Získá víceřádkový řetězec podle čísla.

Další funkce:

StrLength(<Строка>) – vrátí počet znaků v řetězci.

StrNumberRow(<Строка>) – vrátí počet řádků ve víceřádkovém řetězci. Řádek je považován za nový, pokud je od předchozího oddělen znakem nového řádku.

StrCompare(<Строка1>, <Строка2> ) – porovnává dva řetězce bez ohledu na velikost písmen. Funkce funguje podobně jako objekt Srovnání hodnot. Vrácení:

  • 1 - pokud je první řádek větší než druhý
  • -1 - pokud je druhý řádek větší než první
  • 0 - pokud jsou řetězce stejné

StrCompare("První řádek" , "Druhý řádek" ) ; // 1

Jako příklad toho, jak fungují funkce pro práci s 1C řetězci, bychom rádi vytvořili automatickou analýzu textu. Text převezmeme ze souboru. Výsledek analýzy se uživateli zobrazí v jakékoli podobě.

Musíme vytvořit externí handler, který nám umožní vybrat textový soubor a spustit analyzátor.

Analýza textu 1C - formulář a tlačítka

Vytvořme tedy externí zpracování: Konfigurátor/Soubor/Nové/Externí zpracování.

Přidání formuláře. Na formuláři musíme umístit pole pro výběr textového souboru a tlačítko analýzy.

Analýza textu 1C - tlustý klient

Umístíme na formulář běžné textové pole. Délka řádku je neomezená, protože cesta k souboru (názvy adresářů) může být významná.

Aby uživatel nemusel název souboru zadávat, ale mohl jej vybrat, povolíme v poli výběrové tlačítko.

Změníme název pole na „FileName“, název přidruženého atributu formuláře se automaticky změní na stejný.

Jako tlačítko použijeme tlačítko „Spustit“ automaticky přidané platformou (a již má připojený handler - pohodlné).

Analýza textu 1C - tenký klient

V tenkém klientovi nezávisle vytvoříme atribut formuláře „FileName“. Přetáhneme rekvizity na formu. Ve vlastnostech elementu formuláře povolíme také tlačítko vybrat.

Jako tlačítko vytvoříme příkaz „Spustit“, přiřadíme mu zpracování a přetáhneme jej do formuláře.

Analýza textu 1C - programování

První věc, kterou musíme udělat, je zpracovat kliknutí na tlačítko výběru – po kliknutí zobrazit dialog pro výběr souboru.

Přejdeme k vlastnostem našeho textového pole na formuláři (v tlustém klientovi - levým tlačítkem myši přímo na poli, v tenkém klientovi - na názvu pole v seznamu) a určíme obsluhu události pro událost "Zahájení výběru".

Uvnitř funkce handleru, kterou 1C vytvoří, když je přiřazena, napíšeme nějaký jednoduchý kód:

Nyní máme název souboru. Potřebujeme „získat“ jeho obsah a zavolat analýzu textu.

Již máme handler pro tlačítko Run. V tlustém klientovi byly tlačítko a jeho handler vytvořeny automaticky konfigurátorem 1C. V tenkém klientovi jsme jej přidali ručně.

Pojďme přidat kód do handleru, který načte soubor do řetězce:

Ohledně kódování souboru. Pokud vytvoříte objekt TextReading() bez parametru označujícího kódování, 1C se pokusí nezávisle určit kódování (podpisem Byte Order Mark - BOM, nebo zváží jeho kódování ANSI).

Požadované kódování můžete zadat přímo, například takto:
File = New ReadText(FileName, "UTF-8"); //nahraďte požadovaný název kódování

Takže ve výsledku jsme dostali:

  • Textový řetězec načtený ze souboru v proměnné "Text"
  • Procedura, ve které budeme analyzovat výsledný řetězec z proměnné nazvané „TextAnalysis()“ pomocí řetězcových funkcí 1C

Mezi základní schopnosti programovacího jazyka obvykle patří práce s čísly a řetězci. Obvykle jsou tyto funkce pevně zakódovány do kódu kompilátoru (nebo jsou implementovány „základní“ třídy programovacího jazyka).

V 1C je schopnost práce s řetězci naprogramována v samotné platformě. Dnes se podíváme na funkce práce s řetězci 1C v programech ve vestavěném jazyce 1C.

Hodnota řádku 1C

1. Začneme tím nejjednodušším. Vytvoření proměnné a přiřazení konstantní hodnoty řetězce vypadá takto v 1C:

Proměnná = "Ahoj světe!";

Pokud potřebujete zadat znak citace v konstantní hodnotě řetězce 1C, musíte jej zdvojnásobit „“

Proměnná = "Ahoj světe"!;

2. Zalomení řádku 1C lze zadat dvěma způsoby najednou. První je použití symbolu |

Proměnná = "Dobrý den,
| svět! ";

Druhým je použití systémového výčtu Symbols. Umožňuje přidat zalomení řádků 1C a další netisknutelné znaky, jako je TAB.

Proměnná = "Ahoj" + Symboly.PS + "mír!";

3. Konfigurace v 1C lze vyvíjet nejen pro jeden jazyk (ruštinu, angličtinu nebo jiný) - ale současně pro několik jazyků. V tomto případě je aktuálně používaný jazyk vybrán ve spodní části okna 1C.

Seznam jazyků se nachází v konfiguračním okně ve větvi Obecné/Jazyky. Každý jazyk má krátký identifikátor jako např ru nebo Ing.

Je jasné, že při programování takové konfigurace mohou být 1C linky i vícejazyčné. K tomu je možné vytvořit takový 1C řádek zadáním skrz; možnosti podle identifikátoru jazyka:

Proměnná = "ru=""Ahoj světe! ""; en=""Ahoj světe! """;

Pokud použijete takto vytvořenou čáru 1C jako obvykle, bude to, co je v ní napsáno. Aby jej systém rozdělil na dvě možnosti a použil požadovanou, musíte použít funkci НStr():

//správné pro dvojjazyčné konfigurace
Report(NStr(Proměnná));

Rekvizity s vedením typu 1C

Atribut je pole v adresáři/dokumentu 1C. Od proměnné v programu v jazyce 1C se liší tím, že u atributu je přesně uveden její typ (číslo, řetězec 1C atd.). Pokud si potřebujete osvěžit paměť, co je to rekvizita, podívejte se na lekci.

Pokud zadáte typ atributu - řádek 1C, musíte dodatečně zadat parametry.

1C řádky mají neomezenou délku (označuje se jako délka = 0) a omezenou délku, udávající přesný počet znaků. 1C řádky neomezené délky jsou uloženy v samostatné SQL tabulce, takže jejich použití je méně produktivní než omezené.

Proto má použití 1C strun neomezené délky svá omezení – není možné je použít všude. Není například povoleno jako číslo dokumentu, referenční kód nebo měření.

Práce se strunami 1C

Platforma 1C má několik vestavěných funkcí pro práci se strunami.

  • AbbrLP („Neuvěřitelné, ale pravdivé!“)
    Odstraní nadbytečné mezery z řádku 1C. Lze také použít k převodu libovolných typů na řetězec 1C (například čísla).
  • Proměnná = "Vasya" + AbbrLP(" plus") + "Olya"; //bude "Vasya plus Olya"
    Příklad sečtení několika hodnot řetězce 1C. Výsledkem bude jeden řádek 1C.
  • Proměnná = Lev("Hudba", 2); //bude "Mu"
    Proměnná = Medium("Hudba", 2, 2); //bude tam "hrozba"
    Proměnná = Rights("Hudba", 2); //bude "ka"
    Různé možnosti pro získání podřetězce z řetězce 1C.
  • Proměnná = Najít("Hudba", "zy"); //budou 3
    Vyhledejte podřetězec v řetězci 1C počínaje znakem 1.
  • Proměnná = StrLength("Hudba"); //bude 6
    Vrátí počet znaků na řádku 1C.
  • Report("Ahoj") //v okně zpráv v dolní části okna 1C
    Alert("Ahoj") //vyskakovací dialogové okno
    Status("Ahoj") //v řádku zobrazení stavu vlevo dole
    .

Přiveďte objekty na řádek 1C

Jak víte, v současnosti je nejpopulárnějším formátem pro výměnu strukturovaných informací XML. I nejnovější verze MS Office Word a Excel ukládají soubory v tomto formátu (docx, respektive xlsx změní příponu na zip, otevřete v archivátoru).

Platforma 1C pro výměnu dat poskytuje několik možností, z nichž hlavní je také XML.

1. Nejjednodušší metodou je použití funkce Abbreviation() nebo String(). V těle požadavku můžete použít funkci REPRESENTATION(). Výsledek jejich akce je stejný – vygenerují pro uživatele řetězcovou reprezentaci libovolného 1C objektu.

U adresáře to bude ve výchozím nastavení jeho název. U dokumentu – název dokumentu, číslo a datum.

2. Jakýkoli objekt 1C (s omezeními) lze převést do XML a naopak. Proces převodu se nazývá serializace.

StringViewXml = XMLString(Value); //získání XML z hodnoty 1C
Hodnota1C = XMLValue(Type("DirectoryLink.Nomenclature"),TypStringXml); //získáte hodnotu 1C z řetězce XML, musíte zadat typ 1C, který má být přijat

3. Existuje vlastní způsob platformy 1C, jak převést jakýkoli objekt 1C na řetězec. To migrovalo z verze 1C 7.7. Tomuto formátu nerozumí jiné programy, ale ostatní 1C mu rozumí, což usnadňuje jeho použití pro výměnu mezi databázemi 1C.

Řádek = ValueInRowInt(Value1C); //získáme řetězec 1C z hodnoty 1C
ValueVFile("C:\MyFile.txt", Hodnota1C); //další možnost, z hodnoty 1C získáme soubor s uloženým řetězcem
Hodnota1C = ValueFromStringInt(String); //zpět z řádku 1C
Hodnota1C = ValueFile("C:\MyFile.txt"); //zpět ze souboru

Úprava 1C řádků na formuláři

Kromě práce s 1C řetězci v programu v jazyce 1C bych si samozřejmě přál, aby je uživatel mohl upravovat. K tomu existuje několik možností:

1. Nejjednodušší způsob je požádat o vstup linky 1C na vyžádání. Tato metoda se používá při výuce programování 1C, v životě se používá mnohem méně často (ale používá se!).

Proměnná = "";
Řádek = EnterValue(Proměnná, "Zadejte celé jméno");

2. Pro zobrazení detailů objektu 1C (adresář/dokument) nebo detailů formuláře (viz) se nejčastěji používá vstupní pole. Toto je nejběžnější nástroj v 1C pro uživatele pro práci s editačními poli.

3. Možnosti vstupního pole lze rozšířit (viz vlastnosti vstupního pole, klikněte na něj pravým tlačítkem, více podrobností):

  • Zaškrtávací políčko Režim víceřádkových úprav
  • Zaškrtávací políčko Pokročilé úpravy (dostupné, pokud je zaškrtnuté předchozí políčko)
  • Zaškrtávací políčko Režim hesla (viz).

4. Pokud by vám nestačily všechny možnosti vstupního pole, je zde vestavěný editor. Chcete-li jej přidat do formuláře, musíte přidat pole textového dokumentu do nabídky Ovládací prvek formuláře/vložit. V jeho vlastnostech můžete určit jeho provozní režim – vlastnost Extension.

Pole textového dokumentu nelze přímo přiřadit k datům. Je nutné napsat funkci do obsluhy události OnOpen() formuláře (viz):

Form Elements.ElementNameTextDocumentField.SetText(StringValue); //zde ValueString je text přijatý například z atributu

A v obslužné rutině ukládání - například v tlačítku Uložit - přidejte uložení:

ValueString = FormElements.ElementNameTextDocumentField.GetText(); //ValueŘádek zde je atribut, kam uložíme hodnotu

5. Ve verzi 1C 8.2.11 se ve spravovaných formulářích objevila nová možnost pro reprezentaci řádku 1C - pole Formátovaný dokument.


Podobně jako pole textového dokumentu si jej musíte nastavit při jeho otevření a zapsat si jej při ukládání sami pomocí programu.

  • V objektu 1C, jehož formulář vytváříme (adresář, dokument, zpracování atd.) - přidejte atribut s typem Value Storage
  • Ve funkci OnReadOnServer() nastavíme text z atributu

    //zde Atribut je přidaný atribut objektu 1C
    //zde FormattedDocument je název pole ve formuláři pro úpravy
    &Na serveru

    FormattedDocument = CurrentObject.Attributes.Get();
    Konec procedury

  • Ve funkci BeforeWritingOnServer() nebo pomocí tlačítka napíšeme text z pole

    &Na serveru
    Postup při ReadingOnServer(CurrentObject)
    CurrentObject.Props = NewValueStorage(FormattedDocument);
    Konec procedury