Здравствуйте. Помогите разобраться в поведении функции.
Имеется внешняя обработка, а в ней функция:
Функция Архивировать(ИмяАрхива, АрхивируемыеФайлы)
ЗаписьZIP = Новый ЗаписьZipФайла(ИмяАрхива);
ЗаписьZIP.Добавить(АрхивируемыеФайлы);
Попытка
ЗаписьZIP.Записать();
Исключение
Предупреждение("Ошибка создания архива. "+ОписаниеОшибки());
КонецПопытки;
Возврат ИмяАрхива;
КонецФункции
Запускаю 1с8 через командную строку и передаю в ней запуск внешней обработки, которая стартует после запуска 1с. При отработке обработки выдает ошибку:
Ошибка создания архива. {Форма.ПроверкаИнтернетЗаказов.Форма(1754)}: Ошибка при вызове метода контекста (Записать): Ошибка создания файла
Если же обработку открыть вручную (Файл-Открыть) , то обработка отрабатывает нормально и архивы тоже создаются нормально.
Подскажите пожалуйста в чем может быть причина такого поведения и как это разрешить?
Да один и тот же. Еще замечено, что если повесить на копку или пункт меню вызов данной обработки и запускать таким образом то вылетает исключение на строке ЗаписьZIP.Записать(); Если запустить эту обработку через Файл-Открыть, то она отработает нормально, а потом запустить через кнопку/меню, то эта функция отработает нормально.
При перезапуске среды все повторится по новой если не открывать обработку через Файл-Открыть, то будет выдавать исключение, иначе будет отрабатывать нормально.
Ветеран Иконка группы Группа: Местный Сообщений: 978 Из: Проскуров Спасибо сказали: 234 раз Рейтинг: 223.9 [№9 в ТОП 33 участников форума]
ПриОткрытии ничего не инициализируется?
Вот содержимое ПриОткрытии
Процедура ПриОткрытии()// Устанавливаем начальные значения для интервала закладка "Заказы" //НачПериодаЗаказы = НачалоДня(ТекущаяДата()); // Устанавливаем на десять дней раньше текущей даты
НачПериодаЗаказы = ДобавитьМесяц(НачалоДня(ТекущаяДата()), -1); // Устанавливаем на десять дней раньше текущей даты
НачПериодаЗаказы = НачПериодаЗаказы-10;
КонПериодаЗаказы = КонецДня(ТекущаяДата());
// Устанавливаем начальные значения для выгрузки
НачПериода = НачалоДня(ТекущаяДата());
КонПериода = КонецДня(ТекущаяДата());
// Получаем текущее значение константы "ПоследнийИнтернетЗаказ"
ТМППоследнийЗаказ = Константы.ГА_ПоследнийИнтернетЗаказ.Получить();
// Определяем каталог базы и записываем в переменную
КаталогИБ = НСтр(СтрокаСоединенияИнформационнойБазы(), "File");
КаталогФайловОбмена = КаталогИБ+"\ExtForms\";
КаталогЛогФайлов = КаталогИБ+"\ExtForms\SiteLogs\";
// Устанавливаем имена файлы для выгрузки данных на сайт
ФайлТовары = "tovars";
ФайлСклады = "sklads";
ФайлЦены = "prices";
ФайлОстатки= "ostatki";
ФайлКонтрагенты = "kontr";
ФайлПроизводители = "brend";
ФайлНаселенныеПункты = "towns";
ФайлРегионы = "regions";
ФайлДоговора= "dogovors";
ФайлАналоги = "cross";
ФайлТипыЦен = "price_type";
ФайлСкидки = "skidka";
ФайлХозОперации = "operation";
ФайлОблРайоны = "raion";
ФайлТранспортныеКомпании = "transport";
ФайлФилиалыТК = "transport_filial";
ФайлВзаиморасчеты = "oborot";
ФайлДокументы = "poborot";
ФайлВалюты = "valuta";
ФайлОтправки = "otpravka";
ФайлСкладПрайс="skladprice";
ФайловСТовары = 1;
ФайловСЦены = 1;
ФайловСОстатки = 1;
ФайловССклады = 1;
ФайловСНаселенныеПункты = 1;
ФайловСКонтрагенты = 1;
ФайловСДоговора = 1;
ФайловСАналоги = 1;
ЭлементыФормы.флРазрешитьВыгрузкуКонтрагентов.Доступность = Истина;
флРазрешитьВыгрузкуКонтрагентов = Ложь;
ЭлементыФормы.флВыгружатьКонтрагенты.Доступность = Ложь;
флВыгружатьКонтрагенты = Ложь;
ЭлементыФормы.флКонтрагентыОбновлять.Доступность = Ложь;
флКонтрагентыОбновлять = Истина; //Ложь;
Сп = Новый СписокЗначений;
Сп.Добавить("Обновление остатков и цен");
Сп.Добавить("Обновление товаров");
Сп.Добавить("Полный обмен");
Сп.Добавить("Настраиваемый");
ПолеВыбораРежимаОбмена = Сп;
Если ПолучитьТекущегоПользователя() = "Робот"Тогда
флВыгружатьСклады = Истина;
КоманднаяПанель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С форуме!