1c как да създадете таблица със стойности. А сега: повторение на материала

Вероятно нито един обект от универсални колекции от стойности не е толкова популярен сред разработчиците на 1C, колкото таблицата със стойности (TV). Списъците със стойности не могат да бъдат разширени с подробности; дървото на стойностите е визуално удобно за възприемане, но дизайнът на програмно четене на стойностите на неговите редове е труден за изпълнение.

И само таблицата със стойности:

  • Умее директно да попълва таблични части на документи, справочници и обработка;
  • Е резултат от заявка;
  • Лесен за четене и визуално формулиран;
  • и много много други.

В тази статия се опитахме да дадем обща представа за такъв сложен и универсален обект като таблица със стойности.

От какво се състоят таблиците със стойности?

Всички начинаещи разработчици ясно знаят, че таблицата със стойности има:

  1. Колони, описващи структурата на таблицата;
  2. Редове, които запълват таблицата с информация.

Много често обаче забравяме за едно важно свойство на таблицата - нейните индекси, а именно тяхното използване ни позволява значително да ускорим процеса на търсене в таблицата, формиране на селекции в нея и сериозно подобрява производителността.

Но на първо място.

Фигура 1 показва как изглежда таблица със стойности, отпечатана по най-простата процедура, която показва тяхната структура и съдържание.

Както се вижда от примера, таблицата има 5 колони, без да се брои номерът на реда по ред.

В повечето случаи не е необходимо да се указва типът данни на колоната и нейната ширина; достатъчно е да се посочи името на колоната, но в някои случаи това просто не може да се избегне (например при качване на таблица в dbf файл).

Ако планирате да използвате таблицата със стойности като източник на данни за заявка в бъдеще, е необходимо да посочите типа данни (фиг. 2).

Добавянето на ред става с помощта на метода Add(), присвоявайки името на новия ред.

Индекси на таблицата със стойности

Търсенето в таблицата със стойности се извършва по два метода:

  • Find (връща първия намерен елемент въз основа на определени параметри, в противен случай стойността е Undefined);
  • FindRows (връща масив от редове на таблица, които отговарят на определени условия).

Търсенето в големи таблици значително забавя системата и може да отнеме много време. Именно в тези случаи трябва да се използват индекси.

В първия случай търсенето се извършва с помощта на една стойност и една колона, което трябва да се прехвърли към индексите (фиг. 3)

Предадените индекси, разделени със запетаи, показват, че в таблицата може да се търси с помощта на метода FindRows, на който определена структура ще бъде предадена като параметър.

В случая, даден в примера, вторият ред показва едновременно търсене на редове, съдържащи конкретна номенклатурна стойност и нейните характеристики, а третият ред показва, че документът „Производствена поръчка“ може да бъде добавен към параметрите за търсене.

При работа с различни обекти на метаданни за конфигурация, както и отчети и обработка, често възниква ситуация, когато е необходимо да се извършат някои действия с техните таблични части. Работата директно с елементи на формуляр или таблични части на документи не винаги е удобна.

Тук на помощ отново идва таблицата със стойности. В техническата спецификация, използвайки метода на табличните части Unload(), можете:

  1. Напълно повторете структурата на масата за документи, като запазите цялата възможна информация;
  2. Определете само онези колони и редове, които са необходими за по-нататъшна работа, и ги покажете.

Обратното действие (попълване на табличната част) се извършва с помощта на метода Load(), чийто единствен параметър е името на таблицата, която ще се показва.

Трябва да се отбележи, че сравнението на колоните на табличната част и техническото задание се извършва по име.

Можете напълно да копирате един TK в друг, както и да определите кои редове и колони ще бъдат прехвърлени с помощта на метода Copy().

Фиг.4

В този случай колоните на таблицата ще бъдат запазени, а информацията и редовете от дубликата ще бъдат изтрити.

Таблица със стойности и заявка

Както бе споменато по-горе, резултатът от изпълнението на заявка се качва в техническата спецификация, но доста често разработчиците имат въпрос: как да обработват таблица със стойности със заявка, възможно ли е това и какъв код помага да се направи това.

Технологията за заявки в 1C не предполага използването на технически спецификации като източници на данни, но това ограничение може лесно да бъде заобиколено с помощта. Кодът на фигура 5 показва как се прави това.

Фиг.5

Като замените „*“ с имената на колоните (ред от формата TK.Номенклатура), можете да намалите количеството качена информация.

Грешка при изпълнение на заявка (фиг. 5) „Типът не може да бъде обработен в заявката“ показва, че разработчикът е забравил да изпълни част от кода на фиг. 2 и не е въвел колоните.

Таблица със стойности и цикли

Когато итерирате през редовете на таблица със стойности, като използвате метод, съдържащ брояч (фиг. 6), важно е да запомните, че началната стойност на индекса на реда е 0, а крайната стойност на итератора трябва да бъде 1 по-малко от броя на редовете в таблицата. В противен случай има 100% шанс за грешка „Стойността на индекса е извън диапазона“

Фиг.6

По принцип е по-добре да се изброят редовете на техническите спецификации чрез конструкцията „За всеки ... от“, определяйки името на итератора.

За отчитане на пари и стоки в бизнеса широко се използват различни таблици. Почти всеки документ е таблица.

Една таблица изброява стоките, които трябва да бъдат изпратени от склада. Друга таблица показва задълженията за плащане на тези стоки.

Следователно в 1C работата с таблици заема видно място.

Таблиците в 1C се наричат ​​още „таблични части“. Справочници, документи и други ги има.

Когато се изпълни, заявката връща таблица, която може да бъде достъпна по два различни начина.

Първият - по-бърз - избор, получаването на редове от него е възможно само по ред. Второто е качване на резултата от заявката в таблица със стойности и след това произволен достъп до нея.

//Вариант 1 – последователен достъп до резултатите от заявката

//вземете таблицата
Изберете = Query.Run().Select();
// преминаваме по ред през всички редове на резултата от заявката
Докато Select.Next() цикъл
Доклад(Име на селекция);
EndCycle;

//Вариант 2 – качване в таблица със стойности
Заявка = Нова заявка("ИЗБЕРЕТЕ Име ОТ Директория.Номенклатура");
//вземете таблицата
Таблица = Query.Run().Unload().
//по-нататък можем също да итерираме през всички редове
За всеки ред от цикъла на таблицата
Доклад(Име на низ);
EndCycle;
//или произволен достъп до низове
Ред = Table.Find("Лопата", "Име");

Важна особеност е, че в таблицата, която се получава от резултата от заявката, всички колони ще бъдат строго типизирани. Това означава, че като поискате полето Name от директорията Nomenclature, ще получите колона от типа String с допустима дължина не повече от N знака.

Таблица във формуляра (дебел клиент)

Потребителят работи с таблицата, когато е поставена във формата.

Обсъдихме основните принципи на работа с формуляри в урока по и в урока по

И така, нека поставим таблицата върху формуляра. За да направите това, можете да плъзнете таблицата от контролния панел. По същия начин можете да изберете контрола Form/Insert от менюто.

Данните могат да се съхраняват в конфигурацията - тогава трябва да изберете съществуващата (предварително добавена) таблична част от конфигурационния обект, чиято форма редактирате.

Щракнете върху бутона "..." в свойството Данни. За да видите списъка с таблични части, трябва да разгънете клона Обект.

Когато изберете табличната част, 1C сам ще добави колони към таблицата във формуляра. Редовете, въведени от потребителя в такава таблица, ще бъдат запазени автоматично заедно със справочника/документа.

В същото свойство Data можете да въведете произволно име и да изберете типа Value Table.

Това означава, че е избрана произволна таблица със стойности. Няма да добавя автоматично колони, нито ще се запазва автоматично, но можете да правите каквото искате с него.

Като щракнете с десния бутон върху таблицата, можете да добавите колона. В свойствата на колона можете да посочите нейното име (за справка в 1C кода), заглавието на колоната във формуляра, връзката с атрибута на табличната част (последното - ако не е избрана произволна таблица, а таблична част).

В свойствата на таблицата във формуляра можете да посочите дали потребителят може да добавя/изтрива редове. По-разширена форма е квадратчето за отметка „Само преглед“. Тези свойства са удобни за използване за организиране на таблици, предназначени за показване на информация, но не и за редактиране.

За да управлявате таблицата, трябва да покажете команден панел във формата. Изберете елемента от менюто Form/Insert Control/Command Bar.

В свойствата на командната лента поставете отметка в квадратчето за автоматично попълване, така че бутоните на панела да се показват автоматично.

Таблица във формуляр (тънък/управляван клиент)

В управлявана форма тези действия изглеждат малко по-различно. Ако трябва да поставите таблична част във формуляра, разгънете клона Обект и плъзнете една от табличните части наляво. Това е всичко!

Ако трябва да поставите таблица със стойности, добавете нов атрибут на форма и в свойствата му посочете типа – таблица със стойности.

За да добавите колони, използвайте менюто с десен бутон върху този атрибут на формуляр, изберете Добавяне на колона на атрибут.

След това също плъзнете таблицата наляво.

За да има таблица с командна лента, в свойствата на таблицата изберете стойностите в секцията Използване – Позиция на командната лента.

Качване на таблица в Excel

Всяка таблица 1C, разположена във формуляра, може да бъде отпечатана или качена в Excel.

За да направите това, щракнете с десния бутон върху празно място в таблицата и изберете Списък.

В управляван (тънък) клиент подобни действия могат да се извършват с помощта на елемента от менюто Всички действия/Списък за показване.

Таблицата със стойности в платформата 1C 8.3 (8.2) е универсална колекция от стойности, които разработчикът може да използва по време на разработката на софтуер, за да внедри своите алгоритми. По същество таблицата със стойности на 1C е динамичен набор от стойности, които имат колони и колони.

Статии за други универсални колекции от стойности в 1C

Научете програмиране в 1C в моята книга „Програмиране в 1C в 11 стъпки“

  1. Книгата е написана на ясен и прост език - за начинаещ.
  2. Научете се да разбирате 1C архитектурата;
  3. Ще започнете да пишете код на езика 1C;
  4. Овладейте основни техники за програмиране;
  5. Затвърдете знанията си с помощта на проблемна книга;

Отлично ръководство за разработване в управлявано 1C приложение, както за начинаещи разработчици, така и за опитни програмисти.

  1. Много достъпен и разбираем език на изложение
  2. Книгата се изпраща по имейл в PDF формат. Може да се отвори на всяко устройство!
  3. Разберете идеологията на управлявано 1C приложение
  4. Научете как да разработите управлявано приложение;
  5. Научете се да разработвате управлявани 1C формуляри;
  6. Ще можете да работите с основните и необходими елементи на управляваните форми
  7. Програмирането под управлявано приложение ще стане ясно

Промо код за 15% отстъпка - 48PVXHeYu


Ако този урок ви е помогнал да разрешите някакъв проблем, харесали сте го или сте го намерили за полезен, тогава можете да подкрепите моя проект, като дарите всяка сума:

Можете да платите ръчно:

Yandex.Money - 410012882996301
Web Money - R955262494655

Присъединете се към моите групи.

Ето малко факти за начало - прости примери за работа с таблица със стойности:

1. Създайте таблица със стойности

ValueTable = Нова таблица със стойности;


2. Създайте колони за таблицата със стойности:

ValueTable.Columns.Add("Име");
Стойност Table.Columns.Add("Фамилно име");


3. Добавете нови редове, като използвате имена на колони:


NewLine.Name = "Василий";
NewLine.LastName = "Pupkin";


4. Как да потърсите стойност в таблицата със стойности:
Необходимо е да се намери ред от таблицата, съдържащ желаната стойност.

FoundRow = ValueTable.Find(SearchValue);


5. Намерете първото срещане в определени колони на таблицата със стойности

FoundRow = ValueTable.Find(SearchValue, "Доставчик, Купувач");


6. Ако трябва да намерите всички срещания в таблицата със стойности:
Използваме структурата за търсене.

SearchStructure = Structure("Employee", SearchValue);
Масив от FoundRows = ValueTable.FindRows(SearchStructure);


Нека създадем структура за търсене, всеки елемент от която ще съдържа името на колоната като ключ и желаната стойност в тази колона като стойност. Предаваме структурата за търсене като параметър на метода FindLines(). В резултат на това получаваме редове от таблицата.
Ако добавите търсене на желаната стойност към структурата за търсене, например, също в колоната Отговорен, тогава в резултат на прилагане на метода FindLines() ще получим всички редове, където и Служителят, и Отговорният са равни на търсена стойност.

7. Как да преминете през таблица със стойности в произволен ред

За всеки текущ ред от цикъла на таблицата със стойности
Доклад(CurrentRow.Name);
EndCycle;

Същото нещо, използвайки индекси:

SeniorIndex = ValueTable.Quantity() - 1;
За сметка = 0 към SeniorIndex цикъл
Отчет(Таблица на стойностите[Акаунт].Име);
EndCycle;


8. Изтриване на съществуващ ред от таблица със стойности

ValueTable.Delete(Ред за изтриване);

по индекс

Таблица със стойности.Изтриване(0);


9. Изтриване на съществуваща колона от таблицата със стойности

ValueTable.Columns.Delete(ColumnToDelete);


по индекс

Таблица със стойности.Колони.Изтриване(0);

Необходимо е да се има предвид, че изтриването на ред (или колона) „от средата“ на таблицата със стойности ще доведе до намаляване с единица на индексите на редовете, разположени „след“ изтритите

10. Как да попълните таблица със стойности, ако имената на колоните се съдържат в променливи?

NewRow = ValueTable.Add();
НовРед[Име на Колона] = Стойност;


11. Как да попълним цялата колона на таблицата със стойности с желаната стойност?
Колоната "Флаг за фискално счетоводство" в таблицата със стойности на таблицата със стойности трябва да бъде попълнена със стойността False

Таблица със стойности. Попълнете стойности (False, „Флаг за фискално счетоводство“);


Използваме метода FillValues() за таблицата със стойности. Първият параметър е стойността, която трябва да се попълни. Вторият параметър е името на колоната, която трябва да се попълни.

12. Как да попълня таблицата със стойности “Receiver Table” с данни от таблицата със стойности “SourceTable”?

Ако таблицата с получатели все още не съществува по време на операцията или нейните предишни колони не трябва да бъдат запазени, можете да я създадете като пълно копие на оригинала

Таблица получател = Таблица източник.Копиране();


Вариант две: таблицата ReceiverTable съществува и би било жалко да загуби колоните и ограниченията за типовете данни на колоните. Но трябва да попълните данните за колоните, чиито имена съвпадат с имената на изходната таблица.

Частично прехвърляне на данни за колони със съвпадащи имена:

За всеки ред на SourceTable от цикъла SourceTable
FillPropertyValues(NewRow, SourceTableRow);
Край на цикъла


За всеки ред от изходната таблица се добавя нов ред към получаващата таблица и стойностите се попълват в тези колони на новата таблица, чиито имена съвпадат с имената на колоните в изходната таблица

Ако таблиците нямат колони с еднакви имена, таблицата местоназначение в крайна сметка ще съдържа толкова редове с нулеви стойности, колкото е имало редове в таблицата източник.
Ако за някои колони със същото име типът стойност на данните от изходната таблица не попада в масива от разрешени типове колони на целевата таблица, ще получим празни стойности в такива полета.
Да разгледаме третия случай. В случай на колони с едно и също име, колоната на таблицата местоназначение трябва да бъде приведена в пълно съответствие с колоната на таблицата източник.

Пълно копиране на данни за колони със съвпадащи имена

Същите колони = Нов масив();

За всяка колона от SourceTable.Columns цикъл
MatchingColumn = TableReceiver.Columns.Find(Column.Name);

Ако съответства на колона<>Недефиниран Тогава

// Получаване на свойства на колона.
Име = Име на колона;
ValueType = Колона.ValueType;
Header = Column.Header;
Ширина = Колона.Ширина;

// Замяна на колони в целевата таблица.
Индекс = TableReceiver.Columns.Index(MatchingColumn);

TableReceiver.Columns.Delete(Индекс);
ReceiverTable.Columns.Insert(Индекс, Име, ValueType, Header, Width);

// Добавете следващото име на съответстващи колони към масива.
Същите Columns.Add(Column.Name);

endIf;

EndCycle;

// Цикъл през редовете на изходната таблица.
За всеки ред на SourceTable от цикъла SourceTable

// Добавяне на нов ред към целевата таблица.
NewRow = TableReceiver.Add();

// Попълнете стойностите в съответстващите клетки.
За всяко име Колони от колони със същото име Цикъл
Нов ред[Име на колона] = Ред на изходна таблица[Име на колона];

EndCycle;

EndCycle;


Ще трябва да заменим колоната в целевата таблица с нова, чиито свойства ще съответстват напълно на колоната на изходната таблица.
Следователно, ако в таблицата на получателя се намери колона със същото име, ние събираме всички свойства за новата колона в променливи. След това изтрийте старата и създайте нова колона. След това преминаваме през редовете на изходната таблица.
В цикъла добавяме нов ред към получаващата таблица и отваряме цикъл върху имената на колоните в масива от съвпадащи колони.
Вътре в този вложен цикъл ние запълваме клетките на таблицата местоназначение с данните от клетката на таблицата източник.

13. Как да добавя колони към таблицата със стойности „ValueTable“ с ограничения за типа?

Когато добавяте колона, можете просто да посочите нейното име и да оставите втория параметър на метода Add() недокоснат. В този случай типът данни на колоната е произволен.

Добавяне на колона без посочване на тип данни

// Добавяне на колона без ограничения за типа.
ValueTable.Columns.Add("Обект");


Можете да попълните стойността на втория параметър. Там трябва да подадете описание на типа, разрешен за колоната. Самото описание може да бъде получено с помощта на конструктора чрез предаване на името на низа на типа (ако има много типове, разделени със запетаи) или масив от валидни типове като параметър.

Добавяне на колона, указваща типа данни

// Ограничения за типове данни в колони:
// Само елементи от директория "Контрагенти".
Таблица със стойности.Колони.Добавяне("Акаунт", Ново описание на типовете("Връзка към директория.Акаунти"));


Ако сред разрешените типове за попълване на данни в колона има низ, можете да ограничите неговата битова дълбочина (дължина), да посочите използването на променлива или фиксирана дължина. Всичко това се постига чрез създаване на обект с помощта на конструктора String Qualifiers. След това този обект ще се използва като един от параметрите на конструктора TypeDescription.

Използване на квалификатори за указване на типа данни на колона на таблица със стойности

// Подготвяме и задаваме ограничения за данни от тип String.
Квалификатори на низ = Нови квалификатори на низ (20, AllowedLength.Variable);
ValidTypes = NewTypeDescription("Низ", StringQualifiers);
ValueTable.Columns.Add("NoteStringShort", ValidTypes);


Подобни действия могат да бъдат извършени по отношение на квалификатори за число и дата.
Моля, обърнете внимание: описанията на типове могат да бъдат изградени от конструктора или „от нулата“, или съществуващо описание на тип може да се използва като основа.

Използване на съществуващи декларации за тип за указване на типа данни на колона на таблица със стойности

// Разширение на използваното преди това описание на типа.
QualifiersNumbers = Нови QualifiersNumbers(10, 2, ValidSign.Non-negative);
DateQualifiers = Нови DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, "Number, Date", Number Qualifiers, Date Qualifiers);

ValueTable.Columns.Add("Забележка", ExtendedAcceptableTypes);



 

Може да е полезно да прочетете: