Имя: Пароль:
1C
1С v8
записьтекста, немонопольный доступ
0 novichok79
 
04.10.18
15:18
доброго времени суток, уважаемые специалисты.
есть самописная база, в ней реализована запись лога в текстовые файлы в одном модуле.
текстовые файлы на момент записи открываются на монопольный доступ. в момент выполнения фоновых заданий, они пишут в один файл одновременно, в итоге получается ошибка выполнения. можно ли как-то открыть файл на запись немонопольно? через текстовый файл кажется можно, но он медленнее и придется читать каждый раз весь лог, а не хотелось бы этого. заранее благодарю за ответы.
1 Cyberhawk
 
04.10.18
15:18
Что-то ты мудришь
2 Cyberhawk
 
04.10.18
15:19
Пусть сеанс пишет в отдельный файл. Потом склеивай
3 novichok79
 
04.10.18
15:19
(1) в смысле?
4 novichok79
 
04.10.18
15:20
(2) так и делается, но бывают пересечения. че кроме обертки в попытку нет никаких вариантов?
5 Cyberhawk
 
04.10.18
15:20
Какие еще пересечения? Файл каждый раз уникальный должен быть
6 youalex
 
04.10.18
15:27
(2) +1

(0) >>через текстовый файл кажется можно

ну да, и будет такое: сеанс1 прочитал;сеанс2 прочитал; сеанс1 записал; сеанс 2 записал /затер изменения сеанса1
7 Cool_Profi
 
04.10.18
15:29
нет. Текстовый документ он не многопоточный.
Пиши в базу данных
8 novichok79
 
04.10.18
15:50
(7) ясно, спасибо.
9 Лефмихалыч
 
04.10.18
16:12
ЗаписьЖурналаРегистрации() решит этот вопрос
10 d4rkmesa
 
04.10.18
16:14
(0) Можно попробовать с NoSQL подружить. К примеру, как здесь:
http://catalog.mista.ru/public/642927/
11 DmitrO
 
04.10.18
17:19
Можно писать и в один файл, просто процедуры записи нужно синхронизировать между разными фоновыми заданиями.

Вообще, традиционно, это делается при помощи специальных функций файловой системы, но они в 1С не доступны.
Однако у нас задача только синхронизировать. Писать в один файл разными потоками выполнения можно синхронизировав их например блокировками сервера 1С.

Процедура ЗаписатьВЛог(ИмяФайла, ТекстСообщения)
НачатьТранзакцию();
Блокировка = Новый БлокировкаДанных;
Блокировка.Добавить("Справочник.Любой");
Блокировка.Заблокировать();

//Все, в этом месте может выполняться всегда только один поток, остальные ждут, поэтому спокойно открываем файл (1С это делает монопольно) и пишем
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
ЗаписьТекста.ЗаписатьСтроку(ТекстСообщения);
ЗаписьТекста.Закрыть();

ЗафиксироватьТранзакцию();
КонецПроцедуры

Ставим блокировку на любой объект, лучше на тот, который меньше всего редактруется, можно и на элемент поставить, это не важно. Более того можно даже на пустую ссылку или на не существующий элемент поставить.
Это похоже на технику синхронизации критической секцией.
12 Лефмихалыч
 
04.10.18
17:20
охренеть
13 youalex
 
04.10.18
17:46
Еще можно написать сервис, в сторону которого сеансы 1С будут выплевывать сообщения, а он эти сообщения будет синхронизировать и писать на диск.
В один файл.
14 d4rkmesa
 
04.10.18
20:01
(11) Ога, мьютексы и семафоры в 1С. =)
15 sechs
 
04.10.18
20:07
(13) Еще немного, и ты изобретешь syslogd
16 Сияющий в темноте
 
04.10.18
21:24
Самое простое и часто используемое,если нельзя создать файл,то через черточку добавляем к его имени цифру и увеличиваем ее на единицу,пока файл не создастся.
Потом,если очень нужно,можно файлы склеить,но лучше,чтобы всегда в один файл писал один процесс,тогда проще с ошибками разбираться.
17 Franchiser
 
гуру
05.10.18
00:00
Я делал через попытку с ожиданием
2 + 2 = 3.9999999999999999999999999999999...