Публикация предназначена в первую очередь для программистов, ведущих разработку ПО в крупных информационных системах с массивным потоком обрабатываемой информации и большим количеством пользователей.
Я изучаю вопросы оптимизации более 15 лет, за это время участвовал и руководил проектами оптимизации информационных систем на базе различных конфигураций 1С практически во всех областях учета. На мой взгляд, первопричина зависаний и плохой работы программы 1С - некачественный программный код модулей этой самой 1С. Если у вас проблемы с производительностью системы, вы можете устанавливать супер современное оборудование, тратить месяцы на обучение продвинутых пользователей, пробовать любые тонкие настройки ИТ-техники - без оптимизации программного кода, рано или поздно, вы столкнетесь с теми же проблемами производительности, а зачастую с более серьезными.
Поэтому данная статья посвящена исключительно программной оптимизации.
Во-первых, давайте определимся, что же такое качественный код. Я использую очень простое и понятное определение правильного программного кода:"Нечего добавить и нечего убрать". Т.е. если при взгляде на код модуля вы понимаете, что ни один логический блок нельзя убрать или заменить более оптимальной структурой, не испортив требуемого функционала - будем считать, что это лучшая реализация из возможных, код качественный и работа по его улучшению завершена.
Во-вторых, при оценке программного кода необходимо руководствоваться здравым смыслом и не рассматривать его исключительно через призму рекомендаций 1С. В крупных информационных системах действуют свои законы и правила работы с данными. Очень часто, следуя рекомендациям 1С, мы достигаем противоположного эффекта. Для примера - использование временных таблиц. Из личного опыта: в 90% случаев причина зависаний и отказов 1С в клиент-серверном режиме - бездумное и необоснованное использование команды "Поместить" при построении запросов к базе данных.
В рамках этой публикации хочу остановиться на одном из самых узких мест с точки зрения производительности - обработке записи/проведения документов. Ниже представлена многократно проверенная методика оптимизации модулей проведения. Описанные методы и объекты помещены в небольшую конфигурацию, выгрузка демонстрационной базы во вложении.
Используемые в публикации скриншоты созданы из вложенной демонстрационной базы.
Рекомендую на этапе разработки использовать тестовую копию рабочей базы с тем же режимом работы (файл/сервер). Для приближения условий тестирования в тестовой базе к реальным условиям работы, в предлагаемой методике реализована возможность запуска нагрузочных сессий для имитации рабочего режима.
I. Подготовка конфигурации.
Выгружаем конфигурацию из демонстрационной базы и добавляем из нее в оптимизируемую конфигурацию новые объекты :
- справочник "Дополнительные константы" для хранения настроек;
- общий модуль "МодульОптимизация" с сервисными функциями и процедурами;
- параметр сеанса "ВклОптимизации" для переключения режима использования модулей (исходных/оптимизированных). Добавляем в модуль сеанса его инициализацию;
- регистр "ОтложенноеПроведениеДокументов" для формирования очереди отложенного проведения документов. Используется для исключения конфликтов блокировок.
- обработка "Регламент" для запуска регламентных заданий в файловом режиме работы (демонстрация отложенного проведения).
- обработка "ТестПроведения" для анализа результатов оптимизации.
- обработка "ТестоваяНагрузка" для дополнительной нагрузки системы во время теста.
Не забываем добавить права на новые объекты в общедоступную роль.
Подсистема реализует следующие возможности:
- Автоматический запуск указанного количества нагрузочных сессий для приближения условий теста в тестовой базе к реальным условиям работы.
- Включение/выключение использования оптимизированного кода "на лету" в режиме предприятия;
- Включение/выключение использования оптимизированного кода только для выбранных пользователей;
- Включение/выключение использования оптимизированного кода только для выбранных функций и процедур оптимизируемых модулей;
- Включение режима отложенного проведения документов. При этом выбранные документы выстраиваются в очередь и проводятся регламентом на сервере. Исключается длительное ожидание проведения документа пользователем. Исключаются блокировки за счет последовательного проведения.
- Автоматическая сверка движений документов, проведенных с вкл/выкл режимом оптимизации.
II. Определение проблемных зон кода
1. Информацию о проблемах при проведении получаем от наших пользователей - они предоставляют ее в избытке.
2. Выбираем объект, работа которого наиболее критична для бизнеса.
3. В конфигураторе открываем модуль формы обработки "ТестПроведения".
4. Устанавливаем точки останова в процедуре "ВыполнитьТест" до и после основного цикла тестового проведения (в исходной обработке для обычных форм №стр 341 и 444).
5. Запускаем 1С в режиме отладки.
- Открываем в сессии отладки обработку "ВыполнитьТест".
- Выбираем из списка выбора вид тестируемого документа.
- Устанавливаем количество тестовых проведений. Параметр используется для получения более точных средних показателей.
- Выбираем способ отбора тестируемых объектов: проведение выбранного документа или проведение выборки за период.
- Выполняем команду "Выполнить тестирование".
6. При остановке на первой точке останова включаем режим замера производительности и продолжаем отладку:
7. При остановке на второй точке останова отключаем режим замера производительности, в окне результата замера, начиная с первой строки, фиксируем области с наиболее длительным выполнением.
8. Продолжаем отладку. После завершения теста в окне сообщений отобразится результат замеров с временными показателями. Собственно уменьшение этих показателей и является нашей целью:
III. Анализ и исправление проблемных зон
1. Переходим к найденным участкам кода, анализируем на возможность оптимизации. О методах оптимизации кода статей множество, поэтому кратко, на что обращаем внимание:
- многократное выполнение одинаковых запросов к БД( к примеру, в цикле), с пониманием того, что получение через точку свойств ссылочных объектов, это так же запросы к БД;
- Использование в тексте запросов инструкции "Поместить". Если есть возможность построить качественный запрос без использования временных таблиц, обязательно используйте эту возможность. Темповая база - это самое узкое место в массивных информационных системах. Проведение через нее потоков данных должно быть серьезно обосновано.
- уровень использования принудительного кеширования для значений, часто используемых в коде (к примеру, ссылок на организацию, статью движения, номенклатуру и пр.). Методов кеширования множество - хранение этих значений в локальных или глобальных переменных типа таблица или структура, подключение функций общих модулей с повторным использованием значений и пр.
2. Если найден сомнительный код и появились идеи по его исправлению, добавляем в общий модуль "МодульОптимизация" копию найденой процедуры(функции) с именем, содержащим префикс <Вид оптимизируемого документа>. Объект документа передаем в параметре.
3. Оптимизируем код в новой процедуре(функции).
4. Добавляем в начало исходной процедуры(функции) переключение по значениям параметра сеанса на новую процедуру(функцию)
5. Повторяем алгоритм, описанный в п.II, но перед запуском команды "Выполнить тестирование" меняем настройки режима тестирования:
устанавливаем флаги "Автоматическое тестирование кода до/после оптимизации" и "Сверка проводок, сформированных до и после включения режима оптимизации":
6. После завершения теста в окне сообщений отобразится результат ваших стараний - показатели до и после использования оптимизированного кода.
IV. Выполняем алгоритмы II и III до тех пор, пока не будут ликвидированы критические проблемы производительности.
V. Если достичь желаемого результата не удается и проведение все равно занимает неприемлемо много времени, перенесите функционал проведения на сервер , используя алгоритм отложенного проведения. Упрощенная схема подобного алгоритма реализована в приложенной демонстрационной базе.
Центральным объектом метода оптимизации является обработка "ТестПроведения". Описание настроек:
- "Количество тестовых попыток записи/проведения документов" определяет количество перепроведений выбранного документа в режиме темта по 1 документу. В режиме теста по выборке за период параметр определяет количество отбираемых документов. Особенность теста по выборке - при повторном тестировании при формировании выборки исключаются документы, участвовавшие в предыдущих тестах.
- Флаг "Оптимизация включена для текущего пользователя" включает режим использования оптимизированных модулей для текещего пользователя.
- Флаг "Оптимизация включена для всех пользователей" включает режим использования оптимизированных модулей для всех пользователей.
- Флаг "Автоматическое тестирование кода до/после оптимизации" включает режим тестирования с автоматическим переключением использования оптимизированных модулей. При этом объекты теста перепроводятся дважды: с использованием исходного кода и с использованием оптимизированных модулей;
- Флаг "Сверка проводок, сформированных до и после включения режима оптимизации" включает режим сверки проводок документа, сформированных оптимизированным и не оптимизированным кодом;
- Флаг "Перезаписывать только проведенные" - для тестирования будут отбираться только проведенные документы;
- Флаг "Режим записи без проведения" - при тестировании документы будут записываться без проведения;
- Флаг "Автозапуск нагрузочных сессий" - перед началом тестирования будут запущены нагрузочные сессии 1С. После окончания теста нагрузочные сессии будут автоматически закрыты;
- "Каталог сохранения лога тестирования" определяет путь к каталогу, в котором автоматически сохранится результат теста;
- Команда "Выполнить тестовое проведение всех документов периода" запускает пакетное перепроведение всех документов выбранного периода. При этом документы перепроводятся партиями по 10, поочередно и в обычном режиме и в режиме оптимизации. Команда предназначена для анализа разультата оптимизации и сверки проводок в потоке.
- Флаг "Выполнить тест процедуры" - при тестировании будет выполнятся только код указанной процедуры;
Настройки нагрузочных сессий:
- "Количество нагрузочных сессий" - количество сессий, которые будут запущены автоматически;
- "Месяц отбора документов для нагрузки" - определение месяца, в пределах которого будут отбираться документы для перепроведения в нагрузочных сессиях;
VI. Запуск режима оптимизации для рабочей базы.
Перед включением режима оптимизации для всех пользователей рабочей базы рекомендую включить оптимизацию для 1-2х пользователей, которые особенно нагружены и недовольны зависаниями и сбоями. Во-первых это даст объективную оценку результата, во-вторых - это дополнительный пользовательский тест алгоритмов, которые в результате проведения оптимизации кода могут существенно отличаться от исходных. Как правило, достаточно эксплуатировать базу в таком режиме 3-5 дней, после чего можно включить режим оптимизации для всех.
Включение и выключение режима оптимизации производится с помощью предопределенного элемента "ВключениеОптимизации" справочника "ДопКонстанты".
Включение и выключение режима для всех пользователей производится установкой поля "Значение" элемента "ВключениеОптимизации" в "Истина" или "Ложь" соответственно. Для этого можно использовать флаг "Оптимизация включена для всех пользователей" в обработке ТестПроведения.
Для включения оптимизированных обработчиков только для конкретного пользователя необходимо добавить в табличную часть "Значения" элемента "ВключениеОптимизации" строку, поместив в поле "Ключ" код пользователя, а в поле "Значение" - значение "Истина".
Для включения/выключения использования определенной оптимизированной процедуры(функции), необходимо добавить в табличную часть "Значения" элемента "ВключениеОптимизации" строку, поместив в поле "Ключ" имя этой процедуры, а в поле "Значение" - значение "Истина" или "Ложь" соответственно.
Все эти настройки реализованы в тестовой демонстрационной базе.
Описанная методика позволяет провести анализ, оптимизацию программного кода, провести сверку результатов работы исходных и оптимизированных алгоритмов формирования проводок документов. При этом, кроме ощущамого прироста производительности, вы получаете возможность представить заказчику результат своей работы в числовых показателях производительности, подтвержденных реальными замерами.
В завершение.
Процесс оптимизации чужого кода - занятие длительное, кропотливое и существенно отличающееся от обычного программного творчества, которым нам, программистам, приходится заниматься. Это бесконечный анализ, поиск новых решений, их реализация, и далеко не каждое решение оказывается удачным. Несмотря на существенный опыт в этой области, на ощутимую оптимизацию конфигурации у меня уходило порой до нескольких месяцев. При этом многие типовые модули приходилось переписывать заново, полностью меняя логику исходных алгоритмов. Но результат этой работы - стабильная рабочая система, в которой сбои и зависания - исключительная редкость. Поэтому, если ваша программа 1С работает не так быстро, как хотелось бы ее пользователям - проведите ревизию программного кода и оптимизируйте его, оно того стоит.