|
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++, тестировал в свое время - по скорости в сотню раз вроде бы превосходило штатную работу с текстом. Кроме того - у нее есть штатный режим добавочной записи в файл по одной строке. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |