Как да посочите празна дата в заявка? Месец като ред от датата в заявката 1s.
Всички документи, съществуващи в конфигурации на 1C, и следователно почти всички регистри трябва да имат поне един атрибут с тип Дата, поради което всеки разработчик трябва да знае и разбира:
- Как да конвертирате параметри от други типове във въпросния тип;
- Как да определите празна дата в заявка за 1C;
- Каква е разликата между дата и срок?
Именно на тези въпроси ще се опитаме да отговорим в нашата статия.
Какво е дата и как да я определим
Тъй като вземането на повечето управленски решения и воденето на записи не изискват точност на времето, надвишаваща 1 секунда, разработчиците на платформата 1C решиха, че тази стойност ще бъде абсолютният минимум във формата на датата. По този начин всеки атрибут, описващ времето на събитие в програмата, трябва да съдържа:
- Годината на събитието;
- Месец на това събитие;
- ден.
Не е необходимо да се посочват: час, минута и секунда. Ако тези три параметъра са пропуснати и няма допълнителни условия, програмата автоматично настройва часа към началото на деня.
Съществуващите формати за дата в света имат значителни разлики:
- В Русия сме свикнали първо да поставяме деня, след това месеца на събитието и накрая годината;
- Жителите на САЩ започват датата с месеца;
- Чехи, поляци и словенци записват периоди във формат година – месец – ден.
Това е последният формат, който използва платформата 1C.
Преобразуване към дата
За да получите параметър с тип Дата от няколко стойности или от низ, трябва да използвате кода, показан на фиг. 1
Както може да се види от фигурата по-горе, можете да определите датата или с помощта на един ред, или като разделите този ред на съставните му части със запетая, резултатът няма да се промени.
Важно е да се разбере, че годината на датата трябва да съдържа четири цифри, включително хилядолетието и века на събитието, месецът, денят, часовете и секундите трябва да са с дължина два знака, включително водещите нули.
Отброяването на времето в програмата започва от началото на деня на 1 януари 0001 г. За кода по-горе тази стойност може да се определи по един от двата начина (Фигура 2).
Ориз. 2
Във втория ред пропуснахме часовете, минутите и секундите на събитието, което изобщо не повлия на производителността на нашия код.
Характеристики на използване на дата в 1C заявки
За повечето типове данни, използвани от платформата 1C, има предварително дефинирани void стойности. За числа е 0, за връзки можете да дефинирате стойността EmptyLink(), за дата празната стойност обикновено се счита за начална дата и именно с нея трябва да се сравняват детайлите на съответния тип, когато задавате параметри на заявката.
Важно е да се разбере, че дори ако стойността на даден атрибут на формата от въпросния тип не съдържа никакви числа, т.е. прозорецът изглежда така (фиг. 3), това не означава, че в него не е посочено нищо; на този параметър с празен низ няма да работи.
Ориз. 3
След като получим празна дата, можем да я посочим като параметър към нашата заявка, тоест да използваме конструкцията (фиг. 4)
Въпреки това, има моменти, когато е по-добре да проверите в тялото на заявката, без да подавате празна дата като параметър. За да направите това, можете да въведете подходящото условие в кода на заявката (фиг. 5) и да използвате функцията за заявка DateTime().
Ориз. 5
В горния текст на заявката пропуснахме водещите нули на годината, месеца и деня, а също така не посочихме часовете, минутите и секундите и програмата, както се казва, изяде това предположение.
Граница за дата и час
Друг интересен фактсвързано с връзката между заявките и датите е използването на концепцията за „точка във времето“ при достъп до различни таблици на база данни.
Точността „до милисекунда“, посочена в техническата документация при описание на примитивния тип Дата, се проявява най-ясно при избора на записи от виртуалните таблици на регистъра за натрупване: ако регистърът за натрупване, в допълнение към таблицата за оборот, има Остатък и таблици за оставане и оборот, след което вземането на проби от тях се извършва за определено време, може да даде различни резултати.
За да разберете как и защо се случва това, разгледайте прост пример:
- Преди извършване на документ за продажба в 12 часа 31 минути 36 секунди балансите по Захарна номенклатура са 30 кг.;
- Документът отписва 10 кг в определеното време;
- Отчетът, генериран на датата на документа в 12 часа 31 минути 36 секунди според таблицата Остатък ще покаже остатък от 30 кг.;
- Същият отчет на таблицата Остатъци и обороти за същото време ще покаже баланс от 20 кг.
Каква е причината за това поведение и как да го избегнем?
Проблемът е, че в таблицата Remaining периодът е посочен като отворен сегмент, тоест не се вземат предвид движенията, направени към момента на генериране на отчета, тоест времето се взема в началото на секундата, посочена в параметърът. В същото време за таблицата на оборотите и за таблицата Остатъци и обороти се вземат предвид времевите граници, т.е. времето се взема в края на определената секунда.
Има няколко изхода от тази ситуация:
- Когато използвате таблицата Remains, посочете времева точка с 1 секунда по-голяма от зададената;
- Използвайте само таблицата за остатъци и обороти (не е най-оптималната опция от гледна точка на ефективността);
- Използвайте концепцията за граница.
Последната опция може да бъде представена от кода, показан на фиг. 6.
В първия параметър на нашия обект посочваме датата, за която трябва да се генерира справката, вторият параметър определя вида на границата. Тъй като за нас е важно движенията на дадена дата да бъдат включени в селекцията, трябва да зададем този параметър на позиция „Включително“.
43
NULL – липсващи стойности. Да не се бърка с нулева стойност! NULL не е число, не е равно на интервал, празна препратка или Undefined. NULL е типообразуваща стойност, т.е. има тип NULL и една единствена стойност от този тип. НУЛА...
26
За генериране и изпълнение на заявки към таблици на база данни в платформата 1C се използва специален обект на езика за програмиране Query. Този обект се създава чрез извикване на конструкцията New Request. Удобна заявка...
18
Статията предоставя полезни техники при работа с 1C v.8.2 заявки, както и информация, която не е толкова добре известна за езика на заявките. Не се опитвам да давам Пълно описаниеезик за заявки, но просто искам да се спра на...
13
LIKE - Оператор за проверка на низ за сходство с модел. Аналог на LIKE в SQL. Операторът SIMILAR ви позволява да сравните стойността на израза, посочен вляво от него, с низа на модела, посочен вдясно. Значението на израза...
Инструменти за идентифициране на празни връзки, дати или низове. Нека да разгледаме как да проверим за празна връзка, дата или ред в заявка за 1C.
Можете да дефинирате нулеви данни, като използвате специални оператори.
Информацията от базата данни 1C се изисква (и след това се получава) с помощта на инструмент като език за заявки (Query). Изписани са на латиница и кирилица. И една от ключовите команди (оператори) при получаване на информация е командната дума SELECT (англ.) в комбинация с някои конструкции. Ето примери за конструиране на заявени задачи, които ни интересуват по темата:
Проверка за NULL съдържание
Тази задача се изпълнява от оператора SELECT в комбинация с конструкцията „IS NULL“:
ИЗБЕРЕТЕ
Поръчки Остават. Клиент,
Оставащи поръчки.Оставащо количество
ОТ
RegisterAccumulations.Orders.Remains КАТО OrdersRemains
КЪДЕТО
OrdersRemaining.QuantityRemaining IS NULL
Контрол на датата
Празна дата в заявка за 1C се въвежда с помощта на конструкцията „DATETIME(1, 1, 1, 0, 0, 0)“:
ИЗБЕРЕТЕ
InvoiceIncomingSupplier.Link,
Фактура Доставчик Дата на пристигане
ОТ
Документ. InvoiceSupplier КАТО InvoiceSupplier
КЪДЕТО
InvoiceIncomingSupplier.IncomingDate = DATETIME(1, 1, 1, 0, 0, 0)
Проверка на справка
Несъществуващите вътрешнореферентни стойности (за сметкопланове, директории и т.н.) се проверяват с помощта на конструкцията „VALUE(Directory.Name…EmptyLink)“:
Проверка на низ
Празните редове се откриват чрез използване на интервал в кавички "":
ИЗБЕРЕТЕ
Купувачи.Връзка
ОТ
Справочник Купувачи AS Купувачи
КЪДЕТО
Buyers.Code = ""
Повече за невалидни и редовни връзки
„Прилеп“ е връзка, която води (сочи) към несъществуващ елемент. Под несъществуващ имаме предвид такъв, който не е в базата данни. Полезно е да знаете за такива връзки, поне за да получавате известия от системата в по-разбираема форма. А записването, изтриването и отварянето на нереални обекти няма смисъл.
Платформите 1C нямат вътрешни средства за прекъсването им. Трябва също да разберете, че извън „счупените“ в системата има специални „празни връзки“, които трябва да се разграничават една от друга.
Това може да се намери без запитване към базата данни:
В системата 1C-7.7
За „бита“ методът Link.Selected() и функцията EmptyValue() връщат нула. За "празно" - в първия случай е нула, а във втория случай е единица. За „нормално“ - единица и нула. Оказва се, че в 1C-7.7 „счупен“ не е несъществуваща стойност, която не се счита за избрана.
В системата 1C-8.x
Всичко е различно - и в двата случая (за "счупен" и "нормален") методът връща False, а функцията връща True. Решението е следното: За „счупения“ метод методът Link.GetObject() връща функцията „Undefined“. За „празно“ - хвърля се „Грешка на контекстния метод“. За “нормално” - стойността се връща според документацията; Оказва се, че в 1C-8.x „счупен“ няма да бъде несъществуваща функция от референтен тип, която връща недефинирана стойност на обект.
Откъде идват
Когато навигира до несъществуващ адрес на повредена връзка, на потребителя в най-добрия случай се показва известие, че обектът не е намерен, в най-лошия - изображение на страницата на сървъра. Най-лошата им черта е тяхната потайност. Оттук и трудността при проверката на коректността им. По време на работа с конфигурацията тя непрекъснато се усъвършенства и актуализира. Някои обекти трябва да бъдат изтрити, структурата се променя. И препратката към изтрития елемент остава в структурите и алгоритмите. Така несъществуващите адреси остават в системата след изтриването на самия елемент (заедно с адреса).
Днешната публикация разгледа конструкцията на специална заявка. Дадени са примери за дизайни. Това ще бъде полезно при търсене на празни стойности.
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 език има функцията 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)
Празна дата
Най-лесният начин да проверите променлива, за да видите дали съдържа празна дата, е да използвате просто сравнение. В този пример чрез запитване ще изберем всички касови бележки към сметката, за които не е попълнена входящата дата.