Платежная система ГПБ для Битрикс
Разработан модуль платежной системы ГазпромБанк для Bitrix D7. По вопросам приобретения — обращайтесь. Не выкладываю бесплатно, т.к. довольно долго возюкался, хочу вознаграждение 😉
Разработан модуль платежной системы ГазпромБанк для Bitrix D7. По вопросам приобретения — обращайтесь. Не выкладываю бесплатно, т.к. довольно долго возюкался, хочу вознаграждение 😉
Очень часто проблема в том, что в запросе идёт выборка по условию из РЕСУРСА а не из измерения. Особенность выполнения запроса в 1С по «срезу последних» такова, что сначала делается выборка последних из измерений, а уже затем из ресурсов. Соответственно если в срезе последних по выбранным измерениям нет ресурса, то ничего и не вернётся.
Однако есть способ, заставить 1С выбрать «наоборот». Т.е. сначала делается выборка всего из условия в ресурсе, а затем из ник делается выборка по срезу последних. Достаточно вынести условие в параметры виртуальной таблицы.
Ошибка: в высоко нагруженном приложении с бекендом на 1С, возникают ситуации с одновременным изменением части данных одного из документов. Соответственно возникала ошибка
1 |
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)! |
Решение: перед изменением документа, ждем его разблокировки:
1 2 3 4 5 6 |
оЭЗС = кккк.ПолучитьОбъект(); пока кккк.Заблокирован() цикл конеццикла; кккк.Прочитать(); кккк.Заблокировать(); |
Задача: добавить к числу лидирующий 0, если число однозначное, и не добавлять соответственно, если двухзначное.
Решение: есть два способа, старый, работающий во всех браузерах, и новый — для браузеров 2018 года и новее.
Способ 1:
1 2 3 |
function pad(value) { return ("0"+value).slice(-2); } |
Способ 2:
1 2 3 |
function pad(value) { return value.tostring().padstart(2, 0); } |
Началось всё с того, что после настройки обмена мeжду Bitrix и 1С, заказы в 1С не прилетали. Посмотрел логи, подебажил код обмена и , увидел чудную ошибку «Transferred a partial file» при попытке получить файл заказов. Что при файловом варианте, что при серверном. Причем из браузера (по этой методике), файл открывался и корректно формировался. Просмотр логов сервера apache, добавил еще одну ошибку:
1 2 3 |
2021/07/14 08:54:49 [error] 27470#27470: *1517 upstream prematurely closed connection while reading upstream, client: 185.24.213.2, server: market.erfwerf.ru, request: "GET /bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=ca16a85220fc41bc7e7815adf4401d35 HTTP/1.1", upstream: "http://127.0.0.1:8083/bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=ca16a85220fc41bc7e7815adf4401d35", host: "market.ewrfewrf.ru" |
Гуглинг объяснил, что это возможно ошибка в настройках ngnix. Совместно с хостером, попытались пару настроек изменить, после чего хостер сказал «ничё не знаю, у нас всё нормально». Доступа к настройкам сервера к сожалению нет — только через хостера.
Чего делать? Ну для начала решил попробовать файл формировать самостоятельно, и подпихивать его как то уже готовым в 1С. Наваял скрипт вида:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $login_url = 'https://market.ауцкацука.ru/bitrix/admin/1c_exchange.php?type=catalog&mode=checkauth'; $post_data = 'AUTH_FORM=Y&TYPE=AUTH&USER_LOGIN=цукацук@цукацук.ru&USER_PASSWORD=кцуацукац'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $login_url ); curl_setopt($ch, CURLOPT_POST, 1 ); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt'); $postResult = curl_exec($ch); $exa=explode("=",$postResult); $exa=explode("\n",$exa[1]); $ssid=$exa[0]; curl_setopt($ch, CURLOPT_URL, "https://уцкацук.цукацука.ru/bitrix/admin/1c_exchange.php?type=sale&mode=query&sessid=".$ssid); header('Content-Type: text/xml; charset=windows-1251'); $postResult = curl_exec($ch); echo $postResult; |
Единственной задачей которого было выплюнуть уже готовый файл.
В 1С попробовал:
1 2 3 4 5 |
Запрос = Новый HTTPЗапрос("/цукаука.php"); Соединение = Новый HTTPСоединение("цкуацук.ауцкацу.ru",443,,,,1800,ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение()); ОтветСервера=Соединение.ОтправитьДляОбработки(Запрос).ПолучитьТелоКакСтроку(); |
И получил ровно ту-же ошибку в 1С: Transferred a partial file. Шта??? Круг подозреваемых сузился. Стал винить во всем реализацию HTTPСоединение в 1С. А что если попробовать изобрести свою замену? Родил врезку в модуль обмена с сайтом:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Если ОтветСервера = Неопределено Тогда WinHttp = New COMОбъект("WinHttp.WinHttpRequest.5.1"); WinHttp.Option(2,"utf-8"); WinHttp.Open("GET", "https://maквеиеивкt.квеивкеимвек.ru/gквеивкеs.php", false); WinHttp.Send(); Если WinHttp.Status = 200 Тогда Stream = Новый COMОбъект("ADODB.Stream"); Stream.Type = 1; Stream.Mode = 3; ОтветСервера=WinHttp.ResponseText; Stream = Неопределено; КонецЕсли; конецесли; |
Работает.. Заказы в 1С появились..