1с временная таблица уже существует
Сия ошибка оказывается может возникать и при банальном присутствии в табло отладчика записи вида:
1 |
Запрос.Выполнить() |
😉 Минут 20 копья ломал пока выяснил в чем проблема
Жизнь замечательных грибов
Сия ошибка оказывается может возникать и при банальном присутствии в табло отладчика записи вида:
1 |
Запрос.Выполнить() |
😉 Минут 20 копья ломал пока выяснил в чем проблема
Ошибка: в высоко нагруженном приложении с бекендом на 1С, возникают ситуации с одновременным изменением части данных одного из документов. Соответственно возникала ошибка
1 |
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)! |
Решение: перед изменением документа, ждем его разблокировки:
1 2 3 4 5 6 |
оЭЗС = кккк.ПолучитьОбъект(); пока кккк.Заблокирован() цикл конеццикла; кккк.Прочитать(); кккк.Заблокировать(); |
Началось всё с того, что после настройки обмена м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С появились..
Задача: при открытии внешней обработки, восстанавливать значения на форме которые были при предыдущем запуске обработки.
Решение: на события ПриОткрытииНаСервере и при ПриЗакрытииНаСервере навсеми обработчики:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
&НаСервере Процедура СохранитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, Пользователь = Неопределено) Настройки = Новый Структура; Для Каждого Элем ИЗ Элементы Цикл Если ТипЗнч(Элем) = Тип("ПолеФормы") Тогда Если Объект.Свойство(Элем.Имя) Тогда Настройки.Вставить(Элем.Имя, Объект[Элем.Имя]); Иначе Настройки.Вставить(Элем.Имя, ЭтаФорма[Элем.Имя]); КонецЕсли; КонецЕсли; КонецЦикла; ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки,, Пользователь); КонецПроцедуры &НаСервере Процедура ВосстановитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, Пользователь = Неопределено) СтруктураНастроек = Неопределено; Попытка СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта,КлючНастроек, ,Пользователь); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Если СтруктураНастроек <> Неопределено Тогда Для Каждого Настройка Из СтруктураНастроек Цикл Если Объект.Свойство(Настройка.Ключ) Тогда Объект[Настройка.Ключ] = Настройка.Значение; Иначе ЭтаФорма[Настройка.Ключ] = Настройка.Значение; КонецЕсли; КонецЦикла; КонецЕсли; КонецПроцедуры &НаСервере Процедура УдалитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, Пользователь = Неопределено) ХранилищеОбщихНастроек.Удалить(КлючОбъекта, КлючНастроек, Пользователь); Сообщить("Настройки " + КлючОбъекта + " для " + Пользователь + " удалены"); КонецПроцедуры &НаСервере Процедура ПриЗакрытииНаСервере() СохранитьНастройкиНаСервере("СохранениеНастроекПользователяФорма", "ВсеНастройки", ПользователиИнформационнойБазы.ТекущийПользователь()); КонецПроцедуры &НаКлиенте Процедура ПриЗакрытии(ЗавершениеРаботы) ПриЗакрытииНаСервере(); КонецПроцедуры &НаСервере Процедура ПриОткрытииНаСервере() ВосстановитьНастройкиНаСервере("СохранениеНастроекПользователяФорма", "ВсеНастройки", ПользователиИнформационнойБазы.ТекущийПользователь()); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) ПриОткрытииНаСервере(); КонецПроцедуры |
На этот раз, данные подготовлены для JSON JqGrid. Рабочий вариант для не большого количества записей (около 1000). В противном случае будут «тормоза» в 1С, т.к. листается вся выборка для построения «страницы» (не моё).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
Функция GetListing(body, answer) Экспорт answer.result = Новый Массив; answer.error = Истина; answer.errortext = "Ошибка!"; Если body.Свойство("page") Тогда page = Число(body.page); Иначе page = 1; КонецЕсли; Если body.Свойство("limit") Тогда limit = Число(body.limit); Иначе limit = 20; КонецЕсли; Если body.Свойство("sidx") Тогда sidx = body.sidx; Иначе sidx = ""; КонецЕсли; Если body.Свойство("sord") Тогда sord = body.sord; Иначе sord = ""; КонецЕсли; Если body.Свойство("flt") Тогда flt = body.flt; Иначе flt = Неопределено; КонецЕсли; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХрюХрю.Номер КАК id, | ХрюХрю.НачалоЧесания КАК dtstart, | ХрюХрю.ДлительностьПочесывания КАК long, | ХрюХрю.Пятачок.Наименование КАК column, | ХрюХрю.ВыходПятачка.OCPP_num КАК outlet, | ХрюХрю.НачальныеПоказанияСчастья КАК meterstart, | ХрюХрю.КонечныеПоказанияСчастья КАК meterend, | ПРЕДСТАВЛЕНИЕ(ХрюХрю.ТекущийСтатусПочесывания) КАК status, | ХрюХрю.ТекущийСтатусПочесывания КАК ТекущийСтатусПочесывания |ПОМЕСТИТЬ тЗарядки |ИЗ | Документ.ХрюХрю КАК ХрюХрю |ГДЕ | ХрюХрю.ЭЗС.Владелец.Код = &Код | И ХрюХрю.ПометкаУдаления = ЛОЖЬ | И ХрюХрю.НачалоЧесания МЕЖДУ &ДатаНачала И &ДатаКонца |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | тЗарядки.column КАК column, | тЗарядки.dtstart КАК dtstart, | тЗарядки.id КАК id, | тЗарядки.long КАК long, | тЗарядки.meterend КАК meterend, | тЗарядки.meterstart КАК meterstart, | тЗарядки.outlet КАК outlet, | тЗарядки.status КАК status, | тЗарядки.ТекущийСтатусПочесывания КАК ТекущийСтатусПочесывания |ИЗ | тЗарядки КАК тЗарядки | &Фильтры | &Сортировка "; Запрос.УстановитьПараметр("Код", пп.Владелец.Код); Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Дата(body.datefrom))); Запрос.УстановитьПараметр("ДатаКонца", КонецДня(Дата(body.datefrom))); Сортировка = ""; Если ЗначениеЗаполнено(sidx) Тогда Сортировка = "УПОРЯДОЧИТЬ ПО " + sidx + " " + sord + ", id desc"; КонецЕсли; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Сортировка", Сортировка); Условие = ""; status=""; Если ЗначениеЗаполнено(flt) Тогда groupOp = flt.groupOp; rules = flt.rules; Для Каждого rule Из rules Цикл Если rule.op = "bw" Тогда ЧастичноеУсловие = "(" + rule.field + " ПОДОБНО ""%" + rule.data + "%"")"; Условие = Условие + ?(ЗначениеЗаполнено(Условие), " " + groupOp + " ", "") + ЧастичноеУсловие; конецесли; Если rule.op = "eq" Тогда если rule.data<>"-1" тогда Если rule.field = "status" Тогда ЧастичноеУсловие = "(ТекущийСтатусПочесывания = &status)"; status=rule.data; иначе ЧастичноеУсловие = "(" + rule.field + " = """ + rule.data + """)"; конецесли; Условие = Условие + ?(ЗначениеЗаполнено(Условие), " " + groupOp + " ", "") + ЧастичноеУсловие; конецесли; конецесли; конеццикла; Если ЗначениеЗаполнено(Условие) Тогда Условие = "ГДЕ " + Условие; КонецЕсли; конецесли; Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Фильтры", Условие); если status<>"" тогда status=перечисления.СтатусыПочесывания[status]; Запрос.УстановитьПараметр("status", status); конецесли; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); rows = Новый Массив(); РезультатЗапроса = Запрос.Выполнить().Выгрузить(); // нехорошо колстрок = РезультатЗапроса.Количество(); total = Цел((колстрок - 1) / limit) + 1; rowid = (page - 1) * limit; lastrow = rowid + limit - 1; records=0; Пока rowid <= lastrow И rowid < колстрок Цикл Стр = РезультатЗапроса[rowid]; cell = Новый Массив; cell.Добавить(Стр.id); cell.Добавить(Стр.dtstart); cell.Добавить(Стр.long); cell.Добавить(Стр.column); cell.Добавить(Стр.outlet); cell.Добавить(Стр.status); cell.Добавить(Стр.meterend-Стр.meterend); cell.Добавить(0); row = Новый Структура("id, cell", Стр.id, cell); rows.Добавить(row); rowid = rowid + 1; records=records+1; КонецЦикла; result = Новый Структура("page, total, records, rows", page, total, records, rows); answer.result = result; answer.errortext=""; answer.error = ложь; возврат answer; конецфункции |