1s 8.3 показват таблица със стойности. Какви методи съществуват и как да търсите няколко стойности едновременно

25.06.2023

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

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

Структура на таблица със стойности като обект

Свойствата на таблица със стойности се определят от комбинации от две предварително дефинирани колекции: нейните колони и редове.

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

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

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

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

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

По този начин взаимодействието с низ е много подобно на взаимодействието с други обекти. Можете да четете и записвате неговите свойства, включително като използвате предварително дефинираната функция „FillPropertyValues()“. Тъй като редовете са основната колекция на таблицата със стойности, методът Clear() се използва за изтриване на всички редове в таблицата.

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

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

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

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

ДемоТаблица = Нова таблица със стойности;

// Първо инициализираме техническите спецификации // След това определяме необходимите параметри за нови колони и ги добавяме към колекцията // Създаване на колона "Номенклатура" Name = "Номенклатура";

ValueType = New TypeDescription("DirectoryLink.Nomenclature"); Заглавие = "Номенклатура (продукт)"; DemoTable.Columns.Add(Име, ValueType, Header);

// Опция с копиране на всички редове от стандарта на техническата спецификация, но запазване само на двете посочени колони на стандарта = "Номенклатура, количество"; DemoTable = TableEtalon.Copy(, ColumnsEtalon);// Опция с копиране на предварително избрани редове от стандарта на техническата спецификация, като същевременно се запазват двете посочени колони на стандарта = SelectIntoArrayРедовете, от които се нуждаем от таблицата на стандарта(); ColumnsStandard = "Номенклатура, Количество"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon);

// Възможност за копиране на редове от стандарта на техническата спецификация с помощта на посочения филтър, запазвайки една колона „Номенклатура“ // Всички редове, където стойността в колоната Количество е равна на 0, ще бъдат избрани, само колоната Номенклатура Избор на ред = Нова структура („Количество“ ще се появи в получената таблица, 0);

ColumnsStandard = "Номенклатура"; DemoTable = TableEtalon.Copy(RowsEtalon, ColumnsEtalon);// Опция с пълно копие на таблицата и последващо изтриване на един ред със стойността на полето за количество

равен на нула

и изтриване на цялата колона „Количество“ = Нова структура („Количество“, 0);

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

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

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

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

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

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

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

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


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

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

Yandex.Money - 410012882996301
Web Money - R955262494655

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

Търсете в таблицата със стойности на 1C

Какви методи съществуват и как да търсите няколко стойности едновременно.

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

1. Намерете

TVHorizon = Директории.Номенклатура.FindByName("TVHorizon");
FoundString = TZNomenclature.Find(TVHorizon);
// можем също да посочим в кои колони да търсим, за да ускорим търсенето
FoundString = TZNomenclature.Find(TVHorizon, "Номенклатура");

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

За да избегнете този проблем, има следния метод, който ви позволява да намерите масив от съвпадащи низове:

2. Намиране на низове


Selection Structure.Insert("Номенклатура", TVHorizon); // първо посочете колоната къде да търсите и след това какво да търсите.

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

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


SelectionStructure = Нова структура;
Selection Structure.Insert("Номенклатура", TVHorizon);
Selection Structure.Insert("Количество", 10);
Намерен масив от редове = TZNomenclature.FindLines(SelectionStructure);

Единственият минус, както можете да видите, е, че не можете да използвате други видове сравнение, различни от „равно“

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

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(). В резултат на това получаваме редове от таблицата.
Ако добавите търсене за желаната стойност към структурата за търсене, например, също в колоната Отговорен, тогава в резултат на прилагане на метода FindRows() ще получим всички редове, където и Служителят, и Отговорният са равни на търсена стойност.

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

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

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

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


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

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

по индекс

Стойност.Изтриване(0);


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

ValueTable.Columns.Delete(ColumnDeleted);


по индекс

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

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

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

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


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

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


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

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

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

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


Вариант 2: таблицата 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 = Нови квалификационни числа(10, 2, ValidSign.Non-negative);
DateQualifiers = Нови DateQualifiers(DateParts.Date);
Extended ValidTypes = New TypeDescription(ValidTypes, "Number, Date", Number Qualifiers, Date Qualifiers);

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

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

Характеристики на задачата.

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

Елементи на формуляр.TableField.CreateColumns();

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

Всичко това беше в редовното приложение. В управлявано приложение всичко се е променило. Не е толкова лесно да създадете произволна таблица. Сега трябва или да параметризирате твърдо таблицата със стойности във формуляра, или да я създадете програмно (за да опишете, добре, това всъщност е същността на самото управлявано приложение). Ето какво ще се опитаме да направим: софтуерсъздайте персонализирана таблица със стойности в управляван формуляр.

Разрешаване на проблема.

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

Създаването на таблица във формуляра става чрез описанието на таблицата със стойности като атрибут:
SelectionTypeArray = Нов масив; Масив от SelectionType.Add(Type("Таблица със стойности")); ChoiceTypeDescription = Ново описание на типа(ChoiceTypeArray);
Масив от детайли = Нов масив;
Масив от Attributes.Add(New Form Attributes("Schedule Table", Description of SelectionType, "", "TZN"));
Сега трябва да създадем
програмна таблица
стойности, които съдържат данните. Ако таблицата със стойности се получава от заявка, тогава всичко е повече или по-малко наред. Ако таблицата е създадена ръчно, тогава значението на колоните, които ще съдържат числа или дати, може да бъде създадено чрез „Описание на типовете“. Въпросът е, че колоните в таблицата със стойности трябва да имат някакъв тип. Ако например се очаква, че потребителят ще попълни данните в тези колони интерактивно, тогава не можете да добавите колона от таблицата със стойности просто с име; тя трябва да има тип. Имайте предвид - това е много важно, защото... Ще прехвърлим тези типове в таблицата на формуляра.
Създаваме таблица, която съдържа няколко колони:

CD = NewDateQualifiers(DateParts.Time);
EndCycle;
ChangeDetails(ArrayDetails);
SelectionFieldsTable = Elements.Add("TZN", Type("FormTable"));
SelectionFieldsTable.DataPath = "ScheduleTable";
SelectionFieldTable.Display = TableDisplay.List;

Това е проста комбинация и масата ни е готова.

За всяка колона от цикъла на колоните TK

NewElement = Elements.Add(Column.Name, Type("FormField"), SelectionFieldTable);
NewElement.View = FormFieldView.InputField;
NewElement.DataPath = "ScheduleTable." + Име на колона;
NewElement.Width = 10;
EndCycle;

Условен дизайн, ако имаме нужда, също го пишем ръчно, командното меню - ръчно. Табличните манипулатори също се изписват на ръка. Например, за да добавите манипулатор на събитие за таблицата „Избор“:

Таблица на SelectionFields.SetAction("Selection","TZNSelection");

За обработка на това събитие е предписана отделна процедура под формата на процедура:

&На клиент
Процедура TKNSelection(TK, SelectedRow, Field, StandardProcessing)
//обработващи команди EndProcedure

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

&На клиент

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

ValueВFormAttributes(ToR, "ScheduleTable");

Ето какво имаме в резултат:


И ето обработката на събитието "Избор":



Послеслов.

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

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