Книга знаний

1С:Предприятие / Администрирование / Производительность

Перепроведение документов в 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% ресурсов одного процессора (что может сказаться на производительности работы пользователей, например, в терминальном режиме).

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика