Ano ang isang script para sa 1C. "Tumawag ka!" nagbibigay-daan sa iyo na bumuo ng isang closed cycle ng mga pakikipag-ugnayan sa kliyente

Sa artikulong ito susubukan kong magbigay ng ilang mga tip sa pag-set up ng pag-activate ng mga script sa mga website gamit ang 1C.

Bakit maaaring kailanganin ito? Sa aking halimbawa, kailangan kong magpatakbo ng isang php script upang maisaaktibo ang pag-download sa isang site na ang cms ay 1C-Bitrix. Yung. ang file ay dina-download mula sa 1C at sinenyasan ang site na piliin ang file. Tinitiyak nito ang mataas na kahusayan ng pakikipagpalitan sa site.

Sa katunayan, walang mahirap sa prosesong ito, ngunit dahil sa mga detalye ng pamamaraang ito, ang programmer ay maaaring magkaroon ng ilang mga problema sa pagkilos na ito.

Paglalarawan ng gawain:

Matapos i-download ang file ng data mula sa 1C, kinakailangang i-upload ang file sa database ng site sa lalong madaling panahon. Upang gawin ito, ang programmer na bubuo sa site ay lumikha ng isang script na nagsagawa ng dalawang aksyon: sinuri nito ang pahintulot at na-activate ang palitan sa bahagi ng site. Ang php script mismo ay ganito ang hitsura ng "http:///1c_prices_import_run.php".

Tingnan natin kung paano inilunsad ang script na ito.

GET ang kahilingan mula sa 1C

Ang unang hakbang ay ang paggawa ng object na “HTTP Connection,” kung saan nagsasagawa kami ng awtorisasyon:

Kumuha ng 267 video lesson sa 1C nang libre:

HTTP = Bagong HTTPConnection(" /1c_prices_import_run.php

Ipinapasa ko ang php script address, password at pag-login sa mga parameter. Sapat na ito kung wala kang iba pang nakakalito na kundisyon tulad ng secure na awtorisasyon at proxy server.

Ang aking pangalawang hakbang ay suriin ang koneksyon; kung matagumpay ang pahintulot, ibinalik sa akin ng script na ito ang salitang "tagumpay":

HTTP.Get(" http:///1c_prices_import_run.php?mode=checkauth", ResponseFileName); // tseke ng awtorisasyon

Sa mga parameter ng paraan ng Kumuha (katulad ng GET), tinukoy namin ang parameter " ?mode=checkauth", na nagpapakita na ito ay isang ping test lamang. Ang pangalawang parameter, "ResponseFileName," ay ang file kung saan isusulat ang tugon ng server.

HTTP.Get(" http:///1c_prices_import_run.php?mode=query", RequestFileName);

Iyon lang. Ang lahat ay medyo simple at gumagana nang perpekto sa 1C side.

Buweno, sa huli ay ipapakita ko sa iyo ang buong code:

RequestFileName= GetTemporaryFileName();

HTTP = Bagong HTTPConnection(" http:///1c_prices_import_run.php", Mga Setting ng Pagbabahagi ng Data. UserName ng Pagbabahagi ng HTTP, Mga Setting ng Pagbabahagi ng Data. Password ng Pagbabahagi ng HTTP,); //koneksyon

Exception

EndAttempt;

HTTP.Get( http:///1c_prices_import_run.php?mode=checkauth", RequestFileName); // tseke ng awtorisasyon

Exception

EndAttempt;

ResponseFile = Bagong File(ResponseFileName);

Kung ResponseFile.Exists() Pagkatapos

Ang thesis na ang open-source ay nilikha ng mga masigasig na geeks ay medyo nawala ang kaugnayan nito sa ating panahon. Gayunpaman, ito ay kung paano ipinanganak ang open source na ideolohiya. Mga cool na programa na isinulat sa gabi, ng mga may balbas (at hindi masyadong balbas) na mga weirdo, nang walang interes, para lang gawing mas magandang lugar ang mundo - binago ang mundo ng software development.

Ang sinumang programmer ay lihim na nangangarap na gumawa ng isang bagay na malaki at maliwanag upang magustuhan ito ng lahat. Kung sasabihin mo sa akin na hindi ka isa sa mga taong iyon, na gusto mo lamang isara ang mga tiket sa gumaganang bug tracker, at hindi mo pinangarap na ilabas ang iyong proyekto sa malaking mundo, kung gayon hindi ako maniniwala sa iyo. O ipapayo ko sa iyo na baguhin ang iyong propesyon. Kumbinsido ako na ang isang programmer ay isang artista, at mahalaga para sa isang artista na gumawa ng sarili niyang bagay, marahil ay "nasa mesa" lamang - ngunit gawin ito.

Isang araw, isang ideya para sa isang proyekto ang pumasok sa aking isipan. Ang ideya ay panay pananaliksik at hindi ko nilayon na gumawa ng isang "produkto" mula dito. Bilang karagdagan, hindi pa ako nagpapatakbo ng mga bukas na proyekto sa pag-access at talagang gusto kong subukan kung paano ito nangyayari. Ang lumabas dito ay nasa ilalim ng hiwa.

Sa simula pa lang ng buhay ng proyekto, isinulat ko na ito sa Habré. Pagkatapos ito ang mga unang hakbang, ang code ay krudo, ngunit ito ay gumana. Gusto kong pumukaw ng interes ang proyekto sa bahagi ng ibang mga may-akda, dahil maliwanag na hindi ko ito magagawang mag-isa at sa pangkalahatan ay inabandona ko ito. Sa prinsipyo, mangyayari ito kung hindi ko natanggap ang aking unang kahilingan sa paghila mula sa isang estranghero. Ngunit una sa lahat…

Tungkol Saan iyan? Gumawa ako ng sarili kong pagpapatupad ng isang stack machine na nagpapatupad ng mga script sa wikang 1C: Enterprise. O, sa madaling salita, isang bukas na interpreter ng 1C na wika at isang bukas na pagpapatupad ng ilang karaniwang 1C na klase. Kasabay nito, ang proyekto ay may malinaw na inilapat na layunin - upang bigyan ang mga user ng 1C ng script automation tool na madaling matutunan. Ang proyekto ay pinangalanang 1Script.

At kaya, ang proyekto ay nai-publish sa Habré at sa dalubhasang 1C portal infostart.ru. Naghihintay ako ng feedback. Ang unang tugon na natanggap ko ay nasa entablado at tumawa ako ng malakas. Tinawag ang paksa sa forum "1C interpreter sa Habré. Manahimik na tayo?" Maraming mababait na tao sa site, natuwa ako :)

Pagkatapos ay mayroong higit pa o hindi gaanong sapat na mga tanong, na masigasig kong sinagot, pagkatapos ay ang mga artikulo ay bumaba tulad ng dati mula sa mga unang pahina, at ang interes sa proyekto ay nawala. Well, it was the expected ending, medyo naiinis ako, pero hindi masyado. Sa totoo lang, hindi ko inaasahan ang anumang espesyal na resulta. Nagkwentuhan kami at okay. Lumipas ang mga araw, may natapos ako, nag-post pa nga ng ibang version, pero walang kailangan maliban sa akin. Naubos na ang fuse ko. Kahit na hindi ako nabigo, tumigil ako sa pagsusulat ng bagong code.

Pangalawang hangin Mga dalawang buwan pagkatapos ng publikasyon, si Sergey Batanov (Serega, hello! :) - isang kilalang tao sa komunidad ng 1C - ay nakipag-ugnayan sa akin at nag-alok ng kanyang tulong sa pagbuo ng karaniwang aklatan. Ito ay ang 1C na klase na "Table of Values". Syempre, pumayag ako. At nang makita ko ang totoong code na ipinadala ni Sergey, masaya ako bilang isang bata, talaga. Madalas itong nangyayari sa Internet kapag ang isang tao ay nag-aalok ng isang bagay sa mga salita, ngunit madalas itong hindi natutupad. At narito ang totoong live code na gumagana, na ganap na sapat, na maaaring ipasok sa proyekto!

Kasabay nito, ang gawain ay medyo malaki, magiging tamad akong gawin ito sa aking sarili. At narito ang isang nasasalat, talagang kapaki-pakinabang, nasusukat na kontribusyon sa pangkalahatang proyekto, na masusukat sa mga linya ng code! Sa madaling salita, hindi ako magsisinungaling kung sasabihin kong si Sergei ang nagsigurado na ang proyekto ay hindi ko pinabayaan. Ito ay isang kamangha-manghang inspirasyon upang makakuha ng tulong mula sa isang estranghero. Dahil lang sa interesado siya sa nasimulan mo.

Unti-unti, nagsimula akong makatanggap ng feedback mula sa mga taong sumubok sa makina at nagtanong "nasaan ang feature na ito?", "paano ito gagawin?" Ang lahat ng mga tanong na ito ay kailangang sagutin na ito ay isang prototype, at pagkatapos ay kailangan kong agarang idagdag ang mga tampok na ito. Ngunit ang sigasig ay wala sa mga chart: "Interesado ang mga tao at sinusubukang gamitin ito," kaya mabilis na naidagdag ang mga bagong feature. Sa una, ang karaniwang aklatan ay walang mga function para sa pagtatrabaho sa mga file.

Parami nang parami Pagkaraan ng ilang oras, sumulat sa akin si Alexander Kuntashov na may tanong tungkol sa pagsasama ng 1Script at ang proyekto ng Snegopat (www.snegopat.ru). Para sa mga hindi nakakaalam, ito ay isang resharper para sa 1C. Pinapayagan ka nitong gumawa ng mga script plugin para sa 1C Configurator at mayroong isang buong komunidad ng mga may-akda ng naturang mga plugin.
Ang mga plugin na ito ay isinulat sa JavaScript, at samakatuwid ay nangangailangan ng mga kwalipikasyon na lampas sa saklaw ng isang karaniwang 1C programmer. Dahil dito, ang pag-unlad ng plugin ecosystem ay tuluyang nahadlangan. Ang bilang ng mga taong gustong pahusayin ang Configurator ay humigit-kumulang katumbas ng kabuuang bilang ng mga user ng 1C, gayunpaman, ang pangangailangang matuto ng JavaScript ay hindi hinihikayat ang mga may-akda ng mga potensyal na obra maestra.

Ako, muli, ay tuwang-tuwa tungkol sa pangangailangan para sa aking mapanlikhang ideya, nakiusap sa may-akda para sa kit ng pamamahagi ng Snowpath at inalis ang alikabok mula sa aking kaalaman sa C++. Mayroong mas maraming alikabok kaysa sa kaalaman, ngunit ginawa ng malikhaing kati ang trabaho nito, at bumulusok ako sa MSDN.

Makalipas ang halos isang buwan, sa 1C Configurator naging posible na magsulat ng mga plugin nang direkta sa wikang 1C, nang hindi lumilipat sa window ng editor ng JavaScript. Kasabay nito, ang mga unang kritikal na bug ng makina ay naayos at ang panloob na arkitektura ay makabuluhang binago.
Nakatanggap ako ng nakakalasing na kasiyahan mula sa pakikipag-usap sa C++, COM, ATL at lahat ng ito, pagkatapos ng maraming taon ng eksklusibong pagtatrabaho sa 1C. Buweno, at mula rin sa katotohanan na gumawa ako ng isang bagay na kapaki-pakinabang, nakikita para sa komunidad ng 1C.

Unang karanasan ng paggamit ng labanan Sa parehong oras (hindi ko matandaan nang eksakto) ang proyekto ay nakuha ng pansin ni Alexey Lustin () (Lech, kumusta din sa iyo!) - isang kilalang at iginagalang na tao sa mga palayaw ng 1C. Kasabay ito ng paghahanap ko ng bagong trabaho. Naghanap ako ng mga kawili-wiling kumpanya sa merkado, at naghanap si Alexey ng mga espesyalista para sa proyekto ng Continuos Integration/Continuos Delivery para sa mga empleyado ng 1C. Pagkatapos ay nakita na ni Lesha ang aking proyekto (at palayaw) sa Habré, at alam ko na na ang isang partikular na pangkat ng mga advanced na user ng 1C sa network ay gumagawa ng mga kawili-wili, hindi karaniwang mga bagay.

Sa sandaling iyon, alam na ng komunidad ang mga bagay tulad ng unit testing, pag-iimbak ng 1C code sa git, BDD+cucumber para sa 1C, at iba pa. Si Alexey ay tila sa akin ang pinaka madaling lapitan sa mga taong ito, at sumulat ako sa kanya ng isang liham na nagtatanong kung mayroon siyang isang kawili-wiling trabaho. Kaya, kasama ang aking proyekto, napunta ako sa isang masayang kumpanya ng mga geeks na nagtipon sa oras na iyon sa kumpanya kung saan nagtatrabaho si Alexey.

Sa oras na iyon, ang makina ay mayroon nang pinakamababang hanay ng mga kakayahan na kinakailangan ng script, at maaari itong (tulad ng tila sa akin) sa prinsipyo ay ginagamit upang i-script ang pagpupulong at pag-deploy ng mga database ng 1C.

Bakit gumamit pa ng bagong makina para dito? Sa totoo lang, mayroong isang milyong mga wika sa pag-script, ngunit hindi malinaw kung bakit kailangan natin ng isa pa, at isang hindi kilalang isa doon - magtatanong ang isang mambabasa ng Habr - at hindi siya magiging ganap na tama. Sa estratehikong paraan, ang hinaharap na produkto ay inilaan para sa mga empleyado ng 1C at kailangang mabuhay mula sa developer hanggang developer, anuman ang pagbabago ng tauhan sa kumpanya. May layuning problema sa komunidad ng 1C nick: maraming mahuhusay na espesyalista sa kanila, ngunit sa ilang kadahilanan ang karaniwang 1C nick ay ayaw matuto ng anumang iba pang wika pagkatapos na maging mahusay sa 1C. Hindi ko alam kung ano ang dahilan ng hindi pangkaraniwang bagay na ito, marahil dahil sa mga panuntunan ng 1C (irony)? Dumarating ang mga tao sa 1C na alam ang Java, C/C++, microcontrollers, Delphi, o walang alam, ngunit madalas silang nananatili sa 1C at nag-aatubili na bumalik sa kanilang orihinal na ecosystem.
Nakikita ko na ngayon ang isang alon ng galit, ngunit mangyaring makinig sa thesis hanggang sa dulo. Mayroong mga pagbubukod sa anumang panuntunan, gayunpaman, kapag nagpaplano ng isang sistema na dapat mabuhay ng ilang henerasyon ng mga developer (hindi biyolohikal, ngunit mga henerasyon ng tao, siyempre), pagkatapos ay malamang na makakahanap ka ng isang espesyalista na maaaring bumuo nito kung ito ay nakasulat sa 1C . Kung ito ay Python (o ipasok ang iyong paboritong wika), kailangan mong umarkila ng isang espesyalista sa Python na alam na alam ang 1C. At pagkatapos niyang maging isang malaking boss, kailangan mong maghanap ng isa pang katulad niya, na may mga kakayahan sa lugar ng 1C. At kung ito ay kaagad na isang 1C na wika, pagkatapos ay kailangan mo lamang na makahanap ng isang 1C na palayaw na nakakaalam ng mabuti sa 1C at iyon ay sapat na.
Sa madaling salita, ang sistema ay magiging mas matibay at magagawa ng mas malaking bilang ng mga espesyalista kung ito ay nakasulat sa isang wikang pamilyar sa kanilang lahat.

Kaya, naging malinaw ang saklaw ng aplikasyon ng 1Script: ito ang mga DevOps at mga katulad na gawain para sa mga layunin ng mga proyekto ng 1C.

Mga unang bumps at tamang pag-unlad Ang unang mas marami o hindi gaanong malaking script na isinulat ko (bago iyon ay may mga teksto na hindi hihigit sa isang daang linya) ang naging sanhi ng pag-crash ng makina. Sa isang tiyak na kumbinasyon ng mga parameter at chain ng tawag, inilipat ang kontrol sa isang hindi kilalang lugar sa code, at nag-crash ang application. Kinailangan naming halos ganap na muling isulat ang pagpapatupad ng call stack at exception handling. Ito ay isang hamon sa estilo ng “Oh, ikaw talaga! Sige, aayusin na kita!" Ang sigasig ng labanan ay nagpapahintulot sa amin na muling isulat ang mga kinakailangang module sa isang araw at, bilang karagdagan dito, tukuyin ang ilang higit pang mga bug. Ang code ay nagsimulang tumakbo nang matatag. Naglabas ako ng bagong release. Kasabay nito, dahil nagtatrabaho ako ngayon sa Continuous Integration, napagtanto ko na ang proyekto ay nangangailangan din ng build server at automation ng mga release. Bilang karagdagan, ang proyekto ay sinamahan ng , na kilala sa mga 1C nicks bilang isang luminary at 1C testing guru. Ginawa niya akong toolkit para sa pagsubok ng makina batay sa kanyang xUnitFor1C framework. Ito ay kung paano ako nakakuha ng mga pagsusulit sa pagtanggap sa pag-uugali, na nakasulat din sa 1C na wika. Nag-install ako ng TeamCity sa aking home server at nag-set up ng gabi-gabing build na may mga pagsubok na tumatakbo. Sa daan, napuno ako ng sigasig - ang proyekto ay buhay at nakakakuha ng mga bagong kontribyutor. Ito ay ligaw na nagbibigay-inspirasyon.

Sa loob lamang ng tatlo o apat na buwan, sa wakas ay nakuha ng class library ng engine ang lahat ng kailangan para sa karamihan ng mga gawain sa pag-script: lumitaw ang mga function ng network, nagtatrabaho sa mga archive, XML, atbp. Ang aming proyekto sa CI para sa 1C ay matagumpay na nailunsad.

Sa parehong oras, salamat muli, nagsimulang dumating sa proyekto ang mga bagong interesadong user. Humiling sila ng mga feature, nakakita ng mga bug, at humiling ng mga bagong release.
Ang daloy ng mga tampok, ang paglalaan ng code ng library, kasama ang pangangailangan para sa isang simpleng iskedyul ng paglabas, ay humantong sa akin sa isang kawili-wiling bagay tulad ng problema sa paglago. Ngunit higit pa tungkol sa kanya mamaya.

Noong Nobyembre 2014, naimbitahan akong magsalita sa prestihiyosong 1C conference Infostart Event sa St. Petersburg. Siyempre, pumayag ako, at kinuha ang 1Script bilang paksa ng aking talumpati. Ang paksa ay naaprubahan, na para sa akin, una, ang katotohanan na ang proyekto ay medyo sikat (i.e. ang mga tagapakinig ay malamang na darating, dahil kahit papaano ay narinig nila ang tungkol dito), at pangalawa, umaasa akong makaakit ng mga tagapag-ambag , dahil mayroong halos wala nang sapat na oras para i-develop ang makina.
Lalo na para sa kumperensya, gumawa pa ako ng isang espesyal na kasiyahan - CGI mode, kung saan ang mga script ay maaaring patakbuhin sa ilalim ng kontrol ng isang HTTP server at makabuo ng HTTP na output. Ang mga website sa 1C na wika ay hindi na isang bangungot ng host, ngunit isang malupit na katotohanan (biro lang).
Ang talumpati sa Infostart ay maaaring ituring na unang pampublikong anunsyo, kung saan ang 1Script ay hindi na mapapahiya na tawaging isang produkto, isang tool na may kakayahang lutasin ang mga partikular na problema. Ito ay hindi na isang eksperimento, ngunit isang produktong militar. Bagama't nasa beta status pa.

Ang problema ng paglago o ang mga pitfalls ng suporta sa proyekto. Lumalabas, ang pagkakaroon ng hinahangad na proyekto sa iyong pamamahala, kahit na maliit, ay nagdadala ng isang malaking pasanin ng mga gastos sa overhead. Para sa mga panimula, isa itong feature stream. Ang mga kagustuhan ay dumarating nang mas madalas kaysa sa mga pangako na nagpapatupad ng mga kagustuhang iyon. Kinakailangang mahigpit na isaalang-alang ang mga bersyon kung saan naitama ang ilang mga error. Kailangan mong ipaalam sa anumang paraan ang mga user na may naayos na bug sa bersyon X o may lumitaw na bagong feature. Ang paglago ng functionality ay nangangailangan ng dokumentasyon, at ang dokumentasyon ay malamang na maging luma na.
Buweno, ang nakakatawang bagay ay ang teknikal na imprastraktura ng "suporta" mismo ay kinakailangan. Kinakailangan ang isang website, isang documentation generator, isang build/deployment server, atbp., atbp.. Kinakailangan ang mga pamumuhunan sa pananalapi sa imprastraktura - minimal, ngunit pamumuhunan pa rin.
Sa pagsisimula ng proyekto ng pananaliksik, hindi ko naisip ang napakaraming isyu sa organisasyon at teknikal na kailangan kong harapin habang lumalaki ang proyekto. Ang paglipat sa git-flow methodology ay nakatulong nang malaki sa bagay na ito; naging mas madaling malaman ito sa iyong sarili at makipag-usap sa mga gumagamit sa paksa ng mga bersyon at sangay. Karanasan sa crowdfunding (isang kakila-kilabot na salita) Sa simula ng taong ito, ako sinubukan kong magsagawa ng eksperimento - nag-organisa ako ng koleksyon ng mga donasyon para sa imprastraktura - isang domain name at hosting. Nagtataka ako kung magkano ang maaaring bayaran ng proyekto para sa sarili nitong pag-iral. Ang resulta ay ang mga taong hindi ko kilala ay talagang nagpadala sa akin ng mga 100-500 rubles. na sapat na para magbayad para sa isang domain name sa .io zone. Pagkatapos, nabawasan ang kampanya at huminto ang daloy ng pondo. Ang usapin ay hindi umabot ng buong bayad, bagama't may natanggap na tulong pinansyal.
Ang pinakamahalagang bagay ay ang thesis tungkol sa pagiging epektibo ng modelo ng donasyon tulad nito ay nasubok sa situ. Konklusyon - sa aking kaso, ang donasyon ay halos hindi matatawag na epektibo, bagama't ito ay hindi zero. Library ng mga kapaki-pakinabang na script Pagkatapos ng isang taon at kalahati ng coding sa 1Script, lumitaw ang mga bloke ng library na maaari mong gamitin ang iyong sarili at magrekomenda sa iba. Naturally, ang isang bilang ng mga pagpapaunlad na angkop para sa muling paggamit ay naipon sa aking pagtatapon.
Ito ay humantong sa katotohanan na ang kakayahang kumonekta sa "mga pakete" ng third-party, na nakasulat din sa 1Script, ay idinagdag sa makina. Ang resulta ay isa pang proyekto na tinatawag na oscript-library. (https://github.com/EvilBeaver/oscript-library) Ang library na ito, siyempre, ay nangangailangan din ng imprastraktura, dokumentasyon, mga update sa end-user, at higit pa. Ngunit ang daloy ng mga kontribusyon mula sa mga empleyado ng 1C ay tumaas nang malaki. Pagkatapos ng lahat, ang mga pakete ay binuo sa isang pamilyar na wika, na nangangahulugang maaari silang agad na magdala ng mga benepisyo, i-port ang mga kasalukuyang pag-unlad, atbp. Ang komunidad ng "mga manunulat ng script ng 1C" ay nagsimulang lumago, na lubos na pinadali ng pangalawang ulat sa Infostart Event noong 2015. Ano ang hitsura Ang isang espesyal na preprocessor na direktiba ay ginagamit para sa pag-import #Gamitin Wala ito sa orihinal na 1C platform, ngunit para mas mapadali ang pag-import ng mga aklatan, kinailangan naming lumayo sa canonical syntax at humiram ng solusyon mula sa iba pang ecosystem.
#Use json // ang klase ng JSON Reader ay idineklara sa library at magagamit ito salamat sa direktiba na #Use Reader Object = New JSON Reader(); // sumusunod ang ilang code // ...
Isang partikular na solusyon ang binuo ng isang pangkat ng mga may-akda, pinag-isipang mabuti ang mga sitwasyon ng aplikasyon, mga pitfall, atbp. Ginamit ang Google Docs bilang tool para sa brainstorming. Package manager Upang pamahalaan ang mga package, isang simpleng manager ng package ang nakasulat sa tuhod, na tinatawag na OPM (OneScript Package Manager). Ito ay nakasulat din sa 1Script at isang console-based na package management utility. Sa ngayon, muli naming pinag-iisipan ang imprastraktura ng package at gumagawa ng isang production-ready na bersyon ng opm. Project today Sa ngayon, ang 1Script ay isang stable na automation tool para sa mga empleyado ng 1C, na matagumpay na ginagamit sa dose-dosenang kumpanya. Bilang karagdagan, ang OneScript ay isa nang uri ng tatak, ang pangalan na ito ay kilala sa komunidad, ang tool ay aktibong ginagamit, isinulat tungkol sa, itinanong, tinalakay at, kung ano ang lalong kaaya-aya, pinahusay.
Bilang karagdagan, ang isang library ng mga magagamit muli na pakete ng code ay halos mahalagang bahagi ng proyekto. Ito ay maliit, ngunit sumasaklaw sa isang makabuluhang bahagi ng mga gawaing nalutas araw-araw sa pamamagitan ng isang tipikal na 1C na palayaw.
Ito ay hindi na isang "1C interpreter" lamang. Ang komunidad ay lumikha ng isang ecosystem ng mga kapaki-pakinabang at in-demand na tool.
Para sa akin, ito ay isang kakaibang karanasan; Nakatanggap ako ng mga salita (at mga gawa) ng suporta mula sa dose-dosenang mga estranghero (at pamilyar na ngayon) sa akin. Ang programa na sinimulan ko para lang "subukan ito" ay naging isang gumaganang proyekto na ginagamit sa mga tunay na misyon ng labanan. Bilang karagdagan, nakakuha ako ng malawak na karanasan sa pamamahala ng naturang open-source na proyekto - suporta, pagpapanatili, imprastraktura, atbp...
Buweno, at higit sa lahat, nasiyahan ka sa paggawa ng isang bagay na kinakailangan. Ang plano naming gawin sa susunod Ang aktibong paggamit ng library ng package ay nagsiwalat ng ilang mga pagkukulang at abala. Plano naming gumawa ng mga pagsasaayos sa imprastraktura ng package at palawakin ang functionality ng manager ng package. Plano rin naming palawakin ang hanay ng mga aklatan; halimbawa, kasalukuyan kaming gumagawa ng isang wrapper para sa Docker API. Pinamamahalaan namin ang mga container ng Docker gamit ang mga 1C na script at ang mga pagpapaunlad sa paksang ito ay malamang na mai-publish din kapag natapos na ang mga ito. Ang resulta ay isang pinasimpleng DSL para sa pagmamanipula ng lalagyan mula sa 1script. Teknikal na Buod
  • Programming language - C#, .NET v4.0/Mono 3.1x
  • Development environment - VS 2013-2015
  • Pangalan ng interpreter - oscript.exe (tumakbo para sa pagpapatupad - oscript)
  • Extension ng file ng script - .os
  • Extension ng file ng package - .ospx
  • Ang pagganap ng code ay nasa karamihan ng mga sukat hanggang 4 na beses na mas mabilis kaysa sa orihinal na 1C platform. Hindi bababa sa hindi mas mabagal kaysa sa kanya.
  • Imbakan ng makina - github.com/EvilBeaver/OneScript
  • Imbakan ng aklatan - github.com/oscript-library
Hindi ko sinusulat ang website ng proyekto, una, para hindi parang PR, at pangalawa, hindi nito kayang tiisin ang epekto ng habra. Kung mayroon kang sariling proyekto na gusto mong ipaliwanag, hayaan mo akong bigyan ka ng ilang tip batay sa personal na karanasan.
  • Go for it! Kung itinatago mo ang iyong proyekto sa iyong mesa at hindi sasabihin sa sinuman ang tungkol dito, walang makakaalam nito. Magsimula sa artikulo sa Habr. Ang isang artikulo ay hindi sapat. Banggitin ang iyong proyekto sa mga forum na nakatuon sa paksa ng iyong proyekto, magbigay ng mga halimbawa ng matagumpay na aplikasyon.
  • Maging handa sa katotohanang maraming mungkahi mula sa mga tao, ngunit mas kaunti ang aktwal na mga pangako. Ang diskarte sa estilo ng "Ito ay open-source, kailangan mo ito, magagawa mo ito," sa kasamaang-palad, ay hindi gagana.
  • Mag-isip nang maaga tungkol sa solusyon sa "problema sa paglago." Ang paglago, bilang panuntunan, ay sumasabog at medyo mahirap na makayanan ang isang matinding pagtaas ng pool ng mga gawain.
Magdagdag ng mga tag sa Background

Sa panahon ng pagpapatupad ng isang proyekto, lumitaw ang pangangailangan na magsagawa ng javascript (mula rito ay tinutukoy bilang JS) na code sa ilalim ng kontrol ng object ng HTMLDocument Field, na nakuha ang resulta sa 1C. Ang mga halimbawang ibinigay sa mga artikulong natagpuan ay tila hindi masyadong maginhawang gamitin (puro personal na opinyon). Napagpasyahan na subukang maghanap ng isa pa, mas simpleng solusyon; hindi hihigit sa 1 araw ang inilaan para sa paghahanap.

DIV.setAttribute("onclick", "alert("Coordinates");");

Patakbuhin natin ang script

DIV.click();

TA-DAH. lahat ay gumagana

Pamamaraan RunScript(TextScript) DIV = Elements.doc.Document.getElementById("TEST"); DIV.setAttribute("onclick", TextScript); DIV.click(); Katapusan ng Pamamaraan

Update mula 02.08.2016

Sa mga komento, iminungkahi ang isa pang paraan upang tumawag sa JS (salamat), kung mayroon kang kakayahang baguhin ang code ng HTML na dokumento, maaari kang magsulat ng isang function dito at pagkatapos ay tawagan ito. pagpasa ng JS code dito.

function exec(script) ( eval(script); )

at pagkatapos ay sa 1C:

Elements.HTMLDocumentField1.Document.parentWindow.exec("alert("OK")");

Ibinabalik ang resulta ng JS sa 1C

Upang ilipat ang resulta ng script sa 1C mula sa HTMLDocument Field object, gagamit kami ng isang kaganapan. Itali natin ang On Click na kaganapan sa HTMLDocument Field, na tumatanggap ng 3 input parameter:

  • Ang elemento kung saan nangyari ang kaganapan (ang HTMLDocument Field mismo)
  • Kaganapan ng bagay
  • Tanda ng katuparan ng karaniwang pag-uugali
  • Upang ma-trigger ang isang kaganapan kapag na-click kailangan mong patakbuhin ang sumusunod na js code

    Var evt = document.createEventObject(); // create an empty event object evt.propertyName = "function1"; // Iminumungkahi kong ilagay ang pangalan ng resulta (tulad ng isang uri, o ang pangalan ng function kung saan natanggap ang data) sa propertyName attribute evt.data = "156"; //ilipat namin ang data ng resulta sa data attribute document.body.fireEvent("onclick", evt); // magpagana ng kaganapan kapag na-click ang HTMLDocument Field

    Sa pamamagitan ng pag-execute ng js code na ito sa procedure, kapag na-click mo ang pangalawang parameter, darating ang event object na ginawa namin. Na medyo maginhawang pangasiwaan.

    Isang halimbawa ng pag-parse ng sagot.

    &OnClient // makuha ang pangalan at resulta ng kaganapan Pamamaraan DocWhenClicked(Element, EventData, StandardProcessing)OperationName = EventData.Event.propertyName; Data ng Operasyon = Data ng Kaganapan.Event.data; Kung ang OperationName = "" Kung gayon // hindi ang aming event Return; tapusin kung; If OperationName = "Function1" Then // processing result ElseIf OperationName = "function2" Then // processing result //...... EndIf; Katapusan ng Pamamaraan

    Ang pamamaraang ito ay nag-aalis ng pangangailangan para sa mga tagapangasiwa ng paghihintay, at nagbibigay ng isang madaling pagkakakilanlan ng kaganapan. Batay sa identifier, alam namin kung anong data ang aming natanggap at kung paano ito i-parse.

    Mga karagdagan mula 03/26/2016

    At sa lugar na ito, masyadong, ang ilang mga hindi pagkakaunawaan ay naganap (ang error ay muling ginawa sa 8.3.5.1570 platform, ngunit upang maiwasan ang mga sitwasyong ito sa hinaharap, magbibigay ako ng solusyon) Ang dahilan mismo ay kapag ang form ay muling- inilunsad kasama ang HTML field ng dokumento sa oras ng pagtawag sa procedure kapag nag-click sa HTML field, ang platform call ang buong COM object ay natigil at nag-crash (Naganap ang isang exception (htmlfile): Unspecified error). Ang solusyon ay upang huwag paganahin ang karaniwang pagpapatupad ng kaganapan ng pag-click at huwag paganahin ang pop-up mode ng kaganapan. Paano ito gawin, tingnan sa ibaba.

    // huwag paganahin ang pagbubula ng kaganapan

    Evt.cancelBubble = totoo;

    // huwag paganahin ang karaniwang pag-uugali

    Evt.returnValue = false;

    Bilang resulta, makakakuha tayo ng function na maglipat ng data sa 1c mula sa JS.

    Function return1c(pangalan,data)( var evt = document.createEventObject(); evt.propertyName = pangalan; evt.data = data; evt.cancelBubble = true; evt.returnValue = false; document.fireEvent("onclick",evt ); );

    Konklusyon.

    Sa pamamagitan ng pagsasama-sama ng mga pamamaraang ito, madali mong mapapatakbo ang js code na kailangan mo at makatanggap ng data sa 1C para sa karagdagang pagproseso.

    Halimbawa ng pagpapatupad sa

    Operator : "Hello! Ang pangalan ko ay Maria, ang kumpanyang "Windows-to-all-the-world."

    Kliyente : "Wala akong kailangan"

    Operator : "Ngunit mayroon kaming mas mahusay na mga kondisyon at..."

    Kliyente (naputol):"Maria, paalam!"

    Operator (mga daldal):"Nagtatrabaho kami sa merkado ng 2003 at sa panahong ito..."

    Kliyente (binaba ang tawag):...

    Dinial ni Maria ang susunod na numero.

    Isang boring na kwentong pamilyar sa lahat. Pagkatapos ng gayong pag-uusap, maiiwan ang kliyente ng negatibong aftertaste, at ang Windows to All the Lights ay karaniwang nawalan ng mahalagang kontak. Bagaman, matatanggap ng operator na si Maria ang kanyang suweldo sa katapusan ng buwan, kaya hindi lahat ay talunan sa sitwasyong ito.

    Ang pinaka-nakakasakit na bagay sa sitwasyong ito ay talagang sinubukan ni Maria, taos-puso niyang iniisip na "hindi lang ito kailangan ng mga kliyente - kaya hindi nila ito tinatanggap" at sa pangkalahatan "paano ko siya mapipilit na huwag ibaba ang tawag?" Walang pakialam si Maria kung ano ang itinuturing ng isang tao na KPI - bibigyan ka pa rin nila ng suweldo. Sa pagtatapos ng buwan, pag-aaralan ng manager na si Alexey ang 1001 na pag-record ng pag-uusap ng kanyang mga operator (ito ay tumatagal ng hindi bababa sa 2-3 araw bawat buwan), pagalitan ang kanyang mga ward - bilang tugon ay bibigyan siya ng mga dahilan na "muli ang call base hindi tinarget...”. Si Alexey ay magbubuntong-hininga sa kalungkutan at mamamahagi ng suweldo sa lahat. Magsisimula ang susunod na buwan.

    Ang koponan ay palakaibigan, maraming trabaho ang nagawa, ngunit hindi ito maaaring magpatuloy. (Kasama) Ano ang masama sa kasong ito (ngunit maaaring malutas sa kaunting pagsisikap): Diskarte ng mga operator sa trabaho
  • Automatic silang tumatawag. Ngunit kung walang malinaw na layunin, mahirap bumuo ng isang mahusay na diyalogo;
  • Hindi nila alam kung paano tutugon sa pagtutol ng isang kliyente o tumugon nang hindi matagumpay;
  • Nagbabaan sila sa sandaling magsimula silang mag-alinlangan sa tagumpay ng pag-uusap;
  • Sigurado ako na makakatanggap siya ng suweldo para sa proseso - kaya ginagawa niya ang lahat nang maluwag, na may mga pahinga para sa pahinga, nang walang kinakailangang pagganyak;
  • Binabalewala ng lahat ang umiiral na mga panuntunan para sa pagtawag sa mga kliyente at nagrereklamo tungkol sa pagiging kumplikado at dami ng mga tagubilin;
  • Ang posisyon ng manager
    Ang lahat ng isyung ito ay naresolba sa subsystem na “Ayusin ang isang tawag!”.

    (maaari itong "i-embed" sa iyong 1C, o gamitin nang hiwalay).

    "Tumawag ka!" maaaring:
    • Lumikha ng mga script - mga module ng pagsasalita para sa mga operator
    • Magtalaga ng availability ng script sa iba't ibang grupo at sangay
    • Kolektahin ang mga istatistika sa paggamit ng mga bloke ng script, pagkamit ng mga layunin at pagkabigo, sukatin ang conversion
    • Mag-load ng database ng tawag mula sa Excel o gumamit ng mga numero ng customer na tinawag na dati
    • Ipakita ang stats board para sa mga operator
    • Lumikha ng mga order, mga paghahabol sa panahon ng pagpasa ng script, punan ang anumang mga bagay sa iyong database.
    • Limitahan ang walang pinipiling pag-click sa mga pahayag ng script
    • Makipagtulungan sa SIP telephony
    • Magtrabaho gamit ang email
    • I-convert ang mga mensaheng email, mga kahilingan sa website sa mga lead at pangangailangan ng customer sa pamamagitan ng paglo-load sa mga ito sa system
    • Pamahalaan ang mga kliyente, lead at deal
    "Tumawag ka!" nagbibigay-daan sa iyo na bumuo ng isang closed cycle ng mga pakikipag-ugnayan sa kliyente.

    Ang mga yugto ng naturang gawain ay na-customize sa iyong panlasa. Halimbawa, tulad nito:

    Opsyon #1

  • Nakatanggap ang system ng bagong potensyal na kliyente
  • Tumawag ang operator gamit ang algorithm at nilinaw ang pangangailangan para sa serbisyo
  • Ang target na contact ay inilipat sa departamento ng pagbebenta
  • Ang manager ay nagtatayo ng mga relasyon sa kliyente
  • Gumawa ng deal ang manager
  • Opsyon Blg. 2

    O tulad nito:

  • Tumatanggap ang operator ng papasok na tawag
  • Kapag tumawag ka, ang isang script para sa pagtukoy ng mga pangangailangan ng kliyente ay inilunsad, at ang kinakailangang kumpanya ay tinutukoy
  • Sa panahon ng proseso ng trabaho, inilalagay ng operator ang order ng customer at tinutukoy ang petsa ng paghahatid
  • Ang order ay inilipat sa procurement department para sa pagpupulong
  • Opsyon #3

    O isa pang pagpipilian:

  • Ang isang bagong aplikasyon ay naisumite sa site, ang site ay nagre-redirect ng sulat sa database para sa application na ito
  • Pina-parse ng database ang liham, kinukuha mula dito ang data ng katapat, ang teksto ng mensahe, lumilikha ng pangangailangan at isang gawain
  • Kinukuha ng libreng operator ang gawain, tinawag ang kliyente, nalulutas ang problema
  • Kung nagustuhan ng kliyente ang lahat, maaaring gumawa ng order o ililipat ang kliyente sa mga tagapamahala
  • Opsyon Blg. 4

    Bumuo ng anumang pagpipilian na gusto mo!

    Ang manager ay tumatanggap ng mga ulat sa katapusan ng buwan:

  • Ayon sa pinalawig na istatistika ng mga pangangailangan ng customer - ilan ang naroon, ilan ang kwalipikado, ilan ang tinanggihan - para sa anumang katayuan
  • Sa pagpapatakbo ng mga script ng pag-uusap at mga operator
  • Tungkol sa mga contact sa mga kliyente - kung ano ang napag-usapan, kung gaano karaming beses. Ilang tao ang tumawag, ilang sulat ang isinulat nila.
  • Paano ito gumagana

    Sa "Tumawag!" mga built-in na subsystem (naki-click):

    Mga script

    Sa pamamagitan ng mga script, ang ibig naming sabihin ay ilang nauugnay na pagkilos ayon sa algorithm. Halimbawa,

  • Papalabas na tawag - upang magbenta ng produkto o serbisyo, mag-imbita sa isang promosyon, punan ang isang form
  • Papasok na tawag - upang maiproseso nang tama ang order, huwag kalimutan ang tungkol sa diskwento at paghahatid
  • Pagpuno ng isang dokumento - isang karaniwang form sa anyo ng isang katulong
  • Paano gamitin
    • Lumikha ng mga pattern ng pag-uusap ng operator sa constructor
    • Ganap na nako-customize - ipakita ang anumang mga field para sa pagpuno sa script ng tawag (data ng questionnaire, pagpasok ng order, atbp.)
    • Magbigay ng mga link sa panloob na mga artikulo sa base ng kaalaman upang masagot ng mga operator ang anumang teknikal na tanong
    • Lumikha ng mga order sa panahon ng script ng tawag, mangolekta ng mga reklamo, magpadala ng mga sulat at baguhin ang katayuan ng mga potensyal na kliyente
    • Bigyan ang mga star manager ng higit na kalayaan sa script ng tawag. Ang mga naturang empleyado ay hindi gusto ang mga paghihigpit, ang kanilang pagganap ay mas mataas kapag ang pag-uusap ay hindi 100% napipigilan - lumikha ng script ng pag-uusap para sa mga naturang tagapamahala, na gagamitin bilang isang prompt ng questionnaire, at ang paglipat sa pagitan ng mga bloke ay magiging libre. Makakatanggap ka ng mga istatistika sa mga bituin na ito, at hindi sila makaramdam ng "naipit" ng script ng pag-uusap
    • Suriin ang gawain ng mga operator gamit ang mga senaryo ng tawag at itala ang mga resulta ng pagsubok sa isang espesyal na dokumento
    • Alisin ang mga crappy na tawag gamit ang mapagkumpitensyang mga setting ng pagpapatupad ng script
    • Magpadala ng mga liham na may isang komersyal na alok sa panahon ng script ng tawag, lumikha ng mga reklamo mula sa mga hindi nasisiyahang customer sa proseso

    Ang mga script ay ang pangunahing subsystem ng “Tumawag!” Nasa ibaba ang kaunting detalye tungkol sa mga setting nito gamit ang isang halimbawa

    Halimbawa

    Halimbawa, maaaring may gawain para sa mga operator na tulad nito: "Kailangan naming tumawag ng isang listahan ng mga numero, alisin ang mga hindi target na contact, at maglipat ng mga lead sa mga manager." Upang gawin ito, gagawa kami ng isang script sa system, mag-load ng mga potensyal na transaksyon mula sa xls, ang mga operator ay dadaan sa mga transaksyon ayon sa script, ang mga hindi target ay aalisin, at ang mga naka-target ay ililipat sa mga tagapamahala para sa trabaho. Una, gumawa tayo ng script.

    Gumawa ng bagong "Script"

  • Lumilikha kami ng isang flowchart ng script na ito - kung ano ang sasabihin ng operator, anong mga halaga ang pipiliin at kung ano ang susunod na iaalok sa kanya ng system
  • Nagtakda kami ng mga karagdagang field ng script - halimbawa, ang buong pangalan at kumpanya ng kliyente ay dapat makita sa bawat script block
  • Ipinapahiwatig namin ang mabilis na paglipat mula sa bawat bloke. Sa bawat bloke, ang mga pindutan para sa mabilis na paglipat ay ipapakita (ang operator ay maaaring tanungin anumang oras "Anong uri ng kumpanya ka?" - sa kasong ito, ang operator ay nag-click sa mabilis na paglipat, binabasa ang bloke ng teksto tungkol sa kumpanya at bumalik sa nakaraang bloke)
  • I-configure namin ang script - mai-log ba ang script, makikita ba ang diagram, kinakailangan bang gumamit ng SIP, anong mga gawain ang kailangang gawin sa panahon ng script, atbp.
  • Nagtatalaga kami ng mga karapatan sa pag-access dito - sino ang makakakita sa script na ito, gumawa ng bagong tawag gamit ito, atbp.
  • Sa script block diagram, ipinapahiwatig namin kung ano ang dapat sabihin ng operator, anong mga opsyon sa pagtugon ang mayroon ang kliyente, at kung anong mga field ang dapat punan ng operator sa yugtong ito.

  • Teksto ng talumpati ng operator. Maaari kang magpasok ng mga karagdagang detalye mula sa mga nakaraang script block o karaniwang mga field. Maaari mong i-format ang teksto
  • Ang mga parameter ng teksto ay nakatakda dito - ang screenshot ay nagpapakita na ang [Pangalan] ay pupunan mula sa pangalan ng kumpanya
  • Tinatanong namin kung ang layunin ay nakamit, kung naabot na namin ang bloke na ito, kung saang yugto nabibilang ang bloke ("pagtatatag ng pakikipag-ugnayan", "pag-abot sa sekretarya", atbp.) at kung ano ang resulta na aming nakamit kung naabot namin ito harangan
  • Maaaring may karagdagang semantic load ang script block:

    • Maaari mong ilagay ang anumang mga patlang dito. Halimbawa, dapat piliin ng operator kung paano ihahatid ang mga kalakal sa kliyente - pick-up, courier sa loob ng lungsod o intercity. Hanggang sa mapunan ng operator ang field na ito, hindi na magpapatuloy ang script. Buweno, sa diagram maaari mong ipahiwatig na kung pinunan mo ang intercity, kailangan mong ipakita ang isang bloke, kung sa pamamagitan ng courier, pagkatapos ay isa pa.
    • Ang ginawang mga detalye ng block ay maaaring punan ng isang bagay. Halimbawa, sa unang bloke ng script sinabihan kami ng pangalan ng direktor, at sa huling bloke makukuha namin ang impormasyong ito at ipakita ito sa isang form para sa operator.
    • Kapag lumipat pa mula sa block, maaari kang magsagawa ng ilang mga aksyon. Halimbawa, kung sinabi ng kliyente na hindi siya interesado sa amin at walang punto sa "pag-aaway," pagkatapos ay itatakda namin ang pangangailangan sa katayuang "Non-target". Kung naabot na namin ang dulo ng script at handa nang ilipat ang kliyente sa susunod na departamento, itatakda namin ang status ng kumpanya sa "Lead" sa halip na "Bago". Maaari mong baguhin ang anumang mga patlang, hindi lamang ang mga nakalista sa itaas
    • Para sa block, maaari kang magtakda ng mga pagpipilian sa pagtugon ng customer - "Oo", "Hindi", "Tumawag muli sa ibang pagkakataon", "Mayroon kaming tender", "Hindi interesado", atbp. Depende sa mga opsyon, maaari mong sangay ang script diagram
    • Habang tumatakbo ang script block, maaari kang lumikha ng ilang iba pang elemento. Halimbawa, pumayag ang kliyente na ibigay ang kanyang email address - pagkatapos ay padadalhan namin siya kaagad ng sulat mula sa CP. Ipapahiwatig lang namin na ang isang liham ay dapat gawin, punan ayon sa template, at ipadala sa address ng kliyente.

    Nagtatapos kami sa isang bagay tulad nito:

    Para sa operator, ang anyo ng pagpoproseso ng script ay ipapakita sa anyo ng tao ng isang "katulong". Halimbawa, maaaring ganito ang hitsura ng isa sa mga bloke ng diagram:

  • Ang text na isinulat namin sa operator
  • Mga detalye na kailangan niyang punan sa hakbang na ito
  • Nagbigay ng mga opsyon sa pagtugon ng kliyente
  • Ang layunin at layunin ng script
  • Mga paglipat sa iba pang mga bloke na magagamit sa bawat bloke
  • Mga Common Script Fields
  • Log ng mga napiling sagot
  • Matapos malikha ang script scheme, ang operator ay maaari nang magsimulang tumawag - sa lugar ng trabaho ng operator (kung ang script ay may karapatang lumikha), maaari kang mag-click sa pindutang "Lumikha", piliin ang nais na script at, halimbawa, kunin ang susunod na numero ng telepono mula sa xls table, gawin ito:

    Sa yugtong ito, ang mga operator ay maaari nang gumana ayon sa script, ngunit mayroong abala sa pagkuha ng mga contact mula sa talahanayan - ito ay humahantong sa isang serye ng mga tipikal na error.

    Mag-load ng mga contact mula sa isang Excel spreadsheet para sa pangkalahatang pagtawag

    Mag-a-upload kami hindi lamang ng mga kumpanya na may kanilang impormasyon sa pakikipag-ugnayan, ngunit "mga potensyal na deal" (aka "Mga Lead") na may status na "Kwalipikasyon". I-set up natin ang script para baguhin nito ang status ng mga lead habang nagpapatuloy - mula "Tumanggi" patungong "Naka-iskedyul ang pulong." Kaya, titingnan natin ang funnel para sa call base na ito.

    Gumawa tayo ng setting ng paglo-load ng data:

  • Ang file kung saan kami kumukuha ng data
  • Ang data mismo na ilo-load sa database
  • Paano eksaktong mai-load ang data
  • Sa mga setting, maaari mong tukuyin ang pagpuno sa anumang mga detalye ng mga nilikhang bagay. Gagawa kami ng isang potensyal na transaksyon mula sa kumpanya sa katayuan na "Kwalipikasyon" at "pagpapatupad ng script" - isang bagay na handa para sa operator na magtrabaho gamit ang isang script, pupunan namin ang proyekto upang pagkatapos ay i-filter ang mga resulta ng mga tawag gamit ang ang database na ito:

    Hindi namin pinupunan ang operator upang makita ng lahat ang mga nilikhang elemento at dalhin sila sa trabaho. Ang mga nilikhang script ay magiging available sa pamamagitan ng lugar ng trabaho ng operator:

    Ang mga operator ay nag-click sa pindutang "Susunod" - pipiliin ng system ang susunod na script sa pagkakasunud-sunod at sinimulan ang pagproseso para dito. kaya:

    • Palaging nasa harapan ng mga operator ang "napapanahong impormasyon" - walang mga duplicate na tawag
    • Ang mga kliyenteng humiling na tumawag muli pagkatapos ng ilang oras ay naka-pause - ang mga naturang script ay ipinapakita sa parehong window na may petsa ng susunod na contact.
    • Nakikita ng mga operator ang mga istatistika ng kanilang mga kasamahan sa mga tawag, sa gayon ay nag-uudyok sa kanilang sarili na magtrabaho:

    Mas detalyadong nakikita ng mga operator ang kanilang mga istatistika:

    Buweno, kung ang mga operator ay tuso, abandunahin ang mga kumplikadong tawag nang maaga, o subukang "magreserba" ng maraming mga script hangga't maaari, pagkatapos ay maaari mong limitahan ang pagpapalabas ng mga script gamit ang mga panuntunan sa kompetisyon. Maaari mong itakda ang mga sumusunod na paghihigpit:

    • Hindi hihigit sa X script sa Y minuto
    • Pagkatapos isagawa ang script, maghintay ng X minuto
    • Maaari kang mag-iwan ng hindi hihigit sa X script na naghihintay

    Sa yugtong ito, magkakaroon tayo ng mahusay na binuong database ng mga lead - ang mga hindi pangunahing ay inalis, at ang mga nauugnay ay nabigyan ng naaangkop na katayuan. Tapos na ang trabaho ng mga operator dito, ngayon ay kasali na ang mga sales manager.

    Pag-uugnay sa mga tagapamahala sa proseso.

    Ang pinuno ng departamento ng pagbebenta ay pumupunta sa direktoryo ng mga kumpanya, pinipili lamang ang mga kwalipikadong tumawag at humirang ng mga responsableng tagapamahala sa mga transaksyon:

    Ipinasok ng tagapamahala ang pangangailangan para sa kliyenteng itinalaga sa kanya at nagsimulang magtrabaho ayon sa pangangailangan ng kliyente. Ang lahat ng mga pakikipag-ugnayan ay naitala sa need card:

    Pagsusuri ng mga resulta

    Nakikita ng manager ang parehong mga istatistika ng bawat operator at ang conversion ng bawat script:

    Batay sa status ng mga naprosesong pangangailangan, maaari kang bumuo ng funnel:

    Batayan ng kaalaman

    Maaari kang mag-post ng mga artikulo na nahahati sa mga kategorya sa base ng kaalaman. Ang bawat kategorya ay maaaring matingnan at malikha ng mga indibidwal na gumagamit. Ang link sa artikulo ay maaaring ilagay sa tagapangasiwa ng script.

    Paano gamitin
    • Lumikha ng mga materyales tungkol sa iyong mga produkto at maglagay ng mga link sa kanila sa script ng pag-uusap - pagkatapos ay masasagot ng iyong mga operator ang mga teknikal na tanong mula sa mga customer
    • Ilagay ang mga paglalarawan ng paggamit ng script ng pag-uusap sa mga artikulo at ibigay ang mga ito sa mga bagong empleyado para sa pagsusuri.
    CRM

    Isang maliit na sistema para sa pakikipagtulungan sa mga relasyon sa customer. May kasamang direktoryo ng mga kumpanya (naglalaman ito ng link sa katapat, kung kailangang i-load ang "Ayusin ang isang tawag!" sa isang gumaganang configuration), mga contact ng mga kumpanyang ito at mga potensyal na transaksyon. Ang mga tagapamahala ay nagtatrabaho sa mga potensyal na transaksyon ng mga katapat, pinoproseso ang mga ito ayon sa iba't ibang katayuan. Batay sa mga nakumpletong transaksyon, nalikha ang mga benta at kinokontrol ang mga pagbabayad. Sa katapusan ng buwan, sinusuri ng manager kung gaano karaming mga contact ang ginawa, anong bayad ang dapat bayaran sa mga lead generator, at kung anong mga indicator ang mayroon ang bawat manager.

    Paano gamitin
    • Magsagawa ng mga istatistika at pagsusuri ng mga transaksyon ng customer
    • Isalamin ang lahat ng mga opsyon para sa pakikipagtulungan sa mga kliyente
    • Mag-upload ng mga bagong potensyal na kliyente na tatawagan
    • Pangasiwaan ang "nakalimutan" at "nawala" na mga kliyente
    • Subaybayan ang pagganap ng mga serbisyo

    Ang bawat kumpanya ay maaaring maglaman ng mga natatanging detalye ayon sa uri ng aktibidad:

    Para sa bawat kumpanya (at potensyal na deal), ang kasaysayan ng mga pakikipag-ugnayan ay ipinapakita:

    Ang lahat ng paparating na pakikipag-ugnayan ay ipinapakita sa "Feed", at sinumang manager ay may mabilis na access sa kanila anumang oras. Ang feed ay nagpapakita rin ng mga komentong ipinadala sa iyo - halimbawa, ang isang logistician ay nag-iiwan ng komentong "Kapag kami ay naghatid" sa kahilingan ng isang kliyente, at ang taong responsable sa paghahatid ay nakikita ito sa kanyang feed.

    Maaaring suriin ng isang manager ang gawain ng kanyang mga subordinates sa mga tuntunin ng bilang ng mga contact sa mga kliyente. Sino ang tumawag kung gaano karaming beses, nagsulat ng mga liham, nakipag-usap sa messenger, kung anong mga lead ang ginamit para sa kung anong mga pakikipag-ugnayan.

    Mail client

    Ang subsystem ay hindi lamang nagbibigay ng pagpapadala at pagtanggap ng mail. Mayroong isang bagay bilang isang filter ng mail; nakakatulong ito na matukoy kung ano ang kailangang gawin sa isang partikular na sulat. Halimbawa, mayroon kang form ng feedback sa iyong website, sa sandaling mapunan ito ng user, isang liham na may teksto ng kahilingan ay agad na ipapadala sa iyong email address. I-filter sa "Tumawag!" maaaring i-configure sa ganitong paraan - "kung ang liham ay nagmula sa address [email protected], pagkatapos ay kailangan mong kunin ang buong pangalan at pangangailangan ng kliyente mula sa text ng sulat at lumikha ng bagong potensyal na deal gamit ang data na ito." Kaya, maaari mong tukuyin ang panuntunan kung ang isang sulat ay nasa ilalim ng filter at ang filter na pagkilos para dito sulat.

    Para sa layuning ito nagsisilbi sila:

    • Mga detalye ng liham - karagdagang mga patlang ng liham, halimbawa, "Buong pangalan", "Address ng paghahatid", "Telepono", "Text ng mensahe"
    • Pagpuno ng mga detalye mula sa isang liham - ang mga patakaran kung saan ang system ay "makakuha" ng impormasyon mula sa teksto ng liham sa mga detalye
    • I-filter ang mga aksyon - kung anong mga bagong bagay sa email ang kailangang gawin at kung paano punan ang mga ito
    Paano gamitin:
    • I-set up ang awtomatikong koleksyon ng mga application mula sa website at pagtatalaga ng mga tawag sa mga manager ayon sa script ng pag-uusap para sa mga potensyal na kliyenteng ito
    • I-convert ang mga kahilingan para sa mga produkto (halimbawa, napupunta ang mga ito sa isang partikular na e-mail) sa isang dokumentong "Customer Request", sundin ang dokumento sa mga kinakailangang direksyon
    • Subaybayan ang gawain ng mga tagapamahala kasama ang mga kliyente gamit ang mga mensaheng email nang direkta mula sa database
    Accounting ng dokumento

    Binibigyang-daan kang magtala ng mga dokumento sa system ayon sa kanilang mga uri at limitahan ang mga karapatan sa pag-access sa kanila. Halimbawa, maaari mong gawin ang uri ng dokumento na "Quality Claim" at bigyan lamang ito ng access sa departamento ng "QC". Sa dokumentong ito magkakaroon ka ng ilang bagong detalye, tulad ng "Text ng claim", "Petsa ng aplikasyon", "Resulta" at iba pa. O maaari kang mangolekta ng "Mga kahilingan para sa trabaho" mula sa mga kliyente, mag-attach ng mga file sa kanila at ipasa ang mga ito sa pamamagitan ng mga katayuan (" Hindi nagsimula", "Isinasagawa", "Kalkulado", "Sumasang-ayon", "Tumanggi").

    Paano gamitin
    • Sa pag-set up ng mga filter ng mail, maaari kang lumikha ng mga application at kahilingan para sa mga produkto nang direkta mula sa mga titik ng kliyente
    • Kasabay ng mga script ng pag-uusap, maaari kang bumuo ng mga dokumento nang direkta sa panahon ng script ng tawag (halimbawa, ang kliyente ay hindi nasisiyahan sa kalidad ng mga serbisyo - lumikha kami ng isang "Claim", na pagkatapos ay ipoproseso ng departamento ng QC)

    Mukhang ganito:

  • Mga katayuan ng dokumento
  • Uri ng dokumento na tumutukoy sa pagkakaroon ng mga detalye sa dokumento
  • Mga karagdagang detalye ng dokumento
  • Isang virtual machine na nagpapatupad ng mga script sa 1C:Enterprise na wika.

    Sa madaling salita, ito ang kakayahang magsulat ng mga programa sa 1C na wika nang hindi gumagamit ng 1C:Enterprise platform.

    At ito ay nagpapahintulot sa amin na sa huli ay kumuha ng mga yari na piraso ng code na nakasulat sa configurator at ilipat ang mga ito sa isang OneScript program na may kaunting adaptation.

    At kahit na, ayon sa mga developer, hindi ito ang pangunahing layunin ng proyekto, nakikita ko ang interes sa pagkonekta mula sa isang programa ng OneScript sa 1C database sa pamamagitan ng isang panlabas na koneksyon at pagpapatupad ng ilang kapaki-pakinabang na code.

    Maaari mong itanong - bakit ito kinakailangan? Bakit hindi isulat ang parehong code sa pagproseso at patakbuhin ito sa pamamagitan ng 1c sa karaniwang paraan?

    Ngunit pinag-uusapan natin ang tungkol sa automation at may mga pangunahing problema dito:

    • walang paraan upang magarantiya na ang database ay magsisimula at ang ilang panlabas na processing code ay isasagawa sa loob nito (ang mga nakatagpo nito sa pagsasanay ay alam na napakaraming bagay ang maaaring magkamali, simula sa katotohanan na ang pagproseso ay hindi makukumpleto dahil sa ilang modal window)
    • Walang madaling paraan upang makabuo ng naturang pagproseso sa pamamagitan ng program, ngunit maaaring kailanganin natin ito kung pinag-uusapan natin ang tungkol sa pagpapatupad ng kapaki-pakinabang na code sa isang pangkat ng mga database
    • walang madaling paraan upang mai-log ang pagsasagawa ng pagproseso na ito

    Niresolba ng OneScript ang lahat ng problemang ito.

    Bakit isulat at patakbuhin ang mga script na ito sa updater?

    Dahil ang nag-update ay tumatagal ng maraming mahirap na bagay upang pasimplehin ang pagsulat ng naturang mga script sa mga tuntunin ng pakikipag-ugnayan sa mga database.

    Namely.

    Listahan ng mga database para sa pagproseso

    Sa mismong updater pipiliin namin kung gaano karaming mga database ang kailangan namin upang patakbuhin ang script na isinulat namin:

    Pagpasa ng mga parameter ng database

    Kapag isinagawa ang script, ang nag-update mismo ay ipinapasa dito ang mga kinakailangang parameter na may impormasyon tungkol sa kasalukuyang database:

    Magagamit namin ang lahat ng parameter na ito sa aming script, na ginagawa itong unibersal para sa pagpapatupad sa anumang bilang ng mga napiling database.

    Makakahanap tayo ng mga halimbawa ng naturang mga script sa listahan ng mga template ng updater:

    Paunang pag-archive ng database

    Kung kinakailangan, titiyakin ng updater na ang isang backup na kopya ay nilikha bago isagawa ang script:

    Ang backup na kopya na ito ay magiging pare-pareho sa pangkalahatang sistema ng pag-archive, iyon ay, maaari din itong "i-tono" sa mga karagdagang setting ng updater. Ang ganitong kopya ay palaging mamarkahan "bago ang mapanganib na operasyon".

    Pag-lock, pag-unlock sa base

    Kung kinakailangan, ganap na iba-block ng updater ang database bago isagawa ang iyong script at i-unlock ito pagkatapos:

    At ito ay isa sa mga pangunahing "tampok" ng updater - pagkatapos ng lahat, halimbawa, ang wastong pagharang sa isang base ng server sa pangkalahatang kaso ay isang medyo hindi maliit na gawain.

    Kinakailangang "resolba" ang mga kasalukuyang koneksyon ng user, mga administratibong koneksyon, at mga gawain sa background. At lahat ng ito sa pamamagitan ng direktang komunikasyon sa 1c cluster.

    Nagse-save ng mga ulat

    Sine-save ng updater ang kasaysayan ng pagpapatupad ng naturang mga script sa manager ng ulat.

    Sa mga pangkalahatang tuntunin:

    Kaya sa detalye:

    Notification sa pamamagitan ng email

    Kung mayroon kang mga notification sa email na na-configure (lahat o para lang sa mga error)...

    Pagkatapos ang impormasyon tungkol sa pagpapatupad ng mga script (kabilang ang mga detalyadong ulat) ay darating sa iyo sa parehong paraan tulad ng impormasyon tungkol sa pagpapatupad ng iba pang mga operasyon mula sa updater:

    Pagpapatakbo ng script sa isang iskedyul

    Pagsubaybay sa ulap

    Kapag nagse-save ng script, mayroon din kaming pagpipilian na subaybayan ang trabaho nito sa cloud - isang ganap na kamangha-manghang tampok sa aking opinyon. Iyan ay tungkol sa cloud monitoring.

    Multi-threaded script execution

    Paano magpatakbo ng isang script nang magkatulad para sa ilang mga database ay inilarawan nang detalyado.

    Ano pa ang kapaki-pakinabang na matutunan bago magsulat ng mga script?

    Well, siyempre, ang 1C na wika mismo. Saan tayo kung wala siya...

    Una sa lahat, nariyan itong 1C language reference book na may mga halimbawa: .

    Sulit din na suriin ang mga pagkakaiba sa pagitan ng OneScript at ng karaniwang 1C na wika. Mayroong ilan sa kanila (link).

    Paano ako makakabuo ng sarili kong mga script?

    Para sa inspirasyon, ipinapayo ko muna sa iyo na i-parse at unawain ang mga script mula sa mga template ng updater. Marami na itong ibibigay sa iyo.

    At kung kailangan mo ng isang ideya para sa pagsulat ng isang script na magiging kapaki-pakinabang sa daan-daang iba pang mga gumagamit, pagkatapos ay tatanungin kita - sumulat sa akin tungkol dito sa anumang paraan na maginhawa para sa iyo. Mayroon akong napakaraming ideya, ngunit wala akong sapat na oras at pagkakataon.

    Upang gawin ito, nagsimula ako ng isang espesyal na proyekto sa github, kung saan kinokolekta ko ang mga kapaki-pakinabang na script mula sa mga gumagamit ng updater upang ang maraming tao hangga't maaari ay maaaring gumamit ng mga ito sa kanilang trabaho.

    Gusto mo bang ipadala sa akin ang iyong script? hinihiling ko sa iyo na .

    Taos-puso, Vladimir Milkin (guro at developer).