Odstraňte nadbytečné mezery 1s. Porovnání řetězců mezi sebou

FAQ nebo platforma 8 pro figuríny.

Soudě podle fór věnovaných tématům 1C mají programátoři, kteří se poprvé setkali s platformou 1C v 8 nebo přecházejí z 7.7, často stejné otázky. Zde jsem se rozhodl shromáždit podle mého názoru nejčastější...

V: Jak odstranit mezeru v čísle 12 600,00?
O: Je důležité pochopit, že zde není použit znak mezery, ale takzvaný „nepřerušitelný prostor“, takže například tato konstrukce:

StrReplace(VariableNumber," ","");

nebude fungovat. Existují dvě možnosti, jak problém vyřešit, buď zadat Symbols.NPP pro nahrazení místo mezery, nebo použít funkci Format().

StrReplace(VariableNumber,Characters.NPP,""); // 1. možnost
Format(VariableNumber,"HG="); // 2. možnost

V: Jak nastavit podmínku v dotazu, aby do výsledného výběru byly zahrnuty pouze dokumenty určitého typu?
O: To lze provést pomocí operátoru dotazovacího jazyka REF, který umožňuje zkontrolovat, zda hodnota výrazu uvedeného vlevo od něj je odkazem na tabulku uvedenou vpravo. Podívejme se na příklad, vyberte z akumulační evidence Prodej služeb pouze ty záznamy, u kterých je registrátorem doklad Prodej zboží a služeb:

Požadavek=Nový požadavek("
|VYBRAT
| Implementace Služeb, Registrátor.
| Prodej služeb
|OD
| Registr akumulací Realizace služeb JAK Realizace služeb
| KDE
| Registrátor LINK Prodej zboží a služeb");

V: Jak přenést určité dokumenty/referenční knihy mezi identickými konfiguracemi?
O: To lze provést pomocí standardního zpracování UploadLoadDataXML.epf, dodávaného na discích ITS.

V: Jak přenášet data mezi různými konfiguracemi (nebo od 7.7 do 8)?
O: Nejlepší možnost, podle mého názoru, je použít standardní konfiguraci „Data Conversion“, která je dodávána na discích ITS, existuje také několik článků popisujících použití této konfigurace.

V: Jak přidat konkrétní řetězec do pole bez řetězce v dotazu, například SELECT Prodej zboží a služeb + "rub."?
O: V žádném případě. Převod typů není v dotazu možný. Někteří lidé jsou uvedeni v omyl konstrukcí dotazovacího jazyka EXPRESS, ale ta pouze přetypuje hodnotu složeného typu na jeden z typů, které tuto hodnotu tvoří, a žádným způsobem typ nepřevádí, takže v této situaci není použitelná.

V: Jak mohu nastavit podmínku v dotazu na pole s typem řetězce neomezené délky, například vybrat všechny dokumenty s určitým komentářem?
O: Chcete-li to provést, musíte omezit délku pole pomocí operátoru dotazovacího jazyka EXPRESS. Například:

Požadavek=Nový požadavek("
|VYBRAT
| Prodej zboží a služeb
|OD
| Dokument Prodej zboží a služeb JAK na prodej zboží a služeb
| KDE
| EXPRESS(SalesProductsServices.Comment AS ROW(100)) = &Comment");

V: Existuje analog funkce 7.7 CatalogIB() ve verzi 8?
O: Ne, protože taková funkce by neměla smysl pro režim provozu klient-server. Pro souborový režim je však možné získat adresář informační základna pomocí následující konstrukce:

CatalogIB=NStr(InformationBaseConnectionString(),"Soubor");

V: Jak odpojit uzel od distribuované infobáze?
O: Pomocí následující konstrukce:

ExchangePlans.SetMainNode(undefined);

Nebo spusťte konfigurátor s parametrem příkazový řádek/ResetMasterNode (pro základní verze nepoužívá).

V: Jak získat název dokumentu (analogicky k metodě 7.7 View())?
O: Pomocí metadat. Například:

V: Jak vybrat dokumenty všech typů v jednom dotazu?
O: Používání metadat a možnost kombinovat dotazy V:

Požadavek=Nový požadavek;
Text="";
Pro každý dokument z cyklu Metadata.Documents
Text=Text+"VYBRAT odkaz z dokumentu."+Document.Name+"SLOUČIT";
EndCycle;
Query.Text=Left(Text,StrLength(Text)-StrLength(" KOMBINOVAT "));
Select=Query.Run().Select();

V: Jak přerušit hlášení/zpracování?
O: Pomocí operátoru UserInterrupt Handling() se doporučuje používat jej uvnitř smyček. Když uživatel stiskne kombinaci kláves Ctrl+Break, provádění se přeruší a zobrazí se odpovídající zpráva. Například:

Zatímco Select.Next() Loop
UserInterruptHandling();

EndCycle;

V: Formulář má TableField s typem ValueTree a sadou vlastností Tree. Proč se nezobrazuje strom hodnot?
O: Kromě toho musíte nastavit vlastnost Display Hierarchy pro jeden ze sloupců.

V: Jak používat rutinní úlohy v souborovém režimu infobáze?
O: Na rozdíl od klient-server je v režimu souborů odpovědnost za implementaci automatického spouštění rutinní úkoly spočívá na developerovi. Chcete-li implementovat automatické spouštění úloh, potřebujete obslužný program Waiting, který pravidelně kontroluje „zpožděné“ úlohy a spouští je. Důrazně se doporučuje, abyste k tomu použili samostatnou relaci. Příklad:

Postup CheckTasks()
ExecuteTaskProcessing();
Konec procedury
ConnectWaitingHandler("CheckingTasks",3);

V: Jak získat pole z řetězce s oddělovači?
O: Jako příklad uvedu svou verzi funkce, která funguje „v obou směrech“, tj. při předání řetězce s oddělovači vytvoří pole a při předání pole z něj vytvoří řetězec s oddělovači.

Funkce StringArray (hodnota hodnoty, oddělovač)
If TypeValue(Value)=Type("String") Then
MnStr = StrNahradit(Hodnota, Oddělovač, Znaky.PS);
Pole=Nové pole;
Pro n=1 Podle cyklu StrNumber Of Rows(MnStr).
Array.Add(StrGetString(MnStr,n));
EndCycle;
Return Array;
ElseIfTypeValue(Value)=Type("Pole") Potom
Line="";
Pro každý prvek hodnotového cyklu
String=String+?(String"",Separator,"")+Element;
EndCycle;
return String;
v opačném případě
Návrat Nedefinováno;
endIf;
EndFunction

V: Jak povolit možnost provádět změny v konfigurátoru ve standardní konfiguraci?
O: Protože typické konfigurace jsou podporovány (což umožňuje automatický režim update), pak je ve výchozím nastavení možnost provádět změny v konfiguraci zakázána. Chcete-li tuto funkci povolit, musíte v konfigurátoru vybrat položku nabídky „Konfigurace > Podpora > Nastavení podpory“ a v okně, které se otevře, kliknout na tlačítko „Povolit možnost změny“.

V: Jak nastavit heslo pro zpracování/konfiguraci?
O: V 1C v 8 lze hesla nastavit pouze pro objektové moduly. Chcete-li nastavit heslo, musíte otevřít objektový modul a vybrat položku nabídky „Text > Nastavit heslo“. Existuje také možnost dodání konfigurace bez zdrojového kódu objektových modulů (konfigurovatelné v „Konfigurace > Doručování konfigurace > Nastavení doručování“). To bych rád poznamenal tento moment, žádná z těchto metod není spolehlivou ochranu ze zobrazení zdrojového kódu modulu.

V: Proč nevyhledává dokument pomocí metody FindByNumber(<Номер документа>)?
O: Je třeba pamatovat na to, že pokud je u tohoto typu dokladu v konfigurátoru nastaveno periodické číslování, musíte kromě čísla dokladu jako druhý parametr zadat i datum intervalu. V opačném případě bude vyhledán dokument s prázdným datem, což samozřejmě nepovede k požadovanému výsledku.

V: V 1C 8.1 se v případě potřeby připojte k již běžící aplikace pro ladění (Konfigurátor > Ladění > Připojení) jsou dostupné položky ladění prázdné. Jaký je důvod?
O: Jde o to, že u aplikace, kterou budeme ladit, musíme ladění výslovně povolit. Nabídka Nástroje > Možnosti > karta Systém > příznak „Ladění povoleno“.

V: Jak organizovat iteraci přes řetězce dynamický seznam(například DirectoryList nebo DocumentList)?
O: To lze provést pomocí nástroje Report Builder, například:

Builder=NewReportBuilder;
Builder.DataSource=NewDataSourceDescription(DocumentList);
Selection=Builder.Result.Select();
Zatímco Select.Next() Loop
Zpráva(Výběr.Odkaz);
EndCycle;

Poznámka: výběr bude obsahovat řádky podle aktuálně vybraného výběru.

V: Jak zkontrolovat hodnoty vlastností objektů metadat? Například typ hierarchie adresářů nebo režim záznamu rejstříku nebo četnost čísla dokladu?
O: Všechny tyto vlastnosti jsou vyčíslitelné vlastnosti objektů metadat. Hodnoty tohoto typu můžete získat také prostřednictvím metadat. Příklady:

// Příklad 1. Typ hierarchie adresáře
If Metadata.Directories[Název adresáře].Hierarchy View = Metadata.Object Properties.Hierarchy View.Hierarchy of Groups and Elements Then...
// Příklad 2. Režim RegisterRecord
If Metadata.InformationRegisters[RegisterName].RegisterRecordMode = Metadata.ObjectProperties.RegisterRecordMode.Submission toRegistrar Then...
// Příklad 3. Periodicita čísla dokladu
If Metadata.Documents[DocumentName].PeriodicityNumbers = Metadata.ObjectProperties.PeriodicityDocumentNumbers.Non-periodic Then...

V: Jak implementovat zaškrtávací políčko se třemi stavy ve stromu hodnot?
O: Podívejme se podrobněji na formulaci problému. Formulář má pole tabulky, jehož zdrojem dat je strom hodnot. V jednom ze sloupců je ovládací prvek „Checkbox“. Je nutné, aby mohl přijímat tři stavy: „Zapnuto“, „Vypnuto“ a „Nedefinováno“. V tomto případě je stát „Nedefinováno“ nebo tzv. „šedá vlajka“, tzn. částečně vybrané je nastaveno, pokud nemají všechny podřízené řádky stejný stav zaškrtávacího políčka. Pokud má řádek podřízené řádky, pak by se při změně jeho příznaku měly příslušně změnit příznaky všech podřízených řádků.
Nejprve přidejte náš sloupec zaškrtávacího políčka do stromu hodnot:

Tree.Columns.Add("Mark", New TypeDescription("Number"));
FormElements.Tree.CreateColumns();
TreeColumns=FormElements.Tree.Columns;
TreeColumns.Mark.FlagData="Mark";
TreeColumns.Mark.SetControlElement(Type("Zaškrtávací políčko"));
Tree Columns.Mark.EditMode=EditModeColumns.Přímo
Absolutně;
TreeColumns.Mark.ThreeStatesFlag=True;

Za druhé, při změně zaškrtávacího políčka musíte nastavit odpovídající hodnoty v podřízených řádcích a ovládat hodnotu zaškrtávacího políčka v „nadřazeném řádku“:

Postup TreeWhenChangingFlag(prvek, sloupec)
CurrentRow=Prvek.CurrentRow;
If CurrentLine.Mark=2 Then
CurrentLine.Mark=0;
endIf;
SettingFlags(CurrentRow,CurrentRow.Mark);
Zatímco CurrentRow.Parent Nedefinovaná smyčka
CurrentRow.Parent.Mark=?(SetForAll(CurrentRow),CurrentRow.Mark, 2);
CurrentRow = CurrentRow.Parent;
EndCycle;
Konec procedury

Zde procedura SetFlags() rekurzivně nastavuje zaškrtávací políčka v podřízených řádcích:

Postup NastaveníFlags(CurrentRow,Value)
Pro každou stránku z cyklu CurrentRow.Rows
PageMark=Hodnota;
SetChecks(Page,PageMark);
EndCycle;
Konec procedury

A funkce SetForAll() zkontroluje, zda je nastavena stejná hodnota pro všechny řádky na aktuální úrovni:

Funkce SetForAll(String)
Pro každou stránku cyklu Row.Parent.Rows
Pokud Page.MarkLine.Mark Then
Návrat False;
endIf;
EndCycle;
Návrat True;
EndFunction

V: Jak mohu implementovat třídění podle vlastních atributů ve formuláři seznamu?
O: Pokud je atribut primitivního typu, stačí nastavit vlastnost atributu „Index“ na hodnotu „Index“ nebo „Index s dodatkem“. ordering" (není k dispozici pro atributy typu Value Storage). Pokud je atributem referenční typ, pak je nutné pro něj explicitně povolit dostupnost řazení. Například:

Element UP=Formulář Elements.DirectoryList.Order Settings.Find("Props1");
Pokud UP Element není definován, Potom
ElementUP.Availability=True;
endIf;

Řádky v 1C 8.3 ve vestavěném jazyce 1C představují hodnoty primitivního typu Čára. Hodnoty tohoto typu obsahovat řetězec Unicode libovolné délky. Proměnné typu řetězec jsou sady znaků uzavřených v uvozovkách.

Příklad 1. Vytvořme řetězcovou proměnnou s textem.

StringVariable = "Ahoj světe!";

Funkce pro práci s řetězci v 1s 8.3

V tato sekce Budou uvedeny hlavní funkce, které vám umožní změnit řádky v 1c nebo analyzovat informace v nich obsažené.

StrLength

StrLength(<Строка>) . Vrátí počet znaků obsažených v řetězci předaném jako parametr.

Příklad 2. Spočítejme počet znaků v řádku „Ahoj světe!“

String = "Ahoj světe!"; Počet znaků = StrLength(String); Report(NumberCharacters);

Výsledkem provedení tohoto kódu bude zobrazení počtu znaků v řádku: 11.

AbbrL

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

  • prostor;
  • nerozbitný prostor;
  • tabelování;
  • návrat vozíku;
  • překlad řádků;
  • překlad formuláře (stránky).

Příklad 3. Odstraňte všechny mezery z levé strany řádku "svět!" a přidejte k němu řádek „Ahoj“.

String = Zkratka("svět!"); String = "Ahoj"+String; Report(String);

Výsledkem provedení tohoto kódu bude zobrazení řádku „Ahoj světe!“.

Zkráceno

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

Příklad 4. Formulář z řádků „Ahoj“ a „mír!“ fráze "Ahoj světe!"

Řádek = Zkratka("Ahoj ")+" "+ Zkratka("svět!"); Report(String);

AbbrLP

AbbrLP(<Строка>) . Ořízne nevýznamné znaky vpravo od prvního významného znaku v řetězci a také ořízne nevýznamné znaky vlevo od prvního významného znaku v řetězci. Tato funkce se používá častěji než předchozí dva, protože je univerzálnější.

Příklad 5. Odstraňte nepodstatné znaky vlevo a vpravo ve jménu protistrany.

Protistrana = Adresáře. Najít podle podrobností("TIN", "0777121211"); AccountObject = Account.GetObject(); Název objektu protistrany = AbbrLP(Název objektu protistrany); AccountObject.Write();

Lev

Lev(<Строка>, <ЧислоСимволов>) . Získá první znaky řetězce, počet znaků je zadán v parametru Počet znaků.

Příklad 6. Vpusťte strukturu Zaměstnanec obsahovat jméno, příjmení a patronyma zaměstnance. Získejte řetězec s příjmením a iniciálami.

JménoPočáteční = Lev(Jméno zaměstnance, 1); Patronymická iniciála = Lev(Zaměstnanec. Patronymika, 1); CeléJméno = Employee.LastName + " " + Iniciála jména + "." + Střední iniciála + ".";

Že jo

Že jo(<Строка>, <ЧислоСимволов>) . Získá poslední znaky řetězce, počet znaků zadaný v parametru Počet znaků. Pokud zadaný počet znaků překročí délku řetězce, vrátí se celý řetězec.

Příklad 7. Nechte na konec řetězcové proměnné napsat datum ve formátu „rrrrmmdd“, získejte řetězec s datem a převeďte jej na typ datum.

Řetězec = " Aktuální datum: 20170910"; StringDate = Rights(String, 8); Date = Date(StringDate);

středa

Středa(<Строка>, <НачальныйНомер>, <ЧислоСимволов>) . Získá podřetězec z řetězce předaného jako parametr Čára, počínaje znakem, jehož číslo je uvedeno v parametru PočátečníNumber a délka předaná do parametru Počet znaků.Číslování znaků v řádku začíná od 1. Je-li v parametru PočátečníNumber je zadána hodnota menší nebo rovna nule, pak má parametr hodnotu 1. Pokud je parametr Počet znaků není zadáno, vyberou se znaky až do konce řádku.

Příklad 8. Nechte řetězcovou proměnnou začínající na deváté pozici obsahovat kód regionu, měli byste jej získat a napsat na samostatný řádek.

String = "Region: 99 Moskva"; Oblast = Avg(String, 9, 2);

PageFind

StrFind(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) . Vyhledá zadaný podřetězec v řetězci a vrátí číslo pozice prvního znaku nalezeného podřetězce. Podívejme se na parametry této funkce:

  • Čára. Zdrojový řetězec;
  • Hledat podřetězec. Hledat podřetězec;
  • Směr hledání. Určuje směr hledání podřetězce v řetězci. Může nabývat hodnot:
    • Search Direction.From Start;
    • Směr hledání. Konec;
  • Počáteční pozice. Určuje pozici v řetězci, na které začíná hledání;
  • Počet výskytů. Určuje číslo výskytu hledaného podřetězce ve zdrojovém řetězci.

Příklad 9. V řádku „Ahoj světe!“ Určete polohu posledního výskytu znaku „a“.

PositionNumber = StrFind("Ahoj světe!", "and", SearchDirection.End); Report(PositionNumber);

Výsledkem provedení tohoto kódu bude zobrazení čísla posledního výskytu symbolu „a“: 9.

VReg

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

Příklad 10: Převeďte řetězec "hello world!" na velká písmena.

StringVreg = VReg("ahoj světe!"); Report(StringVreg);

Výsledkem provedení tohoto kódu bude zobrazení řádku „HELLO WORLD!“

NReg

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

Příklad 11: Převeďte řetězec "HELLO WORLD!" na malá písmena.

StringNreg = NReg("AHOJ SVĚTE!"); Report(StringVreg);

Výsledkem provedení tohoto kódu bude zobrazení řádku "ahoj světe!"

Treg

TReg(<Строка>) . Převede řetězec následovně: první znak každého slova se převede na velká písmena, zbývající znaky slova se převedou na malá písmena.

Příklad 12: Uveďte první písmena slov v řádku „ahoj světe“ velkými písmeny!

StringTreg = TReg("ahoj světe!"); Report(StringTreg);

Výsledkem provedení tohoto kódu bude zobrazení řádku „Ahoj světe!“

Symbol

Symbol(<КодСимвола>) . Získá znak pomocí kódu Unicod.

Příklad 13. Přidejte doleva a doprava do řádku „Ahoj světe!“ symbol ★

StringWithStars = Symbol("9733")+"Ahoj světe!"+Symbol("9733"); Report(StringWithStars);

Výsledkem provedení tohoto kódu bude zobrazení řádku „★Hello World!★“

Kód symbolu

Kód symbolu(<Строка>, <НомерСимвола>) . Získá kód znaku Unicode z řetězce zadaného v prvním parametru umístěného na pozici zadané ve druhém parametru.

Příklad 14. Zjistěte kód posledního znaku v řádku „Ahoj světe!“

String = "Ahoj světe!"; CharacterCode = CharacterCode(String, StrLength(String)); Upozornit(Kód znaku);

Výsledkem provedení tohoto kódu bude zobrazení kódu symbolu „!“ - 33.

Prázdný řádek

Prázdný řádek (<Строка>) . Kontroluje, zda se řetězec skládá pouze z nepodstatných znaků, tedy zda je prázdný.

Příklad 15. Zkontrolujte, zda je řetězec sestávající ze tří mezer prázdný.

Empty = EmptyString(" "); Report(Empty);

Výsledkem provedení tohoto kódu bude zobrazení slova „Ano“ (řetězcový výraz logické hodnoty Skutečný).

PageReplace

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.

Příklad 16. V řádku „Ahoj světe!“ nahraďte slovo „Mír“ slovem „Přátelé“.

String = StrReplace("Ahoj světe!", "Světe", "Přátelé"); Report(String);

Výsledkem provedení tohoto kódu bude zobrazení řádku „Ahoj přátelé!“

StrNumberLines

StrNumberRow(<Строка>) . Umožňuje spočítat počet řádků ve víceřádkovém řetězci. Jít do nový řádek v 1s 8 se používá symbol PS(znak nového řádku).

Příklad 17. Určete počet řádků v textu:
"První řada
Druhý řádek
Třetí řádek"

Číslo = StrNumberString("První řádek"+Znaky.PS +"Druhý řádek"+Symboly.PS +"Třetí řádek"); Zpráva(Číslo);

Výsledkem provedení tohoto kódu bude zobrazení počtu řádků v textu: 3

StrGetString

StrGetString(<Строка>, <НомерСтроки>) . Získá řádek ve víceřádkovém řetězci podle jeho čísla. Číslování řádků začíná od 1.

Příklad 18. Získejte poslední řádek v textu:
"První řada
Druhý řádek
Třetí řádek"

Text = "První řádek" + Symboly PS + "Druhý řádek" + Symboly PS + "Třetí řádek"; LastRow = StrGetRow(Text, StrNumberLines(Text)); Zpráva(Poslední řádek);

Výsledkem provedení tohoto kódu bude zobrazení řádku „Třetí řádek“.

PageNumberOccurrences

StrNumberOccurrences(<Строка>, <ПодстрокаПоиска>) . Vrátí počet výskytů zadaného podřetězce v řetězci. Funkce rozlišuje malá a velká písmena.

Příklad 19. Určete, kolikrát se písmeno „c“ objeví v řádku „Řádky v 1s 8.3 a 8.2“, bez ohledu na velikost písmen.

Řádek = "Řádky v 1s 8,3 a 8,2"; NumberOccurrences = StrNumberOccurrences(Vreg(String), "S"); Report(NumberOccurrences);

Výsledkem provedení tohoto kódu bude zobrazení počtu výskytů: 2.

PageStartsWith

StrStartsWith(<Строка>, <СтрокаПоиска>) . Zkontroluje, zda řetězec předaný v prvním parametru začíná řetězcem v druhém parametru.

Příklad 20. Určete, zda DIČ vybrané protistrany začíná číslem 1. Nechte v proměnné Protistrana Protistrany.

DIČ = Protistrana.TIN; StartsUNits = StrStartsWith(TIN, "1"); If Začíná jednotkami Then //Váš kód EndIf;

PageEndsOn

StrEndsWith(<Строка>, <СтрокаПоиска>) . Zkontroluje, zda řetězec předaný v prvním parametru končí řetězcem v druhém parametru.

Příklad 21. Určete, zda DIČ vybrané protistrany končí číslem 2. Nechte v proměnné Protistrana je uložen odkaz na prvek adresáře Protistrany.

DIČ = Protistrana.TIN; EndsWithTwo = StrEndsWith(TIN, "2"); If EndsInTwo Then //Váš kód EndIf;

PageSplit

StrDivide(<Строка>, <Разделитель>, <ВключатьПустые>) . Rozdělí řetězec na části pomocí zadaných oddělovacích znaků a zapíše výsledné řetězce do pole. První parametr ukládá zdrojový řetězec, druhý obsahuje řetězec obsahující oddělovač, třetí udává, zda mají být do pole zapsány prázdné řetězce (ve výchozím nastavení Skutečný).

Příklad 22. Mějme řetězec obsahující čísla oddělená symbolem „;“, získáme z řetězce pole čísel.

Řetězec = "1; 2; 3"; Pole = StrDivide(String, ";"); For Count = 0 By Array.Quantity() - 1 Cyklus pokusů Array[Count] = Number(AbbrLP(Array[Count])); Pole výjimek[Sch] = 0; EndAttemptsEndCycle;

V důsledku provedení bude získáno pole s čísly od 1 do 3.

PageConnect

StrConnect(<Строки>, <Разделитель>) . Převede pole řetězců z prvního parametru na řetězec obsahující všechny prvky pole oddělené oddělovačem zadaným ve druhém parametru.

Příklad 23. Pomocí pole čísel z předchozího příkladu získejte původní řetězec.

Pro účet = 0 Podle Array.Quantity() - 1 cyklus Array[Act] = String(Array[Act]); EndCycle; Řádek = StrConnect(Array, "; ");

Typ String se nachází ve všech programovacích jazycích. Je primitivní a v 1C je pro práci s ním mnoho funkcí. V tomto článku se na to podíváme blíže různé cesty práce s typy řetězců v 1C 8.3 a 8.2 pomocí příkladů.

Čára

Aby bylo možné převést proměnnou jakéhokoli typu na řetězec, existuje funkce se stejným názvem „String()“. Vstupním parametrem bude samotná proměnná, jejíž řetězcovou reprezentaci je třeba získat.

String(False) // vrátí "Ne"
String(12345) // vrátí "12,345"
String(CurrentDate()) //"07/21/2017 11:55:36″

Převod na řetězec je možný nejen primitivní typy, ale i další, například prvky referenčních knih a dokumentů.

SokrLP, SokrL, SokrP

Vstupními parametry těchto funkcí jsou proměnná typu string. Funkce odstraňují nepodstatné znaky (mezery, konce řádku atd.): zleva a pravá strana, pouze na levé straně a pouze na pravé, resp.

Zkratka(" Mezery budou odstraněny na obou stranách ") // "Mezery budou odstraněny na obou stranách"
Zkratka(" Mezery na obou stranách budou odstraněny ") // " Mezery na levé straně budou odstraněny "
Zkratka(" Mezery na obou stranách budou odstraněny ") // "Mezery na pravé straně budou odstraněny"

Lev, správně, střední

Tyto funkce umožňují oříznout část řetězce. Funkce "Left()" vrátí část řetězce z levé strany zadané délky. Funkce "Right()" je podobná, ale ořezává se zprava. Funkce „Avg()“ umožňuje zadat číslo znaku, ze kterého bude řádek vybrán, a jeho délku.

Lev("String variable", 4) // vrátí "Str"
Right("String variable", 7) // vrátí "variable"
Medium("String variable", 2, 5) // vrátí "troko"

StrLength

Funkce určuje počet znaků, které jsou obsaženy v řetězcové proměnné.

StrLength("Word") // výsledkem provedení bude číslo 5

Nalézt

Funkce umožňuje vyhledat část řetězce v řetězcové proměnné. Návratovou hodnotou bude číslo, které ukazuje pozici začátku nalezeného řetězce. Pokud není nalezena žádná shoda, vrátí se nula.

Upozorňujeme, že vyhledávání rozlišuje malá a velká písmena. Pokud je v původním řetězci více než jeden výskyt hledaného podřetězce, funkce vrátí začátek prvního výskytu.

Funkce Find("jeden, dva, jedna, dva, tři", "dva") // vrátí číslo 6

Prázdný řádek

Pomocí této funkce můžete určit, zda je řetězec prázdný. Drobné znaky, jako je mezera, návrat vozíku a další, se neberou v úvahu.

EmptyString("Pupkin Vasilij Ivanovič") // funkce vrátí hodnotu False
EmptyString(" ") // funkce vrátí hodnotu True

VReg, NReg, TReg

Tyto funkce jsou velmi užitečné při porovnávání a převodu řetězcových proměnných. "Reg()" vrátí původní řetězec velká písmena, "HPreg()" dole a "TReg()" jej naformátují tak, že první znak každého jednotlivého slova bude mít velká písmena, a všechny následující s malým.

VReg("GENERAL DIRECTOR") // návratová hodnota - "GENERAL DIRECTOR"
NReg(“CEO DIRECTOR”) // návratová hodnota – “CEO”
TREG(“CEO DIRECTOR”) // návratová hodnota – “General Director”

PageReplace

Tato funkce je analogická k nahrazení v textové editory. Umožňuje vám nahradit jeden znak nebo sadu znaků jiným v řetězcových proměnných.

StrReplace("red, white, yellow", ","", ";") // vrátí "red; bílý; žlutá"

StrNumberLines

Funkce umožňuje určit počet řádků oddělených znaky konce řádku v textové proměnné.

Smyčka v příkladu níže projde třemi cykly, protože funkce LineNumberRow vrátí hodnotu 3:

Pro ind = 1 podle StrNumber of Strings ("Řádek1" + Symboly.PS + "Řádek2" + Symboly.PS + "Řádek3")
<тело цикла>
EndCycle;

StrGetString

Tato funkce pracuje s víceřádkovým textem stejným způsobem jako předchozí. Umožňuje vám získat konkrétní řetězec z textové proměnné.

StrGetString("String1" + Characters.PS + "String2" + Characters.PS + "String3", 2) // návrat "String2"

PageNumberOccurrences

Funkce počítá počet výskytů znaku nebo podřetězce ve hledaném řetězci.

StrNumberAttachments("a;b;c;d; ", ";") // funkce vrátí číslo 4

Symbol a kód symbolu

Tyto funkce umožňují získat znak podle jeho kódu v kódování Unicode, stejně jako určit tento kód podle samotného znaku.

Funkce SymbolCode("A") // vrátí číslo 1 040
CharacterCode(1040) // funkce vrátí „A“

Běžné úkoly při práci s řetězci

Zřetězení řetězců

Pro spojení několika řetězců (pro provedení zřetězení) stačí použít operátor sčítání.

"Řádek 1" + "Řádek 2" //výsledkem přidání dvou řádků bude "Řádek 1 řádek 2"

Typ konverze

K převodu typu na řetězec, například odkaz na prvek adresáře, číslo atd., stačí použít funkci „String()“. Funkce jako „ScrLP()“ také převedou proměnné na řetězec, ale okamžitě s ořezáním nepodstatných znaků.

String(1000) // vrátí "1 000"

Upozorňujeme, že při převodu čísla na řetězec program automaticky přidal mezeru oddělující tisíc. Abyste tomu zabránili, můžete použít následující konstrukce:

StrReplace(String(1000),Characters.NPP,"") // vrátí "1000"

String(Format(1000,"HG=")) // vrátí "1000"

Citáty v řetězci

Poměrně často se budete muset vypořádat s nutností zadat uvozovky v řetězcové proměnné. Může to být buď text požadavku zapsaný v konfigurátoru, nebo jen proměnná. Chcete-li tento problém vyřešit, stačí nastavit dvě uvozovky.

Header = String("Horns and Hooves LLC - to jsme my!") // vrátí "Horns and Hooves LLC - to jsme my!"

Víceřádkový, zalomení řádku

Chcete-li vytvořit víceřádkový text, stačí k němu přidat zalomení řádků (Symbols.PS).

Víceřádkový text = „První řádek“ + Symboly.PS + „Druhý řádek“

Jak odstranit mezery

Chcete-li odstranit mezery vpravo nebo vlevo, můžete použít funkci „ScrAP()“ (stejně jako „ScrL()“ a „ScrP()“):

StringNoSpaces = Abbreviation(" Mnoho písmen ") // funkce vrátí hodnotu "Mnoho písmen"

Pokud po převodu čísla na řetězec potřebujete odstranit pevné mezery, použijte následující konstrukci:

StringNoSpaces = StrReplace(String(99999),Characters.NPP,"") // vrátí "99999"

Programátoři také často používají následující konstrukci, která umožňuje odstranit nebo nahradit jiným znakem všechny mezery v textové proměnné:

StringNoSpaces = StrReplace("ahoj","") // vrátí "ahoj"

Porovnání řetězců mezi sebou

Termíny můžete porovnat s obvyklým rovnítkem. Při srovnání se rozlišují velká a malá písmena.

"Ahoj" = "ahoj" // vrací False
"Ahoj" = "Ahoj" // vrátí hodnotu True
"Ahoj" = "Sbohem" // vrátí hodnotu False

Často se stává, že při načítání a vyjímání dat z 1C 8.2 a 8.3 jsou v číslech mezery, které narušují normální zpracování dat. Řešení tohoto problému je velmi jednoduché.

Podívejme se, jaké typy prostorů existují.

Prostory mohou být dvou typů:

  • nerozbitný prostor;
  • „běžný“ prostor.

Odstranění neprolomitelných mezer

StringRepresentation = String(Number); // systém zapíše do proměnné „10 000“.

Je velmi snadné odstranit takové mezery v 1C pomocí funkce formátu čísel:

Číslo = Formát(10000, “NH=”);

StringRepresentation = String(Number); // systém zapíše do proměnné „10000“.

Seskupení ve formátovacím řetězci nastavíme na hodnotu Prázdná (můžete také napsat „0“).

Pokud je datový typ již "řetězec", lze použít následující metodu:

StringRepresentation = StrReplace(String(StringRepresentation), Characters.NPP, ""); // v proměnné StringRepresentation bylo „10 000“, stalo se „10 000“

To znamená, že jsme jednoduše nahradili nezlomitelnou mezeru (Characters.NPP) v řádku prázdnou hodnotou.

Běžné prostory

Odstranit pravidelný prostor v řadě je stejně snadné jako loupání hrušek. Stačí provést následující funkci:

StringRepresentation = StrReplace(String(StringRepresentation), " ", ""); // "10 000" se změnilo na "10 000"

Příklad je podobný předchozí metodě. Místo Characters.NPP však používáme řetězec s jednou mezerou.

Pokud se začínáte učit programování 1C, doporučujeme náš bezplatný kurz (nezapomeňte přihlásit se k odběru YouTube — pravidelně jsou vydávána nová videa).