Как да посочите празна дата в заявка? 1 получават датата в заявката.
Когато доста често има нужда да работите с променливи от типа "Дата". В тази статия ще разгледаме основните техники - предаване на текущата дата, проверка за празна стойност, произволна дата.
Когато пишете заявки, често е необходимо да сравнявате данните с текущата дата. Вграденият език 1C има функцията CurrentDate(). Позволява ви да определите текущия час и дата на вашия компютър. За да извършвате операции с текущата дата, стойността на тази функция трябва да бъде предадена на заявката като параметър.
По-долу е дадена заявка, която избира всички файлове, прикачени към предварителни отчети с дата на създаване до момента:
RequestExample = Нова заявка;
ExampleRequest.Text ="
|ИЗБЕРЕТЕ
| Предварителен отчетAttachedFiles.Link
| ОТ
| Directory.Advance ReportAttachedFilesAS AdvanceReportAttachedFiles
|КЪДЕ
| Предварителен отчетAttachedFiles.Date< &ТекДата»;
Пример за заявка.SetParameter("CurrentDate", CurrentDate());
Произволна дата
Обсъдената по-горе функция ви позволява да сравнявате и следователно да правите избор за всеки период. Този метод ви позволява да зададете строг избор в заявката, без да използвате допълнителни параметри.
Моля, обърнете внимание, че използвайки тази функция в примера по-горе, ние подадохме само три числа (година, месец, ден) като входни параметри. Последните три (час, минута, секунда) не са задължителни и ако ги няма, се заместват с "0", т.е. началото на деня.
Като част от този пример ще бъдат получени всички файлове, прикачени към предварителни отчети до края на миналата 2016 г. В тази връзка ще посочим час, минута и секунда, които да сравним с точката във времето "31 декември 2016 г. 23:59:59".
ИЗБИРАМ
Предварителен отчетAttachedFiles.Link
ОТ
Directory.Advance Report Attached Files КАТО Advance Report Attached Files
КЪДЕТО
Предварителен отчетAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)
празна дата
Най-лесният начин да проверите дали дадена променлива съдържа празна дата е чрез просто сравнение. В този пример с помощта на заявка ще изберем всички касови бележки към сметката, които нямат попълнена входяща дата.
Много често в заявките на 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 г
А сега един пример. Както знаете, честотата на регистъра Организации на служителитеедин ден. Нека създадем заявка, в която вместо действителния период на записите ще се показва датата на началото на месеца.ИЗБЕРЕТЕ НАЧАЛОТО НА ПЕРИОДА (Служители на организации.Период, МЕСЕЦ) КАТО Начало на месеца, Служители на организации.Служител, Служители на организации.Позиция, Служители на организации.Отдел на организацията ОТ Регистъра на информацията.Служители на организации AS Служители на организации
КРАЙЕН ПЕРИОД
Синтаксисът е същият като за началото на период. И както подсказва името, той връща края на периода по дата и тип на периода. Няма да разглеждаме подробно. Ограничаваме се до мини пример.
Заявка:ИЗБЕРЕТЕ КРАЙЕН ПЕРИОД(ДАТАЧАС(2016, 1, 15), МЕСЕЦ)
Връща се 31.01.2016 23:59:59
Както можете да видите, стойността се връща с точност до секундата.ДОБАВЯНЕ
Добавя определения брой времеви интервали към датата.
Синтаксис:
ADDDATE(Дата, Тип период, Брой)
PeriodType приема същите стойности като за функцията НАЧАЛО НА ПЕРИОД
Да вземем февруари като пример:ИЗБЕРЕТЕ ADDDATE(DATETIME(2016, 2, 15), MONTH, 2)
Получаваме датата 04/15/2016 0:00:00 AM Въпреки факта, че февруари е кратък месец, денят на получената дата е същият като оригиналния. Много е удобно, че не е нужно да мислите за броя на дните в месеците.
Числото може да бъде и отрицателно. След това интервалът се брои в обратна посока.РАЗЛИКА В ДАТАТА
Изчислява разликата между две дати в посочените единици.
Синтаксис:
DATEDIFF(Начална дата, крайна дата, тип период)
Типът период може да приема следните стойности: СЕКУНДА, МИНУТА, ЧАС, ДЕНЯТ, МЕСЕЦ, ТРИМЕСЕЧИЕ, ГОДИНА
Например:ИЗБЕРЕТЕ РАЗЛИКА В ДАТАТА(ДАТАЧАС(2016, 2, 15), ДАТАЧАС(2016, 3, 1), ДЕН)
връща 15
Тук бяха разгледани най-често използваните функции на езика за заявки 1C. Останалите се използват рядко. Ако е необходимо, примери за работа с тях могат да бъдат намерени в помощта, вградена в платформата 1C.
Типът "Дата" в 1C е един от 4-те основни типа данни заедно с число, низ и булев тип. Датите са повсеместни в конфигурациите - невъзможно е да се избегне работата с този тип данни по време на разработката. Ето защо е по-добре да започнете да пишете заявки, като вече разбирате как да обработвате дати, какви са възможностите за работа с тях, как се съхраняват. Нека да разгледаме примери за всички нюанси на писане на заявки с различни дати.
Примери за работа с дати в 1C заявки
На първо място, трябва да получите датата в заявката в желания формат - с или без час. Има няколко начина за изпълнение на тази задача:
- Преминаване през параметър. Този метод е единственият начин да получите текущата дата на сесията;
- Вземете датата в заявката от полето за избор;
- Преобразувайте от числови стойности с помощта на функцията DATETIME().
Най-често срещаната задача при работа с документи е проверката за празна дата в 1C заявка. В този случай е най-лесно да сравните променливата или полето с празна дата, която се получава с помощта на функцията DATETIME(1,1,1):
DATETIME(1; 1; 1)С подобна команда можете да получите произволна дата и час в заявката. В същото време те могат да бъдат зададени до секунда чрез посочване на 6 числа като параметри. Ако се използват само 3 числа, тогава часовете, минутите и секундите ще бъдат зададени на 0 (началото на деня). Например трябва да изберем документи за първите 10 дни на януари 2018 г. в заявка:
SELECT Разписка към разплащателна сметка. Препратка КАТО препратка ОТ Документ. Получаване към разплащателна сметка КАТО разписка към разплащателна сметка WHERE Разписка към разплащателна сметка. Дата МЕЖДУ DATETIME (2018, 1, 1, 0, 0, 0) И DATETIME (2018, 1, 10, 23, 59, 59)В заявка на вградения език 1C можете не само да избирате различни полета и да получавате параметри. Има много функции, които улесняват форматирането на датата за нуждите на конкретна задача. Ако често работите с дати в заявка, тогава трябва да знаете тези команди:
- НАЧАЛО НА ПЕРИОД.Като параметри посочете датата и интервала от време, в контекста на който е необходимо да получите началото на датата. Използва се за преобразуване на дата във вечен формат. За да направите това, трябва да зададете втория параметър - "ДЕН";
- КРАЙЕН ПЕРИОД.Подобна команда, която връща последната дата в контекста на единиците, посочени в параметрите;
- ДОБАВЯНЕ.Позволява ви да получите дата, по-голяма с даден брой определени времеви единици. Дата, времева единица и число са посочени като функционални параметри;
- РАЗЛИКА В ДАТАТАПолучава разликата между датите в посочените единици;
- ДЕН ОТ СЕДМИЦАТА.Връща поредния номер на един от дните от седмицата.
Правилно прилагайки тези функции, разработчикът може да реши доста нетривиални задачи. Например получаване на името на деня от седмицата на текущата дата в заявката като низ:
ИЗБЕРЕТЕ WHENWEEKDAY(&CurrentDate) = 1 THEN „Понеделник“ WHENWEEKDAY(&CurrentDate) = 2 THEN „Вторник“ WHENWEEKDAY(&CurrentDate) = 3 THEN „Сряда“ WHENWEEKDAY(&CurrentDate) = 4 THEN „Четвъртък“ WHENWEEKDAY(&CurrentDate) = Петък 5 THEN „ " WHEN DAYWEEK(&CurrentDate) = 6 THEN "събота" ELSE "неделя" ENDПреобразуването на типове в 1C заявка от число или низ в дата е трудоемка задача. От числа можете да получите датата с помощта на функцията DATETIME, от низ - чрез комбиниране на функцията SUBSTRING и конструкцията SELECT WHEN THEN ELSE. Въз основа на това разработчиците предпочитат да получат датата от други типове в модула и да я предадат на заявката с помощта на параметър. За съжаление, това не винаги е възможно, така че трябва да промените формата на датата в заявката.
Възможно е да посочите датата в заявката 1C като параметър за получаване на данни от таблици на виртуални регистри. В тази роля можете също да използвате всички горепосочени функции. Но тук е важно да се предотврати празната дата в заявката 1C да повлияе на крайния резултат от изпълнението на кода, така че е наложително да се провери.
Всички документи, които съществуват в конфигурациите на 1C, и следователно почти всички регистри трябва да имат поне един атрибут с тип Дата, поради което всеки разработчик трябва да знае и разбира:
- Как да конвертирате параметри от други типове във въпросния тип;
- Как да дефинирате празна дата в 1C заявка;
- Каква е разликата между дата и срок.
Това са въпросите, на които ще се опитаме да отговорим в нашата статия.
Какво е дата и как да я определим
Тъй като повечето управленски решения и счетоводство не изискват точност на времето, надвишаваща 1 секунда, разработчиците на платформата 1C решиха, че тази стойност ще бъде минималната граница във формата на датата. По този начин всеки атрибут, описващ времето на събитие в програмата, трябва да съдържа:
- Годината на събитието;
- Месецът на това събитие;
- ден.
По избор: час, минута и секунда. Ако тези три параметъра са пропуснати и няма допълнителни условия, програмата автоматично настройва часа към началото на деня.
Съществуващите формати за дата в света имат значителна разлика:
- В Русия сме свикнали първо да поставяме деня, след това месеца на събитието и накрая годината;
- Жителите на САЩ започват датата с месеца;
- Чехи, поляци и словенци записват периода във формат "година - месец - ден".
Това е последният формат, който използва платформата 1C.
Преобразуване към дата
За да получите параметър с тип Дата от няколко стойности или от низ, трябва да използвате кода, показан на фиг. 1
Както се вижда от горната фигура, можете да определите датата както с помощта на един ред, така и с разделянето на този ред на съставните му части с помощта на запетая, резултатът няма да се промени.
Важно е да се разбере, че годината на датата трябва да съдържа четири цифри, включително хилядолетието и века на събитието, месецът, денят, часовете и секундите трябва да са с дължина два знака, включително водещите нули.
Обратното броене в програмата започва от началото на деня на 1 януари 0001 г. За горния код тази стойност може да се определи по един от двата начина (Фигура 2).
Ориз. 2
Във втория ред пропуснахме часовете, минутите и секундите на събитието, което ни най-малко не повлия на производителността на нашия код.
Характеристики на използване на дати в 1C заявки
За повечето типове данни, използвани от платформата 1C, има предварително дефинирани void стойности. За числа това е 0, за връзки можете да дефинирате стойността EmptyReference(), за дата датата на началото на обратното броене се счита за празна стойност, именно с нея подробностите от съответния тип трябва да се сравняват, когато се задават параметри на заявката.
Важно е да се разбере, че дори ако в стойността на атрибута на формата на въпросния тип не са посочени числа, т.е. прозорецът изглежда така (фиг. 3), това не означава, че нищо не е посочено в него, сравнявайки този параметър с празен низняма да мине.
Ориз. 3
След като получим празна дата, можем да я посочим като параметър към нашата заявка, тоест да използваме конструкцията (фиг. 4)
Въпреки това, има моменти, когато е по-добре да проверите в тялото на заявката, без да предавате празна дата като параметър. За да направите това, можете да въведете подходящото условие в кода на заявката (фиг. 5) и да използвате функцията за заявка DateTime().
Ориз. 5
В дадения текст на заявката пропуснахме водещите нули от годината, месеца и деня, а също така не посочихме часове, минути и секунди и програмата, както се казва, изяде това предположение.
Дата и срок
Друг интересен фактпо отношение на връзката между заявки и дата е използването на концепцията за "точка във времето", когато се отнася до различни таблици на база данни.
Точността "до милисекунда", посочена в техническата документация при описание на примитивен тип Дата, се проявява най-ясно при избора на записи от виртуалните таблици на регистъра за натрупване: ако регистърът за натрупване, в допълнение към таблицата за оборот, има Таблици Remains и RemainsAnd Turnovers, тогава селекцията върху тях, извършвана за определено време, може да даде различни резултати.
За да разберете как и защо се случва това, разгледайте прост пример:
- Преди изпълнение на документа за продажба в 12 часа 31 минути 36 секунди салда по номенклатура Захар са 30 кг.;
- Документът отписва 10 кг в посоченото време;
- Справката, генерирана на датата на документа в 12 часа 31 минути 36 секунди по таблица Остатъци ще покаже остатък от 30 кг.;
- Същият отчет на таблицата Салда и обороти в същото време ще покаже баланс от 20 кг.
Каква е причината за това поведение и как да го избегнем?
Проблемът е, че в таблицата Remains периодът е зададен като отворен сегмент, тоест движенията, извършени към момента на генериране на отчета, не се вземат предвид, тоест времето се взема в началото на второ, посочено в параметъра. В същото време за таблицата Обороти и за таблицата Остатъци и обороти се вземат предвид времевите ограничения, т.е. времето се взема в края на определената секунда.
Има няколко изхода от тази ситуация:
- Когато използвате таблицата с остатъците, задайте времева точка с 1 секунда по-голяма от зададената;
- Използвайте само таблицата Салда и обороти (не е най-оптималната опция по отношение на производителността);
- Използвайте термина граница.
Последната опция може да бъде представена от кода, показан на фиг. 6.
В първия параметър на нашия обект посочваме датата, за която трябва да се генерира справката, вторият параметър определя вида на границата. Тъй като за нас е важно движенията на дадена дата да бъдат включени в селекцията, трябва да зададем този параметър на позиция „Включително“.
В 1C заявките, както и във вградения език на платформата 1C:Enterprise, има функции за работа с дати. Те помагат за опростяване на преобразуването на дати в заявки и избягват използването на голям брой параметри. Нека разгледаме тези функции.
Как да зададете датата в заявките на 1C като константа
DATETIME (година, месец, ден, час, минута, секунда). Настроики Година, МесецИ денса задължителни, други не са. Ако не посочите час, системата ще зададе началото на деня.
Заявка. Текст= "ИЗБИРАМ
ДАТА ЧАС (2016,09,28,12,22,00)";
// Резултат: 28 септември 2016 г. 12:22:00 ч
В допълнение, само изрични числа могат да бъдат посочени като параметри на тази функция. Не можете да задавате стойности на други функции като параметри. Например, тази конструкция няма да работи:
Заявка. Текст= "ИЗБИРАМ
DATETIME(Година(Източник.Дата),09,28,12,22,00)
От Directory.Source AS Source";
Как да получите началото или края на годината, половин година, тримесечие, месец, десетилетие, седмица, ден, час, минута в 1C заявки
За това се използват следните функции:
- Начален период (дата, период)
- EndPeriod(Дата, Период)
Като параметър датапредадена стойност с тип Дата на.Параметър Период .
Заявка. Текст= "ИЗБИРАМ
Начален период(ДАТАЧАС(2016,09,28,12,22,00), ДЕКАД)";
// Резултат: 21 септември 2016 г. 0:00:00
Заявка. Текст= "ИЗБИРАМ
Краен период(ДАТАЧАС(2016,09,28,12,22,00), ТРИМЕСЕЧИЕ)";
// Резултат: 30 септември 2016 г. 23:59:59
Както можете да видите от примерите, в тези функции могат да се използват други, вложени функции.
Как да получите година, ден от годината, тримесечие, месец, седмица, ден от седмицата, ден, час, минута, секунда от дата в 1C заявки
За да направите това, има съответните функции, в които трябва да предадете датата като параметър.
- функция ГОДИНА (дата)- връща номера на годината;
- функция ДЕН ОТ ГОДИНАТА (Дата)- връща номера на деня в годината;
- функция ТРИМЕСЕЧИЕ (Дата)- връща номера на тримесечието;
- функция МЕСЕЦ (дата)- връща номера на месеца;
- функция СЕДМИЦА (дата)- връща номера на седмицата в годината;
- функция ДЕН ОТ СЕДМИЦАТА (Дата)- връща номера на деня от седмицата (понеделник - 1, неделя - 7);
- функция ДЕН (дата)- връща номера на деня в месеца;
- функция ЧАС (дата)- връща часа;
- функция МИНУТА (дата)- връща минути;
- функция ВТОРА (Дата)- връща секунди.
Заявка. Текст= "ИЗБИРАМ
ГОДИНА(ДАТАЧАС(2016,09,28,12,22,00))"; // Резултат: 2016г
Заявка. Текст= "ИЗБИРАМ
СЕДМИЦА(ДАТАЧАС(2016,09,28,12,22,00))"; // Резултат: 40
Заявка. Текст= "ИЗБИРАМ
DAYWEEK(DATETIME(2016,09,28,12,22,00))"; // Резултат: 3
Заявка. Текст= "ИЗБИРАМ
DAYEAR(DATETIME(2016,09,28,12,22,00))"; // Резултат: 272
Заявка. Текст= "ИЗБИРАМ
ДЕН(ДАТАЧАС(2016,09,28,12,22,00))"; // Резултат: 28
Как да добавите или извадите от дата година, половин година, тримесечие, месец, десетилетие, седмица, ден, час, минута, секунда в 1C заявки
За целта се използва функцията AddKDate(Дата, Период, Стойност).
Като параметър датапредадена стойност с тип Дата на.Параметър Периодможе да приема една от следните стойности: ВТОРО, МИНУТА, ЧАС, ДЕН, СЕДМИЦА, ДЕСЕТИЛЕТИЕ, МЕСЕЦ, ТРИМЕСЕЧИЕ, ПОЛУГОДИНА, ГОДИНА.
Параметър Значениепоказва броя на добавените периоди. Ако трябва да се извади периодът, тогава параметърът Значениетрябва да е отрицателен.
Заявка. Текст= "ИЗБИРАМ
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0), ПОЛОВИН ГОДИНА, 1)";
// Резултат: 28 март 2017 г. 12:22:00
Заявка. Текст= "ИЗБИРАМ
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0), DECAD, -1)";
// Резултат: 18 септември 2016 г. 12:22:00 ч
Как да изчислим разликата в датата в 1C заявки
За целта се използва функцията DifferenceDate(Дата1, Дата2, Период).
Параметър Дата1е датата, която трябва да бъде извадена.
Параметър Дата 2 -датата, от която се изважда.
Параметър Периодможе да приема една от следните стойности: ВТОРО, МИНУТА, ЧАС, ДЕНЯТ, МЕСЕЦ, ТРИМЕСЕЧИЕ, ГОДИНА. Показва в какви единици искаме да получим резултата
Заявка. Текст= "ИЗБИРАМ
DifferenceDATE(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME(2017, 9, 28, 12, 22, 0), QUARTER)"; // Резултат: 4
Заявка. Текст= "ИЗБИРАМ
DifferenceDATE(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME(2017, 9, 28, 12, 22, 0), Second)";
// Резултат: 31 536 000
Във всички функции с изключение на функцията ВРЕМЕ ЗА СРЕЩА, като параметър датаможе да бъде не само конкретна стойност на дата (константа или параметър на заявка), но и полета на изходната таблица.