Здравствуйте. Помогите разобраться в поведении функции.
Имеется внешняя обработка, а в ней функция:
Функция Архивировать(ИмяАрхива, АрхивируемыеФайлы) ЗаписьZIP = Новый ЗаписьZipФайла(ИмяАрхива); ЗаписьZIP.Добавить(АрхивируемыеФайлы); Попытка ЗаписьZIP.Записать(); Исключение Предупреждение("Ошибка создания архива. "+ОписаниеОшибки()); КонецПопытки; Возврат ИмяАрхива; КонецФункции
Запускаю 1с8 через командную строку и передаю в ней запуск внешней обработки, которая стартует после запуска 1с. При отработке обработки выдает ошибку:
Ошибка создания архива. {Форма.ПроверкаИнтернетЗаказов.Форма(1754)}: Ошибка при вызове метода контекста (Записать): Ошибка создания файла
Если же обработку открыть вручную (Файл-Открыть) , то обработка отрабатывает нормально и архивы тоже создаются нормально.
Подскажите пожалуйста в чем может быть причина такого поведения и как это разрешить?
Да один и тот же. Еще замечено, что если повесить на копку или пункт меню вызов данной обработки и запускать таким образом то вылетает исключение на строке ЗаписьZIP.Записать(); Если запустить эту обработку через Файл-Открыть, то она отработает нормально, а потом запустить через кнопку/меню, то эта функция отработает нормально.
При перезапуске среды все повторится по новой если не открывать обработку через Файл-Открыть, то будет выдавать исключение, иначе будет отрабатывать нормально.
Сп = Новый СписокЗначений; Сп.Добавить("Обновление остатков и цен"); Сп.Добавить("Обновление товаров"); Сп.Добавить("Полный обмен"); Сп.Добавить("Настраиваемый"); ПолеВыбораРежимаОбмена = Сп;
Если ПолучитьТекущегоПользователя() = "Робот" Тогда флВыгружатьСклады = Истина; КоманднаяПанель1ВыгрузкаНаСайт(Неопределено); ЗавершитьРаботуСистемы(); КонецЕсли;
КонецПроцедуры
Цитата(Мичман Харитонов @ 05.04.16, 12:58)
У системы есть права на создание и запись файлов в той папке?
Думаю что у системы есть такое право, т.к. архив сохраняется в папку с конфигурацией /ExtForms/, к тому же если открыть обработку через Файл-Открыть, то исключение не вылетает.
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 14052
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3750.1
База клиент-серверная? Если да, то подозреваю, что в случае, когда система пытается что-то сохранить, она пробует это сделать в папке на сервере. Проверьте, что на сервере есть нужный каталог и на него есть нужные разрешения.
Живет на форуме
Группа: Местный
Сообщений: 2753
Из: Проскуров
Спасибо сказали: 709 раз
Рейтинг: 688.5
А вызов обработки из-под Робота как происходит?
В-общем предложение: Все, что не связано с формой - перенести в модуль, ВыгрузкаНаСайт(...) тоже Экспортной. Вызывать через Создать; ВыгрузкаНаСайт(..)
Виноват не указал, что база файловая, с последними обнолвениями. 1С:Предприятие 8.2 (8.2.19.130) Типовое отраслевое решение "Альфа-Авто: Автосервис+Автозапчасти, украинская версия 4.1" Разработка: "1С-Рарус" Локализация: "АБИ Украина" (4.1.14.01)
Цитата(sava1 @ 05.04.16, 13:29)
А вызов обработки из-под Робота как происходит?
Пока вызывается через ярлык, но в дальнейшем хочу запуск перенести в планировщик заданий форточек. Строка в ярлыке такая: "C:\Program Files (x86)\1cv82\8.2.19.130\bin\1cv8.exe" ENTERPRISE /F "D:\ALPHA\AA_4_1_13_1" /N Робот /P 147 /Execute "D:\ALPHA\AA_4_1_13_1\ExtForms\_ОБМЕН_С_САЙТОМ.epf"
Цитата(sava1 @ 05.04.16, 13:29)
Все, что не связано с формой - перенести в модуль, ВыгрузкаНаСайт(...) тоже Экспортной. Вызывать через Создать; ВыгрузкаНаСайт(..)
Не совсем понял в какой модуль? Это внешняя обработка.
Процедура КоманднаяПанель1ВыгрузкаНаСайт(Кнопка) СпФайлы = Новый СписокЗначений; СпФайлы.Очистить(); //------ Выгрузка номенклатуры в файл ------------------ Если флВыгружатьНоменклатуру = Истина Тогда СформироватьФайлТовар(); КонецЕсли; //далее идут такие же условия проверки установки флажков для других данных ... //------ ОТПРАВКА ФАЙЛОВ НА СЕРВЕР ПО СФОРМИРОВАННОМУ СПИСКУ ------------------- ОтправитьФайлНаFTPСервер(); //------ ЗАГРУЗКА ДАННЫХ В БАЗУ ИЗ ФАЙЛОВ -------------------------------------- //------ номенклатура ------------------ Если флВыгружатьНоменклатуру = Истина Тогда Стр = ВыполнитьСкриптНаСайте("http://ga.dn.ua/1C/load_products.php?MODE="+Строка(Число(флНоменклатураОбновлять))); Логи("Загрузка номенклатуры в базу: "+Стр); КонецЕсли; //далее идут такие же условия проверки установки флажков для других данных ... КонецПроцедуры
а вот пример функции, которые вызываются в условиях при установке соответствующих флажков
Функция СформироватьФайлТовар() Запрос = Новый Запрос; // тут выполняется запрос на выборку данных, не привожу, чтобы сократить текст ТекстФайлТовары = Новый ЗаписьТекста((КаталогФайловОбмена+ФайлТовары+Строка(Файлов)+".csv"), КодировкаТекста.UTF8); Пока ТЗТовар.Следующий() Цикл КолВоСтрок = КолВоСтрок + 1; Если КолВоСтрок > 30000 Тогда ТекстФайлТовары.Закрыть(); Файлов = Файлов + 1; ТекстФайлТовары = Новый ЗаписьТекста((КаталогФайловОбмена+ФайлТовары+Строка(Файлов)+".csv"), КодировкаТекста.UTF8); КолВоСтрок = 1; КонецЕсли; Если ТЗТовар.ЭтоГруппа = Ложь Тогда ТекстФайлТовары.ЗаписатьСтроку(""""+СокрЛП(ТЗТовар.Код)+""";"""+ТЗТовар.Артикул+""";"""+ТЗТовар.Модель+""""); КонецЕсли; КонецЦикла; ТекстФайлТовары.Закрыть(); // тут вызываем функцию, которая заархивирует сформированные файлы АрхФайл = Архивировать(ФайлТовары+".zip", КаталогФайловОбмена+ФайлТовары+"*.csv"); СпФайлы.Добавить(АрхФайл); // добавим имя архива в список значений для дальнейшего использования при отправке на сервер сайта КонецФункции
Все как бы просто, ничего экстраординарного не используется.
Если через "файл/открыть", но установить флаг "флВыгружатьСклады", то выгружает нормально?
Да все работает нормально. Если это делать через кнопку на форме/панели то выдает исключение.
Но если изначально после старта системы запустить обработку через "файл/открыть" и нажать кнопку "КоманднаяПанель1ВыгрузкаНаСайт()", а потом закрыть обработку и снова открыт через через кнопку/панель, то тогда она отрабатывает без исключения.
К сожалению чистка кеша не помогает, тут видимо наверное что-то с платформой, видимо она по разному открывает обработки через Файл/Открыть и через передачу обработки в качестве параметра или через программное открытие внешней обработки.
Может быть при Файл/Открыть у 1с больше прав на запись файла, но почему тогда это возникает только при архивировании, а текстовые файлы создаются нормально? А этот функционал для работы с ZIP это штатная функциональность или это какой-то дополнительный плагин, которому нужно в системе дать дополнительные права?
Нашел причину проблемы. Проблема оказалась до ужаса банальной. В функцию передавались
//вызов функции до обнаружения Архивировать(ФайлТовары+".zip", КаталогФайловОбмена+ФайлТовары+"*.csv"); //вызов функции после исправления Архивировать(КаталогФайловОбмена+ФайлТовары+".zip", КаталогФайловОбмена+ФайлТовары+"*.csv");
т.е. имя архива передавалось в функцию без полного пути, что вызывало исключение при запуске обработки как параметра или с кнопки. А если запускать Файл/Открыть, то путь подставлялся форточками автоматически и поэтому не вызывало исключения.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!