Funkcje łańcuchowe w zapytaniu trwającym 1s 8.3. Cecha wykonania funkcji substring().
Istnieje kilka mechanizmów pracy z ciągami w zapytaniach 1C. Po pierwsze, można dodać linie. Po drugie, możesz pobrać podciąg z ciągu. Po trzecie, ciągi znaków można porównywać, także według wzorca. To chyba wszystko, co można zrobić za pomocą sznurków.
Dodanie ciągu
Aby dodać wiersze w zapytaniu, stosuje się operację „+”. Można dodawać tylko ciągi o ograniczonej długości.
WYBIERZ "Nazwa: " + Kontrahenci. Nazwa AS Kolumna 1 Z katalogu. Kontrahenci JAKO Kontrahenci GDZIE Kontrahenci. Link = &Link
Funkcja podciągu
PODCIĄG(<Строка>, <НачальнаяПозиция>, <Длина>)
Analog funkcji Environment() z modelu obiektowego. Funkcję Substring() można zastosować do danych łańcuchowych i umożliwia wybranie fragmentu <Строки> , zaczynając od numeru znaku <НачальнаяПозиция> (znaki w linii numerowane są od 1) i długość <Длина> postacie. Wynik obliczenia funkcji ma typ ciągu o zmiennej długości, a długość zostanie uznana za nieograniczoną, jeśli <Строка> ma nieograniczoną długość i parametry <Длина> nie jest stałą ani większą niż 1024.
Jeśli długość ciągu jest mniejsza niż podana w drugim parametrze, funkcja zwróci pusty ciąg.
Uwaga! Nie zaleca się używania funkcji SUBSTRING() do konwersji ciągów o nieograniczonej długości na ciągi o ograniczonej długości. Zamiast tego lepiej jest użyć operatora rzutowania EXPRESS().
Funkcja podobna
Jeśli chcemy się upewnić, że atrybut string spełnia określone kryteria, porównujemy go:
WYBIERZ Kontrahenci Nazwa AS Kolumna 1 Z Katalogu Kontrahenci JAKO Kontrahenci GDZIE Kontrahenci Nazwa = "Gazprom"
Ale co, jeśli potrzebujesz bardziej subtelnego porównania? Nie tylko równość czy nierówność, ale podobieństwo do pewnego wzorca? Właśnie po to stworzono funkcję PODOBNY.
LIKE — Operator sprawdzający podobieństwo ciągu do wzorca. Analog LIKE w SQL.
Operator SIMILAR umożliwia porównanie wartości wyrażenia określonego po jego lewej stronie z ciągiem wzorca określonym po prawej stronie. Wartość wyrażenia musi być typu string. Jeśli wartość wyrażenia pasuje do wzorca, wynikiem operatora będzie PRAWDA, w przeciwnym razie będzie to FAŁSZ.
Następujące znaki w ciągu szablonu są znakami usługowymi i mają inne znaczenie niż znak ciągu:
- % (procent): ciąg zawierający dowolną liczbę dowolnych znaków;
- _ (podkreślenie): jeden dowolny znak;
- […] (jeden lub więcej znaków w nawiasach kwadratowych): dowolny pojedynczy znak umieszczony w nawiasach kwadratowych. Wyliczenie może zawierać zakresy, np. a-z oznaczające dowolny znak zawarty w zakresie, łącznie z końcami zakresu;
- [^...] (w nawiasach kwadratowych znak negacji, po którym następuje jeden lub więcej znaków): dowolny pojedynczy znak inny niż te wymienione po znaku negacji.
Każdy inny symbol oznacza sam siebie i nie niesie ze sobą żadnego dodatkowego obciążenia. Jeśli jeden z wymienionych znaków ma być zapisany jako sam, należy go poprzedzić<Спецсимвол>. Ja<Спецсимвол>(dowolny odpowiedni znak) jest zdefiniowany w tej samej instrukcji po słowie kluczowym SPECIAL CHARACTER.
Przyjrzyjmy się teraz reszcie.
Funkcje do pracy z ciągami w zapytaniach 1C
Istnieje kilka funkcji i operatorów do pracy z danymi łańcuchowymi w zapytaniach 1C.
Po pierwsze, w zapytaniach można dodać ciągi znaków. Aby to zrobić, użyj operatora „+”:
Wniosek. Tekst = „WYBIERZ
" "Linia: " " + Źródło.Nazwa
;
Po drugie, możesz wybrać część linii. Aby to zrobić, użyj funkcji PODSTRUKCJA. Funkcja jest podobna do wbudowanego języka 1C. Ma trzy parametry:
- Ciąg źródłowy.
- Numer znaku, od którego powinien zaczynać się wybrany wiersz.
- Postacie.
Wniosek. Tekst= "WYBIERAĆ
PODCIĄG(""Linia: " „, 4, 3) JAKO WYNIK”; // Wynik: OK
Funkcjonować ISNULL
NULL to specjalny typ danych na platformie 1C:Enterprise. Jest to jednocześnie jedyna możliwa wartość tego typu. NULL może pojawić się w zapytaniach w kilku przypadkach: podczas łączenia źródeł zapytań, jeśli w jednej z tabel nie znaleziono odpowiedniej wartości; podczas uzyskiwania dostępu do szczegółów nieistniejącego obiektu; jeśli na liście pól zapytania podano NULL (na przykład podczas łączenia wyników selekcji z kilku tabel) itp.
Ponieważ NULL nie jest ani null, ani pustym ciągiem, ani nawet wartością Nieokreślony, często warto zastąpić go bardziej użytecznym typem danych. Do tego właśnie została stworzona ta funkcja. ISNULL.
Ma dwa parametry:
- Sprawdzana wartość.
- Wartość, na którą ma zostać zastąpiony pierwszy parametr, jeśli okaże się, że ma wartość NULL.
Wniosek. Tekst= "WYBIERAĆ
ISNULL(Źródło.Reszta, 0) JAKO Reszta";
// Jeśli wynikiem żądania jest reszta pola = NULL,
// wtedy zostanie zastąpione przez 0 i będziesz mógł na nim wykonywać operacje matematyczne
Funkcje WYDAJNOŚĆ I WSTĘP LINKI
Funkcje te służą do uzyskiwania reprezentacji łańcuchowych różnych wartości. Oznacza to, że konwertują odniesienia, liczby, wartości logiczne itp. na zwykły tekst. Różnica między nimi polega na tym, że funkcja WYDAJNOŚĆ konwertuje dowolne typy danych na tekst (string) i funkcję WSTĘP LINKI- tylko łączy i zwraca pozostałe wartości w niezmienionej postaci, nie przekonwertowane.
Wniosek. Tekst= "WYBIERAĆ
REPREZENTACJA (PRAWDA) JAKO wartość logiczna,
REPREZENTACJA (4) JAKO Liczba,
REPREZENTACJA (Source.Link) JAKO Link,
REPREZENTACJA(DATACZAS(2016,10,07)) JAKO Data”;
// Boolean = „Tak”, Liczba = „4”, Link = „Dokument eksploatacyjny zamówienie gotówkowe Nie....od..."
// Data="07.10.2016 0:00:00"
Wniosek. Tekst= "WYBIERAĆ
REPRESENTATIONREFERENCE(TRUE) AS Boolean,
REPREZENTACJA ODNOŚNIK(4) JAKO LICZBA
PREZENTINGLINK(Source.Link) JAKO Link,
REPREZENTACJAREFERENCE(DATETIME(2016,10,07)) JAKO Data”;
// Boolean = TRUE, Number = 4, Link = „Dokument zamówienia odbioru gotówki nr... od…”
// Data=07.10.2016 0:00:00
Funkcje TYP I WPISZ WARTOŚCI
Funkcjonować TYP zwraca typ danych platformy 1C:Enterprise.
Wniosek. Tekst= "WYBIERAĆ
TYP (liczba)
TYP (ciąg),
TYP (Dokument. Dyspozycja gotówkowa wydatków)”;
Funkcjonować WPISZ WARTOŚCI zwraca typ przekazanej mu wartości.
Wniosek. Tekst= "WYBIERAĆ
TYP WARTOŚCI (5) AS Numer,
TYP (""Linia" ") AS Ciąg,
TYP (Source.Link) AS Odniesienie
Z katalogu.Źródło jako źródło”;
//Number=Numer, String=String, Katalog = DirectoryLink.Source
Funkcje te są wygodne w użyciu, np. gdy trzeba dowiedzieć się, czy pole otrzymane w żądaniu jest wartością jakiegoś typu. Przykładowo dane kontaktowe kontrahentów otrzymamy z rejestru informacyjnego ContactInformation (kontakty nie tylko kontrahentów, ale także organizacji, osoby itp.):
Wniosek. Tekst= "WYBIERAĆ
Z
GDZIE
TYP WARTOŚCI(ContactInformation.Object) = TYP(Katalog.Kontrahenci)";
Funkcjonować OZNACZAJĄCY
Funkcjonować Oznaczający umożliwia użycie obiektów konfiguracyjnych 1C bezpośrednio w żądaniu, bez użycia .
Dodajmy jeszcze jeden warunek do poprzedniego przykładu. Wystarczy, że zdobędziesz numery telefonów swoich kontrahentów.
Wniosek. Tekst= "WYBIERAĆ
Informacje kontaktowe.Wprowadzenie
Z
Rejestr informacji Informacje kontaktowe JAK Informacje kontaktowe
GDZIE
WARTOŚCI TYPE(ContactInformation.Object) = TYPE(Katalog.Kontrahenci)
ORAZ ContactInfo.Type = WARTOŚĆ(Enum.ContactInfoTypes.Phone)”;
Należy zaznaczyć, że tej funkcji można używać tylko z wcześniej zdefiniowanymi wartościami, tj. z wartościami, do których można uzyskać dostęp bezpośrednio z konfiguratora. Czyli funkcja OZNACZAJĄCY nie można używać z elementami katalogu utworzonymi przez użytkowników, ale można pracować z wyliczeniami, z predefiniowanymi elementami katalogu i wartościami Pusty Link.
Operator POŁĄCZYĆ
Operator POŁĄCZYĆ ma na celu sprawdzenie wartości zwracanych przez żądanie, aby sprawdzić, czy należą one do określonego typu referencyjnego. To samo zadanie można wykonać za pomocą funkcji TYP I WPISZ WARTOŚCI(które mają szerszy zakres i zostały omówione powyżej).
Na przykład zadanie wyboru danych kontaktowych dla kontrahentów można rozwiązać w następujący sposób:
Wniosek. Tekst= "WYBIERAĆ
Informacje kontaktowe.Wprowadzenie
Z
Rejestr informacji Informacje kontaktowe JAK Informacje kontaktowe
GDZIE
ContactInformation.Object LINK Directory.Kontrahenci";
Operator WYRAZIĆ
Operator WYRAZIĆ używane w zapytaniach 1C w dwóch przypadkach:
- kiedy trzeba zmienić charakterystykę typu pierwotnego;
- kiedy trzeba zamienić pole ze złożonym typem danych w pole o pojedynczym typie.
Pierwotne typy danych obejmują: liczba, ciąg znaków, data, wartość logiczna. Niektóre z tych typów danych mają dodatkowe cechy. Typ Numer ma długość i precyzję, typ Linia - długość lub nieograniczona.
Operator WYRAZIĆ pozwala zmienić nie typ danych, ale dodatkowe cechy. Na przykład może zamienić sznurek o nieograniczonej długości w ciąg o ograniczonej długości. Może to być przydatne, jeśli chcesz pogrupować wyniki zapytania według takiego pola. Nie można grupować według pól o nieograniczonej długości, dlatego konwertujemy je na ciąg o długości 200 znaków.
Wniosek. Tekst= "WYBIERAĆ
ILOŚĆ (RÓŻNE Przybycie towarów i usług. Link) JAKO Link
Z
Dokument Odbiór towarów i usług JAK Odbiór towarów i usług
GRUPUJ WEDŁUG
EKSPRESOWY(Odbiór towarów i usług. Komentarz JAK WIERSZ (200))";
W niektórych przypadkach zapytania do pól o złożonym typie danych mogą nie być optymalnie przetwarzane przez platformę 1C. Powoduje to dłuższe czasy zapytań, dlatego przydatne może być wcześniejsze przekonwertowanie typu złożonego na typ pojedynczy.
Wniosek. Tekst= "WYBIERAĆ
EKSPRESOWY (Przewóz towarów. Zamówienie jako Dokument. Zamówienie klienta). Data jako Data zamówienia,
Przepływ towarówObrót towarowy.Nomenklatura
Z
RejestrAkumulacje.Przepływ towarów.Obrót AS Przepływ towarówObrót
GDZIE
Przemieszczenie towarówObrót.Dokument LINK do zamówienia.Zamówienie klienta";
Operatorzy WYBÓR I JEST NULL
Operator WYBÓR podobny do operatora JEŚLI we wbudowanym języku 1C, ale ma nieco ograniczoną funkcjonalność.
Załóżmy, że chcemy otrzymać dane kontaktowe z rejestru informacji ContactInformation i jednocześnie w osobnym polu żądania wskazać, czy należą one do kontrahenta, czy do osoby fizycznej.
Wniosek. Tekst= "WYBIERAĆ
Informacje kontaktowe.Wprowadzenie,
WYBÓR
KIEDY WARTOŚCI TYPE(ContactInformation.Object) = TYPE(Directory.Counterparties)
NASTĘPNIE " Kontrahent "
INNEGO WYBORU
KIEDY WARTOŚCI TYPE(ContactInformation.Object) = TYPE(Directory.Individuals)
NASTĘPNIE " Indywidualny"
ELSE „Ktoś inny” "
KONIEC
KONIEC JAKO WŁAŚCICIEL
Z
Rejestr informacji. Informacje kontaktowe JAKO Informacje kontaktowe”;
Jak widać na przykładzie, w projekcie WYBÓR po słowie zawsze jest warunek GDY; wartość stosowana, jeśli warunek po słowie jest spełniony NASTĘPNIE oraz wartość zastosowaną, jeśli warunek nie jest spełniony, po słowie W PRZECIWNYM RAZIE. Wszystkie trzy elementy projektu WYBÓR są obowiązkowe. Pomiń element W PRZECIWNYM RAZIE, analogicznie jak w przypadku korzystania z operatora JEŚLI we wbudowanym języku 1C jest to niemożliwe. Również od operatora WYBÓR nie ma analogii do projektu ELSEIF, ale możesz go zainwestować WYBÓR w innym, jak to zrobiono w naszym przykładzie.
Operator JEST NULL wykorzystywane w projektowaniu WYBÓR aby porównać pole zapytania z typem NULL.
Wniosek. Tekst= "WYBIERAĆ
WYBÓR
JEŚLI WARTOŚĆ JEST NULL, TO 0
INACZEJ Znaczenie
KONIEC";
Poza tym operator JEST NULL można używać w warunkach zapytania, na przykład w zdaniu GDZIE.
W języku zapytań 1C:Enterprise funkcja PODCIĄG() V formatuj PODCIĄG(<Исходная строка>, <Начало>, <Длина>) można zastosować do danych łańcuchowych i umożliwia wybranie fragmentu<Исходной строки>, zaczynając od numeru znaku<Начало>(znaki w linii numerowane są od 1) i długość<Длина>postacie. Wynik obliczenia funkcji SUBSTRING() ma typ string o zmiennej długości, a długość zostanie uznana za nieograniczoną, jeżeli<Исходная строка>ma nieograniczoną długość i parametry<Длина>nie jest stałą ani większą niż 1024.
Obliczenie funkcji SUBSTRING() na serwerze SQL:
W wersji klient-serwer funkcja SUBSTRING() jest realizowana przy pomocy funkcji SUBSTRING() odpowiedniej instrukcji SQL, przekazywanej do serwera bazy danych SQL Server, który oblicza typ wyniku funkcji SUBSTRING() stosując złożone reguły w zależności od rodzaju i wartości jego parametrów, a także w zależności od kontekstu, w którym jest używany.
W większości przypadków reguły te nie wpływają na wykonanie zapytania 1C:Enterprise, jednak zdarzają się przypadki, gdy maksymalna długość ciągu wynikowego obliczona przez SQL Server jest niezbędna do wykonania zapytania. Należy pamiętać, że w niektórych kontekstach podczas korzystania z funkcji SUBSTRING() maksymalna długość jej wyniku może być równa maksymalnej długości łańcucha o ograniczonej długości, który w SQL Server wynosi 4000 znaków. Może to spowodować nieoczekiwane zakończenie żądania.
Na przykład żądanie:
Kod 1C v 8.x WYBIERZ
WYBÓR
W przeciwnym razie NULL
KONIEC JAKO PREZENTACJA,
WYBÓR
KIEDY Typ = &LegalAddressIndividual
THEN PODCIĄG(Reprezentacja, 0, 200)
W przeciwnym razie NULL
ZAKOŃCZ JAKO Prezentacja 1
Z
SORTUJ WEDŁUG
Wydajność,
Wydajność1
kończy się nieprawidłowo komunikatem Błąd DBMS:
Dostawca Microsoft OLE DB dla SQL Server: Ostrzeżenie: Procesor zapytań nie mógł wygenerować planu zapytań z optymalizatora, ponieważ całkowita długość wszystkich kolumn w klauzulach GROUP BY lub ORDER BY przekracza 8000 bajtów.
HRESULT=80040E14, SQLSTATE=42000, natywny=8618
Dzieje się tak, ponieważ Microsoft SQL Server oblicza maksymalną długość ciągu znaków wynikającą z wyrażenia:
Kod 1C v 8.x WYBÓR
KIEDY Typ = &LegalAddressIndividual
THEN PODCIĄG(Reprezentacja, 0, 200)
W przeciwnym razie NULL
KONIEC JAKO PREZENTACJA,
wynosi 4000 znaków. Dlatego długość rekordu składającego się z dwóch takich pól przekracza 8000 bajtów dozwolonych dla operacji sortowania.
Ze względu na opisaną specyfikę wykonywania funkcji SUBSTRING() na serwerze SQL Server, nie zaleca się stosowania funkcji SUBSTRING() do konwersji ciągów o nieograniczonej długości na ciągi o ograniczonej długości. Zamiast tego lepiej jest użyć operatora rzutowania EXPRESS(). W szczególności powyższy przykład można przepisać jako:
Kod 1C v 8.x WYBIERZ
WYBÓR
KIEDY Typ = &LegalAddressIndividual
W przeciwnym razie NULL
KONIEC JAKO PREZENTACJA,
WYBÓR
KIEDY Typ = &LegalAddressIndividual
THEN EXPRESS(Reprezentacja AS String(200))
W przeciwnym razie NULL
ZAKOŃCZ JAKO Prezentacja 1
Z
Rejestr informacji Informacje kontaktowe JAK Informacje kontaktowe
SORTUJ WEDŁUG
Wydajność,
Wydajność1
Język zapytań jest jednym z podstawowych mechanizmów 1C 8.3 dla programistów. Za pomocą zapytań można szybko odzyskać dowolne dane zapisane w bazie danych. Jego składnia jest bardzo podobna do SQL, ale są pewne różnice.
Główne zalety języka zapytań 1C 8.3 (8.2) w porównaniu z SQL:
- dereferencja pól referencyjnych (odniesienie jednego lub większej liczby punktów do szczegółów obiektu);
- praca z wynikami jest bardzo wygodna;
- możliwość tworzenia wirtualnych tabel;
- wniosek może zostać napisany w języku angielskim i rosyjskim;
- możliwość blokowania danych w celu uniknięcia zakleszczeń.
Wady języka zapytań w 1C:
- w przeciwieństwie do SQL, w zapytaniach 1C nie pozwalają na zmianę danych;
- brak procedur przechowywanych;
- niemożność konwersji ciągu znaków na liczbę.
Rzućmy okiem na nasz mini samouczek na temat podstawowych konstrukcji języka zapytań 1C.
Ponieważ zapytania w 1C pozwalają tylko na odbieranie danych, każde zapytanie musi zaczynać się od słowa „WYBIERZ”. Po tym poleceniu wskazane są pola, z których należy pobrać dane. Jeżeli wpiszesz „*”, wybrane zostaną wszystkie dostępne pola. Miejsce, z którego zostaną wybrane dane (dokumenty, rejestry, spisy itp.) wskazane jest po słowie „OD”.
W omówionym poniżej przykładzie nazwy całej nomenklatury wybierane są z katalogu „Nomenklatura”. Po słowie „JAK” wskazane są aliasy (nazwy) tabel i pól.
WYBIERAĆ
Nomenklatura Nazwa AS Nazwa nomenklatury
Z
Katalog.Nomenklatura AS Nomenklatura
Obok polecenia „WYBIERZ” możesz określić słowa kluczowe:
- RÓŻNY. Zapytanie wybierze tylko wiersze, które różnią się co najmniej jednym polem (bez duplikatów).
- PIERWSZY rz, Gdzie N– liczba wierszy od początku wyniku, które należy wybrać. Najczęściej tę konstrukcję stosuje się w połączeniu z sortowaniem (ORDER BY). Na przykład, gdy chcesz wybrać określoną liczbę dokumentów, które są aktualne według daty.
- DOZWOLONY. Konstrukcja ta umożliwia wybranie z bazy danych tylko tych rekordów, które są dostępne dla bieżącego użytkownika. W wyniku użycia tego słowa kluczowego użytkownik otrzyma komunikat o błędzie podczas próby zapytania o rekordy, do których nie ma dostępu.
Te słowa kluczowe mogą być używane razem lub osobno.
DLA ZMIANY
Niniejsza propozycja blokuje dane, aby zapobiec wzajemnym konfliktom. Zablokowane dane nie zostaną odczytane z innego połączenia aż do zakończenia transakcji. W tej klauzuli możesz określić konkretne tabele, które mają być zablokowane. W przeciwnym razie wszyscy zostaną zablokowani. Konstrukcja dotyczy wyłącznie trybu automatycznego ryglowania.
Najczęściej przy odbiorze salda stosowana jest klauzula „DO ZMIANY”. Przecież gdy w programie pracuje jednocześnie kilku użytkowników, jeden otrzymuje salda, drugi może je zmieniać. W takim przypadku otrzymana reszta nie będzie już poprawna. Jeśli zablokujesz dane tą propozycją, to dopóki pierwszy pracownik nie otrzyma prawidłowego salda i nie wykona przy nim wszystkich niezbędnych manipulacji, drugi pracownik będzie zmuszony poczekać.
WYBIERAĆ
Wzajemne rozliczenia Pracownik,
Wzajemne rozliczenia Kwota wzajemnych rozliczeń Saldo
Z
Rejestr Akumulacji Wzajemne rozliczenia z pracownikami Salda AS Wzajemne rozliczenia
DLA ZMIANY
GDZIE
Projekt jest konieczny, aby narzucić pewnego rodzaju selekcję przesyłanym danym. W niektórych przypadkach pozyskiwania danych z rejestrów rozsądniejsze jest określenie warunków selekcji w parametrach tablic wirtualnych. W przypadku użycia opcji „WHERE” w pierwszej kolejności pobierane są wszystkie rekordy, a dopiero potem stosowana jest selekcja, co znacznie spowalnia zapytanie.
Poniżej znajduje się przykład zapytania o pozyskanie osób kontaktowych na konkretne stanowisko. Parametr wyboru ma format: &NazwaParametru (nazwa parametru jest dowolna).
WYBÓR (przypadek)
Konstrukcja umożliwia określenie warunków bezpośrednio w treści żądania.
W poniższym przykładzie „AdditionalField” będzie zawierać tekst w zależności od tego, czy dokument został zaksięgowany, czy nie:
WYBIERAĆ
WstępT&U.Link,
WYBÓR
KIEDY WstępT&U.Wykonane
WTEDY „Dokument został przyjęty!”
W przeciwnym razie „Dokument nie został wysłany...”
KONIEC JAKO Pole dodatkowe
Z
Dokument Odbiór towarów i usług JAK Warunki odbioru
DOŁĄCZYĆ
Złączenia łączą dwie tabele według pewien warunek komunikacja.
POŁĄCZENIE LEWE/PRAWE
Istota złączenia LEFT polega na tym, że pierwsza określona tabela jest pobierana w całości, a druga jest z nią łączona zgodnie z warunkiem połączenia. Jeśli w drugiej tabeli nie ma rekordów odpowiadających pierwszej tabeli, wówczas jako ich wartości zostaje podstawiona wartość NULL. Mówiąc najprościej, tabela główna jest pierwszą określoną tabelą, a dane drugiej tabeli (jeśli istnieją) są już zastąpione jej danymi.
Przykładowo konieczne jest uzyskanie pozycji towarowych z dokumentów „Odbiór towarów i usług”, a cen z rejestru informacyjnego „Ceny pozycji”. W takim przypadku, jeśli nie zostanie znaleziona cena dla żadnej pozycji, zamiast tego zamień NULL. Wybrane zostaną wszystkie pozycje z dokumentu niezależnie od tego czy mają cenę czy nie.
WYBIERAĆ
Nomenklatura odbioru i U,
Ceny.Cena
Z
Dokument Odbiór towarów i usług Towar JAK Odbiór i specyfikacje
DOŁĄCZENIE WEWNĘTRZNE RejestrInformacje.CenyNomenklatura.SliceLast AS Ceny
Otrzymanie oprogramowania i nomenklatura = Ceny. Nomenklatura
W PRAWEJ wszystko jest dokładnie odwrotnie.
PEŁNE POŁĄCZENIE
Ten typ połączenia różni się od poprzednich tym, że w rezultacie zwrócone zostaną wszystkie rekordy zarówno pierwszej, jak i drugiej tabeli. Jeśli w pierwszej lub drugiej tabeli na podstawie określonego warunku połączenia nie zostaną znalezione żadne rekordy, zamiast tego zostanie zwrócona wartość NULL.
Kiedy użyto w poprzednim przykładzie pełne połączenie Wybrane zostaną wszystkie pozycje towarowe z dokumentu „Odbiór towarów i usług” oraz wszystkie najnowsze ceny z rejestru „Ceny towarów”. Wartości nieodnalezionych rekordów zarówno w pierwszej, jak i drugiej tabeli będą równe NULL.
WEWNĘTRZNE POŁĄCZENIE
Różnica między INNER JOIN a FULL JOIN polega na tym, że jeśli w co najmniej jednej tabeli nie zostanie znaleziony rekord, zapytanie w ogóle go nie wyświetli. W rezultacie wybrane zostaną tylko te pozycje pozycji z dokumentu „Odbiór towarów i usług”, dla których istnieją zapisy w rejestrze informacyjnym „Ceny pozycji”, jeśli w poprzednim przykładzie „PEŁNE” zastąpimy „WEWNĘTRZNY”.
GRUPUJ WEDŁUG
Grupowanie w zapytaniach 1C umożliwia zwijanie wierszy tabeli (grupowanie pól) według określonego wspólną cechą(pola zgrupowane). Pola grupujące można wyświetlić wyłącznie przy użyciu funkcji agregujących.
Wynikiem poniższego zapytania będzie lista typów produktów wraz z maksymalnymi cenami dla nich.
WYBIERAĆ
,
MAX(Cena.Cena) AS Cena
Z
GRUPUJ WEDŁUG
Ceny.Nomenklatura.Rodzaj nomenklatury
WYNIKI
W przeciwieństwie do grupowania, w przypadku korzystania z sum wyświetlane są wszystkie rekordy i dodawane są do nich wiersze sumy. Grupowanie wyświetla tylko uogólnione rekordy.
Wyniki można sumować dla całej tabeli (przy użyciu słowa kluczowego „OGÓLNE”), dla kilku pól, dla pól o strukturze hierarchicznej (słowa kluczowe „HIERARCHY”, „TYLKO HIERARCHIA”). Przy podsumowywaniu wyników nie ma konieczności stosowania funkcji agregujących.
Przyjrzyjmy się przykładowi podobnemu do powyższego, używając grupowania. W takim przypadku wynik zapytania zwróci nie tylko zgrupowane pola, ale także szczegółowe rekordy.
WYBIERAĆ
Ceny.Nomenklatura.Rodzaj nomenklatury AS Rodzaj nomenklatury,
Ceny. Cena AS Cena
Z
Rejestr informacji Ceny nomenklatury Migawka najnowszych cen AS
WYNIKI
MAKSYMALNA (Cena)
PRZEZ
TypNomenklatura
MAJĄCY
Operator ten jest podobny do operatora WHERE, ale jest używany tylko w przypadku funkcji agregujących. Pozostałe pola, poza tymi używanymi przez ten operator, należy zgrupować. Operator WHERE nie ma zastosowania do funkcji agregujących.
W poniższym przykładzie wybierane są ceny maksymalne artykułu, jeśli przekraczają 1000, pogrupowane według rodzaju artykułu.
WYBIERAĆ
MAX(Cena.Cena) AS Cena
Z
Rejestr informacji Ceny nomenklatury Migawka najnowszych cen AS
GRUPUJ WEDŁUG
Ceny.Nomenklatura.Rodzaj nomenklatury
MAJĄCY
MAKSYMALNE(Ceny.Cena) > 1000
SORTUJ WEDŁUG
Operator ORDER BY sortuje wynik zapytania. Aby mieć pewność, że rekordy są wyświetlane w spójnej kolejności, używana jest funkcja AUTO ORDER. Typy pierwotne są sortowane według zwykłych zasad. Typy odwołań są sortowane według identyfikatora GUID.
Przykład uzyskania listy pracowników posortowanej według nazw:
WYBIERAĆ
Pracownicy.Nazwa AS Nazwa
Z
Katalog.Pracownicy JAK Pracownicy
SORTUJ WEDŁUG
Nazwa
AUTOMATYCZNE ZAMÓWIENIE
Inne konstrukcje języka zapytań 1C
- ŁĄCZYĆ– wyniki dwóch zapytań w jedno.
- POŁĄCZ WSZYSTKO– podobnie jak COMBINE, ale bez grupowania identycznych wierszy.
- PUSTY STOLIK– czasami używane podczas łączenia zapytań w celu określenia pustej zagnieżdżonej tabeli.
- MIEJSCE– tworzy tabelę tymczasową w celu optymalizacji złożonych zapytań 1C. Takie żądania nazywane są żądaniami wsadowymi.
Funkcje języka zapytań
- PODCIĄG obcina ciąg znaków od określonej pozycji do określonej liczby znaków.
- ROK... DRUGI pozwalają uzyskać wybraną wartość typu numerycznego. Parametrem wejściowym jest data.
- POCZĄTEK OKRESU i KONIEC OKRESU używane podczas pracy z datami. Rodzaj okresu (DZIEŃ, MIESIĄC, ROK itp.) wskazywany jest jako dodatkowy parametr.
- DODATK.DATA pozwala na dodanie lub odjęcie od daty określonego czasu określonego typu (DRUGA, MINUTA, DZIEŃ itp.).
- RÓŻNICA określa różnicę pomiędzy dwiema datami, wskazując rodzaj wartości wyjściowej (DZIEŃ, ROK, MIESIĄC itp.).
- ISNULL zastępuje brakującą wartość określonym wyrażeniem.
- REPREZENTACJA i LINKI REPREZENTACYJNE uzyskać ciąg znaków reprezentujący określone pole. Zastosuj odpowiednio do dowolnych wartości i tylko wartości referencyjnych.
- TYP, WARTOŚCI TYPU służą do określenia typu parametru wejściowego.
- POŁĄCZYĆ jest logicznym operatorem porównania dla typu wartości atrybutu.
- WYRAZIĆ używany do konwersji wartości na żądany typ.
- DATA CZAS pobiera wartość typu „Data” z wartości numerycznych (rok, miesiąc, dzień, godzina, minuta, sekunda).
- OZNACZAJĄCY w żądaniu 1C służy do wskazania predefiniowanych wartości - katalogów, wyliczeń, planów typów cech. Przykład użycia: " Gdzie osoba prawna = wartość (wyliczenie. osoba prawna. osoba fizyczna)«.
Konstruktor zapytań
Do tworzenia zapytań za pomocą 1C istnieje bardzo wygodny wbudowany mechanizm - projektant zapytań. Zawiera następujące główne zakładki:
- „Tabele i pola” – zawiera pola do wybrania oraz ich źródła.
- „Połączenia” – opisuje warunki struktury POŁĄCZENIE.
- „Grupowanie” – zawiera opis struktur grupujących oraz zsumowanych na ich podstawie pól.
- „Warunki” – odpowiada za wybór danych w zapytaniu.
- „Zaawansowane” – dodatkowe parametry zapytania, takie jak słowa kluczowe dla komendy „WYBIERZ” itp.
- „Złączenia/Aliasy” - wskazane są możliwości łączenia tabel i określone aliasy (konstrukcja „JAK”).
- „Zamówienie” odpowiada za sortowanie wyników zapytań.
- „Sumy” – podobne do zakładki „Grupowanie”, ale używane w konstrukcji „SUMY”.
Treść samego żądania można wyświetlić, klikając przycisk „Zapytanie” w lewym dolnym rogu. W tej formie można go poprawić ręcznie lub skopiować.
Poproś o konsolę
Aby szybko wyświetlić wynik zapytania w trybie korporacyjnym lub debugować złożone zapytania, użyj . Zawiera tekst żądania, ustawia parametry i wyświetla wynik.
Konsolę zapytań możesz pobrać na dysku ITS lub poprzez plik .
Wiersze w 1C 8.3 we wbudowanym języku 1C reprezentują wartości typu pierwotnego Linia. Wartości tego typu zawierają ciąg Unicode o dowolnej długości. Zmienne typu string to zbiór znaków ujętych w cudzysłów.
Przykład 1. Stwórzmy zmienną typu string zawierającą tekst.
StringVariable = "Witaj, świecie!";
Funkcje do pracy z ciągami znaków w 1s 8.3
W tej sekcji zostaną przedstawione główne funkcje, które pozwalają zmieniać linie w 1c lub analizować zawarte w nich informacje.
Długość str
Długość siły(<Строка>) . Zwraca liczbę znaków zawartych w ciągu znaków przekazanym jako parametr.
Przykład 2. Policzmy liczbę znaków w wierszu „Witaj, świecie!”
String = "Witaj, świecie!"; LiczbaZnaków = StrLength(String); Raport (liczba znaków);
Efektem wykonania tego kodu będzie wyświetlenie liczby znaków w wierszu: 11.
SkrótL
SkrótL(<Строка>)
. Przycina nieistotne znaki na lewo od pierwszego znaczącego znaku w ciągu.
Drobne znaki:
- przestrzeń;
- spacja nierozdzielająca;
- tabulacja;
- powrót karetki;
- tłumaczenie liniowe;
- tłumaczenie formularza (strony).
Przykład 3. Usuń wszystkie spacje z lewej strony wiersza „świat!” i dodaj do niego wiersz „Hello”.
String = skrót("świat!"); Ciąg = „Witam” + Ciąg; Raport (ciąg);
Efektem wykonania tego kodu będzie wyświetlenie na ekranie wiersza „Hello world!”.
W skrócie
Skrót(<Строка>) . Przycina nieistotne znaki na prawo od pierwszego znaczącego znaku w ciągu.
Przykład 4. Formularz z wierszy „Witam” i „pokój!” fraza „Witaj, świecie!”
Linia = skrót("Witam ")+" "+ skrót("świat!"); Raport (ciąg);
SkrótLP
skróconyLP(<Строка>)
. Przycina nieistotne znaki na prawo od pierwszego znaczącego znaku w ciągu, a także przycina nieistotne znaki na lewo od pierwszego znaczącego znaku w ciągu. Ta funkcja jest używana częściej niż dwie poprzednie, ponieważ jest bardziej uniwersalna.
Przykład 5. Usuń nieistotne znaki po lewej i prawej stronie nazwy kontrahenta.
Kontrahent = Katalogi Kontrahenci.Wyszukaj według szczegółów("TIN", "0777121211"); ObiektKonta = Konto.GetObject(); CounterpartyObject.Name = AbbrLP(CounterpartyObject.Name); ObiektKonta.Zapis();
Lew
Lew(<Строка>, <ЧислоСимволов>)
. Pobiera pierwsze znaki ciągu, liczba znaków jest określona w parametrze Liczba znaków.
Przykład 6. Wpuść strukturę Pracownik zawierać imię, nazwisko i nazwisko pracownika. Uzyskaj ciąg znaków z nazwiskiem i inicjałami.
NameInitial = Lev(Employee.Name, 1); Inicjał patronimiczny = Lew (pracownik. Patronimiczny, 1); FullName = Pracownik.Nazwisko + " " + Inicjał imienia + "." + Środkowy inicjał + „.”;
Prawidłowy
Prawidłowy(<Строка>, <ЧислоСимволов>) . Pobiera ostatnie znaki ciągu, liczbę znaków określoną w parametrze Liczba znaków. Jeśli podana liczba znaków przekracza długość ciągu, zwracany jest cały ciąg.
Przykład 7. Niech na końcu zmiennej łańcuchowej zostanie zapisana data w formacie „rrrrmmdd”, pobierz ciąg znaków z datą i przekonwertuj go na typ data.
String = "Bieżąca data: 20170910"; StringDate = Prawa(Ciąg, 8); Data = Data(StringDate);
Środa
Środa(<Строка>, <НачальныйНомер>, <ЧислоСимволов>) . Pobiera podciąg z ciągu przekazanego jako parametr Linia, zaczynając od znaku, którego numer jest określony w parametrze Numer początkowy i długość przekazana do parametru Liczba znaków. Numeracja znaków w linii zaczyna się od 1. Jeśli w parametrze Numer początkowy podano wartość mniejszą lub równą zero, wówczas parametr przyjmuje wartość 1. Jeżeli parametr Liczba znaków nie jest określony, wybierane są znaki do końca linii.
Przykład 8. Niech zmienna łańcuchowa zaczynająca się od dziewiątej pozycji zawiera kod regionu, należy go pobrać i zapisać w osobnej linii.
String = "Region: 99 Moskwa"; Region = Średnia (Ciąg, 9, 2);
Znajdź stronę
StrFind(<Строка>, <ПодстрокаПоиска>, <НаправлениеПоиска>, <НачальнаяПозиция>, <НомерВхождения>) . Wyszukuje określony podciąg w ciągu, zwracając numer pozycji pierwszego znaku znalezionego podciągu. Przyjrzyjmy się parametrom tej funkcji:
- Linia. Ciąg źródłowy;
- Wyszukaj podciąg. Wyszukaj podciąg;
- Kierunek wyszukiwania. Określa kierunek wyszukiwania podciągu w ciągu. Może przyjmować wartości:
- Kierunek wyszukiwania. Od początku;
- Szukaj. Kierunek końcowy;
- Pozycja początkowa. Określa pozycję w ciągu, od której rozpoczyna się wyszukiwanie;
- LiczbaWystąpień. Określa numer wystąpienia przeszukiwanego podciągu w ciągu źródłowym.
Przykład 9. W wierszu „Witaj, świecie!” Określ położenie ostatniego wystąpienia znaku „i”.
PositionNumber = StrFind("Witaj, świecie!", "i", SearchDirection.End); Raport (numer pozycji);
Efektem wykonania tego kodu będzie wyświetlenie numeru ostatniego wystąpienia symbolu „i”: 9.
VReg
VReg(<Строка>) . Konwertuje wszystkie znaki w określonym ciągu w formacie 1s8 na wielkie litery.
Przykład 10: Konwertuj ciąg „witaj świecie!” do wielkich liter.
StringVreg = VReg("Witaj, świecie!"); Raport(StringVreg);
Efektem wykonania tego kodu będzie wyświetlenie wiersza „HELLO WORLD!”
NReg
NReg(<Строка>) . Konwertuje wszystkie znaki określonego ciągu w postaci 1s 8 na małe litery.
Przykład 11: Konwertuj ciąg „HELLO WORLD!” na małe litery.
StringNreg = NReg("WITAJ ŚWIECIE!"); Raport(StringVreg);
Efektem wykonania tego kodu będzie wyświetlenie wiersza „hello world!”
Treg
TReg(<Строка>) . Konwertuje ciąg w następujący sposób: pierwszy znak każdego słowa jest konwertowany na wielkie litery, pozostałe znaki słowa są konwertowane na małe litery.
Przykład 12: Zacznij pisać wielkimi literami słowa w wierszu „witaj, świecie!”
StringTreg = TReg("Witaj, świecie!"); Raport (StringTreg);
Efektem wykonania tego kodu będzie wyświetlenie wiersza „Hello World!”
Symbol
Symbol(<КодСимвола>) . Pobiera znak według jego kodu Unicod.
Przykład 13. Dodaj lewą i prawą stronę do linii „Hello World!” symbol ★
StringWithStars = Symbol("9733")+"Witaj świecie!"+Symbol("9733"); Raport(StringWithStars);
Efektem wykonania tego kodu będzie wyświetlenie wiersza „★Hello World!★”
Kod symbolu
Kod symbolu (<Строка>, <НомерСимвола>) . Pobiera kod znaku Unicode z ciągu określonego w pierwszym parametrze, znajdującego się w pozycji określonej w drugim parametrze.
Przykład 14. Znajdź kod ostatniego znaku w wierszu „Hello World!”
String = "Witaj, świecie!"; CharacterCode = CharacterCode(String, StrLength(String)); Powiadom (kod znaku);
Efektem wykonania tego kodu będzie wyświetlenie kodu symbolicznego „!” - 33.
Pusta linia
Pusta linia (<Строка>) . Sprawdza, czy ciąg składa się tylko z nieistotnych znaków, czyli czy jest pusty.
Przykład 15. Sprawdź, czy ciąg składający się z trzech spacji jest pusty.
Pusty = PustyString(" "); Raport (pusty);
Efektem wykonania tego kodu będzie wyświetlenie słowa „Tak” (wyrażenie łańcuchowe o wartości logicznej PRAWDA).
StronaZastąp
StrReplace(<Строка>, <ПодстрокаПоиска>, <ПодстрокаЗамены>) . Znajduje wszystkie wystąpienia szukanego podciągu w ciągu źródłowym i zastępuje je podciągiem zastępczym.
Przykład 16. W wierszu „Hello World!” zastąp słowo „Pokój” słowem „Przyjaciele”.
String = StrReplace("Witaj świecie!", "Świecie", "Przyjaciele"); Raport (ciąg);
Efektem wykonania tego kodu będzie wyświetlenie wiersza „Hello Friends!”
Linie StrNumber
StrNumberRow(<Строка>) . Umożliwia zliczenie liczby linii w ciągu wielowierszowym. Aby przejść do nowej linii w 1s 8, użyj symbolu PS(znak nowej linii).
Przykład 17. Określ liczbę linii w tekście:
"Pierwsza linia
Druga linia
Trzecia linia”
Number = StrNumberString("Pierwsza linia"+Znaki.PS +"Druga linia"+Symbole.PS +"Trzecia linia"); Numer raportu);
Efektem wykonania tego kodu będzie wyświetlenie liczby linii tekstu: 3
StrGetString
StrGetString(<Строка>, <НомерСтроки>) . Pobiera wiersz w ciągu wielowierszowym według jego numeru. Numeracja linii zaczyna się od 1.
Przykład 18. Pobierz ostatnią linijkę tekstu:
"Pierwsza linia
Druga linia
Trzecia linia”
Tekst = „Pierwsza linia” + Symbole PS + „Druga linia” + Symbole PS + „Trzecia linia”; LastRow = StrGetRow(Tekst, StrNumberLines(Tekst)); Raport (ostatnia linia);
Efektem wykonania tego kodu będzie wyświetlenie wiersza „Trzecia linia”.
Numer stronyWystąpienia
StrNumberWystąpienia(<Строка>, <ПодстрокаПоиска>) . Zwraca liczbę wystąpień określonego podciągu w ciągu. W funkcji rozróżniana jest wielkość liter.
Przykład 19. Określ, ile razy litera „c” pojawia się w wierszu „Wiersze w 1s 8.3 i 8.2”, niezależnie od jej wielkości.
Linia = „Linie w 1s 8,3 i 8,2”; NumberOccurrences = StrNumberOccurrences(Vreg(String), "C"); Raport (NumberWystąpień);
Efektem wykonania tego kodu będzie wyświetlenie liczby wystąpień: 2.
Strona zaczyna się od
StrZaczyna się z(<Строка>, <СтрокаПоиска>) . Sprawdza, czy ciąg znaków przekazany w pierwszym parametrze zaczyna się od ciągu z drugiego parametru.
Przykład 20. Ustal, czy NIP wybranego kontrahenta zaczyna się od cyfry 1. Wprowadź zmienną Kontrahent Kontrahenci.
NIP = Kontrahent.TIN; StartsUNits = StrStartsWith(TIN, „1”); Jeśli zaczyna się od jednostek, to //Twój kod EndIf;
Strona się kończy
STREnds With (<Строка>, <СтрокаПоиска>) . Sprawdza, czy ciąg znaków przekazany w pierwszym parametrze kończy się ciągiem znaków w drugim parametrze.
Przykład 21. Ustal, czy NIP wybranego kontrahenta kończy się na cyfrę 2. Wprowadź zmienną Kontrahent przechowywane jest odwołanie do elementu katalogu Kontrahenci.
NIP = Kontrahent.TIN; EndsWithTwo = StrEndsWith(TIN, "2"); Jeśli EndsInTwo, to //Twój kod EndIf;
Podział strony
StrPodziel(<Строка>, <Разделитель>, <ВключатьПустые>) . Dzieli ciąg na części przy użyciu określonych znaków rozdzielających i zapisuje wynikowe ciągi w tablicy. Pierwszy parametr przechowuje ciąg źródłowy, drugi zawiera ciąg zawierający separator, trzeci wskazuje, czy do tablicy mają być zapisywane puste ciągi (domyślnie PRAWDA).
Przykład 22. Weźmy ciąg zawierający liczby oddzielone symbolem „;”, pobierz tablicę liczb z ciągu.
Ciąg = "1; 2; 3"; Array = StrDivide(String, ";"); Dla Count = 0 Według Array.Quantity() - 1 próba cyklu Array[Count] = Number(AbbrLP(Array[Count])); Tablica wyjątków[Sch] = 0; EndAttemptsEndCycle;
W wyniku wykonania otrzymana zostanie tablica z liczbami od 1 do 3.
PageConnect
StrConnect(<Строки>, <Разделитель>) . Konwertuje tablicę ciągów z pierwszego parametru na ciąg zawierający wszystkie elementy tablicy oddzielone ogranicznikiem określonym w drugim parametrze.
Przykład 23. Korzystając z tablicy liczb z poprzedniego przykładu, uzyskaj oryginalny ciąg.
Dla konta = 0 według Array.Quantity() - 1 cykl Array[Act] = String(Array[Act]); Koniec cyklu; Wiersz = StrConnect(tablica, "; ");