Мениджърът на временни таблици 1C 8.3 не е инсталиран.

Езикът за заявки 1C:Enterprise 8 ви позволява да използвате временни таблици в заявки. Използването на временни таблици помага за подобряване на производителността на заявките и прави сложните заявки по-лесни за четене.

Работата с временни таблици се осигурява от два компонента:

Обект на вградения език, Temporary Table Manager, който съхранява данни от временни таблици;
синтаксис на езика за заявки, който ви позволява да създавате нови временни таблици и да използвате съществуващи временни таблици.
Мениджър на временни таблици
Мениджърът на временни таблици е предназначен да управлява живота на временни таблици, създадени по време на работа на приложно решение.

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

Екземпляр на временен мениджър на таблици може да бъде създаден с помощта на конструктора New. Например:

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

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

Създаване на временни таблици
Временните таблици се създават с помощта на обекта Request на вградения език на 1C:Enterprise 8.

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

TemporaryTableManager = Нов TemporaryTableManager;
Заявка = Нова заявка;
Query.TemporaryTableManager = TemporaryTableManager;

Временна таблица може да бъде създадена от данни от база данни или от външен източник на данни (като таблица със стойности).

За да създадете временна таблица от данни от база данни, задайте обекта Query на мениджър на временна таблица и след това изпълнете заявка към база данни, като използвате ключовата дума PLACE, последвана от името на временната таблица, която да създадете. Ключовата дума PUT се намира след списъка за избор на заявка. Например:

ИЗБИРАМ
код,
Име
МЯСТО Временна таблица
ОТ Справочник.Номенклатура

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

Ако мениджърът на временни таблици не е инсталиран или мениджърът е бил затворен, ще се генерира грешка.

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

Ако трябва да създадете индекс за временна таблица, трябва да посочите ключовата дума INDEX BY в заявката, последвана от списък с полетата, върху които искате да изградите индекса.

Например:

ИЗБИРАМ
код,
Име
МЯСТО Временна таблица
ОТ Справочник.Номенклатура
ИНДЕКС ПО код

Полетата, по които се извършва индексирането, трябва да са в списъка за избор.

За да създадете временна таблица и да заключите данните от таблиците, на базата на които се създава временната, трябва да използвате конструкцията ЗА ПРОМЯНА, трябва да използвате конструкцията ЗА ПРОМЯНА.

Например:

ИЗБИРАМ
Invoice.Link,
Номер на фактура,
Датата на фактурата
МЯСТО Временна таблица
ОТ
Документ. Фактура КАТО Фактура
КЪДЕТО
Фактура.Връзка B(&Документи)

ЗА СМЯНА

За да създадете временна таблица на базата на външен източник, в текста на заявката в списъка с източници посочете името на параметъра, в който ще бъде поставен външният източник. Останалата част от синтаксиса е идентичен на нормалното създаване на временна таблица. Следното може да действа като външен източник:

Таблица със стойности;
таблична част;
резултат от заявката.
По-долу е даден пример за създаване на временна таблица въз основа на външен източник:

ИЗБИРАМ
код,
Име
МЯСТО Временна таблица
ОТ &външен източник КАТО външен източник

В този пример съдържанието на колоните „Код“ и „Име“ от външен източник, например таблица със стойности, предадени като параметър „ExternalSource“, ще бъде поставено във временната таблица „TemporaryTable“.

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

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

Премахване на временни таблици
За да изтриете временна таблица от мениджъра на временни таблици, използвайте ключовата дума DESTROY на езика на заявката, последвана от името на таблицата, която ще бъде унищожена. Например:

УНИЩОЖЕТЕ временна таблица

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

Здравейте всички! Или по-скоро на тези, които все още понякога разглеждат този блог :)

След доста дълго отсъствие поради работа на пълен работен ден, най-накрая реших да напиша още един пост.

Наскоро научих, че някои хора не знаят, че платформата 1C 8.3 има вграден инструмент за отстраняване на грешки във временни таблици. Появи се сравнително наскоро, в една от версиите на 1C 8.3.8 - „За получаване на данни“() се прилага към До временния мениджър на маса.

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

Всичко е съвсем просто.

1. Вземете временни таблици за заявки

Когато използваме отстраняване на грешки, първо изчисляваме списъка с временни таблици, Query.TemporaryTableManager.Tables. По този начин можем да получим списъка с таблици, генерирани от изпълняваната заявка:

2. Вземете временна таблица за отстраняване на грешки

След това получаваме достъп до временната таблица, от която се нуждаем за отстраняване на грешки, като добавим Get(<Индекс таблицы>)

3. Получаваме данните директно

Използването на метода GetData() ви позволява да получите колекцията от резултати от заявката директно за избраната временна таблица.

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

Query.TemporaryTableManager.Tables.Get(0).GetData().Unload()

Отстраняването на грешки по този начин ще отнеме по-малко време, отколкото използването на различни „патерици“ 😀

Това е всичко, добро развитие и весели празници!

PS. А за тези, които поддържат изчисляването на заплатите в предприятие (не само програмистите), напомням ви, че за тази тема е отделен отделен ресурс Pro-Zup.info.

Ако имате въпроси по тази тема, интересувате се от разширяване на възможностите на стандартната програма или имате предложения за отстраняване на неизправности, добре дошли на ресурса https://pro-zup.info/

