Имя: Пароль:
1C
1С v8
http сервис. Не работает НайтиПоКоду и ТекстовыйДокумент.Записать(ВФайл)
,
0 AnBlast
 
08.03.23
10:54
Что-то непонятное мне происходит...
есть http-сервис который должен получить файл от стороннего ресурса и сохранить его в КаталогВременныхФайлов() и в Справочники.ХранилищеДополнительнойИнформации
раньше все работало. потом этот сервис долго не использовался, а за это время база переехала на другой сервак (как и раньше под SQL, релизы те же, винда такая же) и все сломалось...

Скорее всего дело в настройках базы, но совершенно непонятно куда копать и что мы смогли сломать при переезде.
Может кто сталкивался? помогите, плиз.
1 JeHer
 
08.03.23
11:11
А до 1С этот файл доходит? Брандмауэр винды, может, рубит?
2 AnBlast
 
08.03.23
11:18
не... я вижу по размеру пакета, что оно приходит.
но даже простейшая конструкция типа Спр = Справочники.ФизическиеЛица.НайтиПоКоду("0000070320"); валится по ошибке. причем ошибка пишется на английском object procedere called as function или как-то так
3 vicof
 
08.03.23
11:26
"object procedere called as function"
хммм, что же это может быть?!
4 AnBlast
 
08.03.23
11:28
(3) перевести не проблема )) проблема, что оно выдается на Спр = Справочники.ФизическиеЛица.НайтиПоКоду("0000070320");
5 vicof
 
08.03.23
11:42
Кэш?
Посмотреть сам сервис, насколько он отличается от бывшего.
Думаю, это проблема не строки, а в целом процедуры.
6 AnBlast
 
08.03.23
11:46
(5) сервис не меняли. машина, на котором развернут сервис та же и не менялась с того времени как все работало. Да и на ней не только этот сервис крутится, там туча всяких обменов...

а что значит "в целом процедуры"? типа контекст не тот?
7 ДедМорроз
 
08.03.23
11:47
Где-то вместо функции определили процедуру.
И до вашего кода просто не доходит вообще.
8 AnBlast
 
08.03.23
11:51
(7) не... я ставлю точку остановки на входе в процедуру метода POST. раньше ничего нет... и прям в этот момент, еще до выполнения любого кода, смотрю через Вычислить выражение результат выполнения Спр = Справочники.ФизическиеЛица.НайтиПоКоду("0000070320"); И оно пишет "object procedere called as function"
9 AnBlast
 
08.03.23
11:53
причем обычно жеж 1С ругается не на английском... а тут ошибка похожая на 1Сную, но на английском. Значит возможно это ругается сервис, а не 1С. но так ли это и как это пофиксить???
10 ДедМорроз
 
08.03.23
12:03
Так в поле Вычислить нужно функцию вызывать
Тот же поиск,но без присвоения сделай
11 Сергиус
 
08.03.23
12:20
(2)Справочники.ФизическиеЛица имеет тип СправочникМенеджер?
12 AnBlast
 
08.03.23
12:22
(10) ну я не на столько еще 1С забыл ))
(11) да
13 JeHer
 
08.03.23
12:24
Кусочек кода бы
14 AnBlast
 
08.03.23
12:36
Функция DocValidPOST(HTTPСервисЗапрос)
    ЗаписьЖурналаРегистрации("Запрос", УровеньЖурналаРегистрации.Информация, , , "Получены данные");
    Попытка
        Результат = HTTPСервисЗапрос.ПолучитьТелоКакСтроку();
        ИмяФайла = КаталогВременныхФайлов() + "zzz_txt_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_ччММсс") + ".txt";
        Док = новый ТекстовыйДокумент;
        Док.УстановитьТекст(Результат);
        Док.Записать(ИмяФайла);                 //ВОТ ТУТ ВАЛИТСЯ
        
        НомерБрони = "";
        RequestId = HTTPСервисЗапрос.Заголовки["X-Document-Request-Trace-Id"];
        Если ЗначениеЗаполнено(RequestId) Тогда
            Поз = СтрНайти(RequestId, "/");
            Если Поз <> 0 Тогда
                НомерБрони = Сред(RequestId, 1, Поз - 1);
            КонецЕсли;    
        КонецЕсли;
        
        Если НомерБрони <> "" Тогда
            
            КарточкаБронирования = Справочники.ФизическиеЛица.НайтиПоКоду("0000070320");             //И ВОТ ТУТ ВАЛИТСЯ
            Если НЕ КарточкаБронирования.Пустая() Тогда
                НовЭл = Справочники.ХранилищеДополнительнойИнформации.СоздатьЭлемент();
                НовЭл.Наименование = RequestId;
                НовЭл.Объект = КарточкаБронирования;
                НовЭл.Хранилище = Новый ХранилищеЗначения(HTTPСервисЗапрос.ПолучитьТелоКакСтроку(), Новый СжатиеДанных(9));
                НовЭл.Записать();
            КонецЕсли;    
        КонецЕсли;    
    Исключение
        ЗаписьЖурналаРегистрации("Запрос ", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    КонецПопытки;
        
    РезультатСтруктура = Новый Структура("success",true);
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, РезультатСтруктура);
    СтрокаДляОтвета = ЗаписьJSON.Закрыть();
    
    Ответ = Новый HTTPСервисОтвет(200);    
    Ответ.УстановитьТелоИзСтроки(СтрокаДляОтвета);
    
    Возврат Ответ;

КонецФункции
15 ДедМорроз
 
08.03.23
13:05
А после каталога разделитель пути ?
А справочник ФизическиеЛица точно есть ?
16 AnBlast
 
08.03.23
13:17
(15) КаталогВременныхФайлов() возвращает C:\Users\USR1CV8.Server\AppData\Local\Temp\
конечно есть...

Этот код работал осенью... потом сервис не использовался, а сама база тестовая в которой дело происходит (в продакшн сервис не попал) переподнималась из бэкапа
А сервер где крутятся сервисы http не менялся и ничего с ним не делалось вообще
17 Сергиус
 
08.03.23
13:26
(14)[ КарточкаБронирования = Справочники.ФизическиеЛица.НайтиПоКоду("0000070320");             //И ВОТ ТУТ ВАЛИТСЯ]
Как определили, что именно здесь валится? Попробуйте ради проверки использовать КарточкаБронирования = Справочники.ФизическиеЛица.ПустаяСсылка(), ошибка исчезнет или будет такая же?
18 AnBlast
 
08.03.23
13:35
(17) Ошибка исчезнет...
А если найти по коду (код точно есть), то пишет Error calling context method (НайтиПоКоду)

но функция сваливается еще раньше на Док.Записать(ИмяФайла); - object procedere called as function
19 Сергиус
 
08.03.23
13:45
(18)Версия платформы 1с какая? Пробовали сделать переопубликацию сервиса? ИМХО, похоже на какую-то ошибку на уровне платформы именно, применительно к данной публикации.
20 AnBlast
 
08.03.23
13:51
(19) 8.3.10 и не менялась последние 3 года точно. Осенью все работало
сервис там https и перепубликацию не пробовал... и не очень хочется. Но видать придется
21 Сергиус
 
08.03.23
18:52
(20)Сами же пишете в (0), что был переезд на другой сервак.
22 rudnitskij
 
08.03.23
19:17
(14) А какое имя файла возвращает?
23 rudnitskij
 
08.03.23
19:38
(14) "ИмяФайла = КаталогВременныхФайлов() + "zzz_txt_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_ччММсс") + ".txt"" - вот это чему равно?
24 Злопчинский
 
08.03.23
20:57
(23) я хз как там форматы в восьмерке, но прикольно будет если время с двоеточием.. хотя, думаю что все же - без...
25 rudnitskij
 
08.03.23
21:08
(24) судя по ошибкам на английском, мог измениться формат даты, из-за чего ошибку выкидывает попытка записи файла с именем, которое не разрешается системой. Плюс лишние точки в пути к файлу тоже смущают("КаталогВременныхФайлов() возвращает C:\Users\USR1CV8.Server\AppData\Local\Temp\")
26 Сергиус
 
09.03.23
02:38
(24)Формат(ТекущаяДата(), "ДФ=yyyyMMdd_ччММсс") - в таком формате никакого двоеточия не может быть
27 Сергиус
 
09.03.23
02:40
(25)[C:\Users\USR1CV8.Server\AppData\Local\Temp\] - такой путь вполне себе проходит, точка в имени каталога допустима.
28 Сергиус
 
09.03.23
02:45
(14)
Док = новый ТекстовыйДокумент;
Док.УстановитьТекст(Результат);
Док.Записать(ИмяФайла);

Проверьте, чтобы в этом блоке нигде не было какого-то скрытого текста, например если пролистать вправо экран. На всякий случай, выделите, удалите и пропишите руками заново.
29 JeHer
 
09.03.23
04:15
Права, права
30 AnBlast
 
09.03.23
10:48
(21) не переезд, а прибили старую тестовую базу и подняли на ее место новую
(23) C:\Users\USR1CV8.Server\AppData\Local\Temp\zzz_txt_20230309_090344.txt
(28) проверил, нету там ничего
(29) права на что? на запись в каталог? проверил...
31 AnBlast
 
09.03.23
11:55
(29) ну таки да... права
дал пользователю админские права и все заработало. При этом тут сервис https и у него свой пользователь. Права ему давались по аналогии с пользователем, под которым работают другие http (не https) сервисы. Видать для https надо что то еще, что не требуется для http
Буду искать что...

Всем Спасибо!