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

1С:Предприятие :: 1С:Предприятие 8 общая

записьтекста, немонопольный доступ

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

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

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

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

//Все, в этом месте может выполняться всегда только один поток, остальные ждут, поэтому спокойно открываем файл (1С это делает монопольно) и пишем

ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
ЗаписьТекста.ЗаписатьСтроку(ТекстСообщения);
ЗаписьТекста.Закрыть();

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует