При работе с крупными базами данных «1С:Бухгалтерия 3.0» (БП) пользователи и программисты часто сталкиваются с проблемой медленного перепроведения документов за длительные периоды (например, при подготовке годовой отчетности или закрытии года). В стандартном режиме процедура может занимать несколько дней, что недопустимо в условиях жестких дедлайнов по сдаче НДС или налога на прибыль. В этой статье мы подробно разберем, как реализовать параллельное проведение, какие механизмы платформы 1С:Предприятие 8.3 это позволяют и какие технические нюансы необходимо учесть для достижения максимальной производительности.
Прежде всего, проанализируем, почему в старых версиях конфигураций (например, на платформе 7.7 или БП 2.0 в режиме обычных блокировок) распараллеливание было практически невозможным. Основной причиной являлись блокировки всей таблицы регистра бухгалтерии при записи даже одного документа. Однако современная «1С:Бухгалтерия 3.0» работает в режиме управляемых блокировок. Это означает, что система блокирует не всю таблицу, а только конкретные записи, соответствующие измерениям регистра (например, сочетанию Организация + Период).
Рассмотрим ситуацию: если мы запускаем проведение документов по «Организации №1» и одновременно по «Организации №2», эти процессы не будут конфликтовать между собой на уровне логики 1С, так как они работают с разными наборами данных в регистрах. Это дает нам фундаментальную возможность для распараллеливания.
Это самый простой и быстрый в реализации метод, который не требует написания сложного кода. Выясним, как это реализовать на практике:
Таким образом, нагрузка распределится по ядрам процессора сервера 1С, и каждый сеанс будет обрабатывать свою порцию данных. Это особенно эффективно, если в базе ведется учет по десяткам или сотням организаций.
Для более продвинутой автоматизации мы можем создать внешнюю обработку, которая будет самостоятельно делить массив документов на «пакеты» и запускать их обработку в фоновом режиме на сервере. Разберем пример логики такого кода:
// Пример упрощенной логики запуска фоновых заданий
Процедура ЗапуститьПараллельноеПроведение(МассивОрганизаций)
Для Каждого ТекущаяОрганизация Из МассивОрганизаций Цикл
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(ТекущаяОрганизация);
ПараметрыЗадания.Добавить(НачалоПериода);
ПараметрыЗадания.Добавить(КонецПериода);
НаименованиеЗадания = "Проведение_" + ТекущаяОрганизация.Наименование;
// Запуск фонового задания на сервере
ФоновыеЗадания.Выполнить("МойОбщийМодуль.ПровестиДокументыПоОрганизации", ПараметрыЗадания, , НаименованиеЗадания);
КонецЦикла;
КонецПроцедуры
При использовании этого метода стоит учитывать количество доступных рабочих процессов на сервере 1С. Не рекомендуется запускать количество потоков, значительно превышающее количество ядер процессора, так как это может привести к деградации производительности из-за чрезмерного переключения контекста.
Проанализируем ситуацию: значительная часть времени при проведении тратится не на саму запись документа, а на обновление итогов по регистрам бухгалтерии и накопления. Если вам нужно перепровести огромный объем данных за прошлый год, самым эффективным решением будет временное отключение расчета итогов.
Выполним следующие шаги:
Даже если мы идеально разделили проведение по организациям, мы можем столкнуться с блокировками на уровне СУБД (MS SQL Server или PostgreSQL). Посмотрим на основные причины:
Конфликты в TempDB: При активной параллельной записи 1С активно использует временные таблицы. Чтобы избежать очередей, рекомендуется разделить файл базы данных TempDB на несколько файлов одинакового размера (по количеству ядер CPU).
Блокировки по общим таблицам: В БП 3.0 существуют системные таблицы (например, настройки программы или кэш конфигурации), к которым могут обращаться все потоки одновременно. Чтобы минимизировать конфликты, рассмотрим возможность запуска потоков с небольшой задержкой в 5–10 секунд, чтобы транзакции не стартовали в одну и ту же миллисекунду.
Важно помнить, что в «1С:Бухгалтерия 3.0» существует механизм последовательностей. Если ваша задача — не просто «провести документы», а восстановить правильную последовательность для корректного расчета себестоимости и партионного учета, то параллельное проведение внутри ОДНОЙ организации невозможно. Последовательность по определению требует строгого порядка: документ №2 не может быть проведен раньше документа №1, если они влияют на остатки одних и тех же ресурсов.
Однако распараллеливание между разными организациями остается полностью легитимным и безопасным методом, так как в БП 3.0 для каждой организации фактически строится своя независимая цепочка расчетов в рамках общих регистров (при условии отсутствия межхозяйственных операций).
Подводя итог, можно составить следующий план действий для максимально быстрого проведения документов:
TempDB на SQL-сервере.Применяя эти методики в комплексе, вы сможете сократить время проведения документов с нескольких дней до нескольких часов, успешно соблюдая сроки сдачи отчетности.