Сравнение с празна дата в заявка от 1s

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

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

Това са въпросите, на които ще се опитаме да отговорим в нашата статия.

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

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

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

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

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

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

Последният формат използва платформата 1C.

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

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

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

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

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

Ориз. 2

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

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

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

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

Ориз. 3

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

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

Ориз. пет

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

Ограничение за дата и време

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

Точността "до една милисекунда", посочена в техническата документация при описание на примитивен тип Date, се проявява най-ясно при избор на записи от виртуалните таблици на регистъра за натрупване: ако регистърът за натрупване, освен таблицата за оборот, има Таблици Remains и RemainsAnd Turnovers, тогава изборът върху тях, извършен за определено време, може да даде различни резултати.

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

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

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

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

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

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

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

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

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

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

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

    ИЗБЕРЕТЕ ДАТА ВРЕМЕ(2016, 1, 1)

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

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

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

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

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

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

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

  • КРАЙ ПЕРИОД

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

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

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

  • ДОБАВЯНЕ

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

    ИЗБЕРЕТЕ ДОБАВЯНЕ (ДАТА ВРЕМЕ(2016, 2, 15), МЕСЕЦ, 2)

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

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

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

    ИЗБЕРЕТЕ РАЗЛИКА В ДАТАТА(ДАТА ВРЕМЕ(2016, 2, 15), ДАТА ВРЕМЕ(2016, 3, 1), ДЕН

    връща 15

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

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

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

Например:
// Работа с 1C дати - конвертирайте датата в 1C от части - година, месец, ден (плюс незадължително време)
Дата = Дата(2012,10,30); //няма време
Дата = Дата(2012,10,30,12,00,00); //с време

//Работа с 1C дати - преобразуване на дата в 1C от низ, различни начини
Дата = Дата("20121030"); //година, месец, ден
Дата = Дата("10/30/2012 12:00:00 PM"); // локализиран формат, само пълен

//Работа с 1C дати - указване на стойността на датата без кастинг, директно
Дата = "20121030"; //няма време
Дата = "20121030120000"; //с време

Работа с дати 1C - Празна дата 1C

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

"Празната дата" е 01.01.0001 00:00:00.

Например:
EmptyDate = "00010101000000";
Ако желаната дата = "00010101000000" Тогава
alert("Не сте попълнили необходимата дата");
EndIf;

Работа с дати 1C - Дата в детайли (указатели, документи и др.)

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

  • Само дата (часът винаги е 00:00:00)
  • Само по време (тогава датата винаги е 01.01.0001)
  • дата и час

Получаване на датата

За да получите датата и часа, се използва функцията 1C CurrentDate().

Мястото, където се извиква тази функция, е много важно - на клиента или на сървъра. Вижте темата „Режим на изпълнение/време на изпълнение“ за подробности. Често се случва времето на клиентските машини да е малко по-различно, така че те се опитват да използват времето на сървъра навсякъде - дори и да не е зададено правилно на сървъра, тогава поне всички клиенти ще имат едно и също неправилно време.

За да се получи датата на сървъра (датата, зададена в операционната система на сървърния компютър), обикновено в конфигурацията се създава общ модул с отметнато квадратче „Сървър“ в свойствата и в него се създава функция
//функцията се намира в общ модул, например с име ServerFunctions
// в свойствата на общия модул квадратчето за отметка "Сървър" е поставено и квадратчето за отметка "Клиент" не е поставено
Функция GetServerDate() Експортиране
Връщане CurrentDate();
Крайни функции

// извикването на тази функция за използване от друг модул изглежда така
DocumentObject.Date = ServerFunctions.GetServerDate(); //Име на модул.Име на функция()

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

Начало и край на деня

За дата "30.10.2012 г.":

  • началната дата на деня изглежда така "10/30/2012 00:00:00"
  • датата на края на деня изглежда така "10/30/2012 23:59:59"

Използва се в отчети и заявки, които изискват данни за период - ден, месец, година.

Например периодът от „01/01/2012 00:00:00“ до „01/31/2012 00:00:00“ е неправилен, тъй като не включва един ден от месеца (но включва една секунда от последния ден от месеца).

Работа с дати 1C - Сравнение на дати

Датата съдържа дата и час. Когато се сравняват дати (без да се отчита времето), те обикновено се довеждат до началото на деня (месец, година).

Например:
Дата1 = Дата("10/30/2012 12:00:00 PM");
Ако StartDay(Date1) = StartDay(DocumentRef.Date) Тогава
alert("Документът е въведен на дадена дата");
EndIf;

За всеки случай, пример за сравнение на дати в период:
Ако DocumentReference.Date >= MonthStart(CurrentDate()) и
Референтен документ.Дата

Работа с дати 1C - Промяна на датата

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

Например:
Начален ден = Текуща дата() – Начален ден(Текуща дата());
Доклад("От началото на деня мина" + String(FROMDayStart) + "секунди");
Доклад("От началото на деня мина " + Низ (ОТ началото на деня / 60) + "минути");
Доклад("От началото на деня мина " + Низ (ОТ началото на деня / 60/60) + "часа");

Можем също да променим датата, като при промяна добавяме или изваждаме броя на секундите:
StartThisDay = Начален ден(ТекущаДата());

StartPreviousDay = Начален ден(StartThisDay - 1); // премахнете второто - правите "вчера" и вземете началото на деня от "вчера"

StartPreviousDay = StartThisDay - 24*60*60; //друг начин - извадете 24 часа - 24(часа) * 60 (оказаха се минути) * 60 (секунди)

Работа с дати 1C - Момент от време

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

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

Можете да получите точка във времето от документ по следните начини:
// метод 1
DocumentTimeMoment = DocumentReference.MomentTime();

Можете също да сравните момент във времето с дата/час:
MomentInTimeReference = Нов MomentInTime(Начален ден(Текуща дата()));
Ако DocumentReference.TimeIn().Compare(InTimeReference) = -1 Тогава
Покажи("Документът е въведен по-рано от днес");
EndIf;
//Ако документът е въведен с днешна дата в 00:00:00, тогава все пак се въвежда - днес

Работа с дати 1C - Форматиране на дати

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

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

Проверката за тази стойност може да се извърши с помощта на конструкцията "IS NULL" и "". В първия случай се връща True или False. Във втория случай можете веднага да зададете друга стойност в случай, когато се върне NULL.

Заявката 1C 8.3 по-долу ще върне списък с лица за контакт за тези партньори, които нямат набор от сегменти.

ИЗБЕРЕТЕ
ContactPartners.Link
ОТ
Справочник.Лица за контакт на партньори AS Лица за контакт на партньори
ВЪТРЕШНО ПРИСЪЕДИНЕНИЕ
PO ContactPartners.Owner = SegmentsPartners.Parent
КЪДЕТО
SegmentsPartners.Reference Е NULL

празна дата

Стойността се проверява за празна дата, като се сравнява с конструкцията DATETIME(1, 1, 1, 0, 0, 0). По-долу е даден пример за употреба:

Празна връзка в заявка 1C

В случай, когато върнатият атрибут има референтен тип, например, той е елемент от някаква директория, документ и т.н., се използва следната конструкция: VALUE(Catalog.CatalogName.EmptyReference).

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

За да проверите за "ValueFilled", трябва да направите обратното условие:

Partners.BusinessRegion<>VALUE(Catalog.BusinessRegions.EmptyReference)

Празен ред

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

Заявката по-долу ще избере всички партньори с празно име.

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

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

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

RequestExample = Нова заявка;
Пример Заявка.Текст ="
|ИЗБЕРЕТЕ
| Предварителен докладПриложени файлове.Връзка
| ОТ
| Directory.Advance ReportAttachedFilesAS AdvanceReportAttachedFiles
|КЪДЕ
| Предварителен отчетAttachedFiles.Date< &ТекДата»;
Пример за заявка.SetParameter("CurrentDate", CurrentDate());

Произволна дата

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

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

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

ИЗБЕРЕТЕ
Предварителен докладПриложени файлове.Връзка
ОТ
Directory.Advance Report Прикачени файлове КАТО Предварителен отчет Прикачени файлове
КЪДЕТО
Предварителен отчетAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

празна дата

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