1с временная таблица уже существует
Сия ошибка оказывается может возникать и при банальном присутствии в табло отладчика записи вида:
Запрос.Выполнить()
😉 Минут 20 копья ломал пока выяснил в чем проблема
Жизнь замечательных грибов
Сия ошибка оказывается может возникать и при банальном присутствии в табло отладчика записи вида:
Запрос.Выполнить()
😉 Минут 20 копья ломал пока выяснил в чем проблема
Ошибка: в высоко нагруженном приложении с бекендом на 1С, возникают ситуации с одновременным изменением части данных одного из документов. Соответственно возникала ошибка
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)!
Решение: перед изменением документа, ждем его разблокировки:
оЭЗС = кккк.ПолучитьОбъект();
пока кккк.Заблокирован() цикл
конеццикла;
кккк.Прочитать();
кккк.Заблокировать();
Началось всё с того, что после настройки обмена мeжду Bitrix и 1С, заказы в 1С не прилетали. Посмотрел логи, подебажил код обмена и , увидел чудную ошибку «Transferred a partial file» при попытке получить файл заказов. Что при файловом варианте, что при серверном. Причем из браузера (по этой методике), файл открывался и корректно формировался. Просмотр логов сервера apache, добавил еще одну ошибку:
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С. Наваял скрипт вида:
<?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С попробовал:
Запрос = Новый HTTPЗапрос("/цукаука.php");
Соединение = Новый HTTPСоединение("цкуацук.ауцкацу.ru",443,,,,1800,ОбщегоНазначенияКлиентСервер.НовоеЗащищенноеСоединение());
ОтветСервера=Соединение.ОтправитьДляОбработки(Запрос).ПолучитьТелоКакСтроку();
И получил ровно ту-же ошибку в 1С: Transferred a partial file. Шта??? Круг подозреваемых сузился. Стал винить во всем реализацию HTTPСоединение в 1С. А что если попробовать изобрести свою замену? Родил врезку в модуль обмена с сайтом:
Если ОтветСервера = Неопределено Тогда
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С появились..
Задача: при открытии внешней обработки, восстанавливать значения на форме которые были при предыдущем запуске обработки.
Решение: на события ПриОткрытииНаСервере и при ПриЗакрытииНаСервере навсеми обработчики:
&НаСервере
Процедура СохранитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, Пользователь = Неопределено)
Настройки = Новый Структура;
Для Каждого Элем ИЗ Элементы Цикл
Если ТипЗнч(Элем) = Тип("ПолеФормы") Тогда
Если Объект.Свойство(Элем.Имя) Тогда
Настройки.Вставить(Элем.Имя, Объект[Элем.Имя]);
Иначе
Настройки.Вставить(Элем.Имя, ЭтаФорма[Элем.Имя]);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Настройки,, Пользователь);
КонецПроцедуры
&НаСервере
Процедура ВосстановитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, Пользователь = Неопределено)
СтруктураНастроек = Неопределено;
Попытка
СтруктураНастроек = ХранилищеОбщихНастроек.Загрузить(КлючОбъекта,КлючНастроек, ,Пользователь);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Если СтруктураНастроек <> Неопределено Тогда
Для Каждого Настройка Из СтруктураНастроек Цикл
Если Объект.Свойство(Настройка.Ключ) Тогда
Объект[Настройка.Ключ] = Настройка.Значение;
Иначе
ЭтаФорма[Настройка.Ключ] = Настройка.Значение;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УдалитьНастройкиНаСервере(КлючОбъекта, КлючНастроек, Пользователь = Неопределено)
ХранилищеОбщихНастроек.Удалить(КлючОбъекта, КлючНастроек, Пользователь);
Сообщить("Настройки " + КлючОбъекта + " для " + Пользователь + " удалены");
КонецПроцедуры
&НаСервере
Процедура ПриЗакрытииНаСервере()
СохранитьНастройкиНаСервере("СохранениеНастроекПользователяФорма", "ВсеНастройки", ПользователиИнформационнойБазы.ТекущийПользователь());
КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии(ЗавершениеРаботы)
ПриЗакрытииНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПриОткрытииНаСервере()
ВосстановитьНастройкиНаСервере("СохранениеНастроекПользователяФорма", "ВсеНастройки", ПользователиИнформационнойБазы.ТекущийПользователь());
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонецПроцедуры
На этот раз, данные подготовлены для JSON JqGrid. Рабочий вариант для не большого количества записей (около 1000). В противном случае будут «тормоза» в 1С, т.к. листается вся выборка для построения «страницы» (не моё).
Функция 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;
конецфункции