Исторически в ИТ-сообществе существовал стереотип, что программные продукты семейства «1С:Предприятие 8» ориентированы исключительно на малый и средний бизнес. Считалось, что системы свыше 1 000 – 2 000 одновременно работающих пользователей — это предел возможностей платформы, а для крупных транснациональных холдингов и корпораций подходят только тяжелые зарубежные ERP-системы. Однако масштабные процессы импортозамещения последних лет доказали обратное.
В этой статье мы подробно проанализируем реальные кейсы сверхкрупных внедрений «1С» на десятки тысяч рабочих мест, разберем архитектурные подходы к проектированию таких систем, а также рассмотрим результаты официальных высоконагруженных тестирований.
Проанализируем официальные данные крупнейших проектов автоматизации, подтвержденных отзывами заказчиков и сертифицированными партнерами фирмы «1С»:
1С:Зарплата и управление персоналом КОРП. Помимо этого, активно используется 1С:Управление холдингом для централизованного управления закупками, где одновременно работают более 1 500 специалистов по закупкам.1С:ERP к 2028 году. Уже сейчас автоматизированы процессы управления автотранспортом, ремонтами и другими ключевыми активами.1С:ERP Управление холдингом. Это уникальный пример масштабной ERP-системы, развернутой на полностью импортонезависимом технологическом стеке.При проектировании систем для тысяч пользователей перед архитекторами всегда встает вопрос: объединять все процессы в одной информационной базе или строить распределенную систему (РИБ)? Выясним преимущества и особенности каждого подхода.
Исторически крупные холдинги использовали распределенную архитектуру (РИБ — распределенные информационные базы). Каждый филиал работал локально в своей базе, а данные консолидировались в центральном узле с помощью регулярных обменов. Это решало проблему узких мест в производительности оборудования и медленных каналов связи.
Однако современный тренд направлен на максимальную централизацию. Крупный бизнес выбирает работу в единой базе данных в ЦОД. Это обеспечивает:
Для реализации такой схемы требуются выделенные специалисты по технологическим вопросам «1С» (эксперты по производительности), которые контролируют весь жизненный цикл разработки и администрирования.
Чтобы доказать скептикам возможность стабильной работы огромного числа сотрудников в единой базе, фирма «1С» совместно с технологическими партнерами провела официальное нагрузочное тестирование системы 1С:ERP Управление предприятием.
Проанализируем параметры этого теста:
PostgreSQL под управлением операционной системы семейства Linux;Для того чтобы ваша система выдерживала тысячи пользователей без критических блокировок и зависаний, необходимо соблюдать строгие правила разработки. Рассмотрим основные методы борьбы с избыточными блокировками СУБД.
При выполнении массовой обработки данных в транзакции всегда следует разделять весь объем данных на небольшие пакеты. Это предотвращает эскалацию блокировок таблиц СУБД. Рассмотрим пример правильной организации пакетной обработки данных на встроенном языке «1С»:
// Пример оптимизированной пакетной обработки данных для высоконагруженных систем
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказыКлиентов.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказыКлиентов
|ГДЕ
| ЗаказыКлиентов.Проведен И НЕ ЗаказыКлиентов.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
РазмерПакетнойТранзакции = 100;
Счетчик = 0;
НачатьТранзакцию();
Пока Выборка.Следующий() Цикл
Попытка
// Блокируем только конкретный документ для исключения взаимоблокировок
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.ЗаказКлиента");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Выборка.Ссылка);
Блокировка.Заблокировать();
// Выполняем действия с объектом
ДокументОбъект = Выборка.Ссылка.ПолучитьОбъект();
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Счетчик = Счетчик + 1;
// Фиксируем транзакцию порциями для освобождения ресурсов СУБД
Если Счетчик % РазмерПакетнойТранзакции = 0 Тогда
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КонецЕсли;
Исключение
// В случае ошибки отменяем текущую транзакцию и продолжаем работу со следующим пакетом
ОтменитьТранзакцию();
ЗаписатьЛогОшибки(ОписаниеОшибки());
НачатьТранзакцию();
КонецПопытки;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ЗафиксироватьТранзакцию();
КонецЕсли;
При написании запросов также крайне важно следить за тем, чтобы в соединениях не использовались подзапросы или виртуальные таблицы. СУБД не всегда может оптимально построить план запроса в таких условиях. Проанализируем типичную ошибку и правильный вариант решения:
Неправильно (соединение с подзапросом):
ВЫБРАТЬ
Товары.Ссылка,
Цены.Цена
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ Номенклатура, Цена ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних
) КАК Цены ПО Товары.Ссылка = Цены.Номенклатура
Правильно (использование временной таблицы):
// Сначала выбираем данные во временную таблицу
ВЫБРАТЬ
ЦеныСрез.Номенклатура КАК Номенклатура,
ЦеныСрез.Цена КАК Цена
ПОМЕСТИТЬ ВТ_Цены
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныСрез;
// Индексируем временную таблицу по полям соединения
ИНДЕКСИРОВАТЬ ПО
Номенклатура;
// Выполняем финальное соединение
ВЫБРАТЬ
Товары.Ссылка,
ЕСТЬNULL(ВТ_Цены.Цена, 0) КАК Цена
ИЗ
Справочник.Номенклатура КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Цены КАК ВТ_Цены ПО Товары.Ссылка = ВТ_Цены.Номенклатура;
Практика крупнейших российских холдингов подтверждает: современные версии платформы «1С:Предприятие 8.3» способны эффективно решать задачи автоматизации на уровне 50 000 – 100 000+ рабочих мест. Успех таких проектов зависит от грамотного проектирования архитектуры, привлечения сертифицированных экспертов по производительности и строгого соблюдения стандартов разработки фирмы «1С».