Tworzenie i praca z zapytaniami (dla początkujących). Tworzenie i praca z prośbami (dla początkujących) 1s 8.3, jeśli w prośbie

Programowanie 1C polega nie tylko na napisaniu programu. 1C to wlewek działań użytkownika i danych, z którymi pracuje.

Dane są przechowywane w bazie danych. Zapytania 1C to sposób na pobranie danych z bazy danych w celu wyświetlenia ich użytkownikowi w formularzu lub przetworzenia.

Podstawową częścią raportu jest prośba 1C. W przypadku raportu SKD jest to większość raportu.

Usiądź. Wziąć oddech. Spokojnie. Teraz powiem ci nowinę.

Aby programować w 1C, nie wystarczy znać język programowania 1C. Musisz także znać język zapytań 1C.

Język zapytań 1C to całkowicie odrębny język, który pozwala określić, jakie dane potrzebujemy uzyskać z bazy danych.

Jest również dwujęzyczny - to znaczy, że możesz pisać po rosyjsku lub po angielsku. Jest bardzo podobny do języka zapytań SQL i ci, którzy go znają, mogą się zrelaksować.

Jak wykorzystywane są żądania 1C

Kiedy użytkownik uruchamia 1C w trybie Enterprise, w uruchomionym kliencie nie ma ani grama danych. Dlatego, gdy trzeba otworzyć katalog, 1C żąda danych z bazy danych, to znaczy wysyła żądanie 1C.

Żądania 1C to:

  • Automatyczne żądania 1C
    generowane automatycznie przez system. Utworzyłeś formularz listy dokumentów. Dodano kolumnę. Oznacza to, że kiedy otworzysz ten formularz w trybie Enterprise, pojawi się zapytanie i zażądane zostaną dane dla tej kolumny.
  • Żądania półautomatyczne 1C
    Istnieje wiele metod (funkcji) w języku 1C, po uzyskaniu dostępu następuje zapytanie do bazy danych. Na przykład.GetObject()
  • Żądania ręczne 1C (napisane przez programistę specjalnie jako żądanie)
    Możesz samodzielnie napisać zapytanie 1C w kodzie i wykonać je.

Tworzenie i wykonywanie żądań 1C

Żądanie 1C to rzeczywisty tekst żądania w języku zapytań 1C.
Tekst można napisać odręcznie. To znaczy weź i napisz (jeśli znasz ten język).

Ponieważ 1C promuje koncepcję programowania wizualnego, w którym wiele lub prawie wszystko można zrobić bez pisania kodu za pomocą piór, istnieje specjalny obiekt Query Constructor, który pozwala narysować tekst zapytania bez znajomości języka zapytań. Jednak cuda się nie zdarzają - do tego trzeba wiedzieć, jak pracować z konstruktorem.

Po przygotowaniu tekstu żądania 1C należy go wykonać. W tym celu w kodzie 1C Request () znajduje się obiekt. Oto przykład:

Żądanie = Nowe żądanie();
Query.Text = "WYBIERZ
| Nomenklatura. Link
| OD
| Katalog Nomenklatura AS Nomenklatura
|GDZIE
| Nomenklatura.Usługa";
Selection = Query.Execute().Select();

Raport(Wybór. Link);
koniec cyklu;

Jak widać na przykładzie, po wykonaniu żądania 1C wynik przychodzi do nas i musimy go przetworzyć. Wynikiem jest jeden lub więcej wierszy tabeli (w specjalnej formie).

Wynik można wyładować do zwykłej tabeli:
Selection = Request.Execute().Upload(); //Wynik - tabela wartości

Lub po prostu idź linia po linii.
Selection = Query.Execute().Select();
Podczas pętli Selection.Next().
//Zrób coś z wynikami zapytania
koniec cyklu;

Praca z żądaniami 1C

Podstawowe zasady żądań 1C

Podstawowe zasady budowania żądania 1C -
WYBIERZ listę pól FROM TableName WHERE Warunki

Przykład konstrukcji takiego zapytania 1C:

WYBIERAĆ
//lista pól do wyboru
Połączyć,
Nazwa,
Kod
Z
//nazwa tabeli z której wybieramy dane
//list of table to lista obiektów w oknie konfiguratora
Katalog.Nomenklatura
GDZIE
//określ wybór
ProductType = &Service //wybór według wartości zewnętrznej
Lub Usługa // Atrybut „Usługa” typu Boolean, wybór według wartości True
SORTUJ WEDŁUG
//Sortowanie
Nazwa

Spis tabel 1C

Nazwy tabel możesz zobaczyć w oknie konfiguratora. Konieczne jest jedynie wpisanie „Katalog” zamiast „Katalog”, na przykład „Katalog. Nomenklatura” lub „Dokument. Sprzedaż towarów i usług” lub „Rejestr akumulacji. Sprzedaż”.

W przypadku rejestrów dostępne są dodatkowe tabele (wirtualne), które pozwalają uzyskać łączne dane.

Information Register.RegisterName.SliceLast(&Date) - Żądanie 1C z rejestru informacji, jeśli jest okresowe, w określonym dniu

Accumulation Register.RegisterName.Remains(&Date) - Żądanie 1C z rejestru sald na określoną datę

Rejestr akumulacyjny.RegisterName.Turnovers(&StartDate, &EndDate) – zapytanie 1C z rejestru obrotów za okres od daty początkowej do daty końcowej.

Dodatkowe zasady

Kiedy prosimy o listę niektórych danych, działają podstawowe zasady. Ale możemy również zażądać liczb, a żądanie może je dla nas obliczyć (na przykład dodać).

WYBIERAĆ
//Quantity(FieldName) – zlicza ilość
//Field AS OtherName - zmienia nazwę pola
Ilość (referencja) AS Ilość Przeprowadzone dokumenty
Z

GDZIE
Trzymany

To zapytanie 1C zwróci nam całkowitą liczbę dokumentów. Jednak każdy dokument ma pole Organizacja. Załóżmy, że chcemy obliczyć liczbę dokumentów dla każdej organizacji za pomocą zapytania 1C.

WYBIERAĆ
//tylko pole dokumentu
Organizacja,
// policz liczbę
Ilość (referencja) AS Ilość Według organizacji
Z
Dokument.Sprzedaż Towarów/Usług
GDZIE
Trzymany
GRUPUJ WEDŁUG

Organizacja

To zapytanie 1C zwróci nam liczbę dokumentów dla każdej organizacji (mówią też „w kontekście organizacji”).

Obliczmy dodatkowo ilość tych dokumentów za pomocą żądania 1C:

WYBIERAĆ
//tylko pole dokumentu
Organizacja,
// policz liczbę

//oblicz kwotę

Z
Dokument.Sprzedaż Towarów/Usług
GDZIE
Trzymany
GRUPUJ WEDŁUG
//powinno być używane, jeśli lista pól ma funkcję count() i jedno lub więcej pól jednocześnie - wtedy należy pogrupować według tych pól
Organizacja

Ta prośba 1C zwróci nam również liczbę dokumentów.

WYBIERAĆ
//tylko pole dokumentu
Organizacja,
// policz liczbę
Ilość (referencja) AS Ilość według organizacji,
//oblicz kwotę
Kwota(KwotaDokumentu) AS Kwota
Z
Dokument.Sprzedaż Towarów/Usług
GDZIE
Trzymany
GRUPUJ WEDŁUG
//powinno być używane, jeśli lista pól ma funkcję count() i jedno lub więcej pól jednocześnie - wtedy należy pogrupować według tych pól
Organizacja
WYNIKI Ogólne

Język zapytań 1C jest obszerny i złożony i nie rozważymy wszystkich jego funkcji podczas jednej lekcji - przeczytaj nasze następne lekcje.

Krótko o dodatkowych funkcjach języka zapytań 1C:

  • Łączenie danych z wielu tabel
  • Podzapytania
  • żądanie partii
  • Twórz własne wirtualne stoły
  • Zapytanie z tabeli wartości
  • Używanie wbudowanych funkcji do pobierania wartości i manipulowania wartościami.

Konstruktor zapytań 1C

Aby nie pisać tekstu zapytania własnymi rękami, istnieje konstruktor zapytań 1C. Wystarczy kliknąć prawym przyciskiem myszy w dowolnym miejscu modułu i wybrać Query Builder 1C.

Wybierz żądaną tabelę w projektancie zapytań 1C po lewej stronie i przeciągnij ją w prawo.

Wybierz wymagane pola w projektancie zapytań 1C z tabeli i przeciągnij w prawo. Jeśli chcesz nie tylko wybrać pole, ale zastosować do niego jakąś funkcję sumowania, po przeciągnięciu kliknij dwukrotnie pole myszą. Następnie na karcie Grupowanie należy wybrać (przeciągnij i upuść) wymagane pola do grupowania.

Na karcie Warunki w 1C Query Builder możesz wybrać żądane filtry w ten sam sposób (przeciągając pola, według których dokonasz wyboru). Upewnij się, że wybrałeś właściwy warunek.

Na zakładce Kolejność wskazane jest sortowanie. Na zakładce Sumy — sumowanie sum.

Korzystając z narzędzia do tworzenia zapytań 1C, możesz przestudiować dowolne istniejące zapytanie. Aby to zrobić, kliknij prawym przyciskiem myszy tekst istniejącego zapytania, a także wybierz projektanta zapytań 1C - a zapytanie zostanie otwarte w projektancie zapytań 1C.

Język zapytań 1C 8 jest niezbędnym narzędziem dla programisty 1C, pozwala pisać bardziej zwięzły, prosty, zrozumiały kod, zużywa mniej zasobów systemowych podczas pracy z danymi. Ten artykuł otwiera serię lekcji na temat języka zapytań 1C 8. W pierwszej lekcji rozważymy strukturę głównego operatora tego języka - WYBIERAĆ. Za pomocą tego operatora można tworzyć selekcje z tabel bazy danych. Wybrane dane tabeli można sortować, nakładać na nie warunki, łączyć i łączyć z danymi z innych tabel, grupować według różnych pól i wiele więcej.

Język zapytań 1s przedsiębiorstwo 8 - struktura operatora SELECT

Rozważmy strukturę operatora SELECT (opcjonalne części operatora zaznaczono w nawiasach kwadratowych). Język zapytań 1C zapewnia szeroką gamę narzędzi do tworzenia próbek danych.

SELECT [DOZWOLONE] [RÓŻNE] [PIERWSZY A] [Pole1] [AS Alias1], [Pole2] [AS Alias2], ... [PoleM] [AS AliasB] [PUT TempTableName] [FROM Table1 AS TableAliasTable1 [[INTERJOIN ] [LEFT JOIN][FULL JOIN] Table2 AS Table2 Alias ​​​​[[INNER JOIN][LEFT JOIN][FULL JOIN] TableC AS TableC Alias ​​​​TO Expression1 [AND Expression2]...[AND ExpressionD]] ... ... TO Wyrażenie1 [AND Wyrażenie2]...[I WyrażenieE]] ... [TabelaF AS TabelaF Alias] ... ] [GROUP BY GroupingField1[,] ... [GroupingFieldG]] [GDZIE Wyrażenie1 [AND Expression2 ] ... [ORAZ WyrażenieH]] [POŁĄCZ WSZYSTKO...] [; ...] [INDEKS BY Alias1 ... AliasB] [SUMY [AggregateFunction(Pole1)][,] [AggregateFunction(Field2)][,] ... [AggregateFunction(FieldI)] BY [OGÓLNE][,] [ GroupingField1][,] ... [GroupingFieldj]]

Słowa kluczowe i bloki do pracy z polami

  • WYBIERAĆ- słowo kluczowe oznaczające początek operatora;
  • DOZWOLONY wskazuje, że wybór powinien obejmować rekordy tabel, do których dany użytkownik ma dostęp do odczytu;
  • RÓŻNY wskazuje, że do wyboru powinny należeć tylko różne (dla wszystkich pól) ujścia. Innymi słowy, powielone wiersze zostaną wykluczone z wyboru;
  • NAJPIERW jeśli określisz to słowo kluczowe, to tylko pierwsze A z wierszy wybranych przez zapytanie zostanie uwzględnione w zaznaczeniu, gdzie A jest liczbą naturalną;
  • Blok terenowy- w tym bloku wskazane są pola, które muszą zostać uwzględnione w selekcji. Pola te staną się kolumnami wyboru. W najprostszym przypadku pole wygląda tak: TableAlias.TableFieldName AS FieldAlias

    Tym samym wskazujemy, z której tabeli bierzemy to pole. Język zapytań 1C pozwala określić dowolne aliasy, ale nie należy ich powtarzać w jednej instrukcji SELECT. Pole może być bardziej złożone, może składać się z różnych kombinacji pól tabeli, funkcji języka zapytań i funkcji agregujących, ale w tej lekcji nie będziemy dotykać tych przypadków;

Słowa kluczowe i bloki do pracy z tabelami

  • PUT NazwaTabeli Tymczasowej- słowo kluczowe UMIEŚCIĆ jest przeznaczony do tworzenia tabeli tymczasowej o określonej nazwie, która będzie przechowywana w pamięci RAM w tej sesji 1C 8, aż do jej zakończenia lub do zniszczenia tabeli tymczasowej. Należy zauważyć, że nazwy tabel tymczasowych w jednej sesji 1C 8 nie powinny się powtarzać;
  • Blok tabel i linków- blok zawiera wszystkie tabele użyte w tym zapytaniu, a także powiązania między nimi. Blok zaczyna się od słowa kluczowego Z, po którym następuje nazwa i alias pierwszej tabeli. Jeśli ta tabela jest powiązana z innymi tabelami, wskazane są łącza. Język zapytań 1C zawiera następujący zestaw typów relacji:
    • POŁĄCZENIE WEWNĘTRZNE- rekord z lewej tabeli zostanie włączony do selekcji tylko wtedy, gdy spełniony jest warunek połączenia, rekord z prawej tabeli zostanie włączony do selekcji tylko wtedy, gdy spełniony będzie warunek połączenia;
    • LEWY DOŁĄCZ- rekord z lewej tabeli znajdzie się w selekcji tak czy inaczej, rekord z prawej tabeli znajdzie się w selekcji tylko wtedy, gdy spełniony będzie warunek powiązania;
    • PEŁNE POŁĄCZENIE- rekord z lewej tabeli zostanie włączony do selekcji jako pierwszy w każdym przypadku, potem tylko jeśli warunek połączenia zostanie spełniony, rekord z prawej tabeli zostanie uwzględniony w selekcji jako pierwszy w każdym przypadku, a następnie tylko jeśli warunek połączenia jest spełniony. Jednocześnie z selekcji wykluczone są zduplikowane wiersze wynikające z relacji.

    Po typie łącza następuje nazwa i alias drugiej tabeli. Następnie pojawia się słowo kluczowe PRZEZ, po których następują warunki połączenia, połączone operatorami logicznymi I, LUB. Każde wyrażenie w warunku musi zwracać wartość logiczną (prawda, fałsz). Jeśli pierwsza tabela jest połączona z innymi tabelami niż druga, to ponownie wskazywany jest typ połączenia i tak dalej. Każda z tabel biorących udział w relacji może być z kolei powiązana z innymi tabelami, co pokazano na diagramie struktury zapytania. Jeśli tabela nie jest powiązana z pierwszą, to jest określona bez typu łączenia, potem mogą następować jej łącza i tak dalej;

Słowa kluczowe i bloki transformacji danych

  • Blok grupowania— ten blok służy do grupowania wierszy tabeli. Wiersze są łączone w jeden, jeśli wartości pól określonych po słowie kluczowym GRUPUJ WEDŁUG okazać się tym samym. W takim przypadku wszystkie inne pola są sumowane, uśredniane, maksymalizowane lub minimalizowane przy użyciu funkcji agregujących. Funkcje agregujące są używane w bloku pól. Przykład: Max(TableAlias.TableFieldName) AS FieldAlias
  • Blok warunków- w tym bloku po słowie kluczowym GDZIE wskazane są wyrażenia warunkowe oddzielone operatorami logicznymi I, LUB, aby którykolwiek z wybranych wierszy znalazł się w selekcji, konieczne jest, aby wszystkie warunki w agregacie miały wartość PRAWDA.
  • ZJEDNOCZCIE WSZYSTKICH- to słowo kluczowe służy do łączenia zapytań (operatorów WYBIERAĆ). Język zapytań 1C umożliwia łączenie wielu zapytań w jedno. Aby zgłoszenia mogły zostać połączone, muszą mieć ten sam zestaw pól;
  • «;» - średnik służy do oddzielania niezależnych od siebie instrukcji WYBIERAĆ;
  • INDEKS PRZEZ— słowo kluczowe służy do indeksowania pól określonych po nim;
  • Całkowity blok- używany do budowania drzewiastych selekcji. Dla każdego z pól grupowania określonych po słowie kluczowym PRZEZ, w zaznaczeniu zostanie utworzony osobny wiersz. W tym wierszu, za pomocą funkcji agregujących, zostaną obliczone sumy wartości pól określonych po słowie kluczowym WYNIKI.

Czy chcesz kontynuować naukę języka zapytań 1s 8? Następnie przeczytaj poniższy artykuł.

Wniosek . Tekst = "WYBIERAĆ | usStorageUnits.Reference | OD | Reference.usStorageUnits AS usStorageUnits // Przykład 1. porównanie z pustą wartością logiczną: |GDZIE | setStorageUnit.Allow SelectionFromStandbyZone = Fałsz // Przykład 2. ale jeśli ta wartość logiczna jest zdefiniowana, to jest lepsza: // warunek dla ujemnej wartości logicznej: |GDZIE | NIE z jednostkami pamięci masowej. Zezwól na wycofanie ze strefy czuwania // Przykład 3. selekcja według warunku pustego pola typu "concrete type reference" |GDZIE | setStorageUnit.ActiveFilterRegion = WARTOŚĆ(Catalog.FilterRegion us.NullReference) // Przykład 3a. wybór warunku pustego pola typu "dokument określonego typu" |GDZIE | OurInformationRegister.Document = WARTOŚĆ(Document.OurDocument.EmptyReference) // Przykład 3b. wybór warunku pustego pola typu „dokumenty różnych typów” ( pole złożone) |GDZIE | (OurInformationRegister.Document = VALUE(Document.OurDocument1.EmptyReference) | OR OurInformationRegister.Document = VALUE(Document.OurDocument2.EmptyReference) | OR... (itp. — po kolei wypisz warunki dla wszystkich możliwych typów tego pola złożonego) ) // Przykład 4. lub odwrotnie, jeśli musisz wybrać wypełnioną wartość typu „string”, wówczas warunek pomoże: |GDZIE| usStorageUnits.Name > """" // Przykład 5. jeśli chcesz wybrać dokumenty określonego typu o złożonym typie danych, na przykład w rejestrze „Wykonane zadania”, zasób „Zadanie” ma typ złożony, wśród których wartości dokument „Selekcja” jest możliwy |GDZIE | EXPRESS(InformationRegisterPracy do wykonania.Job AS Document.Filter) REF Document.Filter // Przykład 5a. Kolejny podobny przykład, gdy trzeba wybrać dokumenty określonego typu | WYBÓR | KIEDY WYSYŁAĆ(agDocument Compliance.DocumentBU AS Document.Przychodzące towary/usługi) REFERENCE Document.Przychodzące towary/usługi | WTEDY „„Odbiór towarów lub usług”” | KIEDY WYRAŻAĆ(ar Korespondencja dokumentów.DocumentBU AS Dokument.Sprzedaż towarów lub usług) REFERENCE Dokument.Sprzedaż towarów lub usług | WTEDY „Realizacja towarów i usług” | INACZEJ """" | KONIEC JAK DOKUMENT // Przykład 6. selekcja według warunku o niezdefiniowanej wartości: |GDZIE | SavedSettings.User = niezdefiniowany // Przykład 7. wybór według rodzaju ruchu „Przychodzące” rejestru akumulacji, „Wydatki” - analogicznie): |GDZIE | RegGoodsRetail.MovementType = VALUE(MovementAccumulationType.Income) // Przykład 8. Jak wskazać w zapytaniu, że wykonanie zapytania nie jest konieczne (np. musisz programowo zwrócić pusty wynik zapytania w zależności od warunku - Query.Text = StrReplace(Query.Text, "WHERE Doc.Link = &DocumentLink" , "GDZIE KŁAMAĆ");). Aby to zrobić, po prostu dodaj warunek „Gdzie jest fałsz”. Nawiasem mówiąc, niezależnie od ilości żądanych danych w próbce, takie żądanie zostanie wykonane natychmiast. |GDZIE KŁAMAĆ // Przykład 9. Sprawdzanie, czy wynik zapytania zawiera dane: Jeśli nieWniosek.Uruchomić().Pusty() Następnie // Przykład 10. wybór pod warunkiem pustej daty: |GDZIE | tbRows.CancellationDate = DATAGODZINA(1, 1, 1)

W tym artykule chcemy omówić z wami wszystkimi funkcje języka zapytań 1s, I konstrukcje języka zapytań. Jaka jest różnica między funkcją a strukturą? Funkcja jest wywoływana z nawiasami i możliwymi w nich parametrami, a konstrukcja jest zapisywana bez nawiasów. Niewątpliwie wszystkie konstrukcje i funkcje języka zapytań 1s uczynić proces pozyskiwania danych elastycznym i wielofunkcyjnym. Te funkcje i konstrukcje mają zastosowanie do pól zapytań, a niektóre także do warunków.

Funkcje języka zapytań 1s

Od jasnego opisu funkcje języka zapytań 1s jest znacznie mniej powszechny niż opis struktur, postanowiliśmy przyjrzeć się funkcjom. Teraz przeanalizujmy każdy z nich z osobna, opisując jego przeznaczenie, składnię i przykład użycia, więc:

1. Funkcjonować DATA GODZINA- ta funkcja tworzy stałe pole typu "Data".

Składnia: DATA GODZINA (<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Przykład użycia:

2. Funkcja RÓŻNICA DATY- zwraca różnicę dwóch dat w jednym z wymiarów (rok, miesiąc, dzień, godzina, minuta, sekunda). Pomiar jest przekazywany jako parametr.

Składnia: RÓŻNICA DATY(<Дата1>, <Дата2>, <Тип>)

Przykład użycia:

Query.Text = "WYBIERZ | RÓŻNICA DATY (DATACZAS(2015, 4, 17), DATACZAS(2015, 2, 1), DZIEŃ) | JAKO liczba dni";

3. Funkcja WARTOŚĆ- ustawia stałe pole z predefiniowanym wpisem z bazy danych, można również uzyskać referencję null dowolnego typu.

Składnia: WARTOŚĆ(<Имя>)

Przykład użycia:

Query.Text = "SELECT //predefiniowany element | VALUE(Currency.Dollar.Catalog.Dollar) AS Dolar, //puste odniesienie | VALUE(Document.IncomingGoodsServices.EmptyReference) AS Paragon, //wartość przelewu | VALUE(Transfer.LegalIndividual . Indywidualne) AS Indywidualne, //predefiniowane konto | WARTOŚĆ(Plan kont.Samonośne.Materiały) AS Konto_10" ;

4. WYBIERZ funkcję- mamy odpowiednik konstrukcji IF, który jest używany w kodzie, tylko ten jest używany w zapytaniach 1C.

Składnia: WYBÓR KIEDY<Выражение>NASTĘPNIE<Выражение>W PRZECIWNYM RAZIE<Выражение>KONIEC

Przykład użycia:

Request.Text = //jeśli kwota jest większa niż 7500, to powinien być rabat w wysokości 300 rubli, //dlatego, jeśli warunek zostanie spełniony, funkcja //zwróci Kwota - 300 //w przeciwnym razie żądanie po prostu zwróci wartość „WYBIERZ | WYBIERZ | WHEN PMIncome.Amount > 7500 | THEN PTReceipts.Amount - 300 | ELSE PTReceipts.Amount | END AS AmountDiscounted |FROM | Document.ReceiptofGoodsServices.Goods AS PTReceipts";

5. funkcja EKSPRESOWA- pozwala wyrazić stałe pole o określonym typie.

Składnia: EXPRESS(nazwa pola jako nazwa typu)

Przykład użycia:

Query.Text = "WYBIERZ RÓŻNE | Sales.Registrar.Number, | SELECT | KIEDY Sales.Registrar REF Document.Expense | THEN EXPRESS(Sales.Registrar AS Document.Expense) | ELSE SELECT | WHEN Sales.Registrar REF Document.Implementation | THEN EXPRESS(Sales.Registrar AS Document.Release) | KONIEC | ... | KONIEC AS Numer | OD | Rejestr akumulacyjny. Zakupy AS Zakupy";

Czy istnieje jeszcze wariant wykorzystania funkcji EKSPRESOWEJ w polach typu mieszanego, gdzie takie się spotykają? Najprostszym przykładem jest „Rejestrator” dla dowolnego rejestru. Dlaczego więc mielibyśmy kwalifikować typ w rejestratorze? Rozważmy sytuację, gdy wybieramy pole „Numer” z rejestratora, z jakiej tabeli zostanie wybrany numer? Prawidłowa odpowiedź wszystkich! Dlatego, aby nasze zapytanie zadziałało szybko, musimy określić jawny typ za pomocą funkcji EXPRESS

Przykład użycia:

Query.Text = "WYBIERZ | WYRAŻ (Nomenklatura. Komentarz AS Ciąg (300)) AS Komentarz, | WYRAŻ (Nomenklatura. Suma AS Liczba (15,2)) AS Suma | Z | Odniesienie. Nomenklatura AS Nomenklatura";

6. CZY.NULL, funkcja(alternatywna pisownia IS NULL) - jeśli pole jest typu NULL, to jest zastępowane drugim parametrem funkcji.

Składnia: JEST NULL(<Поле>, <ПодставляемоеЗначение>)

Przykład użycia:

Należy również zauważyć, że pożądane jest ZAWSZE zastępowanie typu NULL jakąś wartością, ponieważ porównanie z NULL zawsze daje FAŁSZ, nawet jeśli porównujesz NULL z NULL. Najczęściej wartości NULL powstają w wyniku łączenia tabel (wszystkie typy łączenia poza wewnętrznymi).

Query.Text = //Wybierz całą pozycję i salda na niej //jeśli w jakiejś pozycji nie ma salda to pojawi się pole //NULL które zostanie zastąpione wartością 0 "WYBIERZ | NrReferencji, | ISNULL(GoodsInWarehouseRemains.InStockRemaining, 0) HOW Remainder | FROM | Katalog Nomenklatura AS Nom | LEFT JOIN Rejestr akumulacji.

7. Funkcja REPREZENTACJA- pozwala uzyskać reprezentację pola żądania.

Składnia: WYDAJNOŚĆ(<НаименованиеПоля>)

Przykład użycia:

Query.Text = "WYBIERZ | REPREZENTACJA (Wolne Resztki. Nomenklatura) AS Nazewnictwo, | REPREZENTACJA ( Wolne Reszty. Magazyn) AS Magazyn, | Wolne Reszty. Dostępne Pozostałości | Z | Rejestr Akumulacyjny. Wolne Reszty. Reszty AS Wolne Reszty. Pozostałości";

Konstrukcje w języku zapytań 1s

Powyżej rozmawialiśmy z tobą funkcje języka zapytań 1s, teraz czas pomyśleć konstrukcje w języku zapytań 1s, są nie mniej ważne i przydatne, zacznijmy.

1. Budowa LINKA- jest logicznym operatorem sprawdzającym typ odniesienia. Najczęściej spotykane podczas testowania pola typu złożonego dla określonego typu. Składnia: POŁĄCZYĆ<Имя таблицы>

Przykład użycia:

Query.Text = //jeśli typ wartości rejestratora to document Receipt, //to zapytanie zwróci "Towary przychodzące", w przeciwnym razie "Sprzedaż towarów" "SELECT | SELECT | WHEN Remains.Registrar LINK Document.Incoming GoodsServices | NASTĘPNIE „„Przychodzące” | W przeciwnym razie „Wydatki” | KONIEC AS Rodzaj ruchu | Z | Rejestr akumulacji. Pozostałości towarów w magazynach AS Pozostałości „;

2. Budowa MIĘDZY- ten operator sprawdza, czy wartość mieści się w podanym zakresie.

Składnia: MIĘDZY<Выражение>I<Выражение>

Przykład użycia:

Query.Text = //pobierz całą nomenklaturę, której kod mieści się w zakresie od 1 do 100 "SELECT | Nomenclature.Reference |FROM | Catalog.Nomenclature AS Nomenclature |WHERE | Nomenclature.Code BETWEEN 1 AND 100" ;

3. Konstrukcja B i B HIERARCHII- sprawdź, czy wartość znajduje się na przekazanej liście (tablice, tabele wartości itp. można przekazać jako listę). Operator IN HIERARCHY umożliwia podgląd hierarchii (przykład wykorzystania PlanAccounts).

Składnia: W(<СписокЗначений>), W HIERARCHII(<СписокЗначений>)

Przykład użycia:

Query.Text = // wybierz wszystkie konta podrzędne konta „WYBIERZ | Samonośne. Połącz AS Konto | Z | Plan kont. Samonośne AS Samonośne | GDZIE | Samonośne. Odniesienie W WARTOŚCI HIERARCYJNEJ ( Wykaz kont. Samonośne. Towary)";

4. Budowa JAK- ta funkcja pozwala nam porównać napis ze wzorcem napisu.

Składnia: TAK JAK"<ТекстШаблона>"

Opcje szablonu linii:

% - sekwencja zawierająca dowolną liczbę dowolnych znaków.

Jeden dowolny znak.

[...] - dowolny pojedynczy znak lub ciąg znaków umieszczony w nawiasach kwadratowych. Wyliczenie może zawierać zakresy, takie jak a-z, oznaczające dowolny znak w zakresie, w tym końce zakresu.

[^...] - dowolny pojedynczy znak lub ciąg znaków ujęty w nawiasy kwadratowe, z wyjątkiem wymienionych po znaku negacji.

Przykład użycia:

Query.Text = //znajdź całą nomenklaturę zawierającą rdzeń TABUR i zaczynającą się // małą lub wielką literą t "SELECT | Nomenclature.Reference |FROM | Directory.Nomenclature AS Nomenclature |GDZIE | Nazwa towaru LIKE ""[Тт ]abur%""" ;

5. Projekt DOZWOLONY- to zestawienie pozwala na wybranie tylko tych rekordów z bazy danych, do których rozmówca ma prawo wglądu. Prawa te są konfigurowane na poziomie rekordu (RLS).

Składnia: ALLOWED jest napisane po słowie kluczowym SELECT

Przykład użycia:

Query.Text = "WYBIERZ DOZWOLONE | Kontrahenci. Odniesienie | Z | Katalog. Kontrahenci AS Kontrahenci";

6. RÓŻNE konstrukcje- pozwala wybrać rekordy, w których nie występują powtarzające się rekordy.

Składnia: DIFFERENT jest napisane po słowie kluczowym SELECT

Przykład użycia:

Request.Text = //wybiera rekordy, do których czytelnik ma uprawnienia "SELECT DIFFERENT | Counterparties.Name |FROM | Directory.Counterparties AS Counterparties" ;

Konstrukcji DIFFERENT można również używać z operatorem ALLOWED i innymi operatorami.

Przykład użycia:

Query.Text = //wybiera różne rekordy, do których czytelnik ma uprawnienia "WYBIERZ DOZWOLONE RÓŻNE | Kontrahenci.Nazwa |FROM |Katalog.Kontrahenci AS Kontrahenci";

7. PIERWSZA budowa- wybiera liczbę rekordów określoną w parametrze z wyniku zapytania.

Składnia: FIRST<число>

Przykład użycia:

Query.Text = //wybierz pierwsze 4 numery GTD z katalogu "WYBIERZ PIERWSZE 4 | GTD Numbers.Reference |FROM | Catalog.GTE Numbers AS GTD Numbers";

8. Projekt DO ZMIANY- pozwala zablokować tabelę, działa tylko w transakcjach (dotyczy tylko blokad automatycznych).

Składnia: NA ZMIANĘ<НаименованиеТаблицы>

Przykład użycia:

Query.Text = "WYBIERZ | FreeRemainsRemains. Nomenklatura, | FreeRemainsRemains. Warehouse, | FreeRemains.AvailableRemains |FROM | Rejestr akumulacyjny.FreeRemains.Remains AS FreeRemainsRemains |DO ZMIANY |

9. Struktura ZAMÓW WEDŁUG- sortuje dane według określonego pola. Jeśli pole jest linkiem, to podczas ustawiania flagi AUTOMATYCZNE ZAMÓWIENIE zostaną posortowane zgodnie z reprezentacją łącza, jeśli flaga jest wyłączona, wówczas łącza zostaną posortowane według starszeństwa adresu łącza w pamięci.

Składnia: SORTUJ WEDŁUG<НаименованиеПоля>AUTOMATYCZNE ZAMÓWIENIE

Przykład użycia:

Query.Text = "WYBIERZ | FreeRemains.Nomenclature AS Nomenklatura, | FreeRemains.Warehouse AS Magazyn, | FreeRemains.In StockRemaining |FROM | Rejestr akumulacyjny.FreeRemains.Remains AS FreeRemainsRemains | | ZAMÓW WEDŁUG | Nomenklatura |AUTOORD CLEANSING";

10. Projektuj GRUPUJ WEDŁUG- służy do grupowania ciągów zapytań według określonych pól. Pola liczbowe muszą być używane z każdą funkcją agregującą.

Składnia: GRUPUJ WEDŁUG<НаименованиеПоля1>, .... , <НаименованиеПоляN>

Przykład użycia:

Query.Text = "WYBIERZ | ItemsInWarehouse.Nomenclature AS Nazewnictwo, | ItemsInWarehouse.Warehouse, | SUM(ItemsInWarehouse.InStock) AS InStock |FROM |

11. Projektowanie MIEĆ- umożliwia zastosowanie funkcji agregującej do warunku selekcji danych, podobnie jak konstrukcja WHERE.

Składnia: MAJĄCY<агрегатная функция с условием>

Przykład użycia:

Query.Text = //wybiera zgrupowane rekordy, w których pole InStock jest większe niż 3 "SELECT | GoodsInStock.Nomenclature AS Nomenclature, | GoodsInWarehouse.Warehouse, | SUM(ItemsInWarehouse.InStock) AS InStock |FROM | Accumulation Register.GoodsInWarehouses AS GoodsInWarehouses | |GROUP WG |Towary w magazynach.Nazewnictwo, |Towary w magazynach.Magazyn ||POSIADAJĄCE |ILOŚĆ(towaryw magazynach.Na stanie) > 3" ;

12. Konstrukcja INDEKS WEDŁUG- służy do indeksowania pola zapytania. Zapytanie indeksowane trwa dłużej, ale przyspiesza wyszukiwanie w polach indeksowanych. Może być używany tylko w wirtualnych tabelach.

Składnia: INDEKS PRZEZ<Поле1, ... , ПолеN>

Przykład użycia:

Query.Text = "WYBIERZ | Nazwa Tz.OS, | Numer folderu Tz, | Tz.CodeOS, | Tz.Term, | Tz.Type |PUT DataTz |FROM | &Tz JAK Tz ||INDEX BY | Nazwa Tz.OS , | Tz .CodeOS";

13. Budowa GDZIE- pozwala nałożyć warunek na dowolne pola zaznaczenia. W wyniku zostaną uwzględnione tylko rekordy spełniające warunek.

Składnia: GDZIE<Условие1 ОператорЛогСоединения УсловиеN>

Przykład użycia:

Query.Text = //wybierz wszystkie rekordy z CompensationRemainder<>0 i // AmountFor Calc.CompBalance > 100 "SELECT | Salda RPO kompensacji. Kontrahent, | Salda RPO kompensacji. Dziecko, | Salda RPO kompensacji. Saldo kompensacji, | Salda RPO kompensacji. AmountFor Calc.Comp Saldo | MIEJSCE DaneTz | Z | Rejestr akumulacji Salda kompensacyjne RP Salda AS Salda kompensacyjne R GDZIE | Salda RPO kompensacyjne Salda kompensacyjne<>0 | I salda kompensacji RPO Kwota dla CalcComp Residual > 100" ;

14. WYNIKI WZORNICTWA... OGÓLNIE- używany do obliczania sum, projekt określa pola, według których będą obliczane sumy, oraz funkcje agregujące zastosowane do pól sum. W przypadku używania sum dla każdego pola następującego po konstrukcji TOTALS dane są grupowane. Istnieje opcjonalna konstrukcja OGÓLNE, której użycie zapewnia również dodatkowe grupowanie. Poniżej możesz zobaczyć przykład wyniku zapytania.

Składnia: WYNIKI<АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>PRZEZ<ОБЩИЕ> <Поле1, ... , ПолеN>

Przykład użycia:

Query.Text = "WYBIERZ | Rozliczenia.Umowa z kontrahentem.Typ umowy AS Typ umowy, | Rozliczenia.Umowa z kontrahentem AS Umowa, | Rozliczenia.Kontrahent, | Rozliczenia.Kwota wzajemnych rozliczeńSaldo AS Saldo |OD | | Oprogramowanie | OGÓLNE, | Rodzaj umowy";

Na rysunku zakreślono grupy, które powstały podczas wykonywania zlecenia, górne odnosi się do sekcji OGÓLNE, a drugie do pola ContractContractorTypeContract.

W tym artykule przeanalizujemy taki temat, jak zagnieżdżone tabele w języku zapytań 1C.

W polach wyboru zapytania można użyć zagnieżdżonej tabeli źródłowej zapytania. Np. dokument „Wykonywanie usług” zawiera część tabelaryczną Usług, więc ta część tabelaryczna może być również wyświetlana w polu wyboru. Teraz zobaczysz, jak można to zrobić.

W mojej szkoleniowej bazie danych uruchomię Konsolę zapytań, otworzę Konstruktora zapytań i wybiorę tabelę Dostarczanie usług.

Rozwińmy tę tabelę

I w nim widzimy tabelaryczną część „Usług”.

Wybierzmy całą tę część tabelaryczną.

Jak widać, cała tabelaryczna część serwisu jest całkowicie wyeksponowana w polach.

Zwracam uwagę na fakt, że część tabelaryczna tak naprawdę idzie jako osobne pole o nazwie „Usługi” i którego typem będzie „RequestResult”. Nauczmy się używać zagnieżdżonej tabeli w zapytaniu.

Zostawmy trzy pola zagnieżdżonej tabeli i dodajmy kilka pól z nagłówka dokumentu.

Wciskamy przycisk OK w konstruktorze i zobaczymy jak będzie wyglądać nasze zapytanie.

Jak widać, w zapytaniu po polu „Usługi” znajduje się kropka, a następnie wybrane pola w nawiasach.

Wykonajmy żądanie.

Na rysunku widzimy, że wszystkie wybrane pola części tabelarycznej dokumentu są wymienione oddzielone przecinkami w polu „Usługi”. Nie wszystkie konsole zapytań mają taki wyświetlacz jak na powyższym rysunku, czasami napis „” może po prostu przejść.

Kolejny interesujący punkt, dla zagnieżdżonej tabeli, możesz umieścić gwiazdkę zamiast pól, wtedy wyjdą wszystkie pola części tabelarycznej. Nie można tego zrobić w konstruktorze, tylko ręcznie w żądaniu. Żądanie będzie miało następującą formę:

Zobaczmy, jak takie żądanie jest wykonywane.

Jedyną rzeczą jest to, że ta gwiazdka nie zostanie zapisana, jeśli otworzymy konstruktor zapytań.

Nauczyliśmy się, jak wykonać zapytanie z zagnieżdżoną tabelą w konsoli, teraz nauczymy się, jak użyć zagnieżdżonej tabeli w selekcji

W rzeczywistości dostęp do zagnieżdżonej tabeli podczas przetwarzania zapytania nie jest taki trudny. Po prostu odwołujesz się do wyboru według nazwy swojej tabeli i otrzymujesz zmienną typu „QueryResult”. A następnie przetwarzasz to jako normalny wynik zapytania: jeśli chcesz, uzyskaj wybór, jeśli chcesz, prześlij.

Poniżej znajduje się mały przykład kodu, który działa z zagnieżdżoną tabelą:


&Na serwerze
Procedura FillOnServer()
Żądanie = Nowe żądanie;
Wniosek. Tekst = "WYBIERAĆ
| WyprzedażProdukt.Link,
| SprzedażProdukt.Produkty.(
| Produkt,
| Ilość
| OD
| Dokument.Sprzedaż towarów jako sprzedaż towarów»
;
Próbka = Żądanie. Wykonać(). Wybierać();
Podczas wyboru. Dalej() Pętla
TopRowTree = Sprzedaj produkty. GetItems();
NewRow = TopTreeRow. Dodać();
Nowa linia. Łącze = wybór. Połączyć;
TableProducts = Wybór. Dobra;
SelectionProducts = TabProducts. Wybierać();
Podczas pobierania próbek towarów. Dalej() Pętla
ChildTreeRow = NewRow. GetItems();
ItemRow = ChildTreeRow. Dodać();
StringProducts. Link = wybór towarów. Produkt;
StringProducts. Ilość = wybór towarów. Ilość ;
koniec cyklu;
koniec cyklu;
Procedura końcowa

Pozwól mi wyjaśnić powyższy kod.

Po pierwsze mamy selekcję liniową i pomijamy tę selekcję w pętli, w której tworzymy górną linię drzewa wartości (znajduje się ona na formularzu) i wpisujemy w nią link do naszego dokumentu.

A potem najciekawsza rzecz, możesz nawet sam spojrzeć na to później w debugerze, przechodzimy do pola wyboru produktów i dla wygody zapisujemy to pole w osobnej zmiennej TabProducts. Ta zmienna jest typu QueryResult. I możesz bezpiecznie pobrać próbkę tego wyniku. Co robimy. Pozostaje ominąć ten wybór za pomocą funkcji next i pętli while.

W tym cyklu będziemy odnosić się do pól wyboru jak do pól zagnieżdżonej tabeli i zapisywać je do wierszy potomnych drzewa z formularza.

Oto wynik, który zwróci ten kod

Czy masz jakieś pytania?

Sam na nie odpowiesz, studiując mój kurs „Prośby w 1C dla początkujących”. Gdzie te i wiele innych zagadnień zostało omówionych bardziej szczegółowo. Wszystkie informacje podane są w prostej i przystępnej formie i są zrozumiałe nawet dla tych, którzy nie są szczególnie zaznajomieni z programowaniem w 1C.

Kod promocyjny na 20% zniżki: hrW0rl9Nnx

Wesprzyj mój projekt przelewając dowolną kwotę

Dołącz do moich grup.