Вопрос о том, почему система «1С:Предприятие» часто нагружает лишь одно ядро центрального процессора, является одним из самых обсуждаемых среди системных администраторов и разработчиков. При запуске отчетов или проведении сложных документов пользователи нередко наблюдают картину: один логический процессор загружен на 100%, в то время как остальные простаивают. Это создает ощущение неэффективности использования дорогостоящего серверного оборудования.

На самом деле ситуация не столь однозначна. Платформа 1С:Предприятие эволюционировала, и современные версии поддерживают многопоточность, однако существуют фундаментальные архитектурные ограничения, которые мешают полноценному распараллеливанию вычислений. Понимание этих ограничений критически важно для правильной настройки сервера и написания оптимизированного кода.

В данной статье мы детально разберем механизмы работы с памятью, блокировки данных и особенности исполнения кода на стороне клиента и сервера. Вы узнаете, в каких ситуациях многопоточность работает, а где она физически невозможна из-за требований к целостности данных.

Архитектурные особенности платформы 1С

Исторически сложилось так, что платформа разрабатывалась в эпоху, когда одноядерные процессоры были стандартом индустрии. Основная архитектура исполнения кода ориентирована на последовательную обработку транзакций. Это гарантирует строгую консистентность данных, но накладывает ограничения на параллелизм. Ключевым элементом здесь является контекст выполнения, который часто привязан к одному потоку операционной системы.

Когда вы запускаете тяжелый отчет, система создает поток, который начинает последовательно выбирать записи из базы данных, обрабатывать их и формировать результат. Даже если у вашего сервера 32 ядра, этот конкретный поток будет использовать ресурсы только одного из них. Операционная система не может magically разделить один поток на несколько ядер без явной поддержки со стороны приложения.

Однако, важно различать работу клиентского приложения и сервера 1С:Предприятия. Сервер процессов rphost может запускать множество экземпляров для разных пользователей. В этом случае нагрузка распределяется между ядрами за счет того, что разные пользователи работают в разных процессах. Но внутри одного сеанса одного пользователя ограничение на одно ядро сохраняется для большинства операций.

⚠️ Внимание: Поведение платформы может отличаться в зависимости от режима работы (файловый или клиент-серверный). В файловом варианте ограничения на многопоточность выражены гораздо сильнее из-за механизмов блокировки файла базы данных.

📊 С каким режимом работы 1С вы чаще всего сталкиваетесь?
Файловый вариант
Клиент-серверный вариант (SQL)
Облачный сервис (SaaS)
Тонкий клиент через веб

Проблема блокировок и целостности данных

Главной причиной, по которой трудно распараллелить вычисления в 1С, является необходимость обеспечения целостности данных. Представьте ситуацию, когда два потока одновременно пытаются изменить saldo счета или количество товара на складе. Без жесткого контроля это приведет к потере данных или дублированию проводок.

Платформа использует механизмы блокировок для предотвращения таких коллизий. Когда один поток захватывает блокировку на объект метаданных или запись в регистре, другие потоки вынуждены ожидать ее снятия. Это явление называется конкуренция за ресурсы. В результате, даже если код теоретически можно выполнить параллельно, система принудительно переводит его в последовательный режим.

Особую роль играют транзакции. В момент начала транзакции НачатьТранзакцию() система фиксирует состояние данных. Любые попытки изменить эти данные извне или из параллельных потоков внутри той же сессии блокируются. Это гарантирует, что итоговый результат будет предсказуемым, но ценой производительности на многоядерных системах.

  • 🔒 Монопольные блокировки полностью запрещают доступ другим процессам к объекту до завершения операции.
  • 🔄 Управляемые блокировки позволяют читать данные, но запрещают запись, что также может вызывать очереди ожиданий.
  • Взаимоблокировки (Deadlocks) возникают, когда два потока ждут ресурсы друг друга, замораживая работу системы целиком.
Что такое Deadlock в 1С?

Взаимоблокировка возникает, когда Поток А держит ресурс 1 и ждет ресурс 2, а Поток Б держит ресурс 2 и ждет ресурс 1. Платформа 1С имеет встроенный монитор блокировок, который автоматически убивает одну из транзакций-жертв для разблокировки системы.

Клиент-серверное взаимодействие и сетевые задержки

Часто проблема «одного ядра» является иллюзией, вызванной архитектурой распределенных вычислений. В режиме клиент-сервер код выполняется частями: логика на клиенте, выборка данных на сервере. Передача данных между ними происходит по сети, и это последовательный процесс.

Если ваш код содержит цикл, в котором на каждой итерации происходит обращение к серверу за данными, то все выполнение сводится к последовательной цепочке запросов-ответов. Сервер может обрабатывать запрос быстро, используя свои ресурсы, но клиентский процесс будет ждать ответа, нагружая лишь один поток ожидания. Это классическая ошибка проектирования, известная как N+1 проблема.

Для минимизации влияния сети необходимо максимально переносить вычисления на сторону сервера. Использование серверных вызовов и пакетной обработки данных позволяет снизить количество переключений контекста и сетевых пакетов. Однако, даже в этом случае, итоговая сборка результата часто происходит в однопоточном режиме.


// Пример неоптимального кода (вызовы в цикле)

Для каждого Элемент из СписокНоменклатуры Цикл

Данные = ПолучитьДанныеССервера(Элемент); // Сетевой вызов

Обработать(Данные);

КонецЦикла;

// Пример оптимизированного кода (пакетная выборка)

Данные = ПолучитьВсеДанныеСписком(СписокНоменклатуры);

Для каждого СтрокаДанных из Данные Цикл

Обработать(СтрокаДанных);

КонецЦикла;

💡

Используйте временные таблицы на сервере для промежуточных вычислений. Это позволяет обрабатывать большие объемы данных внутри одного контекста сервера 1С, минуя лишний сетевой обмен с клиентом.

Возможности многопоточности в современных версиях

Начиная с версии 8.3.10, платформа 1С внедрила механизмы фонового выполнения заданий. Это позволяет выносить длительные операции в отдельные потоки, не блокируя основной интерфейс пользователя. Хотя это не дает линейного ускорения за счет всех ядер CPU для одной задачи, это повышает общую отзывчивость системы.

Фоновые задания выполняются асинхронно. Основной поток продолжает работать (например, отрисовывать интерфейс), пока фоновый поток занимается расчетами. Важно понимать, что фоновое задание все равно будет исполняться на одном ядре, но это уже другое ядро, отличное от того, на котором работает основной интерфейс.

Также существует возможность использования внешних компонент и расширений, написанных на языках, поддерживающих настоящий параллелизм (например, C# или C++). Такие компоненты могут создавать собственные потоки и задействовать несколько ядер для математических вычислений, возвращая в 1С уже готовый результат.

Механизм Использование ядер Блокировка интерфейса Сложность внедрения
Стандартный код 1 ядро Да (полная) Низкая
Фоновое задание 1 ядро (отдельное) Нет Средняя
Внешняя компонента Много ядер Зависит от реализации Высокая
Кластер серверов Распределение по узлам Нет (для других пользователей) Высокая

Оптимизация запросов и работа с СУБД

Значительную часть времени выполнения тяжелых задач занимает работа с системой управления базами данных (СУБД), такой как Microsoft SQL Server или PostgreSQL. Сама СУБД является высокопроизводительной многопоточной системой и умеет эффективно использовать все доступные ядра процессора для параллельного выполнения планов запросов.

Проблема возникает на этапе передачи данных из СУБД в память процесса 1С. Платформа 1С получает данные последовательным потоком. Если запрос возвращает миллион строк, процесс 1С будет занят их приемом и размещением в собственной памяти, что является однопоточной операцией. Здесь узким местом становится не мощность CPU, а пропускная способность канала между СУБД и 1С.

Для решения этой проблемы необходимо оптимизировать текст запроса. Использование индексированных полей, отказ от функций в условиях соединения и правильная структура временных таблиц позволяют СУБД отдать данные быстрее. Чем быстрее СУБД отдаст данные, тем меньше времени процесс 1С будет занят их приемом.

⚠️ Внимание: Настройки максимального количества потоков для параллельного выполнения запросов регулируются на стороне СУБД, а не в конфигураторе 1С. Проверьте параметры max degree of parallelism в SQL Server, если наблюдаете простои на уровне базы данных.

☑️ Оптимизация тяжелого отчета

Выполнено: 0 / 5

Стратегии масштабирования и обхода ограничений

Поскольку изменить фундаментальную архитектуру исполнения кода 1С невозможно, администраторы и разработчики вынуждены искать обходные пути. Основная стратегия заключается в горизонтальном масштабировании. Вместо того чтобы пытаться ускорить одну задачу, система настраивается так, чтобы одновременно выполнять много разных задач.

Настройка кластера серверов 1С позволяет гибко распределять рабочие процессы rphost. Вы можете ограничить количество сеансов на один процесс, заставляя систему запускать больше процессов. Это позволит загрузить все ядра сервера за счет параллельной работы разных пользователей, даже если каждый пользователь по-прежнему будет использовать только одно ядро для своих задач.

Для критически важных вычислений, таких как закрытие месяца или расчет себестоимости, рекомендуется использовать выделенные серверы или запускать эти процедуры в ночное время, когда конкуренция за ресурсы минимальна. Также эффективным методом является разделение базы данных на информационные базы по функциональному признаку.

💡

Горизонтальное масштабирование (увеличение количества рабочих процессов) является единственным эффективным способом загрузить многоядерный сервер в среде 1С при большом количестве пользователей.

Часто задаваемые вопросы (FAQ)

Почему диспетчер задач показывает 100% загрузку только одного ядра при проведении документа?

Это нормальное поведение для транзакционных операций в 1С. Проведение документа требует последовательной записи данных в регистры с соблюдением блокировок, что физически не может быть выполнено параллельно в рамках одной транзакции.

Увеличит ли покупка процессора с большим количеством ядер скорость работы 1С?

Для одного пользователя — нет, скорость выполнения конкретной операции не изменится. Однако, если у вас много пользователей, дополнительный запас ядер позволит серверу обрабатывать больше одновременных запросов без очередей.

Можно ли заставить 1С использовать все ядра для одного отчета?

Стандартными средствами языка 1С — нет. Для этого требуется написание внешней компоненты на компилируемом языке (C++, C#), которая реализует многопоточный алгоритм и вернет результат в 1С.

Влияет ли частота процессора на скорость работы 1С?

Да, влияет напрямую. Поскольку большинство задач выполняются в одном потоке, высокая тактовая частота (GHz) важнее количества ядер для производительности отдельных операций пользователя.

Поможет ли переход на SSD решить проблему одного ядра?

Переход на SSD не заставит 1С использовать несколько ядер, но значительно сократит время ожидания данных с диска. Это снизит общую длительность операции, сделав простое ядра менее заметным для пользователя.