Имя: Пароль:
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
Буду искать что...

Всем Спасибо!
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn