Qanday qilib yangi hujjat shaklini dasturiy ravishda to'ldirish va ochish kerak? Mavjud ob'ektning shakli qanday ochiladi? Dasturiy ravishda yangi hujjat shaklini ochish 1s 8.3

Boshqariladigan 1C ilovasida shakllarni dasturiy ravishda ochish ularni oddiy dasturda ochishdan sezilarli darajada farq qiladi. Avval eski usulni ko'rib chiqaylik. U formani qabul qilish va keyin uni normal yoki modal rejimda ochishdan iborat (modal rejimda ochilganda forma dasturni bloklaydi).

GetForm() . Ochiq()

Bu shakllarni ochishning eng sekin usuli. Biroq, bu shaklni ochishdan oldin uni dasturiy ravishda qayta ishlashga imkon beradi. Kodni qayta ishlash uchun siz biroz o'zgartirishingiz kerak:

Shakl = GetForm ( "Hujjat. Tovar va xizmatlarni qabul qilish. Hujjat shakli") ;
//Bu yerda forma bilan amallarni bajaramiz
Shakl. Ochiq();

Shuni hisobga olish kerakki, ariza qabul qilinganda, boshqa hodisa protsedurasi bajariladi WhenCreatedOnServer.

Keling, boshqariladigan 1C ilovasida shakllarni tezroq va qulayroq ochishga imkon beruvchi boshqa usullarni ko'rib chiqaylik. Muayyan vaziyatga qarab, turli usullardan foydalanish mumkin.

1. Boshqariladigan ilovada ob'ekt formasini qanday ochish mumkin, agar unga havola mavjud bo'lsa.

Bunday holda, hamma narsa juda oddiy.

RefLink = Kataloglar. Nomenklatura. FindByCode("000000001" );
OpenValue (RefLink);

2. Tanlov shaklini qanday ochish va keyin tanlangan qiymatni olish.

Buning uchun funksiya mavjud EnterValue(). Funktsiya 3 ta parametrga ega:

  • Tanlangan qiymat yoziladigan o'zgaruvchi;
  • Tanlash oynasida ko'rsatiladigan maslahat;
  • Tanlangan qiymatlar turlarining tavsifi. Bir nechta turlar bo'lishi mumkin, bu holda ma'lum bir qiymatni tanlashdan oldin sizdan turni tanlashingiz so'raladi.

Funktsiyani bajarish natijasida ko'rsatilgan turdagi ob'ekt uchun standart tanlash shakli ochiladi.

O'zgaruvchan qiymat;
Massiv = yangi massiv;
Massiv. Qo‘shish(Tur( "DirectoryLink.Nomenklatura") ) ;
Massiv. Qo‘shish(Tur( "DirectoryLink. Qarama-qarshi tomonlar") ) ;

TypeDescription= new TypeDescription(Array) ;

Res = EnterValue(Qiymat, "Maslahat" , TypeDescription);

Oldingi usullar faqat ob'ektlar uchun standart shakllarni ochishga imkon berdi (ob'ekt shakli yoki tanlov shakli). Agar siz maxsus shaklni ochishingiz kerak bo'lsa, funksiyadan foydalanishingiz mumkin OpenForm().

Ushbu funktsiya juda ko'p parametrlarga ega. Keling, ulardan ba'zilarini ko'rib chiqaylik:

  • Shakl nomi— bu yerda siz standart obʼyekt shakllaridan birini tanlashingiz mumkin, masalan, Tanlov shakli yoki Ro'yxat shakli. Yoki ishlab chiquvchilar tomonidan yaratilgan maxsus shakl.
  • Variantlar— uni formadagi shaklga o‘tkazish imkonini beradi tuzilmalar uni ochishdan oldin ba'zi parametrlar, shu bilan chiqish ma'lumotlarini aniqlash. Parametrlar mijozdan serverga uzatilishi mumkin bo'lgan har qanday ma'lumotlar bo'lishi mumkin. Shaklni ochishda o'tgan parametrlar protsedurada qayta ishlanishi mumkin WhenCreatingOnServer() ochilayotgan shaklda.
  • Shaklni ochish rejimi— 3 ta variant mavjud: mustaqil, butun interfeysni bloklash, egasi formasini bloklash.

Funktsiya qanday ishlatilishini ko'rib chiqaylik OpenForm() turli vaziyatlarda.

3. Mavjud obyektning shakli qanday ochiladi

Har bir shakl bitta asosiy atributga ega. Shakl tafsilotlari ro'yxatida qalin shrift bilan ta'kidlangan va odatda chaqiriladi Ob'ekt ma'lumotnomalar va hujjatlarning elementlari shakllarida. Boshqa ob'ektlar boshqa nomga ega bo'lishi mumkin. Mavjud ob'ektning formasini ochish uchun ochilayotgan shaklga parametr o'tkazish kerak Kalit ob'ektga havola sifatida qiymat bilan.

&OnClient
Protsedura buyrug'i 1 (buyruq)
Parametr = yangi tuzilma;
Parametr. Insert("Kalit" , FindC() );
OpenForm(, Parametr);
Jarayonning oxiri

&Serverda
FindC();
Kataloglarni qaytarish. Qarama-qarshi tomonlar. FindByRequisites ("TIN", "745107734623")
EndFunction

4. Yangi obyekt formasini ochish

Bu yerda oddiy funksiya bajariladi OpenForm() hech qanday parametrlarsiz.

&OnClient
Protsedura buyrug'i 1 (buyruq)
OpenForm( "Katalog. Qarama-qarshi tomonlar. Ob'ekt shakli") ;
Jarayonning oxiri

5. Yangi ob'ekt shaklini qanday ochish va uni biror narsaga asoslanib to'ldirish

Siz parametrni kiritishingiz kerak Baza, uning qiymati to'ldirish asosiy ob'ektiga havola bo'ladi. Bu protsedurani boshlaydi ProcessFill().

&OnClient
Protsedura buyrug'i 1 (buyruq)
Parametr = yangi tuzilma;
Parametr. Insert("Asosiy", LinkToBuyerAccount) ;
OpenForm( "Hujjat. Tovar va xizmatlarni sotish. Ob'ekt shakli", Parametr);
Jarayonning oxiri

Ushbu misol hujjat yaratadi Tovar va xizmatlarni sotish va xaridorga to'lov uchun schyot-faktura asosida to'ldiriladi, unga havola uzatiladi.

6. Shaklni ochish va undagi tanlovni o'rnatish

1C shakllari bo'yicha tanlov oddiy yoki murakkab bo'lishi mumkin. Oddiy tanlash kabi ifodalarni o'z ichiga oladi Tashkilot = Horns and Hooves MChJ. Kompleks tanlash boshqa turdagi taqqoslashni o'z ichiga oladi, masalan. Ro'yxatda. Ushbu maqolada biz oddiy tanlovni tashkil qilishni ko'rib chiqamiz va alohida maqola murakkab tanlovga bag'ishlanadi.

Oddiy tanlovni tashkil qilish uchun ochilayotgan shaklga kalit bilan parametrni o'tkazish kerak Tanlash, qiymat kalit dinamik ro'yxat maydonining nomi bo'lgan struktura bo'ladi va qiymat izlanayotgan ma'lumotlardir.

Masalan, katalog ro'yxati formasini ochamiz GTD raqamlari va u erda egasi - katalog elementi bo'yicha tanlov qiling Nomenklatura.

&OnClient
Protsedura buyrug'i 1 (buyruq)
Parametr = yangi tuzilma;

Tanlash= yangi tuzilma;
Tanlash. Insert("Egasi", LinkToNomenclature) ;

Parametr. Insert("Tanlash", Tanlash);

OpenForm( "Directory.GTD raqamlari.Ro'yxat shakli", Parametr);
Jarayonning oxiri

7. Axborot reestriga kirish blankasi qanday ochiladi

Buning uchun sizga ma'lumotlar registrini kiritish kaliti kerak bo'ladi.

Yozuv kaliti- bu barcha o'lchovlar va davrning qiymatlari (agar registr davriy bo'lsa). Ya'ni, yozuv kaliti - bu yozuvni yagona aniqlash mumkin bo'lgan parametrlar.

Ochilish algoritmi quyidagicha:

  1. Biz tuzilishga kerakli qiymatlar bilan asosiy yozuv ma'lumotlarini kiritamiz.
  2. Olingan strukturani massivga joylashtiramiz.
  3. Massivdan yozuv kalitini yaratamiz.
  4. Ochilgan formaga parametr o'tkazamiz Kalit qiymat sifatida 3-bosqichdagi yozuv kaliti bilan.

&OnClient
Protsedura buyrug'i 1 (buyruq)
Parametr = yangi tuzilma;

KeyParameters= yangi tuzilma;
Asosiy parametrlar. Insert("Nomenklatura", LinkToNomenklatura) ;
Asosiy parametrlar. Insert("PriceType", LinkToPriceType) ;
Asosiy parametrlar. Insert ("Don", Sana);

KeyArray = Yangi massiv;
KeyArray. Qo'shish (KeyParameters) ;

EntryKey = Yangi( "Axborot registrini qayd etish kaliti. Narxlar nomenklaturasi", KeyArray);

Parametr. Insert("Kalit", RecordKey) ;

OpenForm( "Axborot reestri. Nomenklatura narxlari. Ro'yxatga olish shakli", Parametr);
Jarayonning oxiri

uy Boshlang'ich dasturchilar uchun Dasturlashni o'rganing

Mavjud ob'ektning shakli qanday ochiladi?

Mavjud ob'ektning formasini ochishda forma nomidan tashqari, shakli ochilishi kerak bo'lgan ob'ektni ham ko'rsatish kerak. Buning uchun Key forma parametri va bizni qiziqtirgan ob'ektga havoladan foydalaning.

Masalan, tashkilotlar ro'yxatidan kursor joylashgan tashkilot shaklini ochishingiz kerak bo'lsa, buni quyidagi tarzda qilishingiz mumkin:

Form parametrlarini struktura shaklida o'tkazamiz, bu erda struktura elementining nomi forma parametri nomiga mos keladi va qiymat biz shakl parametrini o'rnatmoqchi bo'lgan qiymatdir.

Agar siz konfiguratorda yaratilgan ob'ektning asosiy emas, balki ixtiyoriy shaklini ochmoqchi bo'lsangiz, asosiy shaklning standart nomi (ObjectForm) o'rniga Form so'zini va undan keyin nuqta qo'ying - bu shaklda yaratilgan shakl nomini ko'rsating. konfigurator.

Masalan:

ReferenceToDirectoryElement = Elements.List.CurrentRow; FormParameters = Yangi tuzilma ("Kalit", ReferenceToDirectoryElement); OpenForm("Directory.Organizations.Form.UniversalObjectForm",FormParameters);

Shuni ta'kidlash kerakki, agar ob'ektga havoladan tashqari, ochilayotgan shaklga parametrlarni o'tkazish kerak bo'lmasa va u mavjud ob'ektning asosiy shakli bo'lsa, siz oddiyroq usuldan foydalanishingiz mumkin. - protsedura yordamida shaklni ochish OpenValue():

OpenValue(Items.List.CurrentRow);

Bu usul kamroq ko'p qirrali, lekin ba'zi hollarda vaqt va kuchni tejaydi. Misol uchun, ko'rib chiqilgan holatda, bitta shunday satr biz ilgari yozgan barcha uch qatorli protsedurani almashtirishi mumkin.

Biroq, ushbu protseduradan foydalanganda ehtiyot bo'lish kerak. Ba'zi hollarda, bu serverga qo'shimcha qo'ng'iroqlarni keltirib chiqarishi mumkin, masalan, ierarxik katalog elementi shaklini ochish kerak bo'lganda. Ushbu protseduradan foydalanganda, platforma elementning guruh yoki yo'qligini aniqlash uchun serverga qo'shimcha qo'ng'iroq qiladi, chunki element va guruh uchun turli shakllar ochilishi kerak.

Shu bilan birga, ushbu ma'lumot ishlab chiquvchiga o'z algoritmi doirasida oldindan ma'lum bo'lishi mumkin va OpenForm() funktsiyasidan foydalangan holda, dasturchi serverga qo'shimcha qo'ng'iroqlarsiz kerakli shaklni ochishi mumkin, darhol asosiyning standart nomini ko'rsatadi. shakl.

Hammaga xayrli kun!
O'ylaymanki, ushbu mavzudagi ma'lumotlar ushbu forumga tashrif buyuruvchilar uchun juda foydali bo'ladi.
Uzoq vaqt davomida men muammoni hal qila olmadim - yangi hujjat shaklini qanday ochish kerak, shunda u bo'sh emas, balki qisman dasturiy jihatdan to'ldirilgan, hujjatning o'zi esa ma'lumotlar bazasida hali qayd etilmagan? Men Internetda ushbu muammoning echimini izlash uchun ko'p vaqt sarfladim, bu muammo ko'tarilgan ko'plab forumlarga tashrif buyurdim, lekin ulardan faqat bir nechtasi echimlarga duch keldi. Ulardan eng oddiyi birinchi navbatda yangi hujjatni dasturiy tarzda yaratish, kerakli rekvizitlarni dasturiy tarzda to'ldirish, hujjatni ma'lumotlar bazasiga yozish va keyin uni foydalanuvchiga ochishdir. Agar foydalanuvchi uni saqlashni istamasa-chi? Agar u fikrini o'zgartirsa va ochiq shaklni yopsa-chi? Bunday holda, allaqachon yozilgan hujjat ma'lumotlar bazasida qoladi. Va ma'lumotlar bazasida qo'shimcha hujjatlar kimga kerak?
Va agar siz hujjatni saqlamasangiz, unda eng mashhur variant GetForm usulidan foydalanishdir ("Hujjatlar. Kerakli hujjat turi. Hujjat shakli"). Ammo bu holda siz bo'sh hujjat shaklini olishingiz va uni Open() usuli yordamida ko'rsatishingiz mumkin. Bu ham variant emas...
Biroz vaqt o'tgach, muammo global kontekst funksiyasi yordamida hal qilindi "Mulk qiymatlarini to'ldirish".

Global kontekst
FillPropertyValues
Sintaksis:
PropertyValues(<Приемник>, <Источник>, <Список свойств>, <Исключая свойства>)
Tavsif:
Mulk qiymatlarini nusxalaydi<Источника>mulklarga<Приемника>. Muvofiqlik mulk nomlari bilan amalga oshiriladi.

Mening vazifamni misol sifatida ishlatib, yangi hujjat uchun shaklni to'ldirish uchun ushbu funktsiyadan qanday foydalanishingiz mumkinligini tushuntirmoqchiman. Vazifa quyidagicha edi: Bitta hujjat (Ish tartibi) mavjud bo'lib, uning jadval qismining rekviziti boshqa hujjatdir (Xizmat ko'rsatish). Shunday qilib, "Ish tartibi" ning jadval qismiga "Xizmatlarni ko'rsatish" yangi hujjati qo'shilganda, ekranda "Xizmatlarni ko'rsatish" yangi hujjatning shakli tafsilotlar bilan ko'rsatilishiga ishonch hosil qilish kerak edi. allaqachon to'ldirilgan, yaratilishga sabab bo'lgan ish tartibidan olingan. Shu bilan birga, yangi hujjatning o'zi, uning shakli ekranda paydo bo'lgan paytda, hali ma'lumotlar bazasida qayd etilmagan. Agar foydalanuvchi to'satdan hujjatni to'ldirmaslikka qaror qilsa va shunchaki shaklni yopsa, buni qilish kerak edi.
Mana muammoni hal qilish uchun kod bo'lagi:

&Mijoz protsedurasi bo'yicha EnterRecord()RecordForm = GetForm("Hujjat.Tibbiy xizmatlarni taqdim etish.ObjectForm"); Fill inPropertyValues(RecordForm.Object,Object,"Sana,Mutaxassis,Ixtisoslik,Hamshira,Ijro holati",); // Ikkala hujjatda nomlari bir xil bo'lgan tafsilotlar qiymatlarini to'ldiring TextStr = Elements.Reception.CurrentData; //Manba hujjatning joriy qatori ma'lumotlariProperty Structure = New Struktura; // Tuzilma yangi hujjat shaklida to'ldirilishi kerak bo'lgan, ammo dastlabki hujjatda bo'lmagan ma'lumotlarning qiymatlarini o'z ichiga oladi StructureProperties.Insert("Ish tartibi", Object.Link); PropertyStructure.Insert("ReceptionTime",TexStr.ReceptionTime); InPropertyValues(RecordForm.Object,PropertyStructure,"RecordOrder,AppointmentTime",); EntryForm.Open(); Jarayonning oxiri

Ya'ni, biz barcha operatsiyalarni to'g'ridan-to'g'ri mijozda, serverga murojaat qilmasdan, mustaqil ravishda yaratilgan bitta protsedura doirasida amalga oshiramiz. Aslida, shu tarzda siz har qanday hujjat yoki ma'lumotnoma shaklini to'ldirishingiz va ochishingiz mumkin. Birinchidan, men forma ob'yektlari yordamida ma'lumotlarni bir shakldan ikkinchisiga to'ldirdim, so'ngra etishmayotgan tafsilotlarni kiritgan "Tuzilish" ob'ektidan foydalanib, ochilayotgan shaklning yana bir qancha tafsilotlarini to'ldirdim va keyin ochdim. shakl.
Umid qilamanki, bu mavzu shunga o'xshash vazifaga duch kelgan ko'pchilik uchun vaqtni tejaydi!