Периодични информационни регистри. Периодични информационни регистри Игра с преизчисления

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

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

Нека разгледаме по-отблизо свойствата и настройките на информационния регистър.

Двете основни свойства на конвергентния регистър са − ПериодичностИ Режим на запис.

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

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

Честотата може да приема следните стойности:

  • Непериодични
  • В рамките на секунда
  • В рамките на един ден
  • В рамките на месец
  • В рамките на блок
  • В рамките на една година

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

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

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

Режим на запис на информационен регистър

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

Подробности Регистрирайте свойства на размерите

Трябва също да обърнете внимание на палитрата от измервателни свойства на информационния регистър 1C 8.3. Специално за флаговете за водещ и основен избор:

  • Водещ— свойство на измерване, което предполага информация, че без стойността на това измерване записът в регистъра няма смисъл. Всъщност това означава, че когато системата изтрие стойност от измерение, тя също изтрива записа в регистъра с измерението „Водещо“. Може да се зададе само едно измерване.
  • Основна селекция— ако регистърът е независим, тези измервания ще се използват за определяне на регистрацията на промените за плана за обмен. Подобна употреба Основна селекция по периодивключва основния избор за период за периодични регистри.

Вписване на програмата в информационния регистър 1C

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

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

NewRecord = Информационни регистри.Валутни курсове.CreateRecordManager();
NewRecord.Currency = Directories.Currencies.FindByName("USD");
NewRecord.Period = Дата(31,12,2016);
NewRecord.Course = 100;
NewRecord.Multiplicity = 1;
NewRecord.Write();

Използване на набор от записи на 1C информационен регистър:

NewRecordSet = Информационни регистри.Валутни курсове.CreateRecordSet();
//ако не зададете избор, всички записи в информационния регистър ще бъдат изтрити
NewRecordSet.Selection.Currency.Set(долар, вярно);
NewRecordSet.Selection.Period.Set(Дата(31.12.2016), True);
//формира директно зададения запис
NewRecordSet = NewRecordSet.Add();
NewSetRecord.Currency = Directories.Currencies.FindByName("USD");
NewDialRecord.Period = Дата (31.12.2016);
NewSetRecord.Course = 100;
NewSetRecord.Multiplicity = 1;
NewRecordSet.Write();

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

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

За да повторите функционалността на 7.7, трябва да направите следното:

Създайте консолидиран регистър „Периодични данни на контрагента“, посочете, че това е периодичен регистър на информация с честота от един ден.

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

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

В нормален режим на приложение чрез бутона „Отиди“.

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

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

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


И в модула на формуляра ще присвоим действия за получаване на текущи данни на събитието „При отваряне“:

& OnClient процедура за отваряне (отказ) //Вмъкване на мястото на колектораданни=Извличане на текущи данни(); опит Директор = dani. керивник; край на изключение; опит телефон = данни. телефон; край на изключение; Край на процедурата

Функцията за получаване на текущи данни е следната:

функция OtrimatiCurrentData() //Вмъкване на мястото на колектора //((QUERY_CONSTRUCTOR_WITH_RESULT_PROCESSING // Датски фрагмент от подкани на конструктора. // Ако ревизирате конструктора отново, ръчно направените промени ще бъдат загубени!!!Заявка = Нова заявка; Заявка. Текст = "ИЗБЕРЕТЕ | Периодично обобщение на най-новите данни за контрагента. контрагент, | Периодично обобщение на най-новите данни за контрагента. Керивник, | Периодично обобщение на най-новите данни за контрагента. адреси, | Периодично обобщение на най-новите данни за контрагента. Телефон |ОТ | Регистър на информацията. Периодични данни на Контрагента. Част от най-новите периодични данни на AS на контрагента Част от най-новите|КЪДЕ | Периодично обобщение на най-новите данни за контрагента. Контрагент = & Контрагент" ; Request. SetParameter(" Account ", object. Link); Result of Request = Request. Execute () ; SelectionDetailedRecords = Резултат от Request. Select(); data= нова структура; Докато SelectionDetailedRecords. Next() Loop // Вмъкване на образец за избор SelectionDetailedRecords //SelectionDetailedRecords.Kerivnik;почит Insert(" ker_vnik ", SelectionDetailedRecords. Kerívnik) ; почит Insert(" phone ", SelectDetailRecords. Phone) ; Доклад(SelectionDetailedRecords. Phone) ; Краен цикъл; Връщане на почит; //))CONSTRUCTOR_QUERY_WITH_RESULT_PROCESSINGКрай на функцията

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

селекция = нова структура; селекция.Вмъкване("Акаунт",обект); данни = регистри на информация.Информация за контакт.Получаване на последна(,селекция); доклад(данни.Kerivnik); отчет(данни.Количество());

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

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

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

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

Теория

Изчислителен регистър (RR)- обект на метаданни за конфигурация, използван за изпълнение на периодични изчисления в системата 1C. Очевидните области на приложение на изчислителните регистри включват следното: изчисляване на заплати, изчисляване на наем, изчисляване на наем.

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

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

механизъм на потискане по период на действие«:

Тук виждаме, че тип калкулация „Командировка” е с продължителност във времето и е валидна от 10 април до 20 април, като изместващ тип калкулация за вид калкулация „Заплата” е посочена „Командировка”. „Заплатата“ също се простира във времето и е валидна от 1 април до 30 април. Тъй като „Командировка” е посочена като изместващ вид изчисление за вид изчисление „Заплата” (с по-висок приоритет от заплата) и важи за периода на валидност на заплатата, то заплатата се измества от командировка и се формира „Действителен период на валидност на заплатата.” Действителен период на валидност на заплатата „Това е периодът на валидност на заплатата след командировка, в нашия случай той се състои от 2 периода - от 1 април. до 9 и от 21 до 30 април и общо е 19 дни. Базираният на периода механизъм за изместване работи само за дългосрочни изчисления.

Фигурата по-горе показва графично принципа на " механизъм на зависимост по базов период«:

Да приемем, че в края на април 2017 г. искаме да дадем на служител бонус в размер на 10% от заплатата. Заплатата е посочена като основен вид изчисляване на бонусите.

Но като „база“ за изчисляване на премията няма да вземем целия месец април, а само интервала от 10 април до 20 април (11 дни). Нека изчислим базата за бонуса, заплатата на служителя е 60 000 рубли, има 30 дни в месеца, дневна заплата = 60 000/30 = 2000 рубли. Следващи 2000*11 = 22000 рубли. Основата за изчисляване на премията е 22 000 рубли.

Нека изчислим премията: (22000/100)*10 = 2200 рубли. Бонус от 10% от заплатата е 2200 рубли.

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

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

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

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

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

Практикувайте

Нека разгледаме по-отблизо изчислителните регистри на практика:

Етап 1Да започнем с план за видовете изчисления. Трябва да създадете план за тип изчисление, преди да създадете регистър за изчисления. Създаваме план за типовете изчисления преди регистъра на изчисленията, тъй като преди да създадем таблица за съхраняване на изчислените данни (т.е. регистър на изчисленията), е необходимо да посочим алгоритмите за изчисляване на тези данни (т.е. план за видовете изчисления).

Нека създадем план за видовете изчисления „Основни такси“. Нека веднага отидем в раздела „Изчисление“. Тук веднага виждаме знамето " Използва период на валидност", когато този флаг е зададен, всички видове изчисления, включени в този план, ще имат дължина във времето(например Заплата, Командировка), а също и за този план от видове изчисления, “ механизъм на потискане по период на действие". Ако флагът „Използва периода на валидност“ не е зададен, тогава видовете изчисления няма да имат удължаване във времето (например Бонус, Глоба) и „механизмът за изместване по период на валидност“ няма да работи. Също така в този раздел има раздели „Зависимост от основата“ и „Основни планове за видове изчисления“ - те служат за изпълнение на „ механизъм на зависимост по базов период“, но ще говорим за това по-късно. Засега нека оставим „Зависимост от базата“ в режим „Независим“.

Нека създадем предварително дефиниран тип изчисление „Заплата“. В раздела „Основни“ всичко е просто. Задайте името и кода на типа изчисление.

Благодарение на факта, че поставихме знамето " Използва период на валидност„Вече имаме раздел“ Изместване" и се включи " основан на периода репресивен механизъм«.

В този раздел посочваме видовете изчисления, които ще изместят заплатата по период на валидност (например Командировка).

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

Има и раздел " Водещи»—показва типовете изчисления, които при промяна трябва да преизчислят текущия тип изчисление. Тук можете също да посочите видове изчисления от други планове за изчисления. Например типът изчисление „Заплата” е водещият за типа изчисление „Бонус”, т.е. Когато се промени заплатата, трябва да преизчислим и бонуса, защото Бонусът се изчислява в зависимост от заплатата. В този случай типът изчисление „Заплата“ принадлежи към PRP „Основни начисления“, който използва период на валидност, а типът изчисление „Бонус“ принадлежи към PRP „Допълнителни начисления“, който не използва период на валидност.

Стъпка 2.Нека създадем директория “Charts” със структурата по подразбиране. В директорията “Графици” ще съхраняваме работното време на служителите (петдневно, шестдневно и др.).

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

Нека създадем непериодичен независим информационен регистър „Работни графици“ с 2 измерения „Дата“ и „График“ и ресурс „Брой часове“.

Благодарение на информационния регистър „Работни графици“ ще можем да изчисляваме заплатите от заплатата пропорционално на броя на отработените дни.

Стъпка 4.Създайте документ „Заплати“ със структурата на детайлите, показана по-долу:

Реквизити:

Оперативното изпълнение е настроено на „Забрана“защото няма смисъл за механизма на периодични сетълменти в 1C - ние никога не изчисляваме бонуси, заплати или глоби в реално време.

Нека създадем формуляр на документ с настройки по подразбиране.

Стъпка 5. Най-накрая стигнахме до момента на създаване на изчислителни регистри.

Обектът с метаданни на регистъра за изчисление се намира в клона „Регистри за изчисление“ на конфигуратора.

Нека създадем регистър за изчисления „Основни такси“. Нека да разгледаме настройките на регистъра за изчисления по-долу:

1. В полето „План за типове изчисления“ посочете PVR „Основни такси“, създадени в стъпка 1.

2. Задайте флага „Срок на валидност“ на „Вярно“, защото PVR, посочен в стъпка 1, има удължаване във времето.

След задаване на този флаг стандартните детайли „Период на действие“, „Начало на период на действие“, „Край на действие“ незабавно стават достъпни за нас, което означава, че типовете изчисления, регистрирани в този регистър на изчисленията, също имат дължина във времетои имаме достъп до " механизъм на потискане по период на действие«.


P.S. Ако посочите PVR, който има дължина във времетоза RR с флаг „Период на валидност“, зададен на „False“, тогава този PVR ще работи като PVR, който няма удължаване във времето.

3. След задаване на флага „Валиден период“ на „Вярно“, полетата „Графика“, „Стойност на графиката“, „Дата на графика“ стават достъпни за нас.

В полето „График“ посочваме информационния регистър „Работни графици“, създаден в стъпка 3.

В полето „Стойност на графика“ посочваме ресурса „Брой часове“ в информационния регистър „Работни графици“.

В полето „Дата на графика“ посочваме измерението „Дата“ на информационния регистър „Работни графици“.

4. В полето „Честота” посочваме стойността „Месец”, това означава, че данните ще се въвеждат в регистъра ежемесечно.

По-долу е структурата на метаданните на регистъра:

Флагът „Основно“ за измерение засяга само производителността; не е необходимо да го задавате, но ако го направите, полето „Служител“ ще бъде индексирано.

Измерението "Служител" - използва се в " механизъм на потискане, базиран на периода на действие" И " механизъм на зависимост от базисния период«.

Ресурс „Сума“ - там ще бъде записана изчислената заплата.

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

Атрибутът „Параметър“ ще съхранява стойността на заплатата.

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

Посочваме документа като регистратор " ТРЗ“ създаден в стъпка 4.

Стъпка 6. Извършваме движения според калкулационния регистър „Основни такси“.

Нека се върнем към документа „Заплати“, създаден в стъпка 4.

Нека опишем обработката на осчетоводяването в обектния модул на документа:

Фрагмент от код за обработка на документи

1C (Код)

Процедура ProcessingProcessing(Failure, Processing Mode) // регистрирайте BasicAccruals на Movement.MainAccruals.Write = True; Movements.MainAccruals.Clear(); Регистрационен период = Начало на месеца (дата); За всяко движение на TechLineMainAccruals от цикъла MainAccruals = Movements.MainAccruals.Add(); Move.Reversal = False; Movement.CalculationType = TechLineMainAccruals.CalculationType; Movement.ActionPeriodStart = TechLineMainAccruals.StartDate; Movement.ActionPeriodEnd = EndDay(TexLineMainAccruals.EndDate); Movement.Registration Period = Период на регистрация; Movement.Employee = TechLineMainAccruals.Employee; Movement.Chart = TechStringMainAccruals.Chart; Movement.Parameter = TechStringMainAccruals.Size; EndCycle; Край на процедурата

ProcessingProcedure(неуспех, режим)

// Основен регистър на начисленията

Движения. Основни начисления. напиши = вярно;

Движения. Основни начисления. Clear() ;

Регистрационен период = Начало на месеца (дата) ;

За всеки TechLine BasicAccrualsFrom BasicAccrualsCycle

Движение = Движения. Основни начисления. Добавяне();

Движение. Storno= Невярно;

Движение. Тип изчисление=TexLineMainAccruals. Тип изчисление;

Движение. PeriodActionStart = TechLineMainAccruals. Начална дата;

Движение. ActionPeriodEnd=EndDay(TexLineMainAccruals.EndDate) ;

Движение. Регистрационен период = Регистрационен период;

Движение. Служител = TechLineMainAccruals. служител;

Движение. Диаграма = TechLineMainAccruals. График;

Движение. Параметър = TechStringMainAccruals. размер;

EndCycle;

Край на процедурата

Нека създадем тестов документ и да го стартираме:

Да отидем на „Движения на документи“:

Виждаме, че периодът на регистрация е зададен в началото на месеца, защото Честотата на RR е посочена като „Месец“. Виждаме също, че всички полета с изключение на сумата са попълнени (заплатата все още не е изчислена).

Стъпка 7.Да напишем кода за изчисляване на заплатите.

Нека създадем общ модул "Изчисление" със следните флагове:

Самото изчисление ще се извърши в този общ модул.

Нека напишем функцията за експортиране „Изчисляване на таксите“ в модула „Изчисляване“:

Тъй като попълнихме полетата „График“, „Стойност на график“, „Дата на график“ в настройките на RR „Основни такси“, виртуална таблица на регистъра на изчисленията стана достъпна за нас DataGraphics,в заявка към виртуална таблица се интересуваме от следните полета:

„Брой часове действителен период на действие“ —съдържа броя на действително отработените часове, изчислен въз основа на данните от графика

„Брой часове Период на действие“ -съдържа броя на работните часове, изчислен въз основа на данните от графика в изчислителния период

Процедура за изчисляване на заплатите

1C (Код)

Процедура CalculateAccruals(Регистратор, набор от записи) Експорт //Заявка за заплата=Нова заявка; Query.Text="SELECT | ISNULL(BasicAccrualsGraphicsData.NumberofHoursActualActionPeriod, 0) AS HoursFact, |BasicAccrualsGraphicsData.Parameter, |ISNULL(BasicAccrualsGraphicsData.NumberofHoursActionPeriod, 0) AS HoursPlan, |BasicAccrualsG raphicsData ica.Номер на ред |ОТ |Регистър на изчисленията.Основни начисления. Графични данни (| Регистратор = & Регистратор | И тип изчисление = & Тип изчисление Заплата) AS Basic AccrualsDataGraphics"; Request.SetParameter("Регистратор", Рекордер); // предаване на документа на регистратора, така че търсенето да се извършва само на текущия документ Request.SetParameter("Calculation TypeSalary", Планове на видовете изчисления. Основни начисления. Заплата); //задайте вида на изчислението заплата, защото изчисляване на заплатата Selection=Request.Run().Select(); SearchStructure=Нова структура; SearchStructure.Insert("Номер на ред",0); //създаване на структура за търсене на данни за изчисление по номер на ред за всеки запис от RecordSet цикъл //цикличен набор от записи на текущия документSearch Structure.LineNumber=Record.LineNumber; //попълнете номера на реда за търсене If Selection.FindNext(Search Structure) Тогава //ние търсим в извадката данни за изчисление въз основа на текущия номер на ред Record.Sum =?(Selection.HoursPlan=0.0, Selection.HoursFact /Sample.HoursPlan * Sampling .Parameter); //изчисляване на заплатата пропорционално на отработените дни, в Параметър - текуща заплата EndIf; Избор.Нулиране(); //нулиране на селекцията, имаме нужда от следващия запис от набора записи, за да търсим през селекцията първо EndCycle; Recordset.Write(, True); //запишете изчислените записи в базата данни, подайте параметъра Replace = True EndProcedure

//Заплата

Заявка=Нова заявка;

Заявка. Текст = "ИЗБЕРЕТЕ

| ISNULL(BasicAccrualsDataGraphics.NumberofHoursActualActionPeriod, 0) AS HoursFact,

| BasicAccrualsDataGraphics.Parameter,

| ISNULL(BasicAccrualsDataGraphics.NumberofHoursActionPeriod, 0) AS HoursPlan,

| BasicAccrualsDataGraphics.NumberLines

| ОТ

| Регистър на изчисленията. Основни начисления. Графични данни (

| Записващо устройство = &Записващо устройство

Много често в заявките на 1C трябва да работите с дати. Особено когато заявката се прави към обекти с метаданни, които съдържат периодична информация. По правило това са регистри (информация, натрупване, изчисление, счетоводство). Нека да разгледаме най-често използваните функции на езика за заявки 1C за работа с дати. Ще изградим примери на базата на информационния регистър Организации на служителите ZUP конфигурации версия 2.5.

  • ВРЕМЕ ЗА СРЕЩА

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

    ИЗБЕРЕТЕ ДАТА ЧАС(2016, 1, 1)

    В резултат на изпълнение на заявката получаваме датата - 01.01.2016 г.
    Всъщност е трудно да си представим ситуация, в която датата ще бъде посочена по този начин в искане. В крайна сметка, когато трябва да посочите период, се използват параметри. Но има случаи, когато тази функция е от особено значение. Това е, когато трябва да посочим празна дата в полетата или в условията на заявката. Позволете ми да ви напомня, че за езика 1C празна дата има формата - 0001.01.01. По този начин, за да получите празна дата в заявка, просто посочете DATETIME(1; 1; 1). Като пример, нека изберем от информационния регистър Организации на служителитезаписи, които не са попълнени Период на завършване:

    ИЗБЕРЕТЕ Организационни служители.Период, Организационни служители.Служител, Организационни служители.Позиция, Организационни служители.Организационен отдел ОТ Информация за регистъра.Организационни служители КАТО Организационни служители WHERE Организационни служители.Период на завършване = DATETIME(1, 1, 1)

  • НАЧАЛО НА ПЕРИОД

    За посочената дата връща началото на периода, към който принадлежи.
    Синтаксис:
    НАЧАЛО НА ПЕРИОД (дата, тип период)
    PeriodType може да приема следните стойности: МИНУТА, ЧАС, ДЕН, СЕДМИЦА, МЕСЕЦ, ТРИМЕСЕЧИЕ, ГОДИНА, ДЕСЕТИЛЕТИЕ, ПОЛУГОДИНА
    В конзолата за заявки въведете:

    ИЗБЕРЕТЕ НАЧАЛО НА ПЕРИОД (ДАТА ЧАС (2016, 1, 15), МЕСЕЦ)

    Заявката ще се върне - 01.01.2016 г
    А сега един пример. Както знаете, периодичността на регистъра Организации на служителитеедин ден. Нека създадем заявка, в която ще се показва началната дата на месеца вместо действителния период на запис.

    ИЗБЕРЕТЕ НАЧАЛО НА ПЕРИОД(Служители на организации.Период, МЕСЕЦ) КАТО Начало на месеца, Служители на организации.Служител, Служители на организации.Длъжност, Служители на организации.Разделение на организация ОТ Информация за регистъра.Служители на организации КАТО Служители на организации

  • КРАЙ НА ПЕРИОДА

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

    ИЗБЕРЕТЕ КРАЙ НА ПЕРИОДА(ДАТАЧАС(2016, 1, 15), МЕСЕЦ)

    Връща се на 31.01.2016 23:59:59
    Както можете да видите, стойността се връща с точност до секундата.

  • ADDKDATE

    Добавя определения брой интервали от време към датата.
    Синтаксис:
    ADDKDATE(Дата, Тип период, Количество)
    PeriodType приема същите стойности като за функцията НАЧАЛО НА ПЕРИОД
    Например, нека изберем датата февруари:

    ИЗБЕРЕТЕ ADDKDATE(DATETIME(2016, 2, 15), MONTH, 2)

    Получаваме датата 04/15/2016 0:00:00 Въпреки факта, че февруари е кратък месец, денят на получената дата е същият като оригиналния. Много е удобно, че не е нужно да мислите за броя на дните в месеците.
    Количеството може да бъде и отрицателно. След това интервалът се брои в обратна посока.

  • ДАТА НА РАЗЛИКА

    Изчислете разликата между две дати в посочените единици.
    Синтаксис:
    РАЗЛИКА В ДАТАТА (начална дата, крайна дата, тип период)
    Типът период може да приема следните стойности: СЕКУНДА, МИНУТА, ЧАС, ДЕНЯТ, МЕСЕЦ, ТРИМЕСЕЧИЕ, ГОДИНА
    Например:

    ИЗБЕРЕТЕ РАЗЛИЧНА ДАТА(ДАТАЧАС(2016, 2, 15), ДАТАЧАС(2016, 3, 1), ДЕН)

    връща 15

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

Много програмисти, които са запознати с версия 7.7 и искат да овладеят версия 8, питат къде са отишли ​​периодичните справочни детайли и периодичните константи. И ако ги няма, какъв механизъм ги замества? В 1C:Enterprise 8 регистрите с периодична информация се използват за съхраняване на историята на промените в стойностите.

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

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

Моля, обърнете внимание, че типът информационен ресурс може да бъде или примитивен (число, низ, дата, булево) или препратка (DirectoryLink, DocumentLink, EnumerationLink и т.н.). Освен това можете дори да съхранявате снимки и друга неструктурирана информация в информационния регистър, тъй като можете да създадете ресурс от типа „Съхранение на стойности“.

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

Подробна информация за структурата на информационния регистър на валутните курсове е дадена в следната таблица:
Размери: тип валути "DirectoryLink.Currencies", водещи, забрана за празни стойности
Ресурси: Тип на курса "число", дължина 15, точност 4, неотрицателно
Множествен тип "число", дължина 10, точност 0, неотрицателно
Честота В рамките на един ден
Независим режим на запис

Данните в този информационен регистър могат да се въвеждат ръчно чрез формата за списък.

ВНИМАНИЕ!Невъзможно е да се въведат два записа с еднакъв набор от измервания и период в информационния регистър с определена честота, която не е равна на „По позиция към регистратора“, т.е. Не можете да въведете два курса на една и съща валута в един и същи ден. Ако честотата на записите в регистъра е зададена на „По длъжност на регистратора“, тогава ключът за уникалност на записа също съдържа връзка към документа на регистратора, т.е. в такъв регистър не може да има два записа с еднакъв набор от измервания, период и записващо устройство. Това е неделимо свойство на информационния регистър, което го отличава от другите регистри.
Добавянето на нови записи в информационния регистър, както и изброяването на съществуващи записи се извършва по стандартен начин за всички регистри. В този раздел ще разгледаме само най-важното
- получаване на информация от периодичен регистър в определен момент от време.

Достъп до периодична информация чрез методи
Обектът Information RegisterManager ви позволява да получите достъп до „резултатите“ на регистъра. „Резултатите“ от периодичния регистър на информацията се разбират като първата или последната стойност на ресурсите за посочените измерения. Използват се следните методи:

Вземете (<Период>, <Отбор>)

Връща, като структура, стойностите на ресурса на един запис в регистъра, съответстващ на посочените стойности на всички (!) измерения на регистъра и период.
GetLatest (<Конец периода>, <Отбор>)
Този метод връща текущата стойност на ресурса, която е била в сила на посочената дата. Ако не намери запис в регистъра за дадена комбинация от измерения точно за посочения период, тогава се връща структура, съдържаща стойностите на ресурса на най-близкия по-късен запис.
GetFirst (<Начало периода>, <Отбор>)
Този метод работи подобно на метода GetLast, но ако в момента няма намерен запис, тогава се връща структура, съдържаща стойностите на ресурса на най-близкия по-ранен запис.
Парче от последния (<Конец периода>, <Отбор>)
Тези методи са подобни съответно на методите GetLast и GetFirst, но обикновено не указват едно или повече измерения. В резултат на това не се връща структура, както в предишните случаи, а таблица със стойности, попълнена с данни от намерени записи в регистъра на информацията.

Когато извиквате методите GetFirst, GetLast, SliceFirst и SliceLast, първият параметър може да бъде от тип "date", Instant in Time или Boundary, но можете изобщо да го пропуснете, след това стойностите на ресурса от първия или последния запис в регистъра ще бъдат намерени, респ.

Нека демонстрираме използването на тези методи с примери:

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


StructureRateMultiplicity = Регистри на информация. Валутни курсове. Получаване (Избор на дата, Избор на валута);
Ако StructureRateMultiplicity.Rate = 0 Тогава
Отчет ("Обменният курс не е посочен за тази дата!");
В противен случай
Доклад("Валутен курс:" + Abbr(StructureRateMultiplicity.Rate) + ", множество: " + Abbr(StructureRateMultiplicity.Multiplicity));
endIf;

Пример 2.Получаване на текущия обменен курс за дадена дата (ако няма запис за тази дата, ще бъде намерен най-близкият по-късен запис)

CurrencySelection = Нова структура ("Валута", SelectCurrency);
StructureRateMultiplicity = Информационни регистри.Валутни курсове.GetLast(SelectDate, CurrencySelection);
Report("Текущ обменен курс за дадена дата: " + StructureRateMultiplicity.Rate);

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

tzData = Информационни регистри. Валутни курсове. Последен отрязък (Изберете дата,);

Доклад("За валута " + Line(String.Currency) + " процент за дадена дата: " + Line(String.Rate) + ", множественост: " + Line(String.Multiplicity));
EndCycle;

Пример 4.Получаване на текущи цени на едро за стоки (посочен е избор според измерението "TypePrice")

SelectionPriceType = Нова структура ("PriceType", Enumeration.PriceTypes.Wholesale);
tzData = Информационни регистри.Цени на фирмата.Последен отрязък(Избор на дата, тип цена на избор);
За всяка страница от цикъла на TzData
Report("За артикул " + Line(Line.Nomenclature) + "цена на едро: " + Line(Line.Price));
EndCycle;

Достъп до периодична информация чрез заявки

За да получите тази информация, използвайте виртуална срезна таблица на последния/първия запис на информационния регистър. Структурата му е напълно идентична с основната таблица на информационния регистър и съдържа следните полета:
<Имя измерения> - Набор от полета, съдържащи стойности на измерението на регистъра. Имената на полетата съответстват на имената на измеренията.
<Имя реквизита> - Набор от полета, съдържащи стойностите на детайлите на регистъра.
<Имя ресурса> - Набор от полета, който съдържа стойности на ресурсите на регистъра.
Дейност- Съдържа знак за записваща дейност. Записите, за които стойността на това свойство е зададена на False, няма да бъдат взети предвид при извличане на „първите“ или „последните“ записи на регистъра, както и при извличане на информация за конкретен момент от време.
Момент от време- Съдържа момента на записа в регистъра.
Номер на ред- Съдържа номера на реда, определен като пореден номер на записа в набора от записи.
Период- Съдържа периода, за който се отнася записът в регистъра.
Секретар- Съдържа връзка към документа за запис на движение.

Когато осъществявате достъп до виртуалните таблици SliceFirst и SliceLast, можете да посочите следните параметри:

Дата -Посочва се датата или моментът, за който ще бъде получена информация. Ако параметърът не е зададен, ще бъдат избрани най-новите/най-ранните записи.
състояние -Условието е посочено в езика на заявката. Ще се използва за ограничаване на състава на записите, сред които ще бъдат избрани най-новите/най-ранните. Условието ще бъде приложено към оригиналните записи, а не към вече избраните.

Ето примери за достъп до записи в регистъра на информация с помощта на заявки:

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

ИЗБЕРЕТЕ * ОТ RegisterInformation.Currency Rates

Пример 2.Получете текущия обменен курс на една валута за дадена дата

ИЗБЕРЕТЕ Валута, Курс
FROM RegisterInformation.CurrencyRates.SliceLast(&SelectDate, Currency = &SelectCurrency);

Пример 3.Изберете текущи курсове на всички валути за дадена дата

ИЗБЕРЕТЕ Валута, Курс
FROM RegisterInformation.CurrencyRates.SliceLast(&SelectDate);

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

ИЗБЕРЕТЕ Номенклатура, цена
FROM RegisterInformation.CompanyPrices.SliceLast(&SelectDate,PriceType=&SelectPriceType);

Резюме
- Периодичният информационен регистър е мощен инструмент за съхраняване на историята на промените в почти всяка информация.
- Честотата на информационния регистър може да варира в широки граници: от позицията на регистратора на документи (минимална честота) до една година (максимална честота). 1C:Enterprise 8 също има непериодични информационни регистри.
- Типът ресурс на информационния регистър може да бъде примитивен (число, низ, дата, булево), препратка (връзка към елемент от директория, документ, стойност на изброяване) или съхранение на стойност.
- Периодичен информационен регистър може да произвежда стойности на ресурсите точно на дадена дата, най-новата или най-ранната стойност на дадена дата или част от първата и част от последната на конкретна дата въз основа на определени стойности на измеренията.
- Достъпът до данните от информационния регистър е възможен както чрез методи, така и чрез заявки.