выгрузка на ftp в сервисе (web)
Добрый день, коллеги. Крайне редко обращаюсь за помощью, но вот тут беда прям. Весь мозг сломал - поможите чем можите!
Задача: есть расширение для БП 3.0 в сервисе 1С Фреш. Создается dbf (не кидайте тапками - ТЗ клиента) и он должен копироваться на ftp. Тестирую у себя на клиент-сервере (SQL) - все работает как часы. Отправялю на аудит, все загружается к клиенту, а у него уже при выгрузке пишет дичь:
Обработка: Обработка выгрузки на ftp: Ошибка подключения к FTP-серверу, проверьте правильность задания пути и права доступа к ресурсу.
Файл не обнаружен '/temp/v8_fCb9XW_1/Price.dbf'
{чдв_ОбменСАптекой Обработка.ОбменПоFTP_БП_ЧДВ.Форма.Форма.Форма(180)}: FTPСоединение.Записать(ПолучитьИзВременногоХранилища(АдресВХ), ПутьДляПрайса + "Price.dbf");
по причине:
Файл не обнаружен '/temp/v8_fCb9XW_1/Price.dbf'
FTPСоединение.Записать(ПолучитьИзВременногоХранилища(АдресВХПрайс), ПутьДляПрайса + "Price.dbf");
ЧЯДНТ?!
Задача: есть расширение для БП 3.0 в сервисе 1С Фреш. Создается dbf (не кидайте тапками - ТЗ клиента) и он должен копироваться на ftp. Тестирую у себя на клиент-сервере (SQL) - все работает как часы. Отправялю на аудит, все загружается к клиенту, а у него уже при выгрузке пишет дичь:
Обработка: Обработка выгрузки на ftp: Ошибка подключения к FTP-серверу, проверьте правильность задания пути и права доступа к ресурсу.
Файл не обнаружен '/temp/v8_fCb9XW_1/Price.dbf'
{чдв_ОбменСАптекой Обработка.ОбменПоFTP_БП_ЧДВ.Форма.Форма.Форма(180)}: FTPСоединение.Записать(ПолучитьИзВременногоХранилища(АдресВХ), ПутьДляПрайса + "Price.dbf");
по причине:
Файл не обнаружен '/temp/v8_fCb9XW_1/Price.dbf'
Код процедуры:
&НаСервере
Функция ВыгрузитьПрайсНаСервере()
КаталогВФ = ФайловаяСистема.СоздатьВременныйКаталог();
ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1Price.dbf",КаталогВФ);
ФайлПрайс = Новый XBase;
ФайлПрайс.Кодировка = КодировкаXBase.OEM;
ФайлПрайс.поля.Добавить("CODEPST","S",36,0);
ФайлПрайс.поля.Добавить("NAME","S",200,0);
ФайлПрайс.поля.Добавить("CNTR","S",100,0);
ФайлПрайс.поля.Добавить("FIRM","S",150,0);
ФайлПрайс.поля.Добавить("QNTPACK","N",10,0);
ФайлПрайс.поля.Добавить("EAN13","S",13,0);
ФайлПрайс.поля.Добавить("GDATE","D",8,0);
ФайлПрайс.поля.Добавить("QNT","N",8,0);
ФайлПрайс.поля.Добавить("PRICE","N",10,2);
ФайлПрайс.поля.Добавить("RATEPACK","N",10,0);
ФайлПрайс.СоздатьФайл(ИмяФайла);
ФайлПрайс.Записать();
Для каждого Строка Из ТЗПрайс Цикл
ФайлПрайс.Добавить();
ЗаполнитьЗначенияСвойств(ФайлПрайс,Строка);
Если Не Строка.ЦенаВключаетНДС Тогда
СтавкаНДС = СтавкаНДСНаСервере(Строка.ВидСтавкиНДС);
ЗначениеСтавкиНДС = УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС, Ложь);
ФайлПрайс.PRICE = Строка.PRICE * (1 + ЗначениеСтавкиНДС / 100);
КонецЕсли;
ФайлПрайс.Записать();
КонецЦикла;
АдресВХПрайс = ПоместитьВоВременноеХранилище(ИмяФайла);
ФайлПрайс.ЗакрытьФайл();
//Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
Попытка
FTPСоединение = ПолучитьFTPСоединение();
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ПолучитьСообщениеОбОшибке(102);
ДополнитьСообщениеОбОшибке(ТекстОшибки);
Возврат Ложь;
КонецПопытки;
Попытка
ПоказатьFTPСоединение.Записать(ПолучитьИзВременногоХранилища(АдресВХПрайс), ПутьДляПрайса + "Price.dbf");
//FTPСоединение.Записать(ПутьДляПрайса + "Price.dbf",Поток);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ПолучитьСообщениеОбОшибке(103);
ДополнитьСообщениеОбОшибке(ТекстОшибки);
Возврат Ложь;
КонецПопытки;
Попытка
МассивФайлов = FTPСоединение.НайтиФайлы(ПутьДляПрайса, "Price.dbf", Ложь);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ПолучитьСообщениеОбОшибке(104);
ДополнитьСообщениеОбОшибке(ТекстОшибки);
Возврат Ложь;
КонецПопытки;
ФайловаяСистема.УдалитьВременныйКаталог(КаталогВФ);
Возврат МассивФайлов.Количество() > 0;
КонецФункции
ПоказатьЧЯДНТ?!
По теме из базы знаний
- Механизмы и транспорт обмена данными. Пример создания в КД 2.1 правил обмена данными ЗУП 2.5 -> БП 3.0. Выгрузка ведомостей и банковских счетов. Передача параметров обмена из Источника в Приемник. ВыгрузитьПоПравилу(). ПередатьОдинПараметрВПриемник().
- 1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки
- Выгрузка УПД из УТ 11.5, УТ 11.4, БП 3.0, УНФ 1.6, КА 2.4 и ERP 2.4 для OZON и Яндекс Маркет
- 1С:Фото номенклатуры 7.7 - решение для работы с фотографиями номенклатуры в 1С:7.7 (включая формат PNG)
- Конфигурация для загрузки штрафов ГИБДД
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
последняя попытка была сделана через файловый поток
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
FTPСоединение.Записать(ПутьДляПрайса + "Price.dbf",Поток);
на что аудиторы написали следуюущее:
Замечания:
1. В сервисе используется клиент-серверный вариант работы. Клиент и сервер находятся на разных компьютерах. Чтение/запись файла, выбранного на клиенте (либо чтение/запись в каталог, выбранный на клиенте), невозможно на сервере.
При работе на стороне сервера для работы с файлами в безопасном режиме, вам доступен только каталог временных файлов.
FTPСоединение.Записать(Источник, Приемник)
Просьба указывать правильный путь к копируемому файлу.
вообще не понял...
Поток = Новый ФайловыйПоток(ИмяФайла, РежимОткрытияФайла.Открыть, ДоступКФайлу.Чтение);
FTPСоединение.Записать(ПутьДляПрайса + "Price.dbf",Поток);
на что аудиторы написали следуюущее:
Замечания:
1. В сервисе используется клиент-серверный вариант работы. Клиент и сервер находятся на разных компьютерах. Чтение/запись файла, выбранного на клиенте (либо чтение/запись в каталог, выбранный на клиенте), невозможно на сервере.
При работе на стороне сервера для работы с файлами в безопасном режиме, вам доступен только каталог временных файлов.
FTPСоединение.Записать(Источник, Приемник)
Просьба указывать правильный путь к копируемому файлу.
вообще не понял...
Если у вас на компьютере А (Клиенте) есть файл /temp/v8_fCb9XW_1/Price.dbf
то это не означает что на компьютере B (Сервере) он тоже будет
Его нужно туда скопировать. Передавать через временное хранилище нужно ДвоичыеДанные, а не имя файла!
На SQL работает, так как Компьютер А = Компьютер B
то это не означает что на компьютере B (Сервере) он тоже будет
Его нужно туда скопировать. Передавать через временное хранилище нужно ДвоичыеДанные, а не имя файла!
На SQL работает, так как Компьютер А = Компьютер B
(8)вы про это?
&НаСервере
Функция ПолучитьFTPСоединение()
НастройкиFTP = ОбменДаннымиСервер.FTPНастройкиСоединения();
НастройкиFTP.Сервер = "supp.****.ru";
НастройкиFTP.ИмяПользователя = "****";
НастройкиFTP.ПарольПользователя = "*****";
НастройкиFTP.ЗащищенноеСоединение = Неопределено;
Возврат ОбменДаннымиСервер.FTPСоединение(НастройкиFTP);
КонецФункции
Показать
Да, про это.Вы не допускаете, что ftp соединение без опции защищенное соединение на компьютере клиента может не быть установлено или установлено, но не позволять каких-то конкретных действий?
Я в данном случае просто как пример..
Я в данном случае просто как пример..
(10)было такое предположение, но запись
НастройкиFTP.ЗащищенноеСоединение = Неопределено;
сделана специально - функция ОбменДаннымиСервер.FTPСоединение(НастройкиFTP) возвращает НастройкиПроксиСервера(Настройки.ЗащищенноеСоединение) ftp:
Функция НастройкиПроксиСервера(ЗащищенноеСоединение)
Прокси = Неопределено;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПолучениеФайловИзИнтернета") Тогда
МодульПолучениеФайловИзИнтернета = ОбщегоНазначения.ОбщийМодуль("ПолучениеФайловИзИнтернета");
Протокол = ?(ЗащищенноеСоединение = Неопределено, "ftp", "ftps");
Прокси = МодульПолучениеФайловИзИнтернета.ПолучитьПрокси(Протокол);
КонецЕсли;
Возврат Прокси;
КонецФункции
Показать
(13)пор 21 по умолчанию есть в
Функция FTPНастройкиСоединения(Знач Таймаут = 180) Экспорт
Результат = Новый Структура;
Результат.Вставить("Сервер", "");
Результат.Вставить("Порт", 21);
Результат.Вставить("ИмяПользователя", "");
Результат.Вставить("ПарольПользователя", "");
Результат.Вставить("ПассивноеСоединение", Ложь);
Результат.Вставить("Таймаут", Таймаут);
Результат.Вставить("ЗащищенноеСоединение", Неопределено);
Возврат Результат;
КонецФункции
Показать
поверьте - я прошел долгий путь с этой выгрузкой. Указывал имяфайла, потом через временное хранилище, последним уже было поток памяти. Сейчас временно сделал заплатку - клиент сам будет сохранять файл локально и ручаками копировать на фтп - жду когда пройдет аудит, чтобы "обрадовать" клиента. Но коллеги! Это ж бред! в БСП уже есть штатная возможность отправялть отчеты на фтп/почту/папку. НО там нет моего "любимого" dbf...
(20)во-первых права есть-смотри принтскрин, во вторых я так и думал, что моя строка
КаталогВФ = ФайловаяСистема.СоздатьВременныйКаталог();
ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1Price.dbf",КаталогВФ);
кому-нибудь бросится в глаза. Открою секрет - если вы так
ИмяФайла = ПолучитьИмяВременногоФайла("dbf")
попробуете создать файл xbase, получите ошибку "Длина имени файла не может быть больше 8 символов".
)))
КаталогВФ = ФайловаяСистема.СоздатьВременныйКаталог();
ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1Price.dbf",КаталогВФ);
кому-нибудь бросится в глаза. Открою секрет - если вы так
ИмяФайла = ПолучитьИмяВременногоФайла("dbf")
попробуете создать файл xbase, получите ошибку "Длина имени файла не может быть больше 8 символов".
)))
Прикрепленные файлы:
(23)есть риск, что файл "Price.dbf" уже есть -во Фреше тысячи баз...
и была такая ошибка, когда во Фреше специалисты не правильно загрузили расширение - файл действительно не создвался и была соответствующая ошибка. Сейчас этой ошибки нет, значит файл создается. Надеюсь завтра аудит пройдет и если я смогу сохраниться файл локально, значит проблем с временными папками нет точно
и была такая ошибка, когда во Фреше специалисты не правильно загрузили расширение - файл действительно не создвался и была соответствующая ошибка. Сейчас этой ошибки нет, значит файл создается. Надеюсь завтра аудит пройдет и если я смогу сохраниться файл локально, значит проблем с временными папками нет точно
(32)Я ничего не предлагаю - это за рамками темы. Строку обычно напрямую между клиентом и сервером передают, если это не фоновое задание. И клиент точно у Вас с этим адресом файла уже ничего не сделает если ФТП без ошибки пройдет - у Вас же строчка ФайловаяСистема.УдалитьВременныйКаталог(КаталогВФ);
(34)как раз для этого и придуман метод ПоместитьВоВременноеХранилище / ПолучитьИзВременногоХранилища. между клиентом и сервером передается адрес ВХ. клиент может спокойно его себе загрузить. ИмяФайла не совсем просто строка: после операции ФайлПрайс.СоздатьФайл(ИмяФайла); это уже данные.
Если платформа в основном гибко относится к передаваемым параметрам и понимает и файл и имя файла, скорее всего не означает что после использования методов 1с все остальные могут столь же свободно этим пользоваться.
А не переводит ли в нижний регистр "Price.dbf" при сохранении? Раз он такой капризный к 8 символам ... На винде это некритично, но на линуксе это разные имена Price и price - можно даже рядом два файла положить "Price.dbf" и "price.dbf"и проблем не будет - это разные файлы с точки зрения линукса.
Проверил. Получилось почти как я говорил. При записи dbf-ки расширение делается DBF - заглавными буквами (хотя просили маленькими) В этом проблема. Потом код ищет файл "Price.dbf", но там реально лежит уже "Price.DBF" - и для линукса это другой файл, в отличие от винды.
В общем, мои рекомендации - сделать - т.е. "PRICE.DBF" - полностью верхний регистр. Если xbase помнит старинные правила 8.3 - то там и регистр только верхний когда-то был )
ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку("%1PRICE.DBF",КаталогВФ);
Рабочий код:
&НаСервере
Функция ВыгрузитьПрайсНаСервере()
ИмяФайла = ПолучитьИмяВременногоФайла(".dbf");
ФайлПрайс = Новый XBase;
ФайлПрайс.Кодировка = КодировкаXBase.OEM;
ФайлПрайс.поля.Добавить("CODEPST","S",36,0);
ФайлПрайс.поля.Добавить("NAME","S",200,0);
ФайлПрайс.поля.Добавить("CNTR","S",100,0);
ФайлПрайс.поля.Добавить("FIRM","S",150,0);
ФайлПрайс.поля.Добавить("QNTPACK","N",10,0);
ФайлПрайс.поля.Добавить("EAN13","S",13,0);
ФайлПрайс.поля.Добавить("GDATE","D",8,0);
ФайлПрайс.поля.Добавить("QNT","N",8,0);
ФайлПрайс.поля.Добавить("PRICE","N",10,2);
ФайлПрайс.поля.Добавить("RATEPACK","N",10,0);
ФайлПрайс.СоздатьФайл(ИмяФайла);
ФайлПрайс.Записать();
Для каждого Строка Из ТЗПрайс Цикл
ФайлПрайс.Добавить();
ЗаполнитьЗначенияСвойств(ФайлПрайс,Строка);
Если Не Строка.ЦенаВключаетНДС Тогда
СтавкаНДС = СтавкаНДСНаСервере(Строка.ВидСтавкиНДС);
ЗначениеСтавкиНДС = УчетНДСВызовСервераПовтИсп.ПолучитьСтавкуНДС(СтавкаНДС, Ложь);
ФайлПрайс.PRICE = Строка.PRICE * (1 + ЗначениеСтавкиНДС / 100);
КонецЕсли;
ФайлПрайс.Записать();
КонецЦикла;
ФайлПрайс.ЗакрытьФайл();
Попытка
FTPСоединение = ПолучитьFTPСоединение();
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ПолучитьСообщениеОбОшибке(102);
ДополнитьСообщениеОбОшибке(ТекстОшибки);
Возврат Ложь;
КонецПопытки;
Попытка
FTPСоединение.Записать(ИмяФайла, ПутьДляПрайса + "Price.dbf");
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ПолучитьСообщениеОбОшибке(103);
ДополнитьСообщениеОбОшибке(ТекстОшибки);
Возврат Ложь;
КонецПопытки;
Попытка
МассивФайлов = FTPСоединение.НайтиФайлы(ПутьДляПрайса, "Price.dbf", Ложь);
Исключение
ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ПолучитьСообщениеОбОшибке(104);
ДополнитьСообщениеОбОшибке(ТекстОшибки);
Возврат Ложь;
КонецПопытки;
УдалитьФайл(ТмяФайла);
Возврат МассивФайлов.Количество() > 0;
КонецФункции
Показать
У меня проблема в момент подключения, причем на опубликованной базе через апатч проблема не повторилась, и аудит я прошел. В момент передачи всплывает окно в нижнем правом углу "во время выполнения действия была потеряна связь с сервером. Сейчас соединение восстановлено и бла бла бла". Написал в поддержку фреша, неделю что-то думают без изменений.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот