Оптимизация производительности прикладных решений

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

  1. При оптимизации прикладного решения с точки зрения параллельности работы пользователей следует понимать, что пропускная способность системы уменьшается, когда увеличивается продолжительность и количество блокировок, накладываемых на данные. Это происходит при модификации каких-либо данных. Таким образом «узким местом» системы становятся те документы, регистры и справочники, которые пользователи чаще всего используют. Именно по этому стоит разделять данные не только для решений задач предметной области, но и для оптимизации запросов к наиболее часто используемым данным.
  2. Главной особенностью получения информации из базы данных, является то, что при этом блокируются не те записи, которые он возвращает запрос, а те, которые он обработал при обращении к базе данных. Поэтому основная опасность отсутствия подходящих индексов заключается в том, что в этом случае будут блокироваться избыточные записи, так как из за отсутствия индекса запрос вынужден обрабатывать диапазон записей больший, чем следует, и затем перебирать их, выбирая нужные. Поэтому надо проанализировать используемые запросы и убедиться, что структура регистров и варианты индексирования, указанные для реквизитов, соответствуют условиям используемых запросов.
  3. Следует избегать ситуаций, при которых регистр может оказаться пустым, но задействованного в логике оперативного режима работы. Пустой регистр – потенциальный источник избыточной блокировки, так как при обращении к записям этого регистра будет блокироваться вся таблица этого регистра.
  4. Если в этом нет специальной прикладной необходимости, не следует выполнять запись движений регистра в явном виде (с использованием метода Записать() набора записей регистра) в обработке проведения. Все наборы записей движений, модифицированные на момент записи документа, будут записаны автоматически при выходе из обработчика проведения.
  5. Не следует получать поле Ссылка через точку от другого поля, так как при этом будет создаваться дополнительное соединение, которое замедлит выполнение запроса.
  6. Пример не оптимального кода:

    Выбрать
           |РасходнаяНакладная.Дата,
           |РасходнаяНакладная.Номер
           |Из
           |Документ. РасходнаяНакладная КАК РасходнаяНакладная
           |ГДЕ
           |РасходнаяНакладная.Контрагент.Ссылка = &Контрагент
    

    В результате будет создано совершенно ненужное в данном случае соединение с таблицей «Контрагенты», и как следствие, выполнение запроса замедлится. Такой запрос следует переписать следующим образом:

    Выбрать
           |РасходнаяНакладная.Дата,
           |РасходнаяНакладная.Номер
           |Из
           |Документ. РасходнаяНакладная КАК РасходнаяНакладная
           |ГДЕ
           |РасходнаяНакладная.Контрагент = &Контрагент