Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: "Неверное имя файла" при записи текстового файла

v7: "Неверное имя файла" при записи текстового файла
Я
   palpetrovich
 
01.06.18 - 09:44
Запись производится путем дописки файла построчно и сохранения каждой строки
ЛогТекст.ДобавитьСтроку(тДатаВремя + ": " + пСтрока);
ЛогТекст.Записать(пПутьТекста); 

Проблема в сабже появляется иногда, вопрос - с чем вызвано?
я предположил - дело в том, что 1с пытается записать следующую строку, когда не завершена еще файловая операция по записи предыдущей.
Сделал "пакетную запись" - логически законченными кусками текста, добавил "паузу": перед началом следующего "куска":
  _WshShell.Run("ping 127.0.0.1 -n "+СокрЛП(Число(пПауза)),0,1);
Но проблема, увы, осталась

зы: запись идет в сетевую папку, имя файла, мягко говоря, не короткое

Кто виноват и что делать? :)
 
 
   бомболюк
 
1 - 01.06.18 - 09:57
мне кажется сеть нестабильная.
да и не слишком это хорошая идея: писать построчно текст через объект "Текст". Тут нужно что то типа ЗаписьТекста в 8ке. Или, если можно: пишем файл локально, потом копируем на сетевой диск.
   1Снеговик
 
2 - 01.06.18 - 09:59
Сохранение файла в цикле это наверное даже хуже запроса в цикле :)
   1Снеговик
 
3 - 01.06.18 - 10:04
Виноват тот, кто придумал построчно записывать много строк.
Описал бы что за задача решалась этой записью, и что за данные.
Имхо надо переделать, чтобы ЛогТекст.Записать выполнялось один раз.
Вообще пиши эти строки в базу, а выгружай файл раз в 5-10 мин, там и ошибку выгрузки обработать можно.
   ADirks
 
4 - 01.06.18 - 10:05
построчно надо так:
Процедура ВЛог(ИмяЛога, Знач стрСообщение, Юзер = "", фВставлятьПустуюСтроку = 0, Показать = 0) Экспорт
    Если _ВЛог_ФСО = Неопределено Тогда
        _ВЛог_ФСО = СоздатьОбъект("Scripting.FileSystemObject");
        Каталог = КаталогИБ()+"logs";
        Если ФС.СуществуетФайл(Каталог) = 0 Тогда
            ФС.СоздатьКаталог(Каталог);
        КонецЕсли;
    КонецЕсли;
    
    Если Пользователь = Неопределено Тогда
        _Юзер = ИмяПользователя();
    ИначеЕсли Юзер = "" Тогда
        _Юзер = Пользователь.Код;
    ИначеЕсли ТипЗначения(Юзер) = 2 Тогда
        _Юзер = Юзер;
    Иначе
        _Юзер = Юзер.Код;
    КонецЕсли;
    
    ИмяФайлаЛога = КаталогИБ()+"logs\"+ИмяЛога+".log";
    Префикс = "";
    Если фВставлятьПустуюСтроку = 1 Тогда
        Префикс = Префикс + РазделительСтрок;
    ИначеЕсли ТипЗначения(фВставлятьПустуюСтроку) = 2 Тогда
        Префикс = Префикс + фВставлятьПустуюСтроку+РазделительСтрок;
    КонецЕсли;
    стрСообщение = Префикс + ТекущаяДата()+" "+ТекущееВремя()+": "+СокрЛП(_Юзер)+": "+стрСообщение +РазделительСтрок;
    
    Попытка
        f = _ВЛог_ФСО.OpenTextFile(ИмяФайлаЛога, 8, -1, 0);
        f.write(стрСообщение);
        f.Close();
    Исключение
        Сообщить("ошибка записи в лог: "+стрСообщение, "!");
    КонецПопытки;
КонецПроцедуры
   palpetrovich
 
5 - 01.06.18 - 10:29
(1) " пишем файл локально, потом копируем на сетевой диск." - тоже думал так сделать, возможно выход
(3) "ЛогТекст.Записать выполнялось один раз" - таке сть вариант потерять весь лог, а не чатсть как сейчас
(4)  спасибо, попробую
   Эльниньо
 
6 - 01.06.18 - 10:38
Запись в Попытке с слипом в цикле
   Salimbek
 
7 - 01.06.18 - 10:52
(0) Сам то понимаешь - как это работает?
Добавили 1 строку - Записали 1 строку
Добавили еще одну строку - Записали уже 2 строки (1-ю заново и вторую)
...
Добавили в 2000-й раз одну строку - записали 2000 строк. (все первые 1999 и еще одну новую)

Вообще - очень рекомендую BinaryData из состава 1C++, тестировал в свое время - по скорости в сотню раз вроде бы превосходило штатную работу с текстом. Кроме того - у нее есть штатный режим добавочной записи в файл по одной строке.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит Тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует