Часто пользователи 1С:Бухгалтерия (БП) сталкиваются с неприятной ситуацией: при попытке отправить счет или любой другой документ по электронной почте система «задумывается» на 20–30 секунд. Это происходит сразу после выбора печатной формы, но до того, как появится само окно подготовки сообщения. В данной статье мы подробно разберем, как локализовать проблему, проанализируем технические причины такой задержки и рассмотрим способы оптимизации процесса.
Первым делом нам необходимо понять, на каком именно этапе происходит задержка. Для этого воспользуемся встроенным инструментом Замер производительности. Рассмотрим алгоритм действий:
-debug).В ходе анализа результатов замера мы можем увидеть, что основное время (иногда более 15–20 секунд) тратится на серверный вызов. Чаще всего проблемным местом оказывается функция:
ПараметрыПисьма = ОтправкаПочтовыхСообщенийВызовСервера.ПараметрыЭлектронногоПисьма(ОписаниеКоманд, ЕстьОшибки, ДополнительныеПараметры);
Проанализируем, что происходит внутри этой функции. Выяснится, что система выполняет цикл по описанию команд печати и подготавливает вложения.
Разберем типичный участок кода в общем модуле, который отвечает за подготовку данных для письма. Рассмотрим пример кода, где происходит задержка:
ПечатныеФормы = Новый Массив;
Для Каждого ОписаниеКоманды Из ОписаниеКоманд Цикл
Если ЗначениеЗаполнено(ОписаниеКоманды.Обработчик) Тогда
ИмяОбработчика = ОписаниеКоманды.Обработчик;
Обработчик = ИмяОбработчика + "(ОписаниеКоманды, ЕстьОшибки)";
ПечатныеФормыОбъекта = Вычислить(Обработчик); // Здесь может быть задержка
ИначеЕсли ОписаниеКоманды.МенеджерПечати = "СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки" Тогда
ПечатныеФормыОбъекта = ОтправкаПочтовыхСообщений.ПечатныеФормыИзВнешнегоИсточника(ОписаниеКоманд);
Иначе
ПечатныеФормыОбъекта = ОтправкаПочтовыхСообщений.ПечатныеФормы(ОписаниеКоманд);
КонецЕсли;
Если ПечатныеФормыОбъекта <> Неопределено Тогда
ПечатныеФормы.Добавить(ПечатныеФормыОбъекта);
КонецЕсли;
КонецЦикла;
ПараметрыПисьма = ОтправкаПочтовыхСообщений.ПараметрыЭлектронногоПисьма(ПечатныеФормы, ОписаниеКоманды.МенеджерПечати, ДополнительныеПараметры);
В данном цикле система динамически вызывает обработчики печати. Функция Вычислить() или вызовы методов ОтправкаПочтовыхСообщений.ПечатныеФормы инициируют реальное формирование табличного документа на сервере и его последующую конвертацию в формат PDF или MXXL.
Рассмотрим подробнее, почему вышеуказанный код может работать медленно. Выделим несколько основных факторов:
1. Проблемы с сетевыми таймаутами и DNS
Одной из скрытых причин является наличие в подписи письма (или в HTML-шаблоне) ссылок на внешние изображения (например, логотип компании, размещенный на корпоративном сайте). При подготовке параметров письма сервер 1С пытается «выкачать» эти изображения для формирования тела сообщения. Если у сервера нет прямого доступа в интернет или возникают задержки в работе DNS, система будет ждать ответа до истечения таймаута (обычно 15–20 секунд), что и видит пользователь как «зависание».
2. Сложность формирования печатной формы
Если печатная форма содержит тяжелые графические элементы или сложные запросы к базе данных (например, расчет остатков на лету для каждой строки счета), то формирование ПечатныеФормыОбъекта займет значительное время. Проверьте, быстро ли открывается та же самая форма при обычном просмотре на экране.
3. Ограничения доступа (RLS)
Проанализируем ситуацию, когда включены ограничения прав доступа на уровне записей. При поиске контактной информации контрагента (адреса электронной почты) система выполняет запросы к регистрам сведений. Если индексы не оптимизированы или правила RLS слишком сложны, поиск основного e-mail может занимать секунды, которые суммируются при переборе нескольких получателей.
4. Особенности работы с PDF на сервере
Конвертация табличного документа в PDF — ресурсоемкая операция. На серверах под управлением Linux отсутствие необходимых шрифтов или библиотек рендеринга может приводить к значительным задержкам. Посмотрим на объем итогового файла: если логотипы вставлены в печатную форму в сверхвысоком разрешении, процесс обработки каждого вложения замедлится.
Иногда процессы отправки или подготовки данных уходят в фоновые задания. Чтобы «поймать» их в замере производительности, необходимо выполнить специальную настройку в Конфигураторе:
После того как мы выяснили причину, применим соответствующие меры:
RLS.Таким образом, проблема долгого открытия окна отправки письма чаще всего кроется в серверной подготовке данных — либо в медленном формировании самой печатной формы, либо в ожидании сетевых ответов при парсинге HTML-шаблонов подписей.