При работе с объемными документами или коллекциями данных в управляемом приложении 1С разработчики и системные администраторы нередко сталкиваются с ситуацией, когда сама запись объекта в базу данных занимает доли секунды, а интерактивное сохранение формы длится минуты. Причиной такого поведения часто становится процесс сжатия и сериализации контекста формы при передаче по сети.
Проанализируем природу этой проблемы, рассмотрим замеры производительности при различных алгоритмах сжатия, а также разберем способы решения задачи как на уровне инфраструктуры, так и на уровне архитектуры прикладного решения.
По умолчанию платформа 1С:Предприятие при взаимодействии между клиентским приложением и сервером использует проприетарный алгоритм сжатия трафика (SDC). Данный алгоритм проектировался с расчетом на медленные каналы связи (такие как мобильные сети и модемные соединения), поэтому он ориентирован на максимальный коэффициент компрессии в ущерб производительности процессора.
Компрессия и декомпрессия выполняются в один поток. Когда управляемая форма передает на сервер коллекцию из десятков тысяч строк (например, большую табличную часть документа), сериализованный пакет данных может достигать десятков мегабайт. В этот момент процесс клиента 1cv8c и рабочий процесс сервера rphost упираются в 100% загрузки одного процессорного ядра, затрачивая сотни секунд исключительно на упаковку и распаковку данных.
Для наглядности рассмотрим тестовую процедуру замера времени на форме документа, которая разделяет этапы преобразования типов, серверной записи и сетевой передачи:
&НаСервере
Процедура ЗаписатьОбъектНаСервере(НачалоПередачи, КонецПередачи)
КонецПередачи = ТекущаяУниверсальнаяДатаВМиллисекундах();
ВремяПередачи = (КонецПередачи - НачалоПередачи) / 1000;
Сообщить("Время передачи данных на сервер: " + ВремяПередачи);
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
ДокОбъект = ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.ЗП_НачислениеЗарплаты"));
Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Время преобразования в объект: " + ((Конец - Начало) / 1000));
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Время записи в СУБД: " + ((Конец - Начало) / 1000));
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЗначениеВДанныеФормы(ДокОбъект, Объект);
Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Время преобразования из объекта: " + ((Конец - Начало) / 1000));
Модифицированность = Ложь;
НачалоПередачи = ТекущаяУниверсальнаяДатаВМиллисекундах();
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьЗапись(Команда)
Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
НачалоПередачи = Начало;
КонецПередачи = Неопределено;
ЗаписатьОбъектНаСервере(НачалоПередачи, КонецПередачи);
КонецПередачи = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Время возврата с сервера: " + ((КонецПередачи - НачалоПередачи) / 1000));
Конец = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("Общее время выполнения: " + ((Конец - Начало) / 1000));
КонецПроцедуры
Замеры на массиве в 30 000 строк показывают следующие результаты в зависимости от настроек компрессии:
Штатная архитектура платформы 1С:Предприятие не предусматривает параметров кластера или конфигурационного файла conf.cfg, которые позволяли бы принудительно запретить сжатие со стороны сервера для всех входящих подключений. Параметры сетевого протокола и уровень компрессии всегда инициируются и запрашиваются клиентским приложением при установке сеанса.
Файл публикации веб-сервисов и приложений default.vrd также не содержит параметров переопределения ключа /TComp, и добавление директив в строку соединения ib= игнорируется платформой.
Тем не менее, существует несколько проверенных способов централизованного управления сжатием.
Для управления режимом сжатия на клиентских рабочих станциях используется параметр командной строки /TComp со следующими ключами:
/TComp -None — полное отключение сжатия данных./TComp -Deflate — использование стандартного быстрого алгоритма Deflate./TComp -SDC — использование стандартного алгоритма сильного сжатия 1С./TComp -lz4 или /TComp -zstd — использование современных высокоскоростных алгоритмов (доступно в актуальных версиях платформы).Чтобы не настраивать параметры вручную на сотнях компьютеров, разберем настройку через общий список баз:
.v8i на общедоступном сетевом ресурсе.AdditionalParameters=/TComp -Deflate (или -None).1cestart.cfg, указав путь к нему в параметре CommonInfoBases.При использовании веб-клиента в браузере проприетарное сжатие 1С не используется — обмен данными осуществляется по протоколу HTTP/HTTPS, а компрессия выполняется веб-сервером.
Если наблюдается избыточная нагрузка на процессор веб-сервера при формировании тяжелых ответов, сжатие настраивается средствами самого веб-сервера:
httpd.conf или в секции каталога публикации отключим модуль mod_deflate либо закомментируем директивы SetOutputFilter DEFLATE.Отключение сжатия нивелирует задержку процессора, но передача десятков мегабайт контекста формы остается архитектурной ошибкой. Передача объекта типа ДанныеФормыКоллекция на клиент и обратно требует полной сериализации всех колонок и строк.
Для кардинального решения проблемы длительной записи рекомендуется применить следующие архитектурные подходы:
ФоновыеЗадания.Выполнить().