Аппараттық және бағдарламалық қамтамасыз етуді орнату

1s 8 бос. Сұраудағы нөлдік мәндермен жұмыс істеу

1С конфигурацияларында бар барлық құжаттар, демек, барлық дерлік регистрлерде Date түрі бар кем дегенде бір атрибут болуы керек, сондықтан әрбір әзірлеуші ​​білуі және түсінуі керек:

  • Басқа типтердің параметрлерін қарастырылып отырған түрге қалай түрлендіруге болады;
  • 1С сұранысындағы бос күнді қалай анықтауға болады;
  • Күн мен уақыт шегінің айырмашылығы неде.

Бұл сұрақтарға біз мақаламызда жауап беруге тырысамыз.

Күн дегеніміз не және оны қалай анықтауға болады

Көптеген басқару шешімдері мен бухгалтерлік есеп 1 секундтан асатын уақыт дәлдігін талап етпейтіндіктен, 1С платформасын әзірлеушілер бұл мән күн пішіміндегі ең төменгі шек болады деп шешті. Осылайша, бағдарламадағы оқиғаның уақытын сипаттайтын әрбір атрибут мыналарды қамтуы керек:

  • Оқиға болған жыл;
  • Бұл оқиғаның айы;
  • Күн.

Қосымша: сағат, минут және секунд. Осы үш параметр алынып тасталса және қосымша шарттар болмаса, бағдарлама уақытты күннің басына автоматты түрде орнатады.

Әлемде бар күн пішімдерінің айтарлықтай айырмашылығы бар:

  1. Ресейде біз алдымен күнді, содан кейін оқиғаның айын, ал соңында жылды қоюды әдетке айналдырдық;
  2. АҚШ тұрғындары күнді айдан бастайды;
  3. Чехтар, поляктар және словендер кезеңді «Жыл – Ай – Күн» форматында жазады.

Бұл 1С платформасы қолданатын соңғы пішім.

Күнге түрлендіру

Бірнеше мәндерден немесе жолдан Date түрі бар параметрді алу үшін суретте көрсетілген кодты пайдалану керек. бір

Суреттен көріп отырғаныңыздай, күнді бір жолдың көмегімен де анықтауға болады, сонымен қатар бұл жолды үтір арқылы оның құрамдас бөліктеріне бөлу арқылы нәтиже өзгермейді.

Күннің жылы оқиғаның мыңжылдығы мен ғасырын қоса алғанда, төрт саннан тұруы керек, ай, күн, сағат және секунд екі таңбадан тұруы керек, оның ішінде алдыңғы нөлдер болуы керек екенін түсіну маңызды.

Бағдарламадағы кері санақ 0001 жылдың 1 қаңтарында күннің басынан басталады. Жоғарыда келтірілген код үшін бұл мәнді екі жолдың бірімен анықтауға болады (2-сурет).

Күріш. 2

Екінші жолда іс-шараның сағаттарын, минуттарын және секундтарын өткізіп жібердік, бұл біздің кодымыздың жұмысына ең аз әсер етпеді.

1С сұраныстарында күндерді қолдану ерекшеліктері

1С платформасы пайдаланатын көптеген деректер түрлері үшін алдын ала анықталған бос мәндер бар. Сандар үшін бұл 0, сілтемелер үшін EmptyReference() мәнін анықтауға болады, күндер үшін кері санақтың басталу күні бос мән болып саналады, дәл осымен сәйкес түрдегі мәліметтер қажет. сұрау параметрлерін орнату кезінде салыстырылады.

Қарастырылып отырған түрдің пішін атрибутының мәнінде сандар көрсетілмесе де, яғни терезе (3-сурет) сияқты көрінсе де, бұл онда ештеңе көрсетілмегенін білдірмейтінін түсіну маңызды, салыстыру бұл параметрдің бос жолы жұмыс істемейді.

Күріш. 3

Бос күнді алғаннан кейін біз оны сұрауымызға параметр ретінде көрсете аламыз, яғни құрылысты пайдалана аламыз (4-сурет)

Дегенмен, параметр ретінде бос күнді өткізбей сұрау денесінің ішінен тексерген дұрыс. Ол үшін сұраныс кодына сәйкес шартты енгізуге болады (5-сурет) және DateTime() сұрау функциясын пайдалануға болады.

Күріш. 5

Жоғарыдағы сұраныс мәтінінде біз жыл, ай және күннің алдыңғы нөлдерін алып тастадық, сонымен қатар сағаттарды, минуттарды және секундтарды көрсетпедік, ал бағдарлама, олар айтқандай, бұл болжамды жеп қойды.

Күн мен уақыт шегі

Тағы біреу қызықты фактсұраулар мен күннің арақатынасына қатысты мәліметтер базасының әртүрлі кестелеріне сілтеме жасағанда «уақыт нүктесі» түсінігін пайдалану болып табылады.

Қарапайым типті сипаттау кезінде техникалық құжаттамада көрсетілген «миллисекундқа дейін» дәлдік Күн жинақтау тізілімінің виртуалды кестелерінен жазбаларды таңдау кезінде айқын көрінеді: егер жинақтау тізілімінде «Айналым» кестесінен басқа, Қалдықтар болса. және Қалдықтар және айналымдар кестелері, содан кейін олар бойынша іріктеу жүргізіледі белгілі бір уақыт, әртүрлі нәтижелер беруі мүмкін.

Мұның қалай және неге болатынын түсіну үшін қарапайым мысалды қарастырыңыз:

  1. 12 сағат 31 минут 36 секундта сату құжатын орындауға дейін Қант номенклатурасы бойынша қалдықтар 30 кг;
  2. Құжат көрсетілген уақытта 10 кг есептен шығарды;
  3. Қалдықтар кестесіне сәйкес құжаттың күні 12 сағат 31 минут 36 секундта жасалған есепте 30 кг теңгерім көрсетіледі;
  4. Баланс және айналымдар кестесіндегі сол есепте бір уақытта 20 кг баланс көрсетіледі.

Бұл мінез-құлықтың себебі неде және оны қалай болдырмауға болады?

Мәселе мынада, Remains кестесінде кезең ашық сегмент ретінде белгіленеді, яғни есеп құрастырылған кезде орындалған қозғалыстар есепке алынбайды, яғни уақыттың басында алынады. екінші параметрде көрсетілген. Бұл ретте айналымдар кестесі үшін және қалдық және айналымдар кестесі үшін уақыт шектеулері есепке алынады, яғни уақыт көрсетілген секундтың соңында алынады.

Бұл жағдайдан шығудың бірнеше жолы бар:

  1. Қалдық кестесін пайдаланған кезде уақыт нүктесін көрсетілгеннен 1 секунд артық көрсетіңіз;
  2. Тек баланстар мен айналымдар кестесін пайдаланыңыз (өнімділік тұрғысынан ең оңтайлы нұсқа емес);
  3. Шекара терминін қолданыңыз.

Соңғы опцияны суретте көрсетілген кодпен көрсетуге болады. 6.

Біздің нысанның бірінші параметрінде есептің жасалуы керек күнін көрсетеміз, екінші параметр шекара түрін анықтайды. Біз үшін белгілі бір күндегі қозғалыстардың таңдауға қосылуы маңызды болғандықтан, біз бұл параметрді «Соның ішінде» күйіне орнатуымыз керек.

1С-де бос мәнді тексеру жүргізіледі арнайы функция. Сізде бар төлсипат немесе айнымалы мән толтырылғанын тексеру үшін жаһандық контекстен функцияны пайдалануыңыз керек Мән толтырылды(<Значение>) .

1С 8-де мән толтырылған (бос емес) болып саналады, егер ол үшін әдепкі мәннен өзгеше болса. осы түрдегі. Мысалы, сілтеме түрі үшін әдепкі мән болып табылады Бос сілтеме(осы анықтамалық, құжат және т.б.). Сондай-ақ бос айнымалылар мен мәндерді қамтитын деректемелер Нөлжәне Белгісіз.

1s бос мәнді тексереді. Мысалдар

Айнымалы = References.Nomenclature.EmptyReference(); Check = ValueFilled(Variable);

Бұл жағдайда айнымалы Емтиханмәні болады Өтірік. Сондай-ақ функция Мән толтырылды(<Значение>) . жағдайларда тікелей қолдануға болады.

1.1-мысал

If ValueFilled(Variable) then Report("Айнымалыдағы мән бос емес!"); EndIf;

Айнымалы = Құжаттар.Шығындар туралы есеп.FindBy Number("000000001"); Check = ValueFilled(Variable);

В бұл мысалқұжат болса Аванстық есепнөмірімен 000000001 бар, содан кейін айнымалыда Емтиханмәні болады Рас, әйтпесе Өтірік.

функциясын пайдалану Мән толтырылдысияқты өзгермелі түрдегі айнымалылар үшін мүмкін емес Мәндер кестесі, Құндылық ағашыжәне т.б. Функция барлық конфигурациялар үшін жұмыс істейді.

1 секундта мәндер кестесінің бос екенін қалай тексеруге болады? Ол үшін әдіс қолданылады Саны(), оның көмегімен мәндер кестесінде қанша жол бар екенін тексеруге болады.

Мысал 3. Келіңіз MyTable— кодта жоғарыда анықталған мәндер кестесі.

MyTable.Count() = 0 болса, Қайтарыңыз; EndIf;

Дәл осы әдісті мәндер ағашының толықтығын анықтау және сұрау нәтижесін таңдау үшін пайдалануға болады.

4-мысал. Келіңіз MyTreeкодта жоғарыда анықталған мән ағашы болып табылады.

MyTree.Rows.Count() = 0 болса, Қайтарыңыз; EndIf;

Көріп отырғаныңыздай, мәндер ағашында біз бірінші деңгейлі жолдардың бар-жоғын тексереміз, егер олар жоқ болса, онда ағаш бос.

Мысал 5. Келіңіз Сұрау- жоғарыда анықталған 1С 8 деректер базасына сұраныс.

Бұл мақалада тексерілетін төлсипат түріне, соның ішінде нөлдік сілтемеге байланысты бос мәнді тексеру жолдары талқыланады.

NULL мәні төлсипат жай жоқ болғанда қайтарылады. Бұл жағдайда түрі де NULL болады. Мысалы, сіз сол жақ біріктіру арқылы екі кестені біріктіріп жатырсыз. Оң жақтағы сол кесте үшін мән табылмаса, NULL мәні қайтарылады.

Бұл мәнді тексеруді «IS NULL» және «» конструкциясы арқылы жасауға болады. Бірінші жағдайда True немесе False қайтарылады. Екінші жағдайда, NULL қайтарылған жағдайда бірден басқа мәнді орнатуға болады.

Төмендегі 1С 8.3 сұрауы сегмент жинағы жоқ серіктестер үшін байланыс тұлғаларының тізімін береді.

ТАҢДАУ
ContactPartners.Link
FROM
Анықтамалық. Серіктестердің байланыс тұлғалары AS Серіктестердің байланыс тұлғалары
ІШКІ ҚОСЫЛУ
PO ContactPartners.Owner = SegmentsPartners.Parent
ҚАЙДА
SegmentsPartners.Сілтеме НҰЛ

бос күн

Мән бос күн үшін оны DATETIME(1, 1, 1, 0, 0, 0) конструкциясымен салыстыру арқылы тексеріледі. Қолдану үлгісі төменде келтірілген:

1С сұранысындағы бос сілтеме

Қайтарылған төлсипаттың сілтеме түрі болған жағдайда, мысалы, ол қандай да бір каталогтың, құжаттың және т.б. элементі болса, келесі құрылым пайдаланылады: VALUE(Catalog.CatalogName.EmptyReference).

Төмендегі мысалда сұрау бизнес аймағы көрсетілмеген барлық серіктестерді таңдайды.

«ValueFilled» мәнін тексеру үшін сізге қарама-қарсы шартты орындау керек:

Серіктестер.БизнесРегион<>VALUE(Каталог.BusinessRegions.EmptyReference)

Бос жол

Жол түрлерін тексеру үшін басқа үлгімен салыстыру жүргізіледі. Бұл жағдайда - »».

Төмендегі сұрау бос аты бар барлық серіктестерді таңдайды.

1С күндермен жұмыс істегенде күн бөліктерінің әдеттегі реті жыл, ай, күн, сағат, минут, секунд болып табылады. Бұл жағдайда сағаттарды, минуттарды, секундтарды өткізіп жіберуге болады.

Жолдан күн жасау кезінде («күнге трансляциялау») локализацияланған пішімде (күн.ай.жыл сағат:минут:секунд), бірақ тек толық көлемде көрсетуге болады.

Мысалы:
// 1С күндермен жұмыс істеу - күнді 1С-ге бөліктерден түрлендіру - жыл, ай, күн (плюс қосымша уақыт)
Дата = Дата(2012,10,30); //уақыт жоқ
Дата = Дата(2012,10,30,12,00,00); //уақытпен

//1С даталарымен жұмыс – жолдан күнді 1С-қа түрлендіру, әртүрлі тәсілдер
Дата = Дата("20121030"); //жыл, ай, күн
Дата = Дата("30.10.2012 12:00:00"); //жергілікті пішім, тек толық

//1С даталарымен жұмыс істеу – күн мәнін кастингсіз көрсету, тікелей
Күні = "20121030"; //уақыт жоқ
Күні = "20121030120000"; //уақытпен

Күндермен жұмыс 1С - Бос күн 1С

1С күнін толықтығын тексеру үшін оны «бос күнмен» салыстырады. Каталогта/құжатта күн түрі бар атрибут болса, пайдаланушы бұл өрісті толтырмаған болса, оның мәні де «бос күн» болады.

"Бос күн" - 01.01.0001 00:00:00.

Мысалы:
EmptyDate = "00010101000000";
Егер DesiredDate = "00010101000000" Содан кейін
alert («Сіз қажетті күнді толтырмадыңыз»);
EndIf;

Күндермен жұмыс істеу 1С - Мәліметтердегі күн (анықтамалар, құжаттар және т.б.)

Төлсипат түрін көрсету кезінде пайдалануды көрсетуге болады:

  • Тек күн (уақыт әрқашан 00:00:00 болады)
  • Тек уақыт (күн әрқашан 01.01.0001 болады)
  • күні мен уақыты

Күнді алу

Күн мен уақытты алу үшін 1C CurrentDate() функциясы пайдаланылады.

Бұл функция шақырылатын орын өте маңызды - клиентте немесе серверде. Мәліметтер алу үшін «Орындалу режимі/Орындалу уақыты» тақырыбын қараңыз. Көбінесе клиенттік машиналардағы уақыт сәл өзгеше болады, сондықтан олар сервер уақытын барлық жерде пайдалануға тырысады - тіпті серверде дұрыс орнатылмаған болса да, кем дегенде барлық клиенттерде бірдей дұрыс емес уақыт болады.

Сервер күнін алу үшін (орнатылған күн операциялық жүйесерверлік компьютер), әдетте конфигурацияда сипаттардағы «Сервер» құсбелгісі қойылған ортақ модуль жасайды және онда олар функцияны жасайды.
//функция ортақ модульде орналасқан, мысалы ServerFunctions деп аталады
// жалпы модульдің қасиеттерінде «Сервер» құсбелгісі қойылады және «Клиент» құсбелгі қойылмаған
GetServerDate() функциясы экспорттау
CurrentDate();
EndFunctions

//бұл функцияны басқа модульден пайдалану үшін шақыру келесідей көрінеді
DocumentObject.Date = ServerFunctions.GetServerDate(); //ModuleName.FunctionName()

сонымен қатар жұқа клиентмодульдер функцияларының жанында оның орындалатын жері көрсетіледі:

Күннің басталуы мен аяқталуы

«30.10.2012» күніне:

  • күннің басталу күні "30.10.2012 00:00:00" сияқты көрінеді
  • күннің аяқталу күні "30.10.2012 23:59:59" сияқты көрінеді

Кезең үшін деректерді талап ететін есептер мен сұрауларда қолданылады - күн, ай, жыл.

Мысалы, "01.01.2012 00:00:00" мен "31.01.2012 00:00:00" аралығы дұрыс емес, себебі ол айдың бір күнін қамтымайды (бірақ бір секундты қамтиды). айдың соңғы күні).

Күндермен жұмыс 1С - Күнді салыстыру

Күнде күн мен уақыт бар. Күндерді салыстыру кезінде (уақытты есепке алмай) әдетте күннің басына (ай, жыл) келтіріледі.

Мысалы:
Күн1 = Күн("30.10.2012 12:00:00");
Егер StartDay(Date1) = StartDay(DocumentRef.Date) Содан кейін
alert("Құжат берілген күні енгізілген");
EndIf;

Кез келген жағдайда, кезеңдегі күндерді салыстыру мысалы:
Егер DocumentReference.Date >= MonthStart(CurrentDate()) және
DocumentReference.Date

Күндермен жұмыс 1С - Күнді өзгерту

Күн - секундтар саны. Егер біз бір күннің екіншісінен үлкен екенін ғана емес, сонымен қатар қанша көп екенін білгіміз келсе, онда айырмашылықты секундтарда аламыз.

Мысалы:
StartDay = CurrentDate() – StartDay(CurrentDate());
Есеп («Күннің басынан бері өтті» + Жол(FROMDayStart) + «секундтар»);
Есеп("Күннің басынан бері өтті" + Жол (күннің басынан / 60) + "минут");
Есеп("Күннің басынан бері өтті" + Жол (күннің басынан / 60/60) + "сағат");

Біз күнді де өзгерте аламыз, өзгерту кезінде секундтар санын қосамыз немесе шегереміз:
StartThisDay = StartDay(CurrentDate());

StartPreviousDay = StartDay(StartThisDay - 1); // екіншісін алып тастаңыз - «кеше» жасау және күннің басын «кешеден» алыңыз

StartPreviousDay = StartThisDay - 24*60*60; //басқа жолмен - 24 сағатты шегеріңіз - 24(сағат) * 60 (минут шықты) * 60 (секунд)

Күндермен жұмыс 1С – Уақыт моменті

Уақыт нүктесі құжаттарға (және, осылайша, тіркелімдерге) қолданылатын күннің ұзартылған көрінісі болып табылады.

Құжаттардың күні мен уақыты бірдей болған жағдайда құжаттардың уақытын салыстыру қажет. Сәйкесінше, оны сұраулардағы таңдау үшін пайдалануға болады.

Сіз құжаттан уақыт нүктесін келесі жолдармен ала аласыз:
//1-әдіс
DocumentTimeMoment = DocumentReference.MomentTime();

Сондай-ақ уақыт нүктесін күн/уақытпен салыстыруға болады:
MomentInTimeReference = Жаңа MomentInTime(StartDay(CurrentDate()));
DocumentReference.TimeIn().Салыстыру(InTimeReference) = -1 болса
Show("Құжат бүгіннен ертерек енгізілген");
EndIf;
//Егер құжат бүгінгі күнмен сағат 00:00:00-де енгізілсе, онда ол бәрібір – бүгін енгізіледі.

Күндермен жұмыс 1С - Күндерді пішімдеу

Мақала ұнады ма? Достарыңызбен бөлісіңіз!
Бұл мақала пайдалы болды ма?
Иә
Жоқ
Пікіріңізге рахмет!
Бірдеңе дұрыс болмады және сіздің дауысыңыз есептелмеді.
Рақмет сізге. Сіздің хабарламаңыз жіберілді
Мәтіннен қате таптыңыз ба?
Оны таңдаңыз, басыңыз Ctrl+Enterжәне біз оны түзетеміз!