Начало - Антивируси
Фрагмент от последното чрез вложена заявка. Функция за получаване на моментна снимка на последните записи в информационния регистър

IN тестова конфигурацияРазполагаме с периодичен информационен регистър "Ценова номенклатура" със следните изходни данни:

Фигурата също така показва структурата на метаданните на регистъра. Както виждаме, регистърът съдържа измерението „Продукт“ с референтен тип „Продукти“, както и цифров ресурс „Цена“ и атрибут „OldPrice“.

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

Две опции за заявка

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

Заявка = Нова заявка; Заявка. Текст = "ИЗБЕРЕТЕ | | | | | | ОТРегистър на информацията. Номенклатури на цените. Парче от най-новото КАК ЦениНоменклатура Парче от най-новото |КЪДЕ |< = 50 " ;

PricesNomenclatureSliceLast. OldPrice

Обърнете внимание на условието в раздел "КЪДЕ". Това е основната грешка! Тази заявка няма да върне нито един запис и ето защо: когато използвате виртуални таблици, в нашия случай „Последен отрязък“, данните първо се извличат от базата данни според условията, описани във виртуалната таблица, и след това действията, описани в текст на заявката се извършва (групиране, условия в секцията "КЪДЕ", сортиране и др.).

За да разрешите проблема правилно, условието за атрибута „Стара цена“ трябва да бъде прехвърлено към условията на виртуалната таблица. Ето как ще изглежда правилният текст на заявката:

Заявка = Нова заявка; Заявка. Текст = "ИЗБЕРЕТЕ PricesNomenclatureSliceLatest. точка, PricesNomenclatureSliceLatest. продукт, PricesNomenclatureSliceLatest. Цена, Заявка. Текст = "ИЗБЕРЕТЕ | | | | | PricesNomenclatureSliceLatest. OldPrice< = 50 ) Регистър на информацията. Номенклатури на цените. SliceLast(, OldPrice"

КАК ЦЕНИНоменклатураРазрез Последни Сега заявката ще получи правилните данни, тъй като срезътпоследни цени

ще получи при спазване на условията за реквизита “Стара цена”.

Резултати

Трябва да се разбере, че горното се отнася за всички случаи на използване на виртуални таблици в заявки (за натрупващи регистри, счетоводни регистри, задачи и др.).

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

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

който съхранява цени по продукти и доставчици. Периодичността на регистъра е ден.

Регистърът съдържа следните записи

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

ИЗБЕРЕТЕ PriceSliceLast.Period AS Период, PriceSliceLast.Product AS Product, PriceSliceLast.Supplier AS Supplier, PriceSliceLast.Amount AS Amount FROM Register Information.Price.SliceLast AS PriceSliceLast

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

Да кажем, че трябва да направим същото, но искаме да получим записи с дата, по-малка или равна на 01/15/2017. За да направите това, трябва да промените реда с последната таблица на срезове в заявката, както следва:

ОТ RegisterInformation.Price.SliceLast(&CutDate,) AS PriceSliceLast

Преди да изпълните заявката, разбира се, трябва да й предадете параметър &Дата на рязане. Сега резултатът от заявката ще изглежда така

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

FROM RegisterInformation.Price.Last Cut(&CutDate, Product = &Product AND Supplier = &Supplier) AS PriceLast Cut

В резултат на това получаваме само един запис

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

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

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

Да приемем, че сме получили задача, за която клиентът иска да получи справка за въведените в базата данни документи „Продажби на стоки и услуги“, като за всеки документ е необходимо да се получи цената от информационен регистър „Цени на артикули ” на датата на документа. Отчетът е написан за конфигурация "Manufacturing Enterprise Management" версия 1.3.

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

Проблемът има няколко начина за решаване. Нека разгледаме две от тях: отчет за системата за контрол на достъпа, използвайки два набора от данни и получаване на всички необходими данни в една заявка. Сега по ред.

Използване на ACS

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

Първият набор от данни съдържа следната заявка:

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

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

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

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

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

В едно искане

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

"SELECT | DocumentNomenclaturePeriod.Document, | DocumentNomenclaturePeriod.Document.Date AS Date, | DocumentNomenclaturePeriod.Document.PriceType AS TypePrice, | DocumentNomenclaturePeriod.Nomenclature, | PricesNomenclature.Price | FROM | (SELECT | Sales of GoodsServicesProducts. Link AS Document, ovServicesProducts .Номенклатура AS, МАКСИМУМ (ЦениНоменклатури. Период) .Продажба на СтокиУслугиПродукти | ЛЕВА ВРЪЗКА. Стоки. Дата >= Цени, Номенклатура | И DocumentNomenclaturePeriod.Document.PriceType = PricesNomenclature.PriceType | И DocumentNomenclaturePeriod.Period = PricesNomenclature.Period"

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

Резултатът от изпълнението е подобен на резултата от предишния отчет (вижте екранната снимка по-горе).

Направете изводи

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

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

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

Постановка на проблема

В базата данни е създаден документ „Продажби на стоки и услуги“, в чийто хедър има атрибут „Валута“. Заявката изисква за всеки документ да се получи текущият валутен курс от заглавката към датата на документа. Валутните курсове се съхраняват в периодичен информационен регистър „Валутни курсове”.
Директно решение на този проблем може да бъде заявка в цикъл: получаване на всички документи с техните дати и валути и, в извадката, достъп до виртуалната таблица с част от най-новия регистър „Валутни курсове“. Но защото заявка в цикъл е „лоша“, нека се опитаме да изпълним задачата с една заявка.

Решение

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

ИЗБЕРЕТЕ Sales of GoodsServices.Link, Sales of GoodsServices.Currency, MAXIMUM(Currency Rates.Period) AS Period PLACE IN PeriodsSetting Rates FROM Document.Sale of GoodsServices HOW Sales of GoodsServices LEFT CONNECTION Регистър на информация.Валутни курсове КАК Валутни курсове Продажби на продукти Услуги.Валута = Валутни курсове.Валута и продажби на стоки.Услуги.Дата >= Валутни курсове.ГРУПА Продажби на стоки и услуги.Връзка, Продажби на стоки и услуги. /////////////////////////////////////////////// // /////////////////////////// ИЗБЕРЕТЕ VTPeriodsSetting Rates.Link, VTPeriodsSetting Rates.Currency, RatesCurrency.Rate FROM VTPeriodsSetting Rates AS VTPeriodsSetting Rates LEFT CONNECTION Register Information . Валутни курсове КАТО Валутни курсове НА VTPeriodsRate Settings.Period = Валутни курсове.Period И VTPeriodsRate Settings.Currency = Валутни курсове.Currency

Процедура за заявка:

  1. Получаване на срок за настройка на обменния курс за всеки документ.Документите са свързани с ФИЗИЧЕСКАТА таблица “Валутни курсове”. Тук трябва да обърнете внимание на условията за свързване. Валутите трябва да са еднакви, а датата на документа >= периода на информационния регистър.
    В резултат на такава връзка за всеки документ ще се получи набор от редове, които отговарят на условието: всички записи на обменните курсове за валутата на документа, установени не по-късно от датата на документа.
    Последната стъпка ще бъде групирането на редовете, за да се получи максималния период на ставка. В резултат на това за всеки документ ще бъде получен необходимия период за настройка на обменния курс за желаната валута (максималната дата за настройка на обменния курс, но не повече от датата на документа). Резултатът се поставя във временната таблица VTPeriodsSettingRates.
  2. Получаване на курс.Временната таблица VTPeriodsSetting Rates е свързана с ФИЗИЧЕСКАТА таблица „Валутни курсове“. Връзката се осъществява според валутата на документа и периода на настройка на обменния курс, дефиниран във втората временна таблица.

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

Копирано от: http://www.kb.mista.ru/article.php?id=92

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


Има няколко начина да получите данните, от които се нуждаете.

1. Директно в заявката (чрез истинска регистрационна таблица)

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

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

За общо развитие:
Какво представлява напречното сечение на последното в платформата?

В зависимост от периодичността на регистъра (във времето, според длъжността на регистратора), VT се разширява в следната заявка:
1. По време (година, месец, ... секунда)

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

Всичко това може да се види, като се погледне технологичният дневник с активиран режим на регистриране на заявки

2. Система за съставяне на данни (прехвърляне на набор от стойности от една таблица към параметър на виртуална таблица)

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

Например, нека създадем отчет - списък с клиентски поръчки.

За да направите това, нека създадем набор от данни "Документи" - заявка:

За да свържете успешно набори от данни по-късно, полетата „Дата“ и „Валута на документа“ трябва да бъдат включени в заявката. За да не се показват в списъка с налични полета, ако е необходимо, те могат да бъдат премахнати, като поставите отметка в квадратчетата за ограничения в таблицата „Полета“ на диаграмата на оформлението. Иначе искането едва ли изисква коментари.

За да получим информация за обменните курсове, ще добавим втори набор от данни за заявка, „Валутни курсове“:

Тази заявка има 2 параметъра: "Дата" и "Валута". Тези параметри ще бъдат зададени от ACS при свързване на комплектите. Освен това в избраните полета е посочен параметърът "Дата" - това е необходимо за свързване на таблиците.
За ненужните полета "Дата" и "Валута" също задаваме флагове за ограничаване, така че да не се показват в наличните полета.

Нека да преминем към свързването на комплектите. На страницата „Връзки към набор от данни“ добавете 2 връзки:
1. Източникът на комуникация е наборът „Документи“, получателят е наборът „Валутни курсове“. Изходен израз - "Дата", целеви израз - "Дата", Параметър - "Дата"
2. Източникът на комуникация е наборът „Документи“, получателят е наборът „Валутни курсове“. Изходен израз - "Валута на документа", целеви израз - "Валута", параметър - "Валута"

Основното тук са комуникационните параметри. При свързване на набори от данни, ако е зададен параметър, ACS прехвърля към подчинения набор (в нашия случай заявката „Валутни курсове“) параметрите, посочени във връзката. Стойностите на параметрите ще бъдат стойностите на съответните полета на изходния набор.

Да преминем към изчислените полета. Нека добавим изчислено поле "AmountInAccountingCurrency". Изразът на полето е „Сума на документа * Ставка / Множество“.

Също така ще посочим полетата „Сума на документа“ и „Сума в валутната отчетност“ като ресурси

Да настроим отчета.
Нека добавим една група "Подробни записи", в избраните полета ще посочим "Поръчка на купувача", "Ставка" и "Множество". Нека добавим ресурсите „Сума по документ“ и „Счетоводна сума във валута“

Можете да генерирате отчет



 


Прочетете:



Процес на рестартиране на браузъра Firefox

Процес на рестартиране на браузъра Firefox

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

Безплатно нулиране на нивото на мастилото в принтери Epson L100, L110, L210, L300, L350, L355, L550, L555, L800

Безплатно нулиране на нивото на мастилото в принтери Epson L100, L110, L210, L300, L350, L355, L550, L555, L800

Безплатно нулиране на нивото на мастилото за принтери Epson L110, L210, L300, L350, L355, L550, L555.

VK руската версия на моята страница

VK руската версия на моята страница

Инструкции за презареждане на контейнери с мастило и...

Форматиране на SD и microSD карти с памет: защо е необходимо и как да го направите

Форматиране на SD и microSD карти с памет: защо е необходимо и как да го направите

Социалната мрежа Vkontakte моята страница днес е един от най-популярните интернет ресурси в света, да не говорим за Русия и Украйна. тя...

Бърза и безопасна помощна програма за форматиране на SD, SDHC и SDXC карти с памет.  Програмата поддържа и работа с други видове външни... feed-image