DZWONEK

Są tacy, którzy czytają tę wiadomość przed wami.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu

Pozdrowienia dla wszystkich czytelników infostart. Ten artykuł będzie poświęcony problematyce tworzenia dowolnej tabeli wartości w postaci zarządzanej aplikacji programistycznie.

Cechy zadania.

Każdy, kto programował w zwykłej aplikacji, często staje przed zadaniem uzyskania dowolnej tabeli wartości na formularzu. Przez arbitralną tabelę wartości rozumie się tabelę, której liczba i rodzaj kolumn nie jest z góry znana. Oznacza to, że mogą być 3 kolumny, może 6, a może 8. W normalnej aplikacji wszystko jest proste: można umieścić element „Tablica wartości” w formularzu przetwarzania, a następnie programowo przenieść utworzoną tabelę wartości do tego elementu. Następnie proste polecenie:

Form Elements.TableField.CreateColumns ();

otrzymaj gotową tabelę wartości na formularzu. Wydawałoby się, że mogłoby być łatwiej.

To wszystko było w zwykłej aplikacji. Wszystko się zmieniło w zarządzanej aplikacji. Nie jest łatwo stworzyć dowolną tabelę. Teraz musisz albo sztywno sparametryzować tabelę wartości w formularzu, albo utworzyć ją programowo (opisz, cóż, to jest w rzeczywistości esencja samej zarządzanej aplikacji). Oto, co spróbujemy zrobić: programowo utwórz dowolną tabelę wartości w zarządzanym formularzu.

Rozwiązanie problemu.

Pierwszą rzeczą, którą musimy zrobić, jest określenie, jak tabela będzie wyglądać na formularzu. Najważniejsze jest to, że podczas przetwarzania nie trzeba tworzyć żadnego elementu formularza. Stworzymy go programowo, podobnie jak całą tabelę. Oznacza to, że tabela zostanie opisana i utworzona w momencie otwarcia formularza lub za pomocą przycisku - tak każdy potrzebuje.

Utworzenie tabeli na formularzu następuje poprzez opis tabeli wartości jako atrybutu:
ChoiceType Array \u003d Nowa tablica; Array ofChoiceType.Add (Type ("ValuesTable")); ChoiceTypeDescription \u003d NewTypeDescription (ArrayChoiceType); ArrayAttributes \u003d New Array; Array of Attributes.Add (New AttributeForm ("Tabela harmonogramu", DescriptionTypeChoice, "", "TZN")); Teraz musimy utworzyć programową tabelę wartości zawierającą dane. Jeśli tabela wartości pochodzi z zapytania, wszystko jest mniej więcej uporządkowane. Jeśli tabela jest tworzona ręcznie, to wartości kolumn, które będą zawierać liczby lub daty, można utworzyć za pomocą „Opisu typów”. Najważniejsze jest to, że kolumny w tabeli wartości muszą być jakiegoś typu. Jeśli np. Przyjmie się, że użytkownik będzie interaktywnie wypełniał dane w tych kolumnach, to nie można dodać kolumny tabeli wartości po prostu nazwą, musi mieć typ. Pamiętaj - to bardzo ważne. przeniesiemy te typy do tabeli na formularzu.
Tworzymy tabelę zawierającą kilka kolumn:
KD \u003d New Date Qualifiers (Date Parts.Time); ArrayKD \u003d New Array; ArrayCD.Add (Type ("Date")); TypeDescriptionTime \u003d Nowy TypeDescription (ArrayKD, KD); TK \u003d nowa tabela wartości;
TZ.Kolonki.Add ("S", DescriptionTypesTime);
TK.Kolonki.Add ("Przed", DescriptionTypesTime);
TK.Kolonki.Add ("pełna nazwa");
TK.Kolonki.Add ("Note"); // Pełna nazwa i uwaga - linie Następnie wypełnimy naszą tabelę programów TK niezbędnymi danymi. Otrzymujemy tabelę TK, która zawiera niezbędne wartości i jest gotowa do przeniesienia do utworzonego atrybutu formularza. Dla każdej kolumny z TK. Pętla kolumny

Array of Attributes.Add (New Form Attribute (Column.Name, Column.ValueType, "ScheduleTable"));
Koniec cyklu;
ModifyAttributes (ArrayAttributes);
ChoiceFieldsTable \u003d Elements.Add ("TZN", Type ("FormTable"));
ChoiceFieldsTable.PathKData \u003d "ScheduleTable";
ChoiceFieldsTable.Display \u003d DisplayTables.List;

Oto taka prosta kombinacja i nasz stół jest gotowy.

Dla każdej kolumny z TK. Pętla kolumny

NewElement \u003d Elements.Add (Column.Name, Type ("FormField"), ChoiceFieldsTable);
NewElement.View \u003d FormFieldKind.InputField;
NewItem.PathData \u003d "ScheduleTable". + Column.Name;
NewElement.Width \u003d 10;
Koniec cyklu;

Projekt warunkowy, jeśli tego potrzebujemy, piszemy również ręcznie, menu poleceń - ręcznie. Obsługa tabel jest również napisana odręcznie. Na przykład, aby dodać procedurę obsługi zdarzeń dla tabeli Select:

ChoiceFields Table.SetAction ("Choice", "TZNSelection");

Aby obsłużyć to zdarzenie, napisano oddzielną procedurę w postaci procedury:

& Na kliencie
Procedura TZNSelection (TK, SelectedString, Field, StandardProcessing)
// komendy obsługi EndProcedure

Należy zauważyć, że programy obsługi tabel uruchamiają się na kliencie i dlatego muszą mieć wskaźnik kompilatora poleceń

& Na kliencie

No i ostatnią rzeczą jaką chciałem dodać jest to, że po tych wszystkich akcjach nie zapominamy o przeniesieniu gotowej tabeli do atrybutu formularza:

ValueVRequisitForm (TK, "Tabela harmonogramu");

Oto wynik:


A oto przetwarzanie zdarzenia „Wybierz”:



Posłowie.

Mam nadzieję, że ten artykuł pomoże tym programistom 1C, którzy zaczynają programowo tworzyć tabele w formularzu.

Możesz pobrać przetwarzanie, które programowo tworzy tabelę wartości i danych wyjściowych do postaci, którą można zarządzać, z komentarzami ułatwiającymi tworzenie tabel.

Opublikowano 21 września 2011 r

Tabela wartości 1C - część 3. Metadane. Przechodzenie przez kolumny tabeli wartości

W tym artykule opowiem, jak pracować z tabelą wartości o „nieznanej” strukturze, jak iterować po kolumnach tabeli wartości, jak wyodrębniać dane z kolumn i wierszy bez używania nazw kolumn. (Ten artykuł odnosi się do cyklu artykułów 1C od zera; programowanie 1c od zera; tabela wartości 1c)

Aby wyjaśnić materiał i móc uruchomić nasze przykłady kodu „na żywo”, potrzebujemy ich tabela testowa wartości 1C... Niektóre z naszych przykładów wyodrębnią dane z tabeli wartości, więc utworzymy tabelę z trzema kolumnami „Nazwisko”, „Imię”, „Patronimic” i dodamy do niej niewielką ilość danych - aż 3 linie :)

Stwórzmy więc tabelę testową wartości 1C i wypełnijmy ją:

Mój TZ \u003d Nowa tabela wartości; // utwórz nową tabelę wartości przechowywanych w zmiennej "MyTZ" MyTZ.Columns.Add ("Nazwisko"); // utwórz kolumnę „Nazwisko” My TZ.Columns.Add („Name”); // utwórz kolumnę „Name” My TZ.Columns.Add („Patronymic”); // utwórz kolumnę „Patronymic” // dodaj pierwszy wiersz do naszej tabeli wartości NewString \u003d MyTZ.Add (); NewStroka.S Nazwisko \u003d "Czapajew"; NewStroka.Name \u003d "Wasilij"; NewStroka.Patronymic \u003d "Iwanowicz"; // dodaj drugą linię NewString \u003d MyTZ.Add (); NewStroka.Sename \u003d "Dzierżyński"; NewString.Name \u003d "Felix"; NewStroka. Patronymic \u003d "Edmundovich"; // dodaj trzecią linię NewString \u003d My TZ.Add (); NewStroka.Sename \u003d "Kotovsky"; NewStroka.Name \u003d "Gregory"; NewStroka.Patronymic \u003d "Iwanowicz";

Nasza tabela testowa składa się z trzech kolumn: Imię, Nazwisko, Patronimic; i ma trzy wypełnione wiersze z nazwiskami bohaterów wojny domowej.

Pierwszy przykład kodu wylicza kolumny tabeli wartości 1C jako zbiór.

// wyświetl nazwy wszystkich kolumn TK For Each Column From My TZ.Columns Cycle Report ("Nazwa kolumny:" + Column.Name); Koniec cyklu;

Nasza pętla wyświetli wszystkie nazwy kolumn w oknie komunikatu 1C:

Nazwa kolumny: Nazwisko Nazwa kolumny: Imię Nazwa kolumny: Drugie imię

Widzimy, że do iteracji po kolumnach używany jest specjalny cykl iteracji kolekcji, podobny do cyklu iteracji ciągów (w poprzednim artykule). Moje TZ.Columns to zbiór kolumn tabeli wartości 1C „MyTZ”... Kolekcja zawiera obiekty typu „ColumnTableValues” Każdy obiekt tego typu jest zarówno kolumną tabeli wartości, jak i zawiera właściwości i metody. Powołując się na te właściwości i metody, uzyskujemy niezbędne informacje o jednej kolumnie lub wykonujemy na niej inne czynności.

Na przykład odnosząc się do nieruchomości "Nazwa" (Nazwa kolumny) otrzymujemy nazwę bieżącej kolumny.

Chciałbym zwrócić uwagę na tytuł cyklu: „Dla każdego Kolumna From MyTZ.Columns Loop „Zmienna o nazwie "Kolumna" wymyślony przez nas. Nie jest konieczne używanie tej samej nazwy. Możesz na przykład nadać tej zmiennej dowolną nazwę „MyCurrentColumn” Wtedy powyższy przykład będzie wyglądał następująco:

// wyświetl nazwy wszystkich kolumn TK dla każdej MyCurrentColumn From MyTZ.Columns Loop Report ("Nazwa kolumny:" + MyCurrentColumn.Name); Koniec cyklu;

Kiedy podsystem wykonawczy 1C napotka pętlę tego rodzaju, przy każdym jej przejściu przypisuje do zmiennej o określonej nazwie jeden element z naszej kolekcji, w tym przypadku - jeden przedmiot z kolekcji kolumny tabeli wartości Moje TZ.Columns Następnie odwołujemy się do zmiennej, która zawiera bieżącą kolumnę i używamy tej właściwości "Nazwa".

Proponuję wyświetlić numer każdej kolumny w zbiorze kolumn obok nazwy kolumny:

// wyświetl liczbę i nazwy wszystkich kolumn tabeli wartości For Each Column From My TZ.Columns Cycle Numer kolumny \u003d Mój TZ.Columns.Index (Kolumna); // pobierz numer kolumny ColumnName \u003d Column.Name; // pobierz nazwę kolumny Report ("Numer kolumny:" + NumerKolumny + "Nazwa kolumny:" + NazwaKolumny); Koniec cyklu;

Tekst zostanie wyświetlony w oknie wiadomości 1C:

Numer kolumny: 0 Nazwa kolumny: Nazwisko Numer kolumny: 1 Nazwa kolumny: Imię Numer kolumny: 2 Nazwa kolumny: Drugie imię

Zwróć uwagę na fakt, że kolumny w tabeli wartości 1C są numerowane zaczynając od zera, podobnie jak wiersze tabeli wartości.

Liczba kolumn w tabeli wartości 1C

Aby znaleźć liczbę kolumn w tabeli wartości, używamy metody „Count ()” na zbiorze kolumn.

Number of Columns \u003d My TZ.Columns.Number (); Raport (liczba kolumn);

Na wyświetlaczu pojawi się cyfra „3”. Rzeczywiście, nasza tabela ma trzy kolumny: „Nazwisko”, „Imię”, „Patronimic”

Pobieranie obiektu kolumny na podstawie jego numeru (indeksu) i iterowanie po kolumnach przy użyciu indeksu kolumny

Przejdźmy przez wszystkie kolumny tabeli wartości, używając indeksów kolumn (liczb). Pamiętaj, że numeracja kolumn zaczyna się od zera. Dlatego musimy zwiększyć licznik cyklu „Mid” od zera do liczby równej liczbie kolumn minus jeden.

For MF \u003d 0 By My TZ.Kolonki.Number () - 1 Cycle CurrentColumn \u003d My TZ.Kolonki [Ms]; Raport (CurrentColumn.Name); Koniec cyklu;

Na ekranie otrzymujemy następujące informacje

Pełne imię i nazwisko

Myślę, że ten przykład był jasny. Zwróciliśmy się do metody Numer() kolekcje kolumn ” Mój TZ.Columns.Number ()", pobrał liczbę kolumn i rozpoczął cykl licznikiem od zadraśnięcie przed liczba kolumn minus jeden... Wewnątrz pętli pobieramy każdą kolumnę ze zbioru kolumn i przypisujemy bieżący obiekt kolumny do zmiennej CurrentColumn Ponadto zmienna CurrentColumn odnosimy się do nieruchomości Nazwa i wyświetl wartość tej właściwości na ekranie: Raport (CurrentColumn.Name);

Ważne jest, aby nigdy nie mylić właściwości obiektu i metody obiektu.

Właściwość jest pewnego rodzaju wartością statyczną, a dostęp do niej jest na przykład zapisywany bez nawiasów CurrentColumn.Name... Metoda jest zasadniczo procedurą lub funkcją obiektu, a wywołania procedur i funkcji są zawsze zapisywane w nawiasach (nawet jeśli nie ma parametrów wejściowych). Na przykład: Mój TZ.Columns.Number ()

Jeśli przejdziemy do metody, zapominając o wpisaniu nawiasów, interpreter 1C poda nam komunikat o błędzie i nie uruchomi kodu do wykonania. Ponieważ tłumacz uzna, że \u200b\u200bnie mówimy o metodzie, ale o właściwości - ponieważ nie ma nawiasów. I nie będzie mógł znaleźć właściwości o tej nazwie (ponieważ istnieje tylko metoda o takiej nazwie) - co zostanie powiedziane w komunikacie o błędzie.

To właśnie napisze interpreter, jeśli zapomnę wstawić nawiasy w wywołaniu metody w tak niewłaściwy sposób Moje TZ.Columns.Quantity (bez nawiasów po „Kwocie ()”):

Nie znaleziono pola obiektu (liczba)

W tym przypadku „pole” i „właściwość” należy rozumieć jako synonimy lub nieścisłości w terminologii programistów 1C. Używają obu tych słów na oznaczenie tego samego. Chociaż w innych językach programowania terminy te mogą oznaczać różne koncepcje.

Uzyskiwanie danych z tabeli wartości 1C za pomocą numerów kolumn

Na początek przedstawiam prosty przykład pobierania danych z pierwszego wiersza naszej tabeli. Zwróć uwagę, że używamy wstępnie wypełnionej tabeli od początku artykułu. Wiemy na pewno, że tabela ma pierwszy wiersz i jest co najmniej jedna kolumna. Jeśli zastosujemy ten przykład do pustej tabeli, wystąpi błąd. Więc:

FirstRow \u003d MyTZ; // pobierz pierwszą linię (numeracja od zera) FirstColumnValue \u003d FirstRow; // pobierz wartość pierwszej kolumny (numeracja kolumn jest również od zera) Report (FirstColumnValue); // wyświetl wartość pierwszej kolumny w pierwszym wierszu tabeli

Ekran wyświetli:

Chapaev

Najpierw otrzymaliśmy obiekt wiersza tabeli wartości, uzyskując dostęp do tabeli wartości za pomocą operatora [...]. (jeśli zapomniałeś jak to zrobić, możesz przejrzeć poprzednie artykuły) Wewnątrz operatora przekazaliśmy argument "0". To jest indeks pierwszego wiersza tabeli wartości. FirstRow \u003d MyTZ;

Ponadto mamy również prawo odwoływać się do obiektu typu string za pomocą operatora [...]. Wewnątrz tego operatora przekazaliśmy numer kolumny tabeli wartości, w tym przypadku również „0”. W ten sposób otrzymaliśmy wartość kolumny o numerze „0” dla bieżącego wiersza tabeli o numerze „0”. Wyświetliliśmy tę wartość i jest to ciąg „Chapaev”.

Skomplikujmy trochę nasz przykład:

FirstRow \u003d MyTZ; // pobierz pierwszą linię (numeracja od zera) Report (FirstLine); // wyświetl wartość pierwszej kolumny w pierwszym wierszu tabeli Report (FirstRow); // wyświetl wartość drugiej kolumny w pierwszym wierszu tabeli Report (FirstRow); // wyświetl wartość trzeciej kolumny w pierwszym wierszu tabeli

Teraz wydrukowaliśmy wartości ze wszystkich trzech kolumn pierwszego wiersza naszej tabeli wartości:

Czapajew Wasilij Iwanowicz

Teraz nadal modyfikuję ten przykład, abyśmy mogli obejść się bez zmiennej "Pierwsza linia"

Raport (MyTZ); // wyświetl wartość pierwszej kolumny w pierwszym wierszu tabeli Report (MyTZ); // wyświetl wartość drugiej kolumny w pierwszym wierszu tabeli Report (MyTZ); // wyświetl wartość trzeciej kolumny w pierwszym wierszu tabeli

Ekran będzie taki sam

Czapajew Wasilij Iwanowicz

W powyższym przykładzie widzieliśmy, że aby uzyskać dostęp do wartości znajdującej się w określonym wierszu i określonej kolumnie tabeli wartości, możemy użyć sekwencyjnego wywołania dwóch operatorów [...] w tej postaci: Tabela wartości [Indeks wierszy] [Indeks kolumn]

Oznacza to, że jesteśmy gotowi do stworzenia pętli iteracji i pobrania danych wszystkich wierszy i wszystkich kolumn za pomocą indeksów wierszy i kolumn:

For RowCounter \u003d 0 By My TZ.Number () - 1 Loop // iteracja w pętli po wierszach For ColumnCounter \u003d 0 By My TZ.Columns.Number () - 1 Loop // zagnieżdżona pętla przez kolumny // pobierz wartość komórki (z bieżącego wiersza i bieżącej kolumny) Wartość komórki \u003d MyTZ [LineCounter] [ColumnCounter]; // wyświetl numer wiersza, numer kolumny i wartość komórki. Report ("Line #" + LineCounter + "Column #" + ColumnCount + "\u003d" + CellValue); Koniec cyklu; Koniec cyklu;

Na ekranie zostaną wyświetlone następujące informacje:

Linia nr 0 kolumna nr 0 \u003d Czapajew Linia nr 0 kolumna nr 1 \u003d Wasilij Linia nr 0 kolumna nr 2 \u003d Iwanowicz Linia nr 1 kolumna nr 0 \u003d Dzierżyńskiego Linia nr 1 kolumna nr 1 \u003d Feliks Linia nr 1 kolumna nr 2 \u003d Edmundowicz Linia nr 2 kolumna # 0 \u003d Kotovsky Line # 2 kolumna # 1 \u003d Grigory Line # 2 kolumna # 2 \u003d Iwanowicz

Za pomocą dwóch pętli, z których jedna jest zagnieżdżona w drugiej, wyświetliliśmy wartości wszystkich kolumn ze wszystkich wierszy tabeli wartości 1C. W tym przypadku nie użyliśmy nazw kolumn, ale odnieśliśmy się do kolumn i wierszy za pomocą ich indeksów. Aby lepiej zrozumieć, zwróć uwagę na komentarze w przykładzie.

Na koniec proponuję nieco zmienić nasz przykład, aby zamiast numerów kolumn wyświetlał ich nazwy na ekranie. A dodatkowo zrobię bardziej reprezentacyjną prezentację treści na ekranie.

For LineCounter \u003d 0 By MyTZ.Number () - 1 Loop // pętla iterująca po liniach Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + LineCounter + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Zgłosić(" "); // linefeed (wstawianie pustego wiersza) For ColumnCounter \u003d 0 By MyTZ.Columns.Number () - 1 Loop // zagnieżdżona pętla iterująca po kolumnach // pobierz wartość komórki (z bieżącego wiersza i bieżącej kolumny) Cell Value \u003d MyTZ [LineCounter] [ ColumnCounter]; // pobierz nazwę kolumny ColumnName \u003d MyTZ.Columns [ColumnCounter] .Name; // wyświetl nazwę kolumny i wartość komórki Report (ColumnName + ":" + CellValue); Koniec cyklu; Zgłosić(" "); // przejście do linii (wstawienie pustej linii) Koniec pętli;

Teraz na naszym ekranie informacje wyglądają bardziej reprezentacyjnie:

Numer linii 0 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Nazwisko: Czapajew Imię: Wasilij Patronim: Iwanowicz \u003d\u003d\u003d\u003d\u003d\u003d\u003d Numer linii 1 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Nazwisko: Dzierżyński Imię: Feliks Patronim: Edmundowicz \u003d\u003d\u003d\u003d\u003d \u003d\u003d Linia numer 2 \u003d\u003d\u003d\u003d\u003d\u003d\u003d Nazwisko: Kotovsky Imię: Grigorij Patronimik: Iwanowicz

Tak, prawie zapomniałem. Używając dwóch operatorów [...] [...] w wierszu, zamiast indeksu kolumny możemy przekazać nazwę tej kolumny: Tabela wartości [indeks wierszy] [nazwa kolumny]

For LineCounter \u003d 0 By MyTZ.Number () - 1 Loop // iteracja pętli po liniach Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + LineCounter + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Zgłosić(" "); // zmiana wiersza (wstawienie pustej linii) For ColumnCounter \u003d 0 By MyTZ.Colonki.Number () - 1 Loop // zagnieżdżona pętla iterująca po kolumnach ColumnName \u003d MyTZ.Columns [ColumnCounter] .Name; // pobierz nazwę kolumny CellValue \u003d MyTZ [LineCounter] [ColumnName]; //

Zwróć uwagę na linię oznaczoną strzałką. "W tej linii zamiast indeksu bieżącej kolumny przekazujemy argumentowi w nawiasach kwadratowych nazwę bieżącej kolumny [...] Wynik będzie taki sam.

A teraz ostatnia w tym artykule.

PRAWIDŁOWE pobieranie wszystkich danych w tabeli wartości 1C poprzez iterację poprzez zbieranie wierszy i zbieranie kolumn

Dla każdej pętli CurrentRow From MyTZ // pętla przez kolekcję ciągów Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + MyTZ.Index (CurrentLine) + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d"); Zgłosić(" "); Dla każdego, pętla CurrentColumn From MyTZ.Columns // pętla zagnieżdżona iterująca po zbiorze kolumn ColumnName \u003d CurrentColumn.Name; // pobierz nazwę kolumny CellValue \u003d CurrentRow [ColumnName]; // pobierz wartość komórki BY kolumna NAME Report (ColumnName + ":" + CellValue); // wyświetl nazwę kolumny i wartość komórki EndCycle; Zgłosić(" "); Koniec cyklu;

W przykładzie zastosowano dwie pętle. Pętla przechodząca przez kolekcję kolumn jest zagnieżdżona wewnątrz pętli przez wiersze. Jeśli zapoznałeś się z powyższymi przykładami i przeczytałeś poprzednie artykuły, nie będziesz miał trudności ze zrozumieniem, jak działa ten przykład.

Na koniec ograniczę liczbę wierszy kodu w naszym ostatnim przykładzie tak bardzo, jak to możliwe, eliminując użycie zmiennych pośrednich. Otrzymamy próbkę „kodu przemysłowego” używanego w rzeczywistych problemach.

Należy to zrobić tylko wtedy, gdy dobrze rozumiesz, co robisz. Jeśli kod jest bardzo złożony, dopuszczalne jest pozostawienie zmiennych pośrednich, aby ułatwić późniejsze zrozumienie własnego kodu. Ponadto każdy kod musi być przynajmniej w minimalnym stopniu skomentowany, aby po pewnym czasie łatwiej było zrozumieć teksty programu.

Dla każdego CurrentString From MyTZ Loop // iteruj po liniach Report ("\u003d\u003d\u003d\u003d\u003d\u003d\u003d Line #" + MyTZ.Index (CurrentString) + "\u003d\u003d\u003d\u003d\u003d\u003d\u003d" + Symbols.PS); Dla każdej bieżącej kolumny z pętli MyTZ.Colons // iteruj po kolumnach Raport (CurrentColumn.Name + ":" + CurrentRow [CurrentColumn.Name]); Koniec cyklu; Zgłosić(" "); Koniec cyklu;

Wyjście na ekran nie zmieniło się, pozostaje takie samo jak w poprzednim przykładzie:

KURS 2-TYGODNIOWY

„PROGRAMOWANIE w 1C DLA POCZĄTKUJĄCYCH”

Kurs zostanie przesłany e-mailem. Zostań programistą, wykonując zadania krok po kroku.

Aby wziąć udział, potrzebujesz tylko komputera i Internetu

Bezpłatny dostęp do kursu:

Sp-force-hide (display: none;). Sp-form (display: block; background: # eff2f4; padding: 5px; width: 270px; max-width: 100%; border-radius: 0px; -moz-border -radius: 0px; -webkit-border-radius: 0px; font-family: Arial, "Helvetica Neue", sans-serif; background-repeat: no-repeat; background-position: center; background-size: auto;) .sp-form input (display: inline-block; opacity: 1; visibility: visible;). sp-form .sp-form-fields-wrapper (margin: 0 auto; width: 260px;). sp-form .sp -form-control (background: #ffffff; border-color: #cccccc; border-style: solid; border-width: 1px; font-size: 15px; padding-left: 8,75px; padding-right: 8,75px; border -radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; height: 35px; width: 100%;). sp-form .sp-field label (kolor: # 444444; czcionka- rozmiar: 13px; font-style: normal; font-weight: bold;). sp-form .sp-button (border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; background-color: # f4394c; color: #ffffff; width: 100%; font-weig ht: 700; styl czcionki: normalny; rodzina czcionek: Arial, "Helvetica Neue", sans-serif; box-shadow: brak; -moz-box-shadow: brak; -webkit-box-shadow: brak; tło: gradient liniowy (do góry, # e30d22, # f77380);). sp-form .sp-button-container (text-align: center; width: auto;)

W biznesie szeroko stosuje się różne tabele do rozliczania pieniędzy i towarów. Prawie każdy dokument jest tabelą.

W jednej tabeli wymieniono pozycje do wysłania z magazynu. W innej tabeli są zobowiązania do zapłaty za te towary.

Dlatego w 1C praca ze stołami zajmuje poczesne miejsce.

Tabele w 1C są również nazywane „sekcjami tabelarycznymi”. Mają je podręczniki, dokumenty i inne.

Zapytanie, w wyniku wykonania, zwraca tabelę, do której można uzyskać dostęp na dwa różne sposoby.

Pierwsza - szybsza - selekcja, pobieranie z niej wierszy jest możliwe tylko w kolejności. Drugi to wyładowanie wyniku zapytania do tabeli wartości, a następnie losowy dostęp do niej.

// Opcja 1 - sekwencyjny dostęp do wyników zapytania

// pobierz tabelę
Selection \u003d Query.Run (). Select ();
// przeglądaj kolejno wszystkie wiersze wyniku zapytania
While Sampling.Next () Loop
Raport (próbka. Nazwa);
Koniec cyklu;

// Opcja 2 - wyładowanie do tabeli wartości
Żądanie \u003d Nowe żądanie („WYBIERZ nazwę z katalogu.Nomenklatura”);
// pobierz tabelę
Tabela \u003d Query.Run (). Unload ().
// wtedy możemy również przejść przez wszystkie linie
Dla każdego wiersza z pętli tabeli
Raport (String.Name);
Koniec cyklu;
// lub dowolny dostęp do ciągów znaków
String \u003d Table. Find ("Shovel", "Name");

Ważną cechą jest to, że w tabeli uzyskanej z wyniku zapytania wszystkie kolumny będą silnie wpisane. Oznacza to, że żądając pola Nazwa z podręcznika Nomenklatury, otrzymasz kolumnę typu String o dopuszczalnej długości nie większej niż N znaków.

Tabela na formularzu (gruby klient)

Użytkownik pracuje z tabelą, gdy jest ona umieszczona na formularzu.

Omówiliśmy podstawowe zasady pracy z formularzami podczas lekcji i podczas lekcji

Więc połóżmy tabelę na formularzu. Aby to zrobić, możesz przeciągnąć tabelę z panelu sterowania. Podobnie możesz wybrać w menu Form / Insert Control.

Dane można zapisać w konfiguracji - wówczas należy zaznaczyć istniejącą (wcześniej dodaną) sekcję tabelaryczną obiektu konfiguracyjnego, którego formularz edytujesz.

Kliknij przycisk „...” we właściwości Dane. Aby zobaczyć listę sekcji tabelarycznych, musisz rozwinąć gałąź Obiekt.

Wybierając sekcję tabelaryczną, sam 1C doda kolumny do tabeli w formularzu. Wiersze wprowadzone przez użytkownika do takiej tabeli zostaną automatycznie zapisane wraz z odnośnikiem / dokumentem.

W tej samej właściwości Data można wprowadzić dowolną nazwę i wybrać typ ValuesTable.

Oznacza to, że wybrana jest dowolna tabela wartości. Nie doda automatycznie kolumn, nie zostanie automatycznie zapisany, ale możesz z nim zrobić, co chcesz.

Klikając prawym przyciskiem myszy tabelę, możesz dodać kolumnę. We właściwościach kolumny możesz określić jej nazwę (dla odniesienia w kodzie 1C), nagłówek kolumny w formularzu, link z atrybutem sekcji tabelarycznej (ten ostatni - jeśli nie jest to dowolna tabela, ale sekcja tabelaryczna jest wybrana).

We właściwościach tabeli w formularzu można określić, czy użytkownik może dodawać / usuwać wiersze. Bardziej zaawansowany formularz - pole wyboru Tylko podgląd. Te właściwości są przydatne do organizowania tabel do wyświetlania informacji, ale nie do edycji.

Aby zarządzać tabelą, musisz wyświetlić pasek poleceń w formularzu. Wybierz pozycję menu Form / Wstaw sterowanie / Panel poleceń.

We właściwościach paska poleceń zaznacz pole wyboru Autouzupełnianie, aby przyciski na pasku pojawiały się automatycznie

Tabela w formularzu (cienki / zarządzany klient)

W zarządzanym formularzu te akcje wyglądają nieco inaczej. Jeśli chcesz umieścić sekcję tabelaryczną w formularzu, otwórz gałąź Obiekt i przeciągnij jedną z sekcji tabelarycznych w lewo. I to wszystko!

Jeśli potrzebujesz umieścić tabelę wartości, dodaj nowy atrybut formularza i określ typ - tabelę wartości w jej właściwościach.

Aby dodać kolumny, użyj menu prawego przycisku myszy na tym atrybucie formularza, elemencie kolumny Dodaj atrybut.

Następnie również przeciągnij tabelę w lewo.

Aby tabela miała pasek poleceń, we właściwościach tabeli wybierz wartości w sekcji Użycie - pozycja paska poleceń.

Wyeksportuj tabelę do programu Excel

Dowolną tabelę 1C znajdującą się na formularzu można wydrukować lub pobrać do programu Excel.

Aby to zrobić, kliknij prawym przyciskiem myszy puste miejsce w tabeli i wybierz opcję Lista.

W zarządzanym (cienkim) kliencie podobne czynności można wykonać za pomocą elementu menu Wszystkie akcje / Wyświetl listę.

Istnieją dwie specjalne metody wyszukiwania wartości w tabeli:

1. Znajdź

Horizon TV \u003d Książki referencyjnes.Nomenclature.FindByName ("Horizon TV");
FoundString \u003d TKNomenclature.Find (TV Horizon);
// możemy również określić, które kolumny przeszukać, aby przyspieszyć wyszukiwanie
FoundString \u003d TKNomenclature.Find (TV Horizon, "Nomenclature");

Ta metoda zwraca pierwszy znaleziony ciąg z żądaną wartością lub Undefined, jeśli nie. Dlatego wygodnie jest go używać do znajdowania unikalnych wartości, ponieważ w przeciwnym razie, po znalezieniu wartości, usuń ją z tabeli, aby znaleźć następną.

Aby nie cierpieć w ten sposób, istnieje następująca metoda, która pozwala znaleźć tablicę pasujących ciągów:

2. FindStrings


StructureSelection.Insert ("Nomenklatura", TV Horizon); // najpierw określ kolumnę, gdzie szukać, a potem czego szukać.

Ta metoda zawsze zwraca tablicę, ale może być pusta, jeśli nic nie zostanie znalezione. Ta metoda, podobnie jak poprzednia, zwraca same wiersze tabeli wartości, a nie same wartości w oddzielnej tablicy. Dlatego zmieniając wartości w wierszu tablicy lub, jak w poprzedniej metodzie, dla znalezionego wiersza, zmienisz wartość w przetwarzanej tabeli wartości.

Kolejną dobrą rzeczą w tej metodzie jest to, że może ona przeszukiwać kilka kolumn tabeli wartości jednocześnie:


Ramy wyboru \u003d nowa struktura;
StructureSelection.Insert ("Nomenklatura", TV Horizon);
Struktura wyboru Wstawić („Ilość”, 10);
FoundArrayStrings \u003d TZNomenclature.FindStrings (SelectionStructure);

Jedyną wadą, jak widać, nie można używać innych typów porównań niż „równe”

Na początek mały fakt - proste przykłady pracy z tabelą wartości:

1. Utwórz tabelę wartości

ValuesTable \u003d New ValuesTable;


2. Utwórz kolumny tabeli wartości:

TableValues.Columns.Add ("Name");
TableValues.Columns.Add ("Nazwisko");


3. Dodaj nowe wiersze, używając nazw kolumn:


NewStroka.Name \u003d "Wasilij";
NewStroka.Sename \u003d "Pupkin";


4. Jak szukać wartości w tabeli wartości:
Konieczne jest znalezienie wiersza tabeli zawierającego żądaną wartość.

FoundString \u003d ValueTable.Find (LookupValue);


5. Znajdź pierwsze wystąpienie w określonych kolumnach tabeli wartości

FoundString \u003d ValueTable.Find (SearchValue, "Dostawca, Kupujący");


6. Jeśli chcesz znaleźć wszystkie wystąpienia w tabeli wartości:
Używamy struktury wyszukiwania.

SearchStructure \u003d Struktura ("Pracownik", LookupValue);
ArrayFoundStrings \u003d ValueTable.FindStrings (SearchStructure);


Stwórzmy strukturę wyszukiwania, której każdy element będzie zawierał nazwę kolumny jako klucz i żądaną wartość w tej kolumnie jako wartość. Przekazujemy SearchStructure jako parametr do metody FindStrings (). W rezultacie otrzymujemy wiersze tabeli.
Jeśli do struktury wyszukiwania dodamy wyszukiwanie wymaganej wartości, na przykład w kolumnie Responsible, to w wyniku zastosowania metody FindStrings () otrzymamy wszystkie wiersze, w których zarówno Pracownik, jak i Osoba odpowiedzialna są równe żądanej wartości.

7. Jak iterować po tabeli wartości w kolejności losowej

Dla każdego bieżącego wiersza z pętli tabeli wartości
Raport (CurrentString.Name);
Koniec cyklu;

To samo z indeksami:

MajorIndex \u003d ValueTable.Number () - 1;
Dla MF \u003d 0 do cyklu wysokiego wskaźnika
Raport (Tabela wartości [liczba] .Nazwa);
Koniec cyklu;


8. Usunięcie istniejącego wiersza tabeli wartości

ValuesTable.Delete (DeletedString);

według indeksu

ValuesTable.Remove (0);


9. Usunięcie istniejącej kolumny tabeli wartości

ValuesTable.Columns.Remove (DeletedColumn);


według indeksu

ValuesTable.Columns.Remove (0);

Należy pamiętać, że usunięcie wiersza (lub kolumny) „ze środka” tabeli wartości spowoduje zmniejszenie o jeden indeksów wierszy, które znajdowały się „po” usuniętym

10. Jak wypełnić tabelę wartości, jeśli nazwy kolumn są zawarte w zmiennych?

NewRow \u003d ValueTable.Add ();
NewString [ColumnName] \u003d wartość;


11. Jak wypełnić całą kolumnę tabeli wartości żądaną wartością?
Kolumna FiscalAccounting Flaga w tabeli wartościValuesTable musi być wypełniona wartością False

ValuesTable.FillValues \u200b\u200b(False, "FiscalAccounting Flag");


Zastosuj metodę FillValues \u200b\u200b() do tabeli wartości. Pierwszym parametrem jest wartość do wypełnienia. Drugi parametr to nazwa kolumny do wypełnienia.

12. Jak można wypełnić tabelę wartości „RecipientTable” danymi tabeli wartości „SourceTable”?

Jeśli tabela odbiorców nie istnieje w momencie operacji lub jeśli nie musisz zapisywać jej poprzednich kolumn, możesz utworzyć ją jako pełną kopię oryginału

ReceiverTable \u003d SourceTable.Copy ();


Opcja druga: tabela TableRecipient istnieje i szkoda stracić jej kolumny i ograniczenia dotyczące typów danych kolumn. Ale musisz wypełnić dane dla kolumn, których nazwy pokrywają się z nazwami tabeli źródłowej.

Częściowy transfer danych dla kolumn o pasujących nazwach:

Dla każdego wiersza SourceTable z pętli SourceTable
FillPropertyValues \u200b\u200b(NewRow, SourceTableRow);
Koniec cyklu


Dla każdego wiersza tabeli źródłowej do tabeli odbierającej dodawany jest nowy wiersz, a wartości są wypełniane w tych kolumnach nowej tabeli, których nazwy odpowiadają nazwom kolumn w pierwotnej tabeli

Jeśli tabele nie mają kolumn o takich samych nazwach, dodatkowa tabela będzie zawierała tyle wierszy z pustymi wartościami, co tabela źródłowa.
Jeśli dla niektórych kolumn o tej samej nazwie typ wartości danych z tabeli źródłowej nie mieści się w tablicy dozwolonych typów kolumn tabeli odbierającej, w takich polach otrzymamy puste wartości.
Rozważmy trzeci przypadek. W przypadku kolumn o tej samej nazwie kolumna tabeli odbierającej musi być w pełni zgodna z kolumną tabeli źródłowej.

Pełne kopiowanie danych dla kolumn o pasujących nazwach

Tytułowe kolumny \u003d Nowa tablica ();

Pętla kolumn dla każdej kolumny z tabeli źródłowej
MatchingColumn \u003d TableRecipient.Columns.Find (Column.Name);

Jeśli MatchedColumn<> Niezdefiniowany Wtedy

// Pobierz właściwości kolumny.
Name \u003d Column.Name;
ValueType \u003d Column.ValueType;
Nagłówek \u003d Kolumna.Heading;
Width \u003d Column.Width;

// Zastąp kolumny w tabeli odbiorczej.
Indeks \u003d TableReceiver.Columns.Index (MatchingColumn);

TableReceiver.Columns.Remove (Index);
TableReceiver.Columns.Insert (indeks, nazwa, typ wartości, tytuł, szerokość);

// Dodaj nazwę następnej pasującej kolumny do tablicy.
Podobne kolumny.Add (Column.Name);

EndIf;

Koniec cyklu;

// Zapętlaj przez wiersze tabeli źródłowej.
Dla każdego wiersza SourceTable z pętli SourceTable

// Dodaj nowy wiersz do tabeli odbiorczej.
NewRow \u003d TableRecipient.Add ();

// Wypełnij wartości w pasujących komórkach.
Dla każdej kolumny nazw z pętli podobnych kolumn
NewRow [ColumnName] \u003d SourceTableRow [ColumnName];

Koniec cyklu;

Koniec cyklu;


Będziemy musieli zastąpić kolumnę w tabeli odbiorczej nową, której właściwości będą w pełni odpowiadały kolumnie tabeli źródłowej.
Dlatego jeśli w tabeli odbiorców znajduje się kolumna o tej samej nazwie, wszystkie właściwości nowej kolumny zbieramy w zmiennych. Następnie usuń starą i utwórz nową kolumnę. Następnie przechodzimy przez wiersze tabeli źródłowej.
W pętli dodaj nowy wiersz do tabeli odbiorczej i otwórz pętlę do iteracji po nazwach kolumn w tablicy zgodnych kolumn.
Wewnątrz tej zagnieżdżonej pętli wypełniamy komórki tabeli odbiorczej danymi komórki tabeli źródłowej.

13. Jak dodać kolumny do tabeli wartości „ValuesTable” z ograniczeniami według typu?

Dodając kolumnę, możesz po prostu określić jej nazwę i pozostawić drugi parametr metody Add () nietknięty. W tym przypadku typ danych kolumny jest dowolny.

Dodanie kolumny bez określania typu danych

// Dodaj kolumnę bez ograniczeń typu.
TableValues.Columns.Add ("Object");


Możesz wpisać wartość drugiego parametru. Należy tam przekazać opis typu dozwolonego dla kolumny. Sam opis można uzyskać za pomocą konstruktora, przekazując ten ostatni jako parametr nazwę typu string (jeśli jest wiele typów, to oddzielone przecinkami) lub tablicę dopuszczalnych typów.

Dodanie kolumny wskazującej typ danych

// Ograniczenia dotyczące typów danych w kolumnach:
// Tylko elementy wyszukiwania „Kontrahenci”.
TableValues.Columns.Add ("Wykonawca", Nowy opis typów ("ReferenceLink.Contractors"));


Jeśli wśród typów dozwolonych do wypełniania danych kolumny znajduje się ciąg, możesz ograniczyć jego głębokość bitową (długość), określić użycie zmiennej lub stałej długości. Wszystko to jest realizowane poprzez utworzenie obiektu za pomocą konstruktora String Qualifiers. Ponadto ten obiekt będzie używany jako jeden z parametrów konstruktora TypeDescription.

Używanie kwalifikatorów do kwalifikowania typu danych kolumny wartości w tabeli

// Przygotuj i ustaw ograniczenia dla danych typu String.
String Qualifiers \u003d NewString Qualifiers (20, ValidLength.Variable);
AllowedTypes \u003d NewTypeDescription ("String", StringQifiers);
ValuesTable.Columns.Add ("NoteStringShort", AllowedTypes);


Możesz zrobić to samo z kwalifikatorami daty i daty.
Uwaga: opis typu może zostać zbudowany przez konstruktora zarówno „od zera”, jak i na podstawie istniejącego opisu typu

Używanie istniejących deklaracji typu do określenia typu danych kolumny tabeli wartości

// Rozszerzenie wcześniej używanego opisu typu.
QualifiersNumber \u003d New QualifiersNumber (10, 2, ValidSign.Non-negative);
Date Qualifiers \u003d New Date Qualifiers (DateParts.Date);
ExtendedAllowedTypes \u003d New TypeDescription (AllowedTypes, "Number, Date", Number Qualifiers, Date Qualifiers);

ValuesTable.Columns.Add ("Uwaga", ExtendedAllowedTypes);

DZWONEK

Są tacy, którzy czytają tę wiadomość przed wami.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu