1C so'rovlari, shuningdek, 1C: Enterprise platformasining o'rnatilgan tili sanalar bilan ishlash funktsiyalariga ega. Ular foydalanishdan qochib, so'rovlarda sanani o'zgartirishni soddalashtirishga yordam beradi katta miqdor parametrlari. Keling, ushbu funktsiyalarni ko'rib chiqaylik.

1C so'rovlarida sanani doimiy sifatida qanday belgilash mumkin

DATETIME (yil, oy, kun, soat, daqiqa, soniya). Variantlar Yil, oy Va kun majburiy, boshqalari shart emas. Vaqtni belgilamasangiz, tizim kunning boshlanishini belgilaydi.

So'rov. Matn= "TANLANG
DATETIME (2016,09,28,12,22,00)"
; // Natija: 2016 yil 28 sentyabr 12:22:00

Bundan tashqari, ushbu funktsiyaning parametrlari sifatida faqat raqamlar aniq ko'rsatilishi mumkin. Siz boshqa funksiyalarning qiymatlarini parametr sifatida belgilay olmaysiz. Masalan, bu qurilish ishlamaydi:

So'rov. Matn= "TANLANG
DATETIME (Yil (Manba.Sana),09,28,12,22,00)
Directory.Source AS Manbadan"
;

1C so'rovlarida yil, yarim yil, chorak, oy, o'n yillik, hafta, kun, soat, daqiqaning boshlanishi yoki oxirini qanday olish mumkin

Buning uchun quyidagi funktsiyalar qo'llaniladi:

  • Boshlanish davri (sana, davr)
  • Yakuniy davr (sana, davr)

Parametr sifatida sana turiga ega qiymat uzatiladi Sana. Parametr Davr .

So'rov. Matn= "TANLANG
StartPeriod(DATETIME (2016,09,28,12,22,00), DEKADE)"
; // Natija: 2016 yil 21 sentyabr 0:00:00

So'rov. Matn= "TANLANG
EndPeriod(DATETIME (2016,09,28,12,22,00), QUARTER)"
; // Natija: 2016 yil 30 sentyabr 23:59:59

Misollardan ko'rinib turibdiki, siz ushbu funktsiyalarda boshqa ichki o'rnatilgan funktsiyalardan foydalanishingiz mumkin.

1C so'rovlarida sanadan yil, yil kuni, chorak, oy, hafta, hafta kuni, kun, soat, daqiqa, soniyani qanday olish mumkin

Buning uchun sanani parametr sifatida o'tkazish kerak bo'lgan tegishli funktsiyalar mavjud.

  • Funktsiya YIL (Sana)— yil raqamini qaytaradi;
  • Funktsiya DAYYEAR (Sana)— yildagi kun sonini oshiradi;
  • Funktsiya CHORAK (Sana)— chorak raqamini qaytaradi;
  • Funktsiya MONTH (Sana)— oy raqamini qaytaradi;
  • Funktsiya HAFTA (Sana)— yildagi hafta sonini qaytaradi;
  • Funktsiya HAFTA KUNI (Sana)— haftaning kun sonini qaytaradi (dushanba — 1, yakshanba — 7);
  • Funktsiya KUN (Sana)— oydagi kun raqamini qaytaradi;
  • Funktsiya HOUR (sana)— soatni qaytaradi;
  • Funktsiya MINUTE (sana)— daqiqalarni qaytaradi;
  • Funktsiya SECOND (Sana)— soniyalarni qaytaradi.

So'rov. Matn= "TANLANG
YEAR(DATETIME (2016,09,28,12,22,00))"
; // Natija: 2016 yil

So'rov. Matn= "TANLANG
HAFTA(DATETIME (2016,09,28,12,22,00))"
; // Natija: 40

So'rov. Matn= "TANLANG
HAFTA KUNI(SANASI VAQT (2016,09,28,12,22,00))"
; // Natija: 3

So'rov. Matn= "TANLANG
DAYYEAR(DATETIME (2016,09,28,12,22,00))"
; // Natija: 272

So'rov. Matn= "TANLANG
DAY(DATETIME (2016,09,28,12,22,00))"
; // Natija: 28

1C so'rovlarida yil, yarim yil, chorak, oy, o'n yillik, hafta, kun, soat, daqiqa, soniyani qanday qo'shish yoki ayirish mumkin

Buning uchun funksiyadan foydalaning AddToDate(Sana, Davr, Qiymat).

Parametr sifatida sana turiga ega qiymat uzatiladi Sana. Parametr Davr quyidagi qiymatlardan birini qabul qilishi mumkin: IKKINCHI, MINUT, SOAT, KUN, HAFTA, O'NLIK, OY, CHORAK, YARIM YIL, YIL.

Parametr Ma'nosi qo'shilishi kerak bo'lgan davrlar sonini ko'rsatadi. Agar davrni olib tashlash kerak bo'lsa, u holda parametr Ma'nosi salbiy bo'lishi kerak.

So'rov. Matn= "TANLANG
AddTODate(DATETIME(2016, 9, 28, 12, 22, 0), YARIM YIL, 1)"
; // Natija: 2017 yil 28 mart 12:22:00

So'rov. Matn= "TANLANG
AddKDate(DATETIME(2016, 9, 28, 12, 22, 0), DECADE, -1)"
; // Natija: 2016 yil 18 sentyabr 12:22:00

1C so'rovlarida sana farqini qanday hisoblash mumkin

Buning uchun funksiyadan foydalaning Farq sanasi (sana1, sana 2, davr).

Parametr Sana 1- ayiriladigan sana.

Parametr Sana 2 - ayirish sanasi.

Parametr Davr quyidagi qiymatlardan birini qabul qilishi mumkin: IKKINCHI, MINUT, SOAT, KUN, OY, CHORAK, YIL. Natijani qaysi birliklarda olishni xohlayotganimizni ko'rsatadi

So'rov. Matn= "TANLANG
DifferenceSana(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME (2017, 9, 28, 12, 22, 0), CHORAK)"
; // Natija: 4

So'rov. Matn= "TANLANG
DifferenceSana(DATETIME(2016, 9, 28, 12, 22, 0), DATETIME (2017, 9, 28, 12, 22, 0), soniya)"
; // Natija: 31 536 000

Funktsiyadan tashqari barcha funktsiyalarda DATE VAQT, parametr sifatida sana nafaqat ma'lum bir sana qiymati (doimiy yoki so'rov parametri), balki manba jadval maydonlari ham bo'lishi mumkin.

1C konfiguratsiyasida mavjud bo'lgan barcha hujjatlar va shuning uchun deyarli barcha registrlar Sana turiga ega kamida bitta atributga ega bo'lishi kerak, shuning uchun har bir ishlab chiquvchi bilishi va tushunishi kerak:

  • Boshqa turdagi parametrlarni ko'rib chiqilayotgan turga qanday aylantirish mumkin;
  • 1C so'rovida bo'sh sanani qanday aniqlash mumkin;
  • Sana va vaqt chegarasi o'rtasidagi farq nima?

Aynan shu savollarga biz maqolamizda javob berishga harakat qilamiz.

Sana nima va uni qanday aniqlash mumkin

Ko'pchilikni qabul qilgandan beri boshqaruv qarorlari va yozuvlarni yuritish 1 sekunddan ortiq vaqt aniqligini talab qilmaydi, 1C platformasini ishlab chiquvchilar bu qiymat sana formatida mutlaq minimal bo'lishiga qaror qilishdi. Shunday qilib, dasturdagi voqea vaqtini tavsiflovchi har bir atribut quyidagilarni o'z ichiga olishi kerak:

  • Voqea sodir bo'lgan yil;
  • Ushbu tadbirning oyi;
  • kun.

Ko'rsatish shart emas: soat, daqiqa va soniya. Agar bu uchta parametr o'tkazib yuborilsa va yo'q qo'shimcha shartlar, dastur avtomatik ravishda kun boshiga vaqtni o'rnatadi.

Dunyoda mavjud sana formatlari sezilarli farqlarga ega:

  1. Rossiyada biz birinchi navbatda kunni, keyin voqea oyi va yil oxirida qo'yishga odatlanganmiz;
  2. AQSh aholisi sanani oydan boshlaydi;
  3. Chexlar, polyaklar va sloveniyaliklar davrlarni Yil - Oy - Kun formatida qayd etadilar.

Bu 1C platformasi foydalanadigan oxirgi format.

Sanaga aylantiring

Bir nechta qiymatlardan yoki satrdan Sana turiga ega parametrni olish uchun siz rasmda ko'rsatilgan koddan foydalanishingiz kerak. 1

Yuqoridagi rasmdan ko'rinib turibdiki, sanani bitta satr yordamida yoki vergul yordamida uning tarkibiy qismlariga bo'lish orqali aniqlash mumkin, natija o'zgarmaydi.

Sana yili to'rtta raqamdan iborat bo'lishi kerakligini, shu jumladan hodisaning mingyilligi va asrini, oy, kun, soat va soniyalar ikki belgidan, shu jumladan bosh nollardan iborat bo'lishi kerakligini tushunish muhimdir.

Dasturda vaqtni teskari sanash 0001 yil 1 yanvar kunining boshidan boshlanadi. Yuqoridagi kod uchun bu qiymat ikki usuldan birida aniqlanishi mumkin (2-rasm).

Guruch. 2

Ikkinchi qatorda biz tadbirning soatlari, daqiqalari va soniyalarini o'tkazib yubordik, bu bizning kodimizning ishlashiga umuman ta'sir qilmadi.

1C so'rovlarida sanadan foydalanish xususiyatlari

1C platformasi tomonidan ishlatiladigan ko'pgina ma'lumotlar turlari uchun oldindan belgilangan bo'sh qiymatlar mavjud. Raqamlar uchun bu 0 ga teng, siz sana uchun EmptyLink(); so'rov parametrlarini o'rnatish.

Tushunish kerakki, ko‘rib chiqilayotgan turga ega bo‘lgan forma atributining qiymatida raqamlar ko‘rsatilmagan bo‘lsa ham, ya’ni oyna o‘xshash bo‘lsa (3-rasm), bu unda hech narsa ko‘rsatilmagan degani emas; bu parametrni bo'sh satr bilan taqqoslash ishlamaydi.

Guruch. 3

Bo'sh sanani olganimizdan so'ng, biz uni so'rovimizga parametr sifatida belgilashimiz mumkin, ya'ni konstruktsiyadan foydalanishimiz mumkin (4-rasm)

Biroq, ba'zida parametr sifatida bo'sh sanani o'tkazmasdan, so'rov tanasi ichida tekshirish yaxshiroq bo'ladi. Buning uchun so'rov kodiga (5-rasm) tegishli shartni kiritishingiz va DateTime() so'rov funksiyasidan foydalanishingiz mumkin.

Guruch. 5

Yuqoridagi so'rov matnida biz yil, oy va kunning bosh nollarini qoldirdik, shuningdek, soatlar, daqiqalar va soniyalarni ko'rsatmadik va dastur, ular aytganidek, bu taxminni yeb qo'ydi.

Sana va vaqt chegarasi

Yana bitta qiziq fakt so'rovlar va sanalar o'rtasidagi munosabat bilan bog'liq bo'lgan ma'lumotlar bazasi jadvallariga kirishda "vaqt nuqtasi" tushunchasidan foydalanish.

Ibtidoiy Sana turini tavsiflashda texnik hujjatlarda ko'rsatilgan "millisekundgacha" aniqlik jamg'arish registrining virtual jadvallaridan yozuvlarni tanlashda eng aniq namoyon bo'ladi: agar jamg'arish registrida aylanma jadvaliga qo'shimcha ravishda Qolgan bo'lsa va Qolgan va Aylanma jadvallari, keyin ulardan namuna olish ma'lum vaqt davomida amalga oshiriladi , turli natijalar berishi mumkin.

Bu qanday va nima uchun sodir bo'lishini tushunish uchun oddiy misolni ko'rib chiqing:

  1. Savdo hujjati 12 soat 31 daqiqa 36 soniyada amalga oshirilgunga qadar Shakar nomenklaturasi bo'yicha qoldiqlar 30 kg;
  2. Hujjat belgilangan vaqtda 10 kg hisobdan chiqarildi;
  3. Hujjat sanasida 12 soat 31 daqiqa 36 soniyada tuzilgan hisobot Qolgan jadvalga muvofiq 30 kg balansni ko'rsatadi;
  4. Jadvalda bir xil hisobot qoldiqlari va aylanmalar bir vaqtning o'zida 20 kg balansni ko'rsatadi.

Bunday xatti-harakatning sababi nima va undan qanday qochish kerak?

Muammo shundaki, Qolgan jadvalda davr ochiq segment sifatida ko'rsatilgan, ya'ni hisobotni yaratish vaqtida qilingan harakatlar hisobga olinmaydi, ya'ni vaqt ikkinchi ko'rsatilgan vaqtning boshida olinadi. parametrda. Shu bilan birga, aylanmalar jadvali va Qoldiqlar va aylanmalar jadvali uchun vaqt chegaralari hisobga olinadi, ya'ni vaqt ko'rsatilgan soniya oxirida olinadi.

Ushbu vaziyatdan chiqishning bir necha yo'li mavjud:

  1. Qolganlar jadvalidan foydalanganda belgilangan vaqtdan 1 sekund kattaroq vaqtni ko'rsating;
  2. Faqat qoldiqlar va aylanmalar jadvalidan foydalaning (ishlash nuqtai nazaridan eng maqbul variant emas);
  3. Chegara tushunchasidan foydalaning.

Oxirgi variant rasmda ko'rsatilgan kod bilan ifodalanishi mumkin. 6.

Ob'ektimizning birinchi parametrida biz hisobotni yaratish kerak bo'lgan sanani ko'rsatamiz, ikkinchi parametr chegara turini aniqlaydi. Tanlovga ma'lum bir sanadagi harakatlar kiritilganligi biz uchun muhim bo'lganligi sababli, biz ushbu parametrni "Shu jumladan" holatiga o'rnatishimiz kerak.

1C-dagi "Sana" turi raqam, satr va mantiqiy ma'lumotlar bilan birga 4 ta asosiy ma'lumotlar turlaridan biridir. Konfiguratsiyalarda sanalar hamma joyda uchraydi - ishlab chiqish jarayonida ushbu turdagi ma'lumotlar bilan ishlashdan qochib bo'lmaydi. Shuning uchun, sanalarni qanday qayta ishlash kerakligini, ular bilan ishlash uchun qanday imkoniyatlar mavjudligini va ular qanday saqlanishini tushunib, so'rovlarni yozishni boshlash yaxshiroqdir. Keling, turli sanalar bilan so'rovlarni yozishning barcha nuanslariga misollarni ko'rib chiqaylik.

1C so'rovlarida sanalar bilan ishlashga misollar

Avvalo, so'rovdagi sanani kerakli formatda - vaqt bilan yoki vaqtsiz olishingiz kerak. Ushbu vazifani bajarishning bir necha yo'li mavjud:

  1. Parametr orqali o'tish. Ushbu usul yordamida faqat joriy sessiya sanasini olishingiz mumkin;
  2. Tanlov maydonidan so'rovdagi sanani oling;
  3. DATETIME() funksiyasidan foydalanib, raqamli qiymatlardan aylantiring.

Hujjatlar bilan ishlashda eng keng tarqalgan vazifa bu 1C so'rovida bo'sh sanani tekshirish. Bunday holda, DATETIME(1,1,1) funksiyasi yordamida olingan bo'sh sana bilan o'zgaruvchi yoki maydonni solishtirish eng oson:

DATETIME (1, 1, 1)

Shunga o'xshash buyruq yordamida siz so'rovda o'zboshimchalik bilan sana va vaqtni olishingiz mumkin. Bundan tashqari, ular 6 ta raqamni parametr sifatida ko'rsatish orqali bir soniyagacha aniqlik bilan aniqlanishi mumkin. Agar faqat 3 ta raqam ishlatilsa, soatlar, daqiqalar va soniyalar 0 ga (kun boshiga) o'rnatiladi. Masalan, so'rovda 2018 yil yanvar oyining dastlabki 10 kuni uchun hujjatlarni tanlashimiz kerak:

Kvitansiyani Joriy hisob qaydnomasiga havola AS, Kvitansiyani Joriy hisob qaydnomasi sifatida tanlang. 10, 23, 59, 59)

O'rnatilgan 1C tilidagi so'rovda siz nafaqat turli maydonlarni tanlashingiz va parametrlarni olishingiz mumkin. Muayyan vazifa uchun sanalarni formatlashni osonlashtiradigan ko'plab funktsiyalar mavjud. Agar siz tez-tez so'rovda sanalar bilan ishlasangiz, quyidagi buyruqlarni bilishingiz kerak:

  • DAVRAN BOSHLANISHI. Parametrlar sananing boshlanishini olish kerak bo'lgan sana va vaqtni belgilaydi. Sanani vaqtsiz formatga aylantirish uchun foydalaniladi. Buni amalga oshirish uchun siz ikkinchi parametrni o'rnatishingiz kerak - "DAY";
DAVRAN BOSHLANISHI(,) DAVRAN BOSHLANGAN (&Sana, KUN) davr>sana>
  • DAVRAN OXIRISHI. Parametrlarda ko'rsatilgan birliklar bo'yicha oxirgi sanani qaytaradigan shunga o'xshash buyruq;
  • ADDKDATE. dan kattaroq sanani olish imkonini beradi belgilangan miqdor belgilangan vaqt birliklari. Funktsiya parametrlari sana, vaqt birligi va raqamni o'z ichiga oladi;
ADDKDATE(,) ADDKDATE(&Sana, KUN, 10) miqdori>turi>sana>
  • DIFFERENCE DATE. Belgilangan birliklarda sanalar orasidagi farqni oladi;
DIFFERENCEDATE(,) DIFFERENCEDATE(&Sana1, &Sana2, KUN) turi>sana2>sana1>
  • HAFTA KUNI. Hafta kunlaridan birining seriya raqamini qaytaradi.

Ushbu funktsiyalardan to'g'ri foydalangan holda, ishlab chiquvchi juda ahamiyatsiz muammolarni hal qilishi mumkin. Masalan, so'rovda joriy sananing hafta kuni nomini qator sifatida olish:

TANLOV QACHON HAFTADA(&Joriy Sana) = 1 KEYIN "Dushanba" WHENWEEKDAY(&CurrentDate) = 2 KEYIN "Seshanba" WHENWEEKDAY(&CurrentDate) = 3 KEYIN "Chorshanba" WHENWEEKDAY(&CurrentDate) = 4 KEYIN "KUNDAN HAFTATA KECHI (&Joriy Sana) = 4 "KUNDAN HAFTADA KECHAN KUNI "Juma" HAFTANING KUNI(&Hozirgi Sana) = 6 KEYIN "Shanba" BOSHQA "Yakshanba" TUGADI

1C so'rovidagi turlarni raqam yoki qatordan sanaga o'tkazish ko'p mehnat talab qiladigan ishdir. Siz raqamlardan sanani DATETIME funksiyasidan foydalanib, qatordan - SUBSTRING funksiyasi va SELECT WHEN THEN ELSE konstruktsiyasini birlashtirib olishingiz mumkin. Bunga asoslanib, ishlab chiquvchilar moduldagi boshqa turlardan sanani olishni va parametr yordamida so'rovga o'tkazishni afzal ko'radilar. Afsuski, bu har doim ham mumkin emas, shuning uchun siz so'rovda sana formatini o'zgartirishingiz kerak.

Virtual registr jadvallaridan ma'lumotlarni olish parametri sifatida 1C so'rovida sanani ko'rsatish mumkin. Bu rol yuqoridagi barcha funksiyalardan ham foydalanishi mumkin. Ammo bu erda 1C so'rovidagi bo'sh sananing ta'sir qilishiga yo'l qo'ymaslik kerak yakuniy natija kodning bajarilishi, shuning uchun tekshirishni amalga oshirish kerak.

Ko'pincha "Sana" tipidagi o'zgaruvchilar bilan ishlashga ehtiyoj bor. Ushbu maqolada biz asosiy usullarni ko'rib chiqamiz - joriy sanani o'tkazish, bo'sh qiymatni tekshirish, o'zboshimchalik sanasi.

So'rovlarni yozishda siz ko'pincha ma'lumotlarni joriy sana bilan taqqoslashingiz kerak. O'rnatilgan 1C tilida CurrentDate() funksiyasi mavjud. Bu sizning kompyuteringizdagi joriy vaqt va sanani aniqlash imkonini beradi. Joriy sana bilan operatsiyalarni bajarish uchun siz ushbu funktsiyaning qiymatini so'rovga parametr sifatida o'tkazishingiz kerak.

Quyida yaratilish sanasi bilan harajat hisobotlariga biriktirilgan barcha fayllarni tanlaydigan so'rov mavjud:

ExampleRequest = Yangi so'rov;
Misol so'rovi.Text = "
|SELECT
| AdvanceReportAttachedFiles.Link
|FROM
| Directory.AdvanceReportAttachedFilesAS AdvanceReportAttachedFiles
|QAYERDA
| AdvanceReportAttachedFiles.Sana< &ТекДата»;
Misol Request.SetParameter("CurrentDate", CurrentDate());

Maxsus sana

Yuqorida muhokama qilingan funksiya solishtirish va shuning uchun istalgan davr uchun tanlov qilish imkonini beradi. Ushbu usul qo'shimcha parametrlardan foydalanmasdan so'rovda qat'iy tanlovni belgilash imkonini beradi.

Shuni esda tutingki, yuqoridagi misolda ushbu funktsiyadan foydalanganda biz faqat uchta raqamni (yil, oy, kun) kiritish parametrlari sifatida o'tkazdik. Oxirgi uchta (soat, daqiqa, soniya) ixtiyoriydir va agar yo'q bo'lsa, "0" bilan almashtiriladi, ya'ni kun boshi.

Doirasida bu misol O'tgan 2016 yil oxirigacha xarajatlar hisobotiga ilova qilingan barcha fayllar qabul qilinadi. Shu munosabat bilan biz "2016 yil 31 dekabr 23:59:59" vaqt nuqtasini solishtirish uchun soat, daqiqa va soniyani ko'rsatamiz.

TANLANG
AdvanceReportAttachedFiles.Link
FROM
Directory.AdvanceReportAttachedFiles AS AdvanceReportAttachedFiles
QAYERDA
AdvanceReportAttachedFiles.Date< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Bo'sh sana

O'zgaruvchida bo'sh sana bor yoki yo'qligini tekshirishning eng oson usuli oddiy taqqoslashdan foydalanishdir. Ushbu misolda biz barcha tushumlarni tanlash uchun so'rovdan foydalanamiz Pul kirish sanasi to'ldirilmagan hisobvaraqlarga.