Как да посочите празна дата в заявка? 1c функции за работа с дати в заявка.

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

  • Как да конвертирате параметри от други типове във въпросния тип;
  • Как да определите празна дата в заявка за 1C;
  • Каква е разликата между дата и срок?

Именно на тези въпроси ще се опитаме да отговорим в нашата статия.

Какво е дата и как да я определим

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

  • Годината на събитието;
  • Месец на това събитие;
  • ден.

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

Съществуващите формати за дата в света имат значителни разлики:

  1. В Русия сме свикнали първо да поставяме деня, след това месеца на събитието и накрая годината;
  2. Жителите на САЩ започват датата с месеца;
  3. Чехи, поляци и словенци записват периоди във формат година – месец – ден.

Това е последният формат, който използва платформата 1C.

Преобразуване към дата

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

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

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

Отброяването на времето в програмата започва от началото на деня на 1 януари 0001 г. За кода по-горе тази стойност може да се определи по един от двата начина (Фигура 2).

Ориз. 2

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

Характеристики на използване на дата в 1C заявки

За повечето типове данни, използвани от платформата 1C, има предварително дефинирани void стойности. За числа е 0, за връзки можете да дефинирате стойността EmptyLink(), за дата празната стойност обикновено се счита за начална дата и именно с нея трябва да се сравняват детайлите на съответния тип, когато задавате параметри на заявката.

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

Ориз. 3

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

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

Ориз. 5

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

Граница за дата и час

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

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

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

  1. Преди извършване на документ за продажба в 12 часа 31 минути 36 секунди балансите по Захарна номенклатура са 30 кг.;
  2. Документ в определено времеотписани са 10 кг.;
  3. Отчетът, генериран на датата на документа в 12 часа 31 минути 36 секунди според таблицата Остатък ще покаже остатък от 30 кг.;
  4. Същият отчет на таблицата Остатъци и обороти за същото време ще покаже баланс от 20 кг.

Каква е причината за това поведение и как да го избегнем?

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

Има няколко изхода от тази ситуация:

  1. Когато използвате таблицата Remains, посочете времева точка с 1 секунда по-голяма от зададената;
  2. Използвайте само таблицата за остатъци и обороти (не е най-оптималната опция от гледна точка на ефективността);
  3. Използвайте концепцията за граница.

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

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

Доста често има нужда да работите с променливи от типа „Дата“. В тази статия ще разгледаме основните техники - предаване на текущата дата, проверка за празна стойност, произволна дата.

Когато пишете заявки, често трябва да сравнявате данните с текущата дата. Вграденият 1C език има функцията CurrentDate(). Позволява ви да определите текущия час и дата на вашия компютър. За да извършвате операции с текущата дата, трябва да предадете стойността на тази функция като параметър към заявката.

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

ExampleRequest = Нова заявка;
Пример Request.Text = "
|ИЗБЕРЕТЕ
| AdvanceReportAttachedFiles.Link
| ОТ
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
|КЪДЕ
| AdvanceReportAttachedFiles.Date< &ТекДата»;
Пример Request.SetParameter("CurrentDate", CurrentDate());

Персонализирана дата

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

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

Този пример ще извлече всички файлове, прикачени към отчетите за разходите до края на миналата 2016 г. В тази връзка ще посочим час, минута и секунда, за да сравним часовата точка „31 декември 2016 г. 23:59:59“.

ИЗБИРАМ
AdvanceReportAttachedFiles.Link
ОТ
Directory.AdvanceReportAttachedFiles КАТО AdvanceReportAttachedFiles
КЪДЕТО
AdvanceReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Празна дата

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

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

Как да зададете дата в 1C заявки като константа

DATETIME (година, месец, ден, час, минута, секунда). Настроики Година, МесецИ денса задължителни, други не са. Ако не посочите часа, системата ще зададе началото на деня.

Заявка. Текст= "ИЗБИРАМ
ДАТА ЧАС (2016,09,28,12,22,00)"
; // Резултат: 28 септември 2016 г. 12:22:00

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

Заявка. Текст= "ИЗБИРАМ
DATETIME (Година (Източник.Дата),09,28,12,22,00)
От директорията.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 заявки

За да направите това, има съответните функции, на които трябва да предадете датата като параметър.

  • функция ГОДИНА (дата)— връща номера на годината;
  • функция DAYYEAR (дата)— увеличава броя на деня в годината;
  • функция ТРИМЕСЕЧИЕ (Дата)— връща номера на тримесечието;
  • функция МЕСЕЦ (дата)— връща номера на месеца;
  • функция СЕДМИЦА (дата)— връща номера на седмицата в годината;
  • функция ДЕН ОТ СЕДМИЦАТА (Дата)— връща номера на деня от седмицата (понеделник — 1, неделя — 7);
  • функция ДЕН (дата)— връща номера на деня в месеца;
  • функция ЧАС (дата)— връща часа;
  • функция МИНУТА (дата)— връща минути;
  • функция ВТОРА (Дата)— връща секунди.

Заявка. Текст= "ИЗБИРАМ
ГОДИНА(ДАТАЧАС (2016,09,28,12,22,00))"
; // Резултат: 2016г

Заявка. Текст= "ИЗБИРАМ
СЕДМИЦА(ДАТА ЧАС (2016,09,28,12,22,00))"
; // Резултат: 40

Заявка. Текст= "ИЗБИРАМ
ДЕЛНИК (ДАТА ЧАС (2016,09,28,12,22,00))"
; // Резултат: 3

Заявка. Текст= "ИЗБИРАМ
DAYEAR(DATETIME (2016,09,28,12,22,00))"
; // Резултат: 272

Заявка. Текст= "ИЗБИРАМ
ДЕН(ДАТАЧАС (2016,09,28,12,22,00))"
; // Резултат: 28

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

За да направите това, използвайте функцията AddToDate(Дата, Период, Стойност).

Като параметър датапредава се стойност с тип Дата на.Параметър Периодможе да приема една от следните стойности: ВТОРО, МИНУТА, ЧАС, ДЕН, СЕДМИЦА, ДЕСЕТИЛЕТИЕ, МЕСЕЦ, ТРИМЕСЕЧИЕ, ПОЛУГОДИНА, ГОДИНА.

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

Заявка. Текст= "ИЗБИРАМ
AddToDate(DATETIME(2016, 9, 28, 12, 22, 0), HALF YEAR, 1)"
; // Резултат: 28 март 2017 г. 12:22:00

Заявка. Текст= "ИЗБИРАМ
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0), DECADE, -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

Във всички функции с изключение на функцията ВРЕМЕ ЗА СРЕЩА, като параметър датаможе да бъде не само конкретна стойност на дата (константа или параметър на заявка), но и полета на таблицата източник.

Типът „Дата“ в 1C е един от 4-те основни типа данни заедно с число, низ и булев тип. Датите са повсеместни в конфигурациите – невъзможно е да се избегне работата с този тип данни по време на разработката. Ето защо е по-добре да започнете да пишете заявки, като вече разбирате как да обработвате дати, какви опции има за работа с тях и как се съхраняват. Нека да разгледаме примери за всички нюанси на писане на заявки с различни дати.

Примери за работа с дати в 1C заявки

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

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

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

ДАТА ЧАС (1, 1, 1)

Използвайки подобна команда, можете да получите произволна дата и час в заявка. Освен това те могат да бъдат зададени с точност до секунда, като се посочат 6 числа като параметри. Ако се използват само 3 числа, тогава часовете, минутите и секундите ще бъдат зададени на 0 (началото на деня). Например трябва да изберем документи за първите 10 дни на януари 2018 г. в заявката:

ИЗБЕРЕТЕ разписка към текуща сметка. Връзка AS Връзка ОТ документа. Разписка към текуща сметка AS разписка към текуща сметка WHERE разписка към текуща сметка. Дата МЕЖДУ DATETIME(2018, 1, 1, 0, 0, 0) И DATETIME(2018, 1, 10, 23, 59, 59)

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

  • НАЧАЛО НА ПЕРИОД.Параметрите показват датата и периода от време, в контекста на който е необходимо да се получи началото на датата. Използва се за преобразуване на дата във вечен формат. За да направите това, трябва да зададете втория параметър – „ДЕН”;
НАЧАЛО НА ПЕРИОД(,) НАЧАЛО НА ПЕРИОД(&Дата, ДЕН) период>дата>
  • КРАЙ НА ПЕРИОДА.Подобна команда, която връща последната дата по отношение на единиците, посочени в параметрите;
  • ADDKDATE.Позволява ви да получите дата, която е по-голяма с определен брой определени времеви единици. Функционалните параметри включват дата, единица за време и число;
ADDKDATE(,) ADDKDATE(&Дата, ДЕН, 10) количество>тип>дата>
  • ДАТА НА РАЗЛИКА.Получава разликата между датите в посочените единици;
DIFFERENCEDATE(,) DIFFERENCEDATE(&Дата1, &Дата2, ДЕН) тип>дата2>дата1>
  • ДЕН ОТ СЕДМИЦАТА.Връща поредния номер на един от дните от седмицата.

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

ИЗБЕРЕТЕ WHENDAY ОТ СЕДМИЦА(&CurrentDate) = 1 СЛЕД ТОВА "Понеделник" WHENDAYDAY(&CurrentDate) = 2 СЛЕД ТОВА "Вторник" WHENDAY ОТ СЕДМИЦА(&CurrentDate) = 3 СЛЕД ТОВА "Сряда" WHENDAYDAY(&CurrentDate) = 4 СЛЕД ТОВА "Четвъртък" WHENDAY СЕДМИЦИ (&Текуща дата) = 5 СЛЕД ТОВА "Петък" ДЕН ОТ СЕДМИЦАТА (&Текуща дата) = 6 СЛЕД ТОВА "Събота" ИНАЧЕ "Неделя" КРАЙ

Преобразуването на типове в 1C заявка от число или низ в дата е трудоемка задача. Можете да получите дата от числа с помощта на функцията DATETIME, от низ - чрез комбиниране на функцията SUBSTRING и конструкцията SELECT WHEN THEN ELSE. Въз основа на това разработчиците предпочитат да получат датата от други типове в модула и да я предадат на заявката с помощта на параметър. За съжаление, това не винаги е възможно, така че трябва да промените формата на датата в заявката.

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

Много често в заявките на 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.



грешка:Съдържанието е защитено!!