Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: НеПОнятное поведение функции
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
bizisoft
Здравствуйте.
Помогите разобраться в поведении функции.

Имеется внешняя обработка, а в ней функция:
Функция Архивировать(ИмяАрхива, АрхивируемыеФайлы)
    ЗаписьZIP = Новый ЗаписьZipФайла(ИмяАрхива);
    ЗаписьZIP.Добавить(АрхивируемыеФайлы);
    Попытка
        ЗаписьZIP.Записать();
    Исключение
        Предупреждение("Ошибка создания архива. "+ОписаниеОшибки());
    КонецПопытки;    
    Возврат ИмяАрхива;
КонецФункции


Запускаю 1с8 через командную строку и передаю в ней запуск внешней обработки, которая стартует после запуска 1с.
При отработке обработки выдает ошибку:
Ошибка создания архива. {Форма.ПроверкаИнтернетЗаказов.Форма(1754)}: Ошибка при вызове метода контекста (Записать): Ошибка создания файла


Если же обработку открыть вручную (Файл-Открыть) , то обработка отрабатывает нормально и архивы тоже создаются нормально.

Подскажите пожалуйста в чем может быть причина такого поведения и как это разрешить?


 ! 

Правила п.24. заголовок темы
 
sava1
Пользователь один и тот-же?
bizisoft

Цитата(sava1 @ 05.04.16, 10:34) необходимо зарегистрироваться для просмотра ссылки
Пользователь один и тот-же?


Да один и тот же.
Еще замечено, что если повесить на копку или пункт меню вызов данной обработки и запускать таким образом то вылетает исключение на строке
ЗаписьZIP.Записать();
Если запустить эту обработку через Файл-Открыть, то она отработает нормально, а потом запустить через кнопку/меню, то эта функция отработает нормально.

При перезапуске среды все повторится по новой если не открывать обработку через Файл-Открыть, то будет выдавать исключение, иначе будет отрабатывать нормально.

Магия какая-то.
sava1
ПриОткрытии ничего не инициализируется?
Мичман Харитонов
У системы есть права на создание и запись файлов в той папке?
bizisoft
Цитата(sava1 @ 05.04.16, 12:22) необходимо зарегистрироваться для просмотра ссылки
Ветеран
Иконка группы
Группа: Местный
Сообщений: 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/, к тому же если открыть обработку через Файл-Открыть, то исключение не вылетает.
Vofka
База клиент-серверная? Если да, то подозреваю, что в случае, когда система пытается что-то сохранить, она пробует это сделать в папке на сервере. Проверьте, что на сервере есть нужный каталог и на него есть нужные разрешения.
sava1
А вызов обработки из-под Робота как происходит?

В-общем предложение:
Все, что не связано с формой - перенести в модуль, ВыгрузкаНаСайт(...) тоже Экспортной.
Вызывать через Создать; ВыгрузкаНаСайт(..)
bizisoft
Цитата(Vofka @ 05.04.16, 13:16) необходимо зарегистрироваться для просмотра ссылки
База клиент-серверная?

Виноват не указал, что база файловая, с последними обнолвениями.
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) необходимо зарегистрироваться для просмотра ссылки
Все, что не связано с формой - перенести в модуль, ВыгрузкаНаСайт(...) тоже Экспортной.
Вызывать через Создать; ВыгрузкаНаСайт(..)

Не совсем понял в какой модуль?
Это внешняя обработка.
Petre
Что в "КоманднаяПанель1ВыгрузкаНаСайт()"?
bizisoft
Цитата(Petre @ 05.04.16, 14:13) необходимо зарегистрироваться для просмотра ссылки
Что в "КоманднаяПанель1ВыгрузкаНаСайт()"?


Попробую в краце написать
Процедура КоманднаяПанель1ВыгрузкаНаСайт(Кнопка)    
    СпФайлы = Новый СписокЗначений;    
    СпФайлы.Очистить();
    //------ Выгрузка номенклатуры в файл ------------------
    Если флВыгружатьНоменклатуру = Истина Тогда
        СформироватьФайлТовар();  
    КонецЕсли;
    //далее идут такие же условия проверки установки флажков для других данных
        ...
    //------ ОТПРАВКА ФАЙЛОВ НА СЕРВЕР ПО СФОРМИРОВАННОМУ СПИСКУ -------------------
    ОтправитьФайлНаFTPСервер();    
    //------ ЗАГРУЗКА ДАННЫХ В БАЗУ ИЗ ФАЙЛОВ --------------------------------------
    //------ номенклатура ------------------
    Если флВыгружатьНоменклатуру = Истина Тогда        
        Стр = ВыполнитьСкриптНаСайте("http://ga.dn.ua/1C/load_products.php?MODE="+Строка(Число(флНоменклатураОбновлять)));
        Логи("Загрузка номенклатуры в базу: "+Стр);  
    КонецЕсли;
        //далее идут такие же условия проверки установки флажков для других данных
    ...
КонецПроцедуры


а вот пример функции, которые вызываются в условиях при установке соответствующих флажков

Функция СформироватьФайлТовар()          
    Запрос = Новый Запрос;
    // тут выполняется запрос на выборку данных, не привожу, чтобы сократить текст
    ТекстФайлТовары = Новый ЗаписьТекста((КаталогФайловОбмена+ФайлТовары+Строка(Файлов)+".csv"), КодировкаТекста.UTF8);
    Пока ТЗТовар.Следующий() Цикл
        КолВоСтрок = КолВоСтрок + 1;                      
        Если КолВоСтрок > 30000 Тогда
            ТекстФайлТовары.Закрыть();
            Файлов = Файлов + 1;
            ТекстФайлТовары = Новый ЗаписьТекста((КаталогФайловОбмена+ФайлТовары+Строка(Файлов)+".csv"), КодировкаТекста.UTF8);
            КолВоСтрок = 1;
        КонецЕсли;  
        Если ТЗТовар.ЭтоГруппа = Ложь Тогда
             ТекстФайлТовары.ЗаписатьСтроку(""""+СокрЛП(ТЗТовар.Код)+""";"""+ТЗТовар.Артикул+""";"""+ТЗТовар.Модель+"""");            
        КонецЕсли;        
    КонецЦикла;
    ТекстФайлТовары.Закрыть();
// тут вызываем функцию, которая заархивирует сформированные файлы
    АрхФайл = Архивировать(ФайлТовары+".zip", КаталогФайловОбмена+ФайлТовары+"*.csv");
    СпФайлы.Добавить(АрхФайл);  // добавим имя архива в список значений для дальнейшего использования при отправке на сервер сайта
КонецФункции


Все как бы просто, ничего экстраординарного не используется.

Petre
Если через "файл/открыть", но установить флаг "флВыгружатьСклады", то выгружает нормально?
bizisoft
Цитата(Petre @ 05.04.16, 15:33) необходимо зарегистрироваться для просмотра ссылки
Если через "файл/открыть", но установить флаг "флВыгружатьСклады", то выгружает нормально?

Да все работает нормально.
Если это делать через кнопку на форме/панели то выдает исключение.

Но если изначально после старта системы запустить обработку через "файл/открыть" и нажать кнопку "КоманднаяПанель1ВыгрузкаНаСайт()", а потом закрыть обработку и снова открыт через через кнопку/панель, то тогда она отрабатывает без исключения.
Petre
why.gif
Почистите кеш...
bizisoft
Цитата(Petre @ 05.04.16, 17:33) необходимо зарегистрироваться для просмотра ссылки
Почистите кеш...

К сожалению чистка кеша не помогает, тут видимо наверное что-то с платформой, видимо она по разному открывает обработки через Файл/Открыть и через передачу обработки в качестве параметра или через программное открытие внешней обработки.

Может быть при Файл/Открыть у 1с больше прав на запись файла, но почему тогда это возникает только при архивировании, а текстовые файлы создаются нормально?
А этот функционал для работы с ZIP это штатная функциональность или это какой-то дополнительный плагин, которому нужно в системе дать дополнительные права?
bizisoft
Нашел причину проблемы.
Проблема оказалась до ужаса банальной.
В функцию передавались
//вызов функции до обнаружения
Архивировать(ФайлТовары+".zip", КаталогФайловОбмена+ФайлТовары+"*.csv");
//вызов функции после исправления
Архивировать(КаталогФайловОбмена+ФайлТовары+".zip", КаталогФайловОбмена+ФайлТовары+"*.csv");


т.е. имя архива передавалось в функцию без полного пути, что вызывало исключение при запуске обработки как параметра или с кнопки.
А если запускать Файл/Открыть, то путь подставлялся форточками автоматически и поэтому не вызывало исключения.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.