Перепроведение документов в 1С:Предприятие без блокировки других пользователейСтатья описывает способ "безопасного" проведения документов при работающих сетевых или SQL-пользователях. Дело в том, что если проводить документы без пауз, то работа остальных пользователей в 1С будет заблокирована. Статья содержит ссылку на внешнюю компоненту с исходным кодом, а также содержит другие рецепты, как сделать паузу без использования внешних компонент. | | Автор статьи: Последняя редакция №1 от 16.02.06 URL: http://kb.mista.ru/article.php?id=98 | |
Ключевые слова: sleep, транзакция, блокировка, пауза, проведение, документов, компонентофобия
Для того, чтобы транзакции пользователей не «висели» в бесконечном (или, скорее, конечном) цикле, а могли все-таки выполниться, алгоритм перепроведения документов должен включать паузы (т.е. необходимо проводить документы не все время, а с промежутками). Тогда пользователи смогут «вставить» свои собственные транзакции, и продолжить, без значительных помех, свою работу.
К сожалению, в 1С нет аналога системной функции sleep, которая в системе Windows (и, кстати, изначально - в Unix) делает паузу в миллисекундах, не нагружая при этом процессор (точнее, процессор все равно работает, но при этом выполняются другие задачи в многозадачной операционной среде). Для этого, если вы не ищете легких путей, используйте внешнюю компоненту, которая реализует системный вызов sleep().
Пример внешней компоненты (с исходным кодом) можно скачать по адресу:
http://x-romix.narod.ru/Sleep.rar
Если у вас лекарственная идиосинкразия к внешним компонентам и COM-объектам, есть и другие способы сделать паузу. Один из самых простых - Предупреждение() с таймаутом в секундах (второй параметр метода Предупреждение):
Процедура Проведение()
док=СоздатьОбъект(«Документ»);
док.ВыбратьДокументы(НачДата, КонДата);
Пока док.ПолучитьДокумент()=1 Цикл
док.Провести();
Предупреждение(«Ждем 3 секунды…», 3);
КонецЦикла;
КонецПроцедуры
Для организации цикла ожидания можно также воспользоваться (недокументированной) функцией _GetPerformanceCounter() – это счетчик времени в миллисекундах, или документированной – ТекущееВремя() – с точностью до секунды. Но при этом потребуется «крутить» цикл без пауз, который, как известно, потребляет 100% ресурсов одного процессора (что может сказаться на производительности работы пользователей, например, в терминальном режиме).
|