Механизмът за заявки, който се появи във версия 7 на програмата 1C, стана все по-широко разпространен и все по-популярен с пускането на първите версии на 8-та платформа. Появата на управлявани формуляри и системи за съставяне на данни значително увеличи обхвата на този инструмент. За много начинаещи програмисти обаче е доста трудно да го овладеят.

Използването на обект, наречен „Диспечер на временни таблици“, ви позволява да:

  • Значително опростете текста на заявката;
  • Разбийте го на по-прости блокове;
  • Увеличете неговата четливост и структура.

Няколко думи за това как работи

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

  1. Създаване на мениджър;
  2. Попълването му;
  3. Четене на данни от таблици;
  4. Унищожаване на мениджъра и изчистване на масите.

Нека поговорим за всеки етап по-подробно.

Създаване на временен мениджър на таблици

За да дефинирате този обект, трябва да изпълните кода, показан на фиг. 1

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

Фиг.2

Попълване на мениджъра

В същата фигура 1 има ред, който прехвърля селекцията към временна таблица. Започва с оператора „Място“. Дестинацията е името на целевата таблица.

С помощта на „Query Builder“ този ред може да бъде създаден в раздела „Advanced“ Фиг. 3.

Фиг.3

За да направите това ви трябва:

  1. Задайте превключвателя „Тип заявка“ на позиция „Създаване на временна таблица“;
  2. Посочете името на получателя.

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

Можете да определите дали мениджърът е пълен с помощта на оператора Quantity(). Примерен ред: MVT.Tables.Quantity().

Четене на таблици на мениджъра

Следващата стъпка е да прочетете данни от съществуващи таблици в друга заявка. Тук има един проблем: създадената нова заявка не знае за съществуването на попълнената таблица, така че няма да се появи в прозореца „База данни“ на конзолата.

Трябва да се регистрира и създаде ръчно.

За да направите това, в раздела „Таблици и полета“ (фиг. 4) трябва да изпълните определена последователност от действия:

Фиг.4

  1. В менюто на прозореца „Таблици“ на този раздел щракнете върху бутона „Създаване на описание на временна таблица“;
  2. В прозореца, който се отваря, трябва да посочите името на полето и неговото описание (тип поле), както е посочено в съществуващата таблица;
  3. Необходимите полета или функции с тях трябва да бъдат преместени в третия прозорец на раздела.

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

Премахване на маси

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

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

  • Чрез посочване на ключова дума Destroy директно в текста на заявката;
  • Използване на метода Close(), приложен директно към мениджъра.

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

Използването на първата опция за изтриване на данни може да бъде указано изрично чрез написване на ред като „Destroy TableName“ в текста на заявката или чрез използване на раздела „Advanced“ (фиг. 2) на прозореца „Query Designer“.

Като превключите превключвателя в позиция „Унищожаване“ и посочите името на обекта, който трябва да бъде изтрит, можете да завършите това действие без никакви проблеми.

Трансфер (TK) по заявка

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

За да направите това, текстът на заявката трябва да съдържа ред като „Изберете * Поставете MVT от &Tz като раздел“. Чрез предаване на съществуваща таблица със стойности като параметър „TZ“ към заявката, ще получим обект, подходящ за по-нататъшна обработка в други заявки.

Единственото условие, което предотвратява предаването на TK като параметър, са имплицитно декларираните типове на неговите колони. Тоест, когато създавате TK колони, трябва да попълните втория параметър с ред като „New TypeDescription(“”)).

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

Пример

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

Вземете безплатно 267 видео урока за 1C:

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

Тези. Когато добавяте колона, трябва да посочите типовете данни като втори параметър, като използвате конструктора на обекта „Описание на типа“.

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

Задължително предупреждение е, че създадената таблица трябва да бъде поставена във временна таблица, в противен случай системата ще покаже съобщението: „Грешка при извикване на контекстния метод (Run): Съдържанието на обект с данни може да бъде извлечено само във временна таблица».

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

Това е, проблемът е решен.

Нека разгледаме няколко ситуации.

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

Нека създадем следната проста заявка с помощта на конструктора:

Съответно текстът на заявката ще изглежда така:

Но ние искаме да поставим резултата от заявката във временна таблица, която ще извикаме VT_Продукти, тоест пренесете нашата заявка в този формуляр

За да направим това, трябва да отидем до отметката Допълнително, задайте типа заявка на позиция Създаване на временна таблицаи попълнете полето за име на таблицата

Как да прочетем временна таблица от друга заявка

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

ManagerVT = Нов TemporaryTablesManager; Заявка = Нова заявка; Заявка. Текст = "ИЗБЕРЕТЕ | Продукти. Връзка |Поставете VT_Products| ОТ | Директория Продукти AS Продукти"; Заявка. TemporaryTablesManager = VTManager; Заявка. Изпълнение(); . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RequestVT = Нова заявка; Заявка за VT. Текст = „ИЗБЕРЕТЕ | VT_Products.Link| ОТ | VT_Products AS VT_Products"; Заявка за VT. TemporaryTablesManager = VTManager; Заявка за VT. Изпълнение(); . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

За да изберете данни от временна таблица, трябва да отидете в раздела Таблици и полетаНатисни бутона Създайте описание на временна таблицаи във формата, която се отваря, попълнете името на таблицата и нейните полета:

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

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

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

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



 

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