В рамках выполнения проекта столкнулся с интересной задачей ускорения загрузки данных из других информационных баз. Задача загрузки данных предполагала выполнение к внешней базе несвязанных между собой запросов, результаты которых помещаются в одну таблицу значений. Когда на оптимизацию запроса рука уже не поднималась, приступил к ускорению загрузки с помощью распараллеливания процессов. Отмечу, что элементы кода в данном посте приведены для клиент-серверного варианта и укрупнено для общего понимания подхода.
Что у нас в 1с Предприятии 8.2 имеется для распараллеливания & это фоновые задачи. Метод, который будет вызываться в фоновой задаче, должен быть прописан в серверном общем модуле и быть экспортным. Естественно нам понадобиться в фоновую задачу передавать и забирать значения.
В моем случае передача значений в фоновую задачу происходила через параметры. Метод ЗагрузитьИзВИБ имеет два параметра это ВходнойПараметр и АдресВХранилище. ВходнойПараметр это структура, в которую сгружаются все данные, необходимые для проведения загрузки. АдресВХранилище это адрес во временном хранилище, по которому будет передан результат загрузки. Сам код метода фонового задания выглядит так:
Зачем нам в фоновую задачу передавать адрес во временном хранилище. Наша фоновая задача должна куда-то положить результат, причем так чтобы мы знали где его потом взять.
Для того чтобы запустить фоновые задачи выполняется следующий код:
Перед запуском фоновой задачи через ФоновыеЗадания.Выполнить() мы формируем массив параметров. Значения из массива параметров переходят в метод фонового задания в качестве параметров. В МассивЗапущенныхЗаданий хранятся все фоновые задачи, которые мы запустили. Теперь надо подождать их ожидания.
После того как все задачи были завершены, можем приступить к получению из них данных. Для этого мы проходим по всем адресам в хранилище, которые хранятся в массиве МассивАдресовВХранилище. После получения результата фонового задания перегоняем его в общую таблицу.
Вопрос определения оптимального количества потоков выходит за рамки данного поста. А после получения некоторых результатов на рабочих данных пока что выходит и за рамки моего сознания . Но если у вас есть идеи как посчитать нужное количество потоков, пишите в комментариях, с радостью почитаю.
Эта ошибка происходит на сетевой или SQL – версии по причине блокировки файлов другим пользователем или Вами же. Обычно это монопольный вход первого, кто входит (или переиндексация, после которой не вышли). Для исправления ошибки нужно открыть монитор пользователей, посмотреть, кто заблокировал БД и попросить его выйти.
На SQL версии, когда появляется желание войти в БД монопольно, а кто-то из пользователей наблюдает за работой БД 1С через средства SQL сервера, такая ошибка тоже может возникнуть. Монитор тогда не поможет. Нужно средствами SQL сервера определить, кто обращается к БД и закрыть эти приложения (или прервать блокировки средствами SQL сервера). После этого монопольный доступ к БД станет возможен.
1. Кто-то уже вошел в 1С в монопольном режиме. Проверка – запустить 1С в режиме Монитор и посмотреть пользователей.
2. Кто-то входил в 1С и не довел дело до конца (выбор базы, выбор пользователя, пароль) – а система временно заблокировала что-то. Если режим Монитор не помог, то см. пункт 4.
3. Кто-то был в 1С в монопольном режиме и вышел совсем недавно (несколько секунд нужно на закрытие всех файлов и снятие всех блокировок). Решение – подождать 30 сек и повторить вход.
4. Кто-то получил доступ к одному из файлов базы данных напрямую, без 1С, и не отпускает его. Решение – на компьютере с базой данных Панель управления – Администрирование – Управление компьютером – Служебные программы – Общие папки и там все просмотреть, кто вошел и какие файлы открыл.
Кроме описанных выше возможен такой вариант. Работа с 1С одного из пользователей была завершена некорректно (перезагрузка компьютера в результате колебаний напряжения, зависание компьютера и т.п.), и в каталоге пользователя (и, возможно, каталоге базы) остались временные файлы 1cv7.LCK. Если причина в этом, то достаточно будет удалить такие файлы.
Каталоги пользователей находятся в каталоге базы данных.
Кроме того, если пользователей 1С прописывал не специалист, то он мог допустить такую ошибку: не указал каждому пользователю отдельный “каталог пользователя” или указал для всех один и тот же каталог. В таком случае даже если кто-то работает с программой НЕ в монопольном режиме, другие пользователи не смогут зайти в программу пока не выйдет этот.
Ну и еще как вариант- кто-то зашел в 1С, а Вы пытаетесь кнопочкой из конфигуратора запустить ее в монопольном режиме.