1c динамичен списък как да получите стойност на низ. Получаване на данни от динамичен списък

1c динамичен списък как да получите стойност на низ. Получаване на данни от динамичен списък

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

За да демонстрираме възможностите на динамичен списък, нека създадем външна обработка, добавете основната форма. Нека добавим към формата нов атрибут с тип "Динамичен списък". Нека отидем до имотите му и да видим какво има там.
Интересуваме се от имота "По поръчка". Активирането му ще ни покаже всички възможности на динамичния списък. Ще можем да напишем заявка, използвайки почти всички функции на езика за заявки на системата 1C: Enterprise. Поставете отметка в квадратчето и щракнете върху връзката „Отвори“:

По подразбиране нашият списък ще покаже списък с артикули с общ баланс за всички складове. За да приложите такъв списък, добавете следната заявка:


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

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


За да го премахнете, трябва да зададете стойността на параметъра "Период". За да направите това, можете да използвате метода "SetParameterValue" от колекцията "Параметри" на динамичния списък. Методът приема два параметъра:
. "Параметър" - Тип: String; DataCompositionParameter. Името на параметъра или параметъра за съставяне на данни, чиято стойност трябва да бъде зададена;
. "Стойност" - Тип: произволна. Стойността, която трябва да бъде зададена.
Може да се извика в манипулатора "OnCreateOnServer" на формуляра:

Имате въпрос, имате нужда от помощта на консултант?


Нека да дадем възможност на потребителя да променя периода за получаване на салда. За да направите това, нека добавим атрибута и свързания с него елемент от формуляра „Дата“:


В манипулатора "OnChange" на елемента на формуляр "Date" извикайте метода "SetParameterValue", като предавате стойността на свързания атрибут като стойност. По същия начин ще променим процедурата "На CreationAtServer" на формуляра. Тъй като методът е наличен на клиента, няма нужда да се обаждате на сървъра:


Сега, когато датата се промени, балансите ще се актуализират автоматично:




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


При промяна на стойността на превключвателя, ние ще променим текста на заявката. За да направим това, ще използваме манипулатора на събитие "OnChange" на елемента на формуляра "DisplayQuantityToReceipt". Трябва да променим свойството "QueryText" на динамичния списък в зависимост от стойността на атрибута. защото даден имотне е наличен на клиента, изисква се извикване на сървърна процедура:


Резултатът от направените промени:



Домашни бележки от огледалото

21.04.2014 г. Получаване на данни от динамичен списък

Внедрено във версия 8.3.6.1977.

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

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

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

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

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

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

Сега тази задача се решава лесно. Таблицата с динамичен списък има два нови метода:

  • GetExecutableDataCompositionSchema();
  • GetExecutableDataCompositionSettings().

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

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

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

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

Платформата 1C:Enterprise 8.2 може да работи с множество записи в таблица на база данни по динамичен начин, т.е. може да чете данни на парчета. По-рано в статиите разгледахме механизма на динамичните списъци и методите за оптимизиране на работата с тях.

Днес ще решим една нестандартна задача за динамични списъци.Ще трябва да изчислим общата сума за атрибута на документа „Сума“ и да я покажем в долния колонтитул на списъка. По същия начин изчислете средната стойност за полето "Рейтинг" и също го покажете в долния колонтитул на динамичния списък. Изчисляването на общите полета трябва да вземе предвид избора, потребителски наборв настройките на списъка с документи.

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

Внедряване

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

Форма и интерфейс

Първо, нека подготвим формуляр на документ за показване на крайните полета. За да направите това, нека добавим два низови атрибута от формата "Рейтинг" и "Сума".

Тези подробности ще съдържат общите стойности за документите.

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

Сега трябва да решите за кое събитие ще се актуализират резултатите в долния колонтитул на списъка. За удобство на разработката нека добавим командата "Актуализиране" и съответния елемент на формуляр към командния панел. Когато тази команда бъде изпълнена, сумите ще бъдат актуализирани.

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

Алгоритъм

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

Забележка: Настройките на динамичния списък (вижте екранната снимка по-горе) се основават на механизмите на системата за съставяне на данни (ACS). Съответно можете да работите с тях по подобен начин (програмно добавяне, промяна, четене и т.н.).

Стъпките за генериране на заявка за получаване на резултатите са както следва:

1. Вземете първоначалната заявка за динамичен списък.

Както виждаме, заявката избира всички детайли на документа. За малко усложнение добавих собствено поле "LevelRating", образувано от конструкцията "CHOICE".

2. Формираме текста на условията на заявката (секция „КЪДЕ“) и го заместваме в оригиналната заявка.

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

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

Ако елементът има флаг за използване (свойство „Използване“), тогава елементът се обработва. Генерираният текст също зависи от условието за сравнение (Равен, не е равен, в списъка и т.н.). Зависимостта на генерирания текст на условието от типа сравнение може да се види в следната функция.

Друга интересна според мен функция е "GetFieldTextOnView". Това е необходимо, за да се заменят полета в условията на заявката, които се формират от изрази на езика на заявката. По-горе добавих полето "LevelRating" към оригиналната заявка. Ако потребителят ще го използва в селекцията, тогава целият израз трябва да бъде заменен в условието на заявката. Тази функцияполучава текста на полето от заявката чрез неговото представяне. За такива сложни полета ще върне целия текст на израза.

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

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

3. Поставяме първата заявка във временна таблица и извършваме групиране по обобщени полета с необходимите агрегатни функции.

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

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

Оптималност на решението

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

Освен това, изчисляването на резултатите, можем да направим заявка само от страна на сървъра. Следователно трябва сериозно да подходите към заявката към сървъра, тъй като процедурата за актуализиране на сумите може да се извършва много често. Представете си регистър на проверките на KKM в търговска организация, където могат да се въвеждат до 5 проверки на минута и до 300 проверки на час. Всеки път, след като документът е написан, ще се извиква актуализацията на общите суми. Следователно би било разумно да се намали предаваният трафик чрез използване на процедури извън контекста.

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

Първият параметър е изборът на динамичен списък, вторият е структурата от типа "FilterFieldNameFilterFieldValueType". Имайте предвид, че първият параметър във функцията се получава като самостоятелна стойност. Не мога да кажа точно защо, но ако прехвърлите селекцията като връзка, платформата дава грешка, че селекцията не може да бъде променена. Грешката може да бъде заобиколена само по този начин.->

Забележка: използването на процедури извън контекста ви позволява да намалите количеството на предавания трафик няколко пъти, тъй като данните от формуляра не се предават на сървъра, за разлика от процедурите на контекстния сървър (директивата "&AtServer").

Заключение

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

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

Въпреки това, методът, описан в статията, се прилага при решаване на проблеми.

Изтегляния:

Печат (Ctrl+P)

динамичен списък

1. Обща информация

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

Ориз. 1. Опции за създаване на динамичен списък

Когато създавате атрибут на формуляр тип Динамичен списъкРазработчикът може да избере два начина за запитване на данните:
● Като посочите главната таблица – в този случай е достатъчно само да посочите таблицата (свойство Main table), от която искате да получите данни, и системата автоматично ще генерира заявка към данните (вижте дясната страна на фиг. 1).
● Ръчно генериране на заявка – за целта трябва да зададете свойството Custom request (вижте лявата страна на фиг. 1). След това ще бъде достъпно ръчно генериране на заявка за получаване на данни от информационната база.
Със заявка можете да изберете данни от множество таблици, така че да можете да посочите основна таблица. Това е необходимо, за да може динамичният списък да определи кои данни са първични и кои вторични и да може правилно да избира и показва информация, както и да предоставя стандартни команди. Ако обаче е невъзможно да се определи основната таблица в заявката, тогава тя може да бъде пропусната, но тогава
динамичният списък няма да предоставя команди, свързани с основната таблица. Освен това в този случай (без да се посочва основната таблица) ефективността на получаване на данни чрез динамичен списък ще бъде значително намалена.
За да се подобри производителността, се препоръчва всички съединения, които се използват в произволна заявка само за извличане на допълнителни данни, да бъдат направени незадължителни чрез използване на разширение на езика за заявки на системата за композиране на данни.
За динамичен списък, който е основният атрибут на формуляра, е възможно да зададете стойностите за избор с помощта на параметъра на формуляра Избор. За да направите това, е необходимо името на свойството на структурата, което е в параметъра Избор,
съответства на името на полето за избор на динамичен списък. В този случай стойността на свойството структура ще бъде зададена като правилната стойност на елемента за избор. Ако масив, фиксиран масив или списък със стойности се предава като стойност на елемент от параметъра за избор на форма на динамичен списък, тогава условие с опцията В списъка се добавя към селекцията, в дясната стойност на която се поставя списъкът със стойности (към които се преобразуват масивът и фиксираният масив).
Произволна заявка в динамичен списък може да бъде заявка, в която параметър се използва за генериране на стойността на поле, например:

ИЗБИРАМ
ИЗБОР
WHEN Delivery.Factor = 1 THEN &Подаване
ИНАЧЕ Доставка. Коефициент
END AS Коеф
ОТ

В този случай, ако типът стойност на параметъра се различава от типа атрибут на обекта (например, Реквизит1има тип Номер, а стойността на параметъра е типът Линия), тогава за да покажете правилно полето, трябва изрично да прехвърлите стойността на параметъра към желания тип:

ИЗБИРАМ
ИЗБОР
WHEN Delivery.Factor = 1 THEN EXPRESS(&Representation AS String(100)) ELSE Delivery. Коефициент
END AS Коеф
ОТ
Document.DeliveryProducts AS Доставка

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

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

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

2. Ограничения и характеристики

Когато задавате филтър в динамичен списък, не забравяйте, че филтърът не засяга групите, ако режимът на показване за динамичния списък е йерархичен списък или дърво. Под "групи" се има предвид елемент от справочник или план от типове характеристики, в който свойството ThisGroup е зададено на True.
Прилагат се филтри, автоматично прилагани от динамичния списък към стандартните атрибути Owner, Parent, Date, Period и ThisGroup
стандартни средствасистеми за съставяне на данни. Филтрите, автоматично прилагани от динамичен списък към ключови полета, могат да се прилагат както чрез стандартни средства на системата за съставяне на данни, така и чрез директно добавяне на условие към текста на заявката INна полетата на основната таблица. В резултат на използването на филтри от инструментите за оформление, те могат да се прилагат както във вложени заявки, така и в параметри на виртуална таблица.

Когато разработвате динамични списъци, добра идея е да тествате всички динамични списъци с персонализирани заявки. По време на процеса на проверка трябва да се уверите, че ако заявката за списък съдържа вложени заявки или виртуални таблици и полета с псевдоними, които съответстват на псевдонимите на стандартните атрибути Owner, Parent, Date, Period, ThisGroup или ключови полета са налични за избор, тогава тези полета са валидни, съвпадат със стандартните атрибути, с които имат същия псевдоним. Ако това не е така, трябва да промените заявката, така че да съвпадат или
псевдонимът е различен.
Ако е избрано ръчно генериране на заявка, тогава върху заявката се налагат някои ограничения:
● Използването на клаузата FIRST в заявка за динамичен списък не се поддържа. Ако е необходимо да се използва селекция в динамичен списък, който е ограничен от броя на записите, заявката за генериране на динамичен списък трябва да бъде преработена по такъв начин, че действителното съдържание на заявката да бъде поставено в подзаявка и да ограничи брой записи, получени в тази подзаявка. Можете също да използвате временна таблица вместо подзаявка.
● Филтрирането, сортирането и групирането не се поддържат:

  • По подробности таблични части.
  • Преглед на полета.
  • Поле DataVersion.
  • Полето PredefinedDataName.
  • Тип таблица на полето Сметкоплан.
  • Полето MovementType на таблицата с регистър на натрупване.
  • Тип на полето Стойности на таблицата с типове характеристики план.
  • Поле от тип Тип;
  • Поле от тип String (неограничена дължина).
  • Поле от тип BinaryData.

● Не се поддържа сортиране и групиране по полета на Subconto<НомерСубконто>и въведете Subconto<НомерСубконто>Таблици MovementsSubconto счетоводен регистър.
● Групиране по полета, които съдържат изрази на език за заявки агрегатни функции.
● При избрана основна таблица заявката за динамичен списък има следните ограничения:

  • Присъединяванията не се поддържат.
  • Използването на секцията ORDER BY не се поддържа. Трябва да използвате заявка без основна таблица или да зададете необходимото подреждане чрез настройките на динамичния списък.

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

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

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

● Подконто таблица на счетоводния регистър;
● всички виртуални таблици на счетоводния регистър, с изключение на таблицата MovementsSubconto;
● таблици с постоянни стойности (включително таблицата на константите);
● таблици на външни източници на данни без ключови полета;
● кубични таблици на външни източници на данни;
● регистрационни таблици за натрупване:

  • оборотна таблица;
  • маса за баланс;
  • таблица на оборотите и балансите.

● таблици с регистър на изчисленията:

  • действителна периодична таблица на валидност;
  • графични данни;
  • основни данни.

● Таблици на таблични части на обекти;
● Регистрационни таблици за промени (използвани в механизмите за обмен на данни);
● Таблици на последователности;
● Таблици за преобразуване (използвани в механизми за повтарящи се сетълменти).
● Таблица, която се използва само във външно съединение в заявка.

С други думи, динамичен списък с определена основна таблица ще работи правилно, ако в резултат на изпълнение на заявка,
посочен като източник на данни, броят на получените редове от основната таблица не се увеличава (като се вземе предвид наложената селекция). Ако в резултат на изпълнение на заявката броят на редовете, получени от заявката от главната таблица, се увеличи, това ще доведе до нарушаване на уникалността на ключа за запис на таблицата, показана от списъка. В този случай трябва да деактивирате използването на основната таблица с динамичен списък.
Когато работите с динамичен списък, е необходимо да се вземат предвид правата за достъп до детайлите, показвани от списъка:
● Данните от колоните на динамичния списък, които са маркирани със свойството Използвай винаги, но за които текущият потребител няма право на преглед, не се прехвърлят към страната на клиента. Достъп до данните на такива колони (използвайки свойството CurrentData и метода RowData())
от страна на клиента не е възможно.
● Ако текущият потребител няма право на преглед върху ключово поле на динамичен списък, получаването на данни от този динамичен списък води до грешка при нарушение на достъпа.
За динамичен списък, който показва списък с изброяване, няма начин за интерактивно персонализиране на списъка.
Съставът на колоните и настройките на динамичния списък са свързани с полетата на заявката чрез псевдонимите на полетата за избор. Ако псевдонимът за полето за избор не е изрично посочен в заявката и полето е системно поле, тогава името на полето за английската версия на вградения език се използва като псевдоним.
Посочената връзка означава, че когато промените (или изрично посочите псевдоним за поле, което използва автоматичен псевдоним)
псевдоним на полето за заявка, което генерира данни от динамичен списък, настройките на атрибута на динамичния списък ще бъдат загубени, елементите на формуляра ще „загубят“ показаните атрибути, настройките на динамичния списък ще станат неправилни и т.н.
В случай, че източникът на данни на динамичен списък е таблица (обикновена или виртуална), която ви позволява да зададете избора по период, тогава, ако потребителят зададе периода на показване в такъв динамичен списък (Интервалът за задаване на дата .. .команда),
посочените граници на периода ще бъдат зададени като стойности за избор или параметри на виртуална таблица. Ако средствата за разширяване на езика
заявките за системата за съставяне на данни изрично указват имената на параметрите на виртуалната таблица - параметрите ще бъдат зададени с посочените
имена. Таблици, за които е възможно да се контролира периодът за показване или обработка на данните:
● таблици от регистри (основни или виртуални), за които има възможност за избор по период (за изчислителния регистър - по периода на регистрация);
● основни таблици с документи, бизнес процеси и задачи;
● основни таблици на дневниците на документи;
● таблици на главни последователности, таблици на граници на последователности.
Параметърът на заявката на динамичен списък може да бъде масив или списък със стойности. Ако обаче параметърът е списък със стойности, тогава само първата стойност от списъка ще се използва като стойност на филтъра. Ако динамичният списък използва заявка с параметри, първоначална инсталациястойностите на параметрите трябва да се изпълняват в манипулатора OnCreateAtServer.
Когато показвате данни от динамичен списък, имайте предвид следните функции:
● Кога промяна на програматасвойства на динамичен списък не попълва автоматично командните ленти, свързани с
с този динамичен списък.
● Ако няколко полета са групирани в група с режим на групиране В клетката и в групираните полета има поле, което се показва с квадратче за отметка, тогава това квадратче за отметка винаги ще се показва първо в получената клетка (отляво на текста ).
В динамичен списък, когато се дефинира типът данни за полета, чиито изрази включват параметри, полета или литерали, полученият тип се определя от типовете на полетата и литералите. Ако типът стойност на параметъра не е включен в получения тип данни, неговата стойност ще бъде съкратена.
Например в следващия пример полето ще бъде от тип Number.

ИЗБОР
КОГАТО Е НЕВЯРНО
ТОГАВА 5
В ПРОТИВЕН СЛУЧАЙ
&Параметър
КРАЙ

Ако присвоите стойност от различен тип на параметъра Parameter, динамичният списък за това поле ще получи стойност 0 (стойността по подразбиране за типа Number).
Ако в такава ситуация е необходимо да изберете параметър от различен тип, препоръчително е да използвате конструкцията на езика за заявки ЕКСПРЕСНО. Например,
ако в горния пример искате да предадете низ не по-дълъг от 100 знака към параметъра, тогава трябва да замените простата индикация на параметъра с израз с явно преобразуване на типа:

ИЗБОР
КОГАТО Е НЕВЯРНО
ТОГАВА 5
В ПРОТИВЕН СЛУЧАЙ
EXPRESS(&Параметър AS String(100))
КРАЙ

Ако параметрите се използват в изразите на полетата за избор в свободния текст на заявката за динамичен списък, трябва изрично да посочите типа на параметрите, като използвате конструкцията ЕКСПРЕСНО. Например, вместо &Номенклатура КАТО номенклатураизползване
EXPRESS(&Номенклатура AS Директория.Номенклатура) AS Номенклатура. В противен случай търсенето през лентата за търсене може да работи.
неправилни или хвърлят грешки.

3. Методи за получаване и кеширане на данни с динамичен списък

Когато получава данни за показване, динамичният списък използва един от трите метода:
1. Четенето от базата данни се извършва на партиди, като броят на елементите от данни леко надвишава броя на редовете, показвани едновременно от списъка (но не по-малко от 20). Данните не се кешират на сървъра.
2. Четенето от базата данни се извършва на страници от 1000 елемента с данни. Данните се кешират на сървъра. Йерархичните данни се кешират: не повече от 2 страници с елементи се кешират за всеки родител. Не повече от 20 страници с артикули се кешират на динамичен списък. Кеширането ще бъде активирано от динамичен списък за следните таблици:
● Критерии за подбор;
● Всички таблици на счетоводната книга, с изключение на основната таблица и таблицата MovementsSubconto;
● Всички таблици на натрупващия регистър, с изключение на основната таблица;
● Всички таблици на информационния регистър, с изключение на основната таблица;
● Всички таблици на изчислителния регистър, с изключение на основната таблица;
● Виртуална таблица TasksBy Performer;
● Таблици на външни източници без ключове;
● Кубове с външен източник.

3. Четенето от базата данни се извършва на страници от 1000 елемента. Първата част е равна на 1 страница. Всяка следваща порция се увеличава с 1 страница (при достигане на края на предишната проба). Колкото повече се приближава "гледната точка" до края на показаните данни, толкова по-голяма селекция се чете от базата данни, като границата става равна на всички показани данни. Данните се кешират на сървъра. Максималният брой записи в кеша и динамичния списък е 1 000 000.
В зависимост от това какво е избрано от основната таблица на динамичния списък и каква стойност приема свойството Dynamic Read, се използва един или друг метод за четене на данни:

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



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

● Свойство за динамично четене:
● Инсталирано: Използва се метод 1 (методите са описани по-горе).
● Нулиране: Използва се метод 2 (методите са описани по-горе).

● Като свойство на главната таблица е зададена таблица с критерии за избор или таблица със задачи по изпълнител (TasksBy Executor):
● Ключ, който идентифицира ред в таблица: Връзка.

● Свойството Main table е зададено на виртуалната таблица SliceFirst или SliceLast на информационния регистър:
● Ключ, който идентифицира ред на таблица: RecordKey.
● Свойството Dynamic Read не е приложимо.
● Използва се метод 2 (методите са описани по-горе).

● Свойството Main Table е зададено на едно от виртуални масирегистри, различни от изброените по-горе:

● Свойството Dynamic Read не е приложимо.

● Свойството Main table не е посочено, използва се произволна заявка:
● Ключ, който идентифицира ред в таблица: Число.
● Свойството Dynamic Read не е приложимо.
● Използва се метод 3 (методите са описани по-горе).

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

4. Настройки на динамичен списък

Свойство за настройки на списъка – щракването върху хипервръзката Отвори отваря формата за настройки за показване на динамичен списък. Настройката на списъка се извършва по същия начин като подобни операции в системата за съставяне на данни.


Ориз. 2. Условен стил на динамичен списък

При настройване на динамичен списък в конфигурацията, разработчикът на приложеното решение има възможност да направи следното:
● задайте полетата, по които да се извършва поръчката;
● описват избора на данни в списъка;
● задайте настройки за условно форматиране;
● задайте полетата, по които искате да групирате данните.
Има смисъл да зададете сортирането на разработчика, ако сортирането по подразбиране, зададено от системата, не е подходящо.

СЪВЕТ.Трябва да се помни, че лошият избор на полета за сортиране (както и изборът и групирането на данни) се отразява негативно на ефективността на динамичното вземане на проби.
От гледна точка на разработчик на приложения, настройките на динамичния списък се състоят от няколко части, които са свързани помежду си. Основното свойство, чрез което можете да контролирате настройките на динамичен списък, е LinkerSettings. Този обект съдържа три набора от настройки, които, когато системата работи, определят крайните настройки, приложени към динамичния списък:
● Настройки - настройки, създадени в режим Конфигуратор. Свойството динамичен списък на поръчката предоставя бърз достъпкъм свойството Settings.Order на създателя на настройките на динамичния списък, така че следните конструкции са еквивалентни:
List.Order и List.SettingsComposer.Settings.Order;
● UserSettings са настройките, които потребителят може да променя в режим 1C:Enterprise;
● FixedSettings - Тези настройки се задават от вградения език. Това свойство също съдържа стойности за избор, които се предават на формуляра с помощта на неговите параметри. Свойствата на динамичния списък Филтър, Параметри, Условен външен вид осигуряват бърз достъп до фиксираните настройки на създателя на настройките на динамичния списък. С други думи, тези повиквания са еквивалентни:
List.SettingsComposer.FixedSettings.Filter и List.Filter.
При формиране на окончателната настройка на динамичния списък се комбинират различни настройки, както следва:
● Ако някакъв вид настройки е изцяло маркиран като дефиниран от потребителя, тогава потребителските настройки се включват в получените настройки
(List.SettingsComposer.UserSettings). В този случай, ако някои елементи на настройките са маркирани като недостъпни, тогава тези настройки ще бъдат поставени в получените настройки от свойството List.Settings Composer. Настройки.
● Ако някой тип настройки е маркиран като специфичен за потребителя не изцяло, а елемент по елемент, тогава:
● Елементите, маркирани като персонализирани, ще бъдат включени в получените настройки от свойството List.SettingsComposer.CustomSettings.
● Елементите, маркирани като недостъпни, ще бъдат включени в получените настройки от свойството List.SettingsComposer.Settings.
● Фиксираните настройки (List.SettingsComposer.FixedSettings) се добавят към получените настройки „както са“. В същото време ситуацията е неприемлива, когато фиксираните и потребителските настройки съдържат настройки с едно и също име, например избор със същата лява стойност в условието.

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


Ориз. 3. Управление на включването в потребителските настройки

Квадратчето за отметка в долната част на прозореца (вижте фиг. 3) е отговорно за поставянето на целия тип настройки в настройките (обикновени или бързи). Тази функция е достъпна за избор, ред, групиране и условен стил. Ако настройките са зададени с режим на редактиране Бърз избор, тогава в свойството Група потребителски настройки на таблицата с формуляри, показваща динамичен списък, трябва да посочите празна група формуляри, в която ще бъдат разположени елементите, свързани с бързите потребителски настройки на динамичния списък. Ако групата не е посочена, бързите потребителски настройки няма да се показват във формуляра. Също така е възможно изрично да се извика създаването на потребителски настройки с помощта на езика 1C:Enterprise, като се използва методът CreateUserSettingsFormItems() на разширението на динамичния списък.
Възможно е също така да изберете възможността за поставяне на конкретни елементи от настройките в потребителските настройки. Тази функция е достъпна за избор и условни елементи на дизайна (вижте фиг. 3).

Ако е необходимо да се заредят специални настройки при отваряне на динамичен списък, това може да стане по два начина:
● Използване на параметъра на формуляра за динамичен списък CustomSettings. Данните, съдържащи се в този параметър, ще бъдат поставени в потребителските настройки на динамичния списък.
● Използване на параметъра на формуляра за динамичен списък UserSettingsKey. Ако посочите този параметър при отваряне на формуляра, тогава потребителските настройки, намиращи се в хранилището за настройки с посочения ключ, ще бъдат заредени в динамичния списък, който е основният атрибут на формуляра.

5. Търсете в динамичен списък

Динамичният списък, намиращ се на формата, дава възможност за извършване на интерактивно търсене в показаните данни. Търсенето може да се извърши с помощта на следните инструменти: низ за търсене, диалогов прозорец за търсене, търсене на текущата стойност, използване на хронологията на търсенето и задаване на периода (за динамични списъци, показващи документи). Резултатът от търсенето е ограничен набор от записи
динамичен списък (от наличните даден потребител), които отговарят на критериите за търсене.
Има три свойства на таблица за контролиране на възможностите за търсене в динамичен списък управлявана форма, който показва динамичен списък:
● Позиция на низа за търсене - определя позицията на низа за търсене. Може да приема следните стойности: Auto, Command Panel, No, Top, Bottom.


Ориз. 4. Лента за търсене в динамичен списък

Ако стойността на това свойство е зададена на Командна лента, тогава лентата за търсене ще се покаже в командната лента на формуляра (ако динамичният списък е основният атрибут на формуляра) или в командната лента, свързана с динамичния списък. Лентата за търсене, поставена в командната лента, винаги се натиска в десния край на командната лента (заедно с бутоните, разположени вдясно от лентата за търсене).
Ако свойството е зададено на Не, тогава низът за търсене ще отсъства във формуляра и ще се отвори диалогов прозорец, когато започнете да въвеждате низа за търсене.
Ако свойството е зададено на Top, тогава лентата за търсене ще бъде разположена между командната лента на списъка и таблицата, показваща динамичния списък. Ако свойството е зададено на Bottom, тогава низът за търсене ще бъде поставен непосредствено след таблицата, показваща динамичния списък.


● Ако свойството Режим на съвместимост е зададено на Не използвайте или е по-старо от Версия 8.3.4, стойността е Команден панел.
Преходът към лентата за търсене се извършва, както следва:
● Чрез натискане на клавишната комбинация Ctrl+F;
● Мишка;
● Когато започнете да въвеждате в динамичен списък (въз основа на стойността на свойството SearchOnType на динамичния списък).
● Позиция на състоянието на преглед - описва къде ще се покаже състоянието на преглед: кои полета са търсени и какви стойности
търсени във всяка област. Може да приема следните стойности: Auto, None, Top, Bottom


Ориз. 5. Статус на търсене в динамичен списък

Ако свойството е зададено на Не, тогава състоянието на изглед няма да присъства във формуляра. В резултат на това ще бъде възможно да се определи дали търсенето е извършено или не само чрез наличието на бутона Отказ от търсенето.
Ако свойството е зададено на Top, тогава състоянието на изглед ще бъде разположено между лентата с команди на списъка и таблицата, показваща динамичния списък. Ако свойството е зададено на Bottom, тогава състоянието на изглед ще бъде поставено непосредствено след таблицата, която показва динамичния списък.
Ако формулярът е създаден в 1C:Enterprise версия 8.3.4 и по-стари, свойството е зададено на No. Ако формулярът е създаден в 1C:Enterprise версия 8.3.5 и по-нова, свойството е зададено на Auto. Реалната стойност на имота в този случай ще се определи, както следва:
● Ако свойството Режим на съвместимост е зададено на Версия 8.3.4 (и по-ниска) – Не;
● Ако свойството Режим на съвместимост е зададено на Не използвайте или е по-старо от Версия 8.3.4, стойността е Топ;
● Позиция на контрола за търсене - определя къде ще се показва бутонът за контрол на търсенето. Бутонът отваря меню, което съдържа следната информация: Търсене по команди текуща стойност, Разширено търсене, Отмяна на търсенето, Задаване на период (за списъци с документи и дневници) и история на заявките за търсене (последните 5 заявки). Свойството може да приема стойности: Auto, No, Command panel.


Ориз. 6. Управление на търсенето в динамичен списък

Ако свойството е зададено на Не, тогава контролният бутон за търсене няма да бъде във формуляра (но командите ще бъдат достъпни чрез менюто Още). Стойността на свойството Command Bar поставя бутон в командната лента, свързан с таблица, която показва динамичен списък.
Ако формулярът е създаден в 1C:Enterprise версия 8.3.4 и по-стари, свойството е зададено на No. Ако формулярът е създаден в 1C:Enterprise версия 8.3.5 и по-нова, свойството е зададено на Auto. Реалната стойност на имота в този случай ще се определи, както следва:
● Ако свойството Режим на съвместимост е зададено на Версия 8.3.4 (и по-ниска) – Не;
● Ако свойството Режим на съвместимост е зададено на Не използвайте или е по-старо от Версия 8.3.4, стойността е Команден панел;
Ако във формуляра има няколко командни панела, източникът на команди за които е една таблица на управлявания формуляр (показваща данни от динамичен списък), тогава низът за търсене и контролният бутон за търсене ще бъдат разположени само в един команден панел:
● Или в командната лента на самия динамичен списък (ако автоматично завършване)
● Или в някой от останалите командни панели.

Обмислете характеристиките на използването на търсене в динамичен списък:
● За да направите търсенето удобно за използване (включително по отношение на производителността), трябва да активирате пълнотекстово търсене за всички конфигурационни обекти, които могат да се използват като основна таблица на динамичен списък. Освен това търсенето в пълен текст трябва да включва всички подробности за конфигурационни обекти, които могат да бъдат показани в динамичен списък и за които може да се наложи търсене.
Ако обектът е изключен от пълнотекстово търсене, тогава въпросният механизъм за търсене ще работи, но производителността на такова търсене ще бъде изключително ниска. Не се препоръчва да се използва търсене на обекти, които не са индексирани чрез пълнотекстово търсене.
● Приложното решение трябва да има рутинна задача, който редовно актуализира индекса за търсене в пълен текст.

● Търсенето се извършва не във всички колони на динамичния списък (и конфигурационния обект), а само в тези колони, които се показват в таблицата.
● Търсене в динамичен списък по полета от референтни типове с произволно представяне се извършва от полета, които се използват за
формиране на представителство (виж тук). Полетата, включени в изгледа, се получават, като се вземе предвид манипулаторът ViewFieldsGetProcess() на съответния обект.
● За динамични списъци с определена основна таблица се използва пълнотекстово търсене спрямо основната таблица. Всички неиндексирани връзки от главната таблица ще бъдат добавени към резултатите от пълнотекстово търсене. Резултатът от пълнотекстовото търсене на основната таблица се използва като филтър по ключови полета. Извършва се и пълнотекстово търсене на полета, показани в списъка от други таблици (ако се използва пълнотекстово търсене за полето и конфигурационния обект). Без активирано търсене в пълен текст данните може да са
намерени, но самото търсене ще бъде много бавно.
Ако възникне грешка при опит за извършване на пълнотекстово търсене, търсенето ще се извърши без използване на пълнотекстово търсене.
Например, това може да се случи при търсене на една буква и Голям бройлинии в информационна базазапочвайки с тази буква.
● Ако за полето на основната таблица на динамичния списък се използва избор с тип сравнение Равно, тогава при извършване на пълнотекстово търсене, заявка за търсенеспоред тази таблица стойността на избора ще бъде добавена.
● Низът за търсене е разделен на думи. Това разделяне се извършва съгласно следните правила:
● Редът е разделен с помощта на интервали и табулатори като разделители.
● След това всеки получен фрагмент се обработва:
● Ако фрагментът е представяне на дата (с или без време) въз основа на текущия локал на сесията, тогава фрагментът е думата.
● В противен случай фрагментът се разделя допълнително, като се използват знаците “,.-/\” като разделители. В този случай всеки получен фрагмент от низа се приема като дума.

● За всяка дума се формира собствен набор от условия, които се комбинират „по ИЛИ“. Този набор от условия се генерира, ако пълнотекстово търсене за дадена дума в таблицата, от която е получено това поле, е върнало поне един обект или ако пълнотекстово търсене не е използвано за това поле. Условията се формират както следва:
● За поле от тип String условието е FieldName LIKE %Word%.
● За поле от тип Number, условието е FieldName=Value, където Value е дума, която е преобразувана в Number. Ако прехвърлянето не може да се извърши, търсенето на полето няма да се извърши.
● Думата се търси като подниз в представянето по подразбиране на булевия тип, дефиниран за текущата сесия. Ако думата за търсене бъде намерена в изглед, тогава се извършва търсене за стойността, съответстваща на изгледа, в който е намерена думата. В същото време изгледите, които са посочени чрез свойството Format form element element, не се използват за търсене.
● За поле тип Дата условието е FieldName>=DayStart(Word) И FieldName<=КонецДня(Слово). Если Слово подобно дате, в которой год
посочена с една или две цифри, годината ще бъде преобразувана в текущия век и тази стойност ще бъде заменена в условието за търсене.
● За референтни полета търсенето се извършва върху полетата, използвани за формиране на представянето на връзката. Във всяко от тези полета търсете
извършва се съгласно описаните по-горе правила. Търсенето не използва полетата, използвани за формиране на произволно представяне на данни.
Наборът от условия за всяка дума се комбинира "чрез И".
● За стойности с водещи нули можете да търсите или в низ с водещи нули, или в низ, указан без водещи нули.
● Ако динамичният списък показва списък с документи или хронология на документи, зададеният интервал за изглед на списък също се показва в областта на формуляра, предназначена за показване на състоянието на изглед за желания динамичен списък.
● Командата за търсене по текуща стойност не е достъпна, ако основната таблица на динамичния списък е критерий за избор.
● Намерените фрагменти от линии се маркират, когато се показват в таблицата.
● Поддържа се само един низ за търсене на колона. Добавянето на нова дума за търсене за колона, която вече се търси, ще замени израза за търсене, вместо да добави двете думи за търсене.
● Ако формулярът няма добавка за елемент на формуляр на формуляра Показване на низ за търсене, свързан с таблица (свойството Източник на добавката на елемент на формуляр), която показва динамичен списък, след което натискане на клавишната комбинация Ctrl+F отваря диалоговия прозорец за търсене.


Ориз. 7. Диалогов прозорец за търсене

Ако формулярът има добавка на елемент на формуляр Показване на низ за търсене, свързан с таблица (свойството Източник на добавката на елемент на формуляр), която показва динамичен списък, тогава командата за разширено търсене трябва да се използва за отваряне диалоговия прозорец за търсене.
● Когато използвате диалоговия прозорец за търсене, имайте предвид следните точки:
● Отварянето на диалоговия прозорец за търсене чрез клавишна комбинация води до показване на стойността на текущата клетка в реда Какво да търсите, а стойността на бутона за избор Как да търсите е зададена на Точно съвпадение.

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

6. Получаване на данните, показани от динамичния списък

Когато използвате динамични списъци, може да се наложи да извършите различни действия върху данните, които в момента се показват от динамичния списък, като вземете предвид наложените филтри и приложеното търсене. Такива действия включват: обработка на показаната информация, например повторно публикуване на избрани документи или задаване на някои подробности за избрани обекти, генериране на списък с налични обекти (с дизайн и т.н.), например за отпечатване или записване в документ с електронна таблица.
За да получите данни, които се показват в динамичен списък, използвайте GetDataCompositionSchemeExecutable() и
GetDataCompositionSettingsExecutable().
Пример за извличане на данни:

Схема = Items.List.GetExecutableDataCompositionSchema();
Настройки = Items.List.GetDataCompositionSettingsExecutable();
Layout Layout Builder = Ново оформление на данни Layout Builder();
LayoutLayout = LayoutComposer.Run(схема, настройки);
CompositionProcessor = NewDataCompositionProcessor;
LayoutProcessor.Initialize(LayoutLayout);
OutputProcessor = Нов OutputProcessorofDataCompositionResultIntoSpreadsheetDocument;
Връщане на OutputProcessor.Output(CompositionProcessor);

Получаването на данни в колекция от стойности (таблица или списък със стойности) се извършва по подобен начин.
Получаването на данни от динамичен списък по този начин има редица характеристики, които трябва да се вземат предвид при разработването на приложни решения:
● Следният дизайн на таблица не се поддържа:
● Редуване на цвета на линиите;
● Заглавна снимка;
● мазе картина;
● Цвят на фона на мазето;
● Цвят на текста в долния колонтитул;
● Шрифт на долния колонтитул;
● Хоризонтално разположение в сутерена;
● Режим на парола.
● Условният външен вид, определен за управлявания формуляр, не се поддържа;
● При сортиране на йерархична таблица във възходящ ред по поле от тип Link, записите, съдържащи нулева връзка, винаги се поставят първи.