Имя: Пароль:
1C
1C 7.7
v7: "Неверное имя файла" при записи текстового файла
0 palpetrovich
 
01.06.18
09:44
Запись производится путем дописки файла построчно и сохранения каждой строки

ЛогТекст.ДобавитьСтроку(тДатаВремя + ": " + пСтрока);
ЛогТекст.Записать(пПутьТекста);

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

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

Кто виноват и что делать? :)
1 бомболюк
 
01.06.18
09:57
мне кажется сеть нестабильная.
да и не слишком это хорошая идея: писать построчно текст через объект "Текст". Тут нужно что то типа ЗаписьТекста в 8ке. Или, если можно: пишем файл локально, потом копируем на сетевой диск.
2 1Снеговик
 
гуру
01.06.18
09:59
Сохранение файла в цикле это наверное даже хуже запроса в цикле :)
3 1Снеговик
 
гуру
01.06.18
10:04
Виноват тот, кто придумал построчно записывать много строк.
Описал бы что за задача решалась этой записью, и что за данные.
Имхо надо переделать, чтобы ЛогТекст.Записать выполнялось один раз.
Вообще пиши эти строки в базу, а выгружай файл раз в 5-10 мин, там и ошибку выгрузки обработать можно.
4 ADirks
 
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();
    Исключение
        Сообщить("ошибка записи в лог: "+стрСообщение, "!");
    КонецПопытки;
КонецПроцедуры
5 palpetrovich
 
01.06.18
10:29
(1) " пишем файл локально, потом копируем на сетевой диск." - тоже думал так сделать, возможно выход
(3) "ЛогТекст.Записать выполнялось один раз" - таке сть вариант потерять весь лог, а не чатсть как сейчас
(4)  спасибо, попробую
6 Эльниньо
 
01.06.18
10:38
Запись в Попытке с слипом в цикле
7 Salimbek
 
01.06.18
10:52
(0) Сам то понимаешь - как это работает?
Добавили 1 строку - Записали 1 строку
Добавили еще одну строку - Записали уже 2 строки (1-ю заново и вторую)
...
Добавили в 2000-й раз одну строку - записали 2000 строк. (все первые 1999 и еще одну новую)

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