Как отключить или настроить сжатие трафика между клиентом и сервером в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Анализ проблемы: почему стандартное сжатие замедляет передачу данных

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

Компрессия и декомпрессия выполняются в один поток. Когда управляемая форма передает на сервер коллекцию из десятков тысяч строк (например, большую табличную часть документа), сериализованный пакет данных может достигать десятков мегабайт. В этот момент процесс клиента 1cv8c и рабочий процесс сервера rphost упираются в 100% загрузки одного процессорного ядра, затрачивая сотни секунд исключительно на упаковку и распаковку данных.

Для наглядности рассмотрим тестовую процедуру замера времени на форме документа, которая разделяет этапы преобразования типов, серверной записи и сетевой передачи:


&НаСервере
Процедура ЗаписатьОбъектНаСервере(НачалоПередачи, КонецПередачи)
    
    КонецПередачи = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ВремяПередачи = (КонецПередачи - НачалоПередачи) / 1000;
    Сообщить("Время передачи данных на сервер: " + ВремяПередачи);
    
    Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ДокОбъект = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ЗП_НачислениеЗарплаты"));
    Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Время преобразования в объект: " + ((Конец - Начало) / 1000));
    
    Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
    Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Время записи в СУБД: " + ((Конец - Начало) / 1000));
    
    Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
    ЗначениеВДанныеФормы(ДокОбъект, Объект);
    Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Время преобразования из объекта: " + ((Конец - Начало) / 1000));
    
    Модифицированность = Ложь;
    НачалоПередачи = ТекущаяУниверсальнаяДатаВМиллисекундах();
    
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьЗапись(Команда)
    
    Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
    НачалоПередачи = Начало;
    КонецПередачи = Неопределено;
    
    ЗаписатьОбъектНаСервере(НачалоПередачи, КонецПередачи);
    
    КонецПередачи = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Время возврата с сервера: " + ((КонецПередачи - НачалоПередачи) / 1000));
    
    Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Общее время выполнения: " + ((Конец - Начало) / 1000));
    
КонецПроцедуры

Замеры на массиве в 30 000 строк показывают следующие результаты в зависимости от настроек компрессии:

  1. Стандартное сжатие платформы (SDC): объем передаваемого трафика минимален (~345 Кб), однако общее время передачи и обработки составляет 248 секунд из-за интенсивной нагрузки на одно процессорное ядро.
  2. Сжатие Deflate: объем трафика увеличивается незначительно (~392 Кб), но время выполнения сокращается до 157 секунд (выигрыш около 35%).
  3. Отключение сжатия (None): объем трафика возрастает до исходных 17 Мб, время выполнения составляет 160 секунд (чистая сериализация без накладных расходов на компрессию). В быстрых локальных сетях (1 Гбит/с и выше) передача 17 Мб занимает доли секунды.

Возможно ли отключить сжатие глобально на стороне сервера 1С

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

Файл публикации веб-сервисов и приложений default.vrd также не содержит параметров переопределения ключа /TComp, и добавление директив в строку соединения ib= игнорируется платформой.

Тем не менее, существует несколько проверенных способов централизованного управления сжатием.

Способ 1. Централизованная настройка тонкого клиента через списки баз

Для управления режимом сжатия на клиентских рабочих станциях используется параметр командной строки /TComp со следующими ключами:

  1. /TComp -None — полное отключение сжатия данных.
  2. /TComp -Deflate — использование стандартного быстрого алгоритма Deflate.
  3. /TComp -SDC — использование стандартного алгоритма сильного сжатия 1С.
  4. /TComp -lz4 или /TComp -zstd — использование современных высокоскоростных алгоритмов (доступно в актуальных версиях платформы).

Чтобы не настраивать параметры вручную на сотнях компьютеров, разберем настройку через общий список баз:

  1. Сформируем централизованный файл описания информационных баз с расширением .v8i на общедоступном сетевом ресурсе.
  2. В свойствах информационной базы укажем строку дополнительных параметров запуска: AdditionalParameters=/TComp -Deflate (или -None).
  3. Подключим общий список баз пользователям через групповые политики (GPO) или общий файл конфигурации 1cestart.cfg, указав путь к нему в параметре CommonInfoBases.

Способ 2. Управление сжатием при работе через веб-сервер (IIS / Apache)

При использовании веб-клиента в браузере проприетарное сжатие 1С не используется — обмен данными осуществляется по протоколу HTTP/HTTPS, а компрессия выполняется веб-сервером.

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

  1. Для Microsoft IIS: в диспетчере служб IIS перейдем к опубликованному приложению 1С, откроем раздел Сжатие (Compression) и снимем флаг Включить динамическое сжатие содержимого (Enable dynamic content compression).
  2. Для Apache: в конфигурационном файле httpd.conf или в секции каталога публикации отключим модуль mod_deflate либо закомментируем директивы SetOutputFilter DEFLATE.

Способ 3. Архитектурная оптимизация передачи данных в коде конфигурации

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

Для кардинального решения проблемы длительной записи рекомендуется применить следующие архитектурные подходы:

  1. Использование динамических списков вместо табличных частей на форме: если пользователю требуется только просмотр большого массива строк, не следует выгружать всю таблицу в контекст формы. Динамический список считывает данные порциями (по 20–50 строк) по мере прокрутки экрана, снижая сетевой трафик и нагрузку на сериализацию практически до нуля.
  2. Обработка данных в фоновом задании на сервере: загрузку, расчет и запись больших массивов данных необходимо выполнять исключительно на стороне сервера без выгрузки в форму. Клиентское приложение должно передавать на сервер только параметры операции (например, ссылку на файл или диапазон расчета) и запускать фоновое задание с помощью ФоновыеЗадания.Выполнить().
  3. Перенос объемных массивов в регистры: если документ содержит более 10 000 строк, целесообразно отказаться от тяжелых табличных частей объекта в пользу подчиненного регистра сведений или регистра накопления, выполняя порционную запись наборов записей на сервере.
← На главную