Очень часто возникает необходимость восстанавливать групповую последовательность документов. Делать это по ночам - самый оптимальный вариант. Однако самому следить за выполнением этой процедуры напряжно, так как клиентов много и баз соответственно. Поэтому у меня все работает по расписанию. Обработка сама запускает восстановление в указанный промежуток времени. Вечером начинает, под утро приостанавливает.
Но последнее время возникли проблемы из-за того, что сотрудники стали задерживаться на работе и автоматическое восстановление последовательности мешает им работать. Конечно можно было сдвинуть время начала на более поздний срок, однако это не совсем эффективно, так как задерживаются сотрудники не всегда. Следующей идеей было проверять наличие пользователей в системе и если они имеются - откладывать начало обработки. Тоже не вариант, так как наши балбесы просто забывали выходить из 1С-ки. Выкидывать их тоже не подходит - могут работать.
Вспомнив о журнале регистрации решил поступить банально просто, проверять последнюю запись в журнале регистрации и таким образом смотреть, когда последний раз кто-то что-то делал в базе. Затем запускать восстановление последовательности, если в базе никто ничего не делал длительное время.
Вот что у меня получилось (просьба не пинать ногами, сильно не заморачивался):
Функция Выделить(Стр, Разделитель = ",")
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
Рез = Стр;
Стр = "";
Иначе
Рез = Лев(Стр,Поз-1);
Стр = Сред(Стр,Поз+СтрДлина(Разделитель));
КонецЕсли;
Возврат Рез;
КонецФункции
Функция ПоследнееДействие()
Файл = КаталогИБ()+"SYSLOG\1cv7.mlg";
FSO = CreateObject("Scripting.FileSystemObject");
F = FSO.GetFile(Файл);
T = FSO.OpenTextFile(Файл,1);
T.Skip(Макс(0,F.Size-256));
ПослСтрока = "";
Пока T.AtEndOfLine=0 Цикл
ПослСтрока = T.ReadLine();
КонецЦикла;
T.Close();
T = 0;
F = 0;
FSO = 0;
Рез = СоздатьОбъект("СписокЗначений");
ДТ = Дата(Сред(ПослСтрока,7,2)+"."+Сред(ПослСтрока,5,2)+"."+Лев(ПослСтрока,4));
Рез.Установить("Дата",ДТ);
Выделить(ПослСтрока,";");
Время = Выделить(ПослСтрока,";");
Рез.Установить("Время",Время);
тЧ = 0; тМ = 0; тС = 0; ТекущееВремя(тЧ,тМ,тС);
Рез.Установить("Бездействие",Макс(0,Число(ТекущаяДата())*86400 + тЧ * 3600 + тМ * 60 + тС - Число(ДТ)*86400 - Число(Выделить(ВРемя,":"))*3600 - Число(Выделить(ВРемя,":"))*60 - Число(Время)));
Рез.Установить("Пользователь",Выделить(ПослСтрока,";"));
Рез.Установить("Среда",Выделить(ПослСтрока,";"));
Рез.Установить("Тип",Выделить(ПослСтрока,";"));
Рез.Установить("Действие",Выделить(ПослСтрока,";"));
Выделить(ПослСтрока,";");
Выделить(ПослСтрока,";");
Ид = СокрЛП(Выделить(ПослСтрока,";"));
Если Ид<>"" Тогда
Рез.Установить("Объект",ЗначениеИзСтрокиВнутр("{"""+Выделить(Ид,"/")+""",""0"",""0"","""+Выделить(Ид,"/")+""",""0"",""0"","""+Ид+"""}"));
КонецЕсли;
Рез.Установить("Описание",ПослСтрока);
Возврат Рез;
КонецФункции
Функция возвращает список значений в котором по ключам хранится следующая информация:
Дата - дата действия (Тип: Дата)
Время - Время действия (Тип: Строка)
Бездействие - количество секунд бездействия между текущем временем и последним действием (Тип: Число)
Пользователь - Имя пользователя (Тип: Строка)
Среда - Флаг среды выполнения E - Предприятие, C - Конфигуратор, M - Монитор (Тип: Строка)
Тип - Тип действия, например Docs - действие с документами (Тип: Строка)
Действие - Выполненное действие (Тип: Строка)
Объект - Объект данных, над которым было произведено действие, если действие не связано с объектом, то это значение не возвращается (Тип: Объект базы данных)
Описание - Опсиание действия из журнала регистрации (Тип: Строка)
В общем, если кому пригодится эта маленькая функция, буду рад.
Пользуйтесь :)