Гэр / Нийгмийн сүлжээ / http хүсэлтийн толгойтой ажиллах 1c жишээ

http хүсэлтийн толгойтой ажиллах 1c жишээ

8.3.9.2170 платформ хувилбар бүхий 1С-ээс сайт руу мэдээлэл илгээх журмыг боловсруулахдаа би асуудалтай тулгарсан: сайтын хөгжүүлэгч надад PUT аргыг ашиглан зөвхөн HTTP хүсэлтийг ашиглан шаардлагатай мэдээллийг бүртгэх боломжийг олгосон.

Би хоёр удаа бодолгүйгээр энгийн кодыг зурсан:

Холболт = Шинэ HTTPConnection("www.mysite.ru"); Гарчиг = Шинэ тохирох; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Хүсэлт = Шинэ HTTPRequest("/api/order_items/93076?order_item=30", Толгой хэсэг); Холболт.Бичих(Хүсэлт);

Гүйцэтгэлийн үр дүнд үндэслэн вэбсайт дээрх худалдан авагчийн захиалгын харгалзах мөрөнд агуулахад хүлээн авсан барааны тоо хэмжээг зааж өгөх ёстой.

Гэсэн хэдий ч та аль хэдийн ойлгосон байх, юу ч болоогүй. Би сайт дээр ямар ч алдаа байхгүй эсэхийг шалгасны дараа (Chrome залгаасаар дамжуулан ижил төстэй хүсэлт илгээх замаар) би гүйсэн. орон нутгийн компьютервэб сервер болон туршилт хийж эхлэв.

Хачирхалтай зүйл тэр даруй гарч ирэв: дээрх код нь PUT биш, харин HEAD хүсэлтийг үүсгэдэг!

Apache логууд дээр би дараахь зүйлийг харсан.

127.0.0.1 - - "ТОЛГОЙ /api/order_items/93076?order_item=30 HTTP/1.1"

Би бага зэрэг гайхсан (эцэст нь үүнийг PUT гарын авлагад хар, цагаанаар бичсэн байсан), гэхдээ би ямар ч алдаагүй байсан - эцэст нь та энэ аргыг шууд дуудаж болно:

Холболт.CallHTTPmethod("PUT", Хүсэлт);

Бүртгэлүүд ижил байна:

127.0.0.1 - - "ТОЛГОЙ /api/order_items/93076?order_item=30 HTTP/1.1"

"Магадгүй би буруу зүйл хийж байгаа юм болов уу?" -Би өөрөөсөө асуулт асуусан. Гэвч интернет болон гарын авлагад ямар ч сэжүүр байгаагүй. За, шинжлэх ухааны нудрах аргыг хэн ч хараахан цуцалсангүй. Эхлэхийн тулд би үүнийг хийхийг оролдсон:

Connection.CallHTTPmethod("fwfw", Хүсэлт);

Миний авсан бүртгэлд:

127.0.0.1 - - "?????? /api/order_items/93076?order_item=30 HTTP/1.1"

Сонирхолтой нь энэ нь 1С нь PUT аргыг тусгайлан сольсон гэсэн үг юм (яагаад тэр 1С-д таалагдаагүй юм бэ?).

Хэд хэдэн оролдлого хийсний дараа би дараах зүйлийг олж мэдэв.

Connection.CallHTTPmethod("PUT", Хүсэлт);

Миний авсан бүртгэлд:

127.0.0.1 - - "PUT /api/order_items/93076?order_item=30 HTTP/1.1"

Мөн энэ сонголт аль хэдийн сайт дээр ажиллаж байсан бөгөөд хүн бүр сэтгэл хангалуун байсан.

Тэр асуудлыг шийдэх илүү зөв шийдлийг санал болгосон: та хүсэлтийн биеийг ямар ч, бүр хоосон зааж өгөх ёстой. Жишээлбэл, энэ нь ажиллах болно:

Холболт = Шинэ HTTPConnection("www.mysite.ru"); Гарчиг = Шинэ тохирох; Headers["Content-Type"] = "application/x-www-form-urlencoded"; Хүсэлт = Шинэ HTTPRequest("/api/order_items/93076?order_item=30", Толгой хэсэг); Query.SetBodyFromString("", TextEncoding.UTF8, UseByteOrderMark.Бүү ашигла); Холболт.Бичих(Хүсэлт);

Параметрийн утгыг хүсэлтийн биед шилжүүлэх нь аль хэдийн зөв байж магадгүй юм.

Дүгнэлт нь дараах байдалтай байна: 1С платформ нь их биегүй PUT хүсэлтийг алдаатай гэж үзэж, аргыг HEAD-ээр сольсон.

1С нь POST хүсэлтийг биегүйгээр дагаж мөрддөггүй бөгөөд GET болгон хувиргадаггүй нь сонирхолтой бөгөөд үүнийг спортын сонирхлын үүднээс шалгасан болно.

Алдарт хошигнолоос алдартай Вовочка хэлэхдээ: "Логик хаана байна?".

Миний нийтлэл хэн нэгний хариултыг хайж хэдхэн цагийн амьдралыг аварна гэж найдаж байна. =)))

8 платформын хоёр дахь хувилбараас эхлэн хэрэглэгчид болон хөгжүүлэгчид 1С http хүсэлтийг шууд ашиглах боломжтой болсон. Хөтөлбөр нь хоёр төрлийн хүсэлтийг дэмждэг:

  • POST хүсэлт;
  • Хүсэлтүүдийг хүлээн авах.

Тиймээс http-ээр дамжуулан ажилладаг вэб үйлчилгээ, үйлчилгээнүүдтэй мэдээлэл солилцох, харилцан үйлчлэхэд тохиромжтой хэрэгсэл бий болсон.

Хүсэлтийг АВАХ

Мэдээжийн хэрэг, асуулга ашиглах хамгийн энгийн жишээнүүд нь тэдгээрийн чадавхийг харуулахдаа олон мөрийн тайлбараас хамаагүй дээр юм. Ингээд оролдоод үзье:

  1. Манай сайтын үндсэн хуудасны хэсгийг авах;
  2. Хүсэлтийг дахин чиглүүлэх ажлыг хийцгээе;
  3. Бид зургийг сайтаас авах болно.

Сайтын биеийг авч байна

Энгийнээр эхэлцгээе. Зураг дээр..

Кодын энэ хэсгийг гүйцэтгэсний үр дүн нь нэлээд том текст бөгөөд эцсийн хэсгийг Зураг 2-т үзүүлэв.

Зураг 2

Кодын эхний мөрөнд бид http нөөцтэй холболтын объектыг үүсгэдэг. Объект нь дараах шинж чанаруудыг агуулж болно.

  • Сервер - серверийн хаягийг агуулсан холболтын мөр;
  • Порт - серверийн портыг харуулсан тоог агуулдаг бөгөөд холболтын төрлөөс хамааран 80-ыг зааж өгч болно. найдваргүй холболтуудэсвэл аюулгүй SSL-д зориулсан 443.
  • Хэрэглэгчийн нэр - сервер дээр зөвшөөрөл шаардлагатай бол зааж өгсөн;
  • Нууц үг - заасан нөөц дээрх хэрэглэгчийн нууц үг;
  • Прокси - сервертэй холбогдоход прокси ашиглах үед заасан InternetProxy төрлийн объект агуулж болно;
  • SecureConnection - өгөгдмөл нь ХУДАЛ, ҮНЭН рүү шилжих нь https протоколыг ашиглаж байгааг илтгэнэ.

Нэмж дурдахад, HTTPConnection объект нь өөрийн гэсэн аргуудтай бөгөөд тэдгээр нь хандагчийг гүйцэтгэх алгоритмыг илүү бүрэн дүрслэх боломжийг олгодог.

  • CallHTTPmethod – HTTPmethod болон HTTPrequest гэсэн хоёр шаардлагатай параметрүүдийг агуулсан, гурав дахь параметрт заасан файлд хариу бичих боломжийг дэмждэг;
  • Write - PUT хүсэлтийг ашиглан сервер рүү өгөгдөл илгээдэг;
  • Өөрчлөх – PATCH хүсэлтийг боловсруулах замаар объектыг өөрчилдөг;
  • SendForProcessing - өмнөх бүх аргуудын нэгэн адил POST хүсэлтийг ашиглахыг харуулсан арга нь хүсэлтийн текстийг агуулсан байх ёстой бөгөөд энэ нь өгөгдөл бичих хариултын файлын хаягийг илгээж болно;
  • Авах - энэ талаар дэлгэрэнгүйг доор хэлэлцэх болно;
  • GetHeaders бол нийтлэлийн туршид хэрэглэгдэх өөр нэг арга юм;
  • Устгах нь үнэндээ хүсэлтээр дамжуулагдсан эх сурвалжийг серверээс устгадаг Delite хүсэлт юм.

Хоёрдахь мөрөнд бид сонгосон сайт руу хүсэлт үүсгэдэг, бидний хүсэлтийн текст нь нэг налуу зураас агуулсан бөгөөд энэ нь бид авахыг хүсч байна гэсэн үг юм. нүүр хуудас. Хэрэв ташуу зураасыг дагаж ямар нэгэн илэрхийлэл байвал, жишээ нь "page2" эсвэл "news" бид өөр хуудас авах болно.

Гурав дахь мөр нь сервер рүү илгээсэн хүсэлтийг гүйцэтгэдэг.

Дөрөвдүгээрт бид үр дүнг харуулж байна.

http хүсэлтийн дахин чиглүүлэлт хийж байна

Бид хайлтын үр дүнг програмын дагуу авах шаардлагатай нөхцөл байдлыг төсөөлөөд үз дээ Хайлтын систем"1 секундын доторх хүсэлт" гэсэн товчлуураар. GOOGLE-д хандахад шаардагдах кодын хэсгийг Зураг 3-т үзүүлэв

Зураг 3

Энд бидэнд аль хэдийн танил болсон барилга байгууламжаас гадна Толгой ба Статус код байдаг. Тэдэнтэй харьцъя.

StatusCode - "Сэтгэгдэл бичих хүсэлт" хэсэгт заасан стандарт утга нь дараах утгыг авч болно.

  1. Хэрэв бүх зүйл хэвийн байвал 100-аас 299 хүртэлх утгыг буцаана;
  2. Дахин чиглүүлэх тохиолдолд 300-аас 399 хүртэлх кодыг буцааж өгөх болно, манай тохиолдолд нөөц рүү амжилттай байнгын дахин чиглүүлэлт нь 301 кодоор тодорхойлогдоно;
  3. Хүсэлтэд алдаа гарсан тохиолдолд параметр нь 400-аас 499 хүртэлх утгыг авна;
  4. 500-599 муж дахь утга нь сервертэй холбоотой асуудлуудыг илтгэнэ.

Хуудас бүр гарчигтай бөгөөд текстэнд хэд хэдэн параметрүүдийг ялгаж болно (Зураг 4):

  1. Холболтын схем (хоёр налуу зураас хүртэл бүх зүйл "//");
  2. хаягийн мөрхолболтууд;
  3. Хэрэглэгчийн нэр, нууц үг;
  4. Холбох порт болон хост.

Чухам энэ задаргаа нь BreakAddressString функцээр хийгддэг. Шинэ хаягийг хүлээн авсны дараа бид хуудсыг компьютер дээрээ хадгалж, анхдагч хөтөч дээр нээх боломжтой (GetPage процедур).

Зураг 5

Асуулгатай ажиллах шинэ боломж, арга зам байхгүй, бид үнэндээ бүтээж байна Текст баримтсайтын үндсэн хэсгээс болон хөтөч дээр хуудсыг ажиллуулна уу.

Бид файлыг D хөтчийн үндсэн хэсэгт байрлуулж, тест гэж нэрлэдэг.

Сайтаас зураг авч байна

Байгалийн асуулт гарч ирдэг: хэрэв бидэнд сайтыг бүхэлд нь биш, харин зөвхөн түүний бие даасан элементүүд хэрэгтэй бол үүнийг яаж хийх боломжтой вэ? Тиймээ чи чадна. Үүнийг хийх боломжийг олгодог програмын кодыг 6-р зурагт үзүүлэв

Зураг 6

Зургаас харахад хүсэлтийн хэсэгт бид авах шаардлагатай сайтын бүтцийн элементийн код байгаа. Энэ хэсэг нь бидний өмнөх тайлбарт байгаагүй бөгөөд бид энэ талаар илүү дэлгэрэнгүй ярих хэрэгтэй.

Бид хөтөч ашигласанСайт руу нэвтрэхийн тулд Opera. Энэ нь бидний хувьд нэг чухал хэрэгсэлтэй бөгөөд та аль нэг элемент дээр хулганы баруун товчийг дарснаар залгах боломжтой контекст цэс, тэдгээрийн нэг нь "Элементийн кодыг харах" юм.

Түүний ачаар бид хүсэлтийн 7-р зурагт ашиглах хаягийг авах боломжтой болсон.

POST хүсэлт

Энгийн Get хүсэлтүүдээс ялгаатай нь POST http хүсэлтүүднь энгийн текст хэлбэрээр болон xml, саван, json өргөтгөлтэй файл хэлбэрээр хадгалах боломжтой текстийн биетэй. Сүлжээ нь дибаг хийх, тодорхой хүсэлтийн гүйцэтгэлийг хянах боломжийг олгодог асуулгын текст үүсгэх олон хэрэгсэлтэй.

1С-д тодорхой текст бүхий хүсэлтийг эхлүүлэхийн тулд HTTP хүсэлтийн объект нь SetBodyFromString процедуртай байдаг.

1C Enterprise 8.3 платформ дээр HTTP үйлчилгээг бий болгох боломжтой болсон

Суурилуулсан хэлний тусламжтайгаар хүсэлтийн хариуг бүрдүүлэх боломжтой болсон. Энэ тохиолдолд та эх сурвалжийн их бие, толгой, мөрөнд хялбар хандах боломжтой хүсэлт, мөн код, их бие, толгой хэсгийг үүсгэх боломжтой хариу үйлдэлтаны үзэмжээр.

SOAP платформ дээр байдаг вэб үйлчилгээнүүдтэй харьцуулахад HTTP үйлчилгээ нь хэд хэдэн давуу талтай:

  • Ийм үйлчилгээний үйлчлүүлэгчийг програмчлахад хялбар;
  • Дамжуулсан өгөгдөл бага байж болзошгүй;
  • Тооцооллын ачаалал бага байх магадлалтай;
  • HTTP үйлчилгээнүүд нь "нөөцөд" чиглэсэн байдаг бол SOAP үйлчилгээ нь "үйлдэл"-д чиглэсэн байдаг.

Мэдээллийн сан нь http-үйлчилгээний хэрэгжилтийг харуулж байна

http үйлчилгээний Нэхэмжлэлийн жагсаалт

URL загваруудыг http үйлчилгээнд ашигладаг, өмчийн зохицуулалтыг хэрэгжүүлдэг ПараметрүүдURLобьект HTTPServiceRequest
AT энэ жишээАжлын бааз болон корпорацийн сайтын хооронд суурийг хэрхэн бий болгож болохыг харуулж байна
Демо баазтай холболт хийгдсэн " Худалдааны менежмент 11", үүнд та эхлээд нэр бүхий нэмэлт өмчийг тохируулах ёстой Вэб нууц үг , бид нэвтрэх нууц үгийг хаана хадгалах болно.
http хүсэлтийг URL параметрүүдээр дамжуулна: нэвтрэх болон нууц үг болгон TIN.
Хүсэлтийг боловсруулахдаа ComConnector-ээр дамжуулан UT-д холболт хийж (тоормос нь баталгаатай) бөгөөд тэндээс сонголт хийнэ.
Би энэ шийдлийн хурд, аюулгүй байдлыг шаарддаггүй, энэ бол жишээ юм

Тэгэхээр. Мета өгөгдлийн модонд шинэ салбар гарч ирэв - HTTP үйлчилгээ
Бид бүтээдэг шинэ үйлчилгээ, түүний нэр болон үндсэн URL (жагсаалт)-ыг зааж өгнө үү
Манай http үйлчилгээ рүү залгахад root url ашиглагдана
Дараа нь http үйлчилгээнд URL загвар нэмж, загвар болгон “/(Нэвтрэх)/(Нууц үг)” гэж зааж өгнө.
Ийм загвар нь http хүсэлтийг боловсруулахдаа URL параметрүүд дэх параметрүүдийн харгалзах бүтэц, тэдгээрийн утгыг олж авах боломжийг олгоно.
Одоо URL загвар дээрээ "get" гэсэн аргыг нэмж, http аргаар GET-ийг сонгоцгооё.
Гаргагчийг нээж кодыг бичнэ үү
Аргын зохицуулагч нь төрлийн утгыг буцаах ёстой функц юм HTTPServiceResponse

http serviceOrderStatus

Жишээ нь POST аргаар дамжуулсан хувьсагчдыг боловсруулах, html хуудас хэлбэрээр хариулт үүсгэх ажлыг хэрэгжүүлдэг.
Энэ удаад hs байрлаж байгаа өгөгдлийн сангаас өгөгдлийг гаргаж авсан тул өмнөх http үйлчилгээнээс хамаагүй хурдан ажилладаг.
Хэрэгжүүлэх үед ажлын системМэдээллийн санд (үйлчилгээний хамт) объект үүсгэж, эх мэдээллийн сангаас өгөгдөл шилжүүлэх (жишээлбэл, тусдаа) тохируулах нь утга учиртай юм. суурь үйл явц). http хүсэлтийг боловсруулахдаа түүний байгаа мэдээллийн сангаас шууд сонголтоо хийнэ үү.

Хэвлэл

Вэб сервер суулгах, тохируулах талаар маш их мэдээлэл байдаг.
Би эндээс build httpd-2.2.25-win32-x86-openssl-0.9.8y.exe ашигласан.
"Дараагийн-Дараагийн-Төгсгөл" аргыг ашиглан суулгасан 🙂
Http-үйлчилгээг нийтлэх нь вэб үйлчилгээг нийтэлж байсан газартай ижил газар бөгөөд тийм ч их ялгаатай биш юм.
Вэб серверийг "Тохируулагч" горимд суулгасны дараа "Захиргаа" - "Вэб сервер дээр нийтлэх" цэс рүү очно уу.
"HTTP үйлчилгээ" таб дээр бид нийтлэлийн нэр, вэб сервер, нийтлэлийн лавлахыг тохируулж, үйлчилгээгээ тэмдэглэнэ (миний хувьд нэр нь "вэб", Apache 2.2 вэб сервер)
Нийтлэх үед харгалзах блокуудыг httpd.conf тохиргооны файлд автоматаар бичиж, серверийг дахин ачаална (эхний хэвлэлд)
http үйлчилгээ рүү залгаж байна
Жишээ: http://mysite/web/hs/list, хаана
миний сайт– серверийн хаяг (хэрэв вэб серверийг дотооддоо суулгасан бол 127.0.0.1 ашиглаж болно)
вэб- нийтлэх үед заасан нэр (холбоо)
hs- серверт http үйлчилгээнүүдтэй ажиллах болно гэж хэлдэг шаардлагатай замын сегмент
жагсаалт– вэб үйлчилгээний root url

Туршилт хийх

Нэхэмжлэхийн жагсаалт

http://127.0.0.1/web/hs/list/7705260681/pswMP (Нууц үгэнд зориулж UT-д нэмэлт өмч оруулахаа бүү мартаарай)

Баримт бичгийн бүртгэлд нэвтрэхийн тулд хэрэглэгч TIN болон нууц үг агуулсан шууд холбоосыг ашигладаг гэж үздэг.

Захиалгын статус

http://127.0.0.1/web/hs/check

Хүсэлт болон хариулт нь ижил URL дээр байрладаг. Хуудас руу орох үед GET аргыг ажиллуулж, html хэлбэрийг буцаана

Та "Шалгах" дээр дарахад захиалгын дугаарыг POST аргыг ашиглан ижил URL руу илгээж, хариуг хүссэн захиалгын өгөгдөлтэй ижил хүсэлтийн маягтаар буцаана.

Хавсаргасан файлд - 1С 8.3-ийн мэдээллийн санг буулгаж байна. Энэхүү тохиргоо нь "Захиалга" баримт бичиг болох UT 11 демо баазтай холболтыг тохируулах 2 http-үйлчилгээг (нийтлэлээс) хэрэгжүүлдэг.

Юуг эхлүүлэх, шалгах хэрэгтэй

  • вэб сервер
  • ямар ч вэб хөтөч
  • одоогийн хувилбар1С: Аж ахуйн нэгж 8.3

За, энд сервер талын эсрэг талуудтай XML файлыг боловсруулах жишээ байна:

VBS код
шаарддаг_нэг удаа dirname(__FILE__) . "/../inc/initf.php" ;
анги Onec_Import_Customers(
хувийн статик $ instance ;
функц __construct()(

Self::$ instance = $ this ;

нийтийн үйл ажиллагааны процесс()(
$rawHttp = file_get_contents("php://input") ;
$xml_raw = str_replace("xml=", "", $rawHttp);

Хэрэв ($_SESSION["нэвтрэх"] || үнэн)(
file_put_contents("log/onec_import_customers_" .time(). ".log", "REQUEST " . print_r($_REQUEST, 1) . " SERVER " . print_r($_SERVER,1). " FILES " . print_r($_FILES, 1) .$xml_raw);
file_put_contents("log/onec_import_customers_last.log", "REQUEST " . print_r($_REQUEST, 1) . " SERVER " . print_r($_SERVER,1). " FILES " . print_r($_FILES,1) . $xml_raw) ;

//$xml = налуу зураас($_POST["xml"]);
$xml = налуу зураас($xml_raw);
if(!$xml) (
$xml = $xml_raw;
//die("XML өгөгдөл байхгүй (post key "xml")") ;
}
хэрэв ($this->setCustomers($xml)) (
үхэх("OK");
) өөр (
үхэх ("FAIL");
}
) өөр (
үхэх();
}
}

Хувийн функцийн багцCustomers($xml)(
$db = db::getInstance();

$sxml = simplexml_load_string($xml);

$ үйлчлүүлэгч = $sxml->("P”PsPiPsPIRsSЂ”) ? $sxml->("R”PsPiRsPIRsSЂ") : self::err("Файлын формат буруу. Хэрэглэгчид.");

$final = массив();
$k = 0 ;

$allCustomers = массив();

Foreach ($хэрэглэгч $cust гэж) (
$нууц үг = base::generatePassword(6,1) ;

$arr["нууц үг"] = $нууц үг;

$arr ["имэйл"] = (массив)$cust->("Почта") ;//? (массив)$cust->("PџPѕS‡S‚P°") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k . ". Хүчингүй имэйл");
$arr["имэйл"] = $arr["имэйл"]? $arr ["имэйл"] : "";//: self::err("Файлын формат буруу. хэрэглэгчийн дугаар:" . $k. ". Хүчингүй имэйл");

$arr ["app_name"] = (массив)$cust->("НаимРμРЅРѕРІР°РРЅРёРµ") ;//? ;
$arr ["app_name"] = $arr ["app_name"] ? $arr ["app_name"] : "";//self::err("Файлын формат буруу. хэрэглэгчийн дугаар:" . $k. ". Буруу нэр");

$arr ["clientid"] = (массив)$cust->("РќРѕРјРμСЂ") ? (массив)$cust->("РќРѕРјРμСЂ") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k . ". Хүчингүй клиент") ;
$arr["clientid"] = $arr["clientid"]? $arr ["clientid"] : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй клиент");

$arr ["огноо"] = (массив)$cust->("R”R°C‚R°") ? (массив)$cust->("P”P°S‚P°") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй огноо");
$arr["огноо"] = $arr["огноо"]? $arr ["огноо"] : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Огноо буруу");

$arr["огноо"] = тэсрэх(".",$arr["огноо"]);
krssort($arr["огноо"]);
$arr ["огноо"] = implode("-",$arr ["огноо"]) . "00:00:00" ;

$arr ["phone_home"] = (массив)$cust->("РўРμР»Рμфон") ;//? (массив)$cust->("PўPμP"PµS„PsPS") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k . ". Хүчингүй утас") ;
$arr ["home_home"] = $arr ["phone_home"] ? $arr ["phone_home"] : "";//self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй утас");

$arr ["дүүрэг"] = (массив)$cust->("P P°P#PsPS") ;//? (массив)$cust->("P P°P#PsPS") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k . ". Хүчингүй дүүрэг");
$arr ["дүүрэг"] = $arr ["дүүрэг"] ? $arr ["дүүрэг"] : "";//self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй дүүрэг" );

$arr ["гудамж"] = (массив)$cust->("PJP"PeC†P°") ;//? (массив)$cust->("PJP"PoC†P°") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй гудамж") ;
$arr["гудамж"] = $arr["гудамж"]? $arr ["street"] : "";//self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй гудамж");

$arr ["барилга"] = (массив)$cust->("R”RѕRј") ;//? (массив)$cust->("P”PѕРј") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k . ". Хүчингүй барилга");
$arr["барилга"] = $arr["барилга"] ? $arr ["Building"] : "" ;//self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй барилга");

$arr ["apartament"] = (массив)$cust->("PљPIR°СЂС‚РёСЂР°") ;//? (array)$cust->("Квартира") : self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k . ". Хүчингүй орон сууц") ;
$arr ["орон сууц"] = $arr ["орон сууц"]? $arr ["apartament"] : "";// self::err("Файлын формат буруу. Хэрэглэгчийн дугаар:" . $k. ". Хүчингүй орон сууц");

$allCustomers [$arr ["clientid"]]= array("password"=>$password, "email"=>$arr ["email"]) ;

$final = $arr;
++$k;
}

$this->buildCustomers($final) буцаана;
/*
if($this->buildCustomers($final)) (
foreach ($allCustomers as $clientid=>$data) (
self::sendPasswordToMail($дата["имэйл"], $үйлчлүүлэгч, $өгөгдөл["нууц үг"]) ;
}
}*/

Хувийн статик функц sendPasswordToMail($имэйл, $клиент_id, $нууц үг) (
$db = db::getInstance();
$config = config_model::getInstance() ;
$lng = Хүсэлт::$currentLang["id"] ;
$email_text = $db->getRow("s1_text", "*", "`alias`="registration_ok" БОЛОН `lng_id`="($lng)"");
$body = str_replace("%нууц үг%", $нууц үг, $имэйл_текст["агуулга"]) ;
$body = str_replace("%client_id%", $client_id, $body) ;
base::mailSend($body, $email_text["title"] . " - " . $config->defaultTitle("site.ru") , $email, $app["app_name"], $config->site_admin_mail( " [имэйлээр хамгаалагдсан]"), $config->from_name("сайт")) ;

Хувийн функц buildCustomers($data)(

$db = db::getInstance();

$qry = "I_insert INTO s1_customer (`идэвхтэй`,`нууц үг`,`app_name`,`email`,`огноо`,`үйлчлүүлэгч`,`утасны_home`,`гудамж`, `дүүрэг`, `барилга`, `орон сууц` `) ҮНЭ ЦЭНЭ " ;
foreach ($датаг $мөр хэлбэрээр)(
$queryArr = "(
"0"
,MD5("($мөрүүд["нууц үг">")
,"($db->escape($rows["app_name"]))"
,"($db->escape($rows["имэйл"]))"
,"($db->escape($rows["огноо"]))"
,"($db->escape($rows["clientid"]))"
,"($db->escape($rows["phone_home"]))"
,"($db->escape($rows["street"]))"
,"($db->escape($мөр["дүүрэг"]))"
,"($db->escape($rows["барилга"]))"
,"($db->escape($rows["орон сууц"]))"
)" ;
}
$qry .= implode(",", $queryArr);
$qry .= "ДАВХАР ТҮЛХҮҮРИЙН ШИНЭЧЛЭЛТ ДЭЭ
`app_name` = VALUES(app_name)
,`огноо` = VALUES(огноо)
,`email` = VALUES(имэйл)
,`гэрийн_утас` = VALUES(гэрийн_утас)
,`гудамж` = VALUES(гудамж)
,`дүүрэг` = VALUES(дүүрэг)
,`барилга` = VALUES(барилга)
,`орон сууц` = VALUES(орон сууц)
" ;
буцаах $db->query($qry);
}

нийтийн статик функц getInstance()(
хэрэв (!self::$ instance)
{
newself() ;
}
self::$ instance буцаах;

Хувийн статик функц алдаа($msg) (
шинэ ImportException ($msg) шидэх;
}

Class ImportException Exception-г өргөтгөх(

Функц __construct($msg)(
үхэх ("Алдаа: " . $msg) ;