1c вземете текущата дата в заявката. Как да посочите празна дата в заявка? Преобразуване към дата

43
NULL – липсващи стойности. Да не се бърка с нулева стойност! NULL не е число, не е равно на интервал, празна препратка или Undefined. NULL е типообразуваща стойност, т.е. има тип NULL и една единствена стойност от този тип. НУЛА... 26
За генериране и изпълнение на заявки към таблици на база данни в платформата 1C се използва специален обект на езика за програмиране Query. Този обект се създава чрез извикване на конструкцията New Request. Удобна заявка... 18
Статията предоставя полезни техники при работа с 1C v.8.2 заявки, както и информация, която не е толкова добре известна за езика на заявките. Не се опитвам да дам пълно описание на езика на заявките, но искам да се спра само на... 13
LIKE - Оператор за проверка на низ за сходство с модел. Аналог на LIKE в SQL. Операторът SIMILAR ви позволява да сравните стойността на израза, посочен вляво от него, с низа на модела, посочен вдясно. Значението на израза...

Всички документи, съществуващи в конфигурации на 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 за работа с дати. Ще изградим примери на базата на информационния регистър Организации на служителите 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.