Часто разработчики сталкиваются с ситуацией, когда простейшая процедура загрузки документов из внешнего источника (например, Excel) в конфигурацию 1С:ERP начинает «зависать» или выполняться недопустимо долго. Казалось бы, документ содержит всего несколько полей, но создание даже сотни объектов растягивается на минуты. Рассмотрим подробнее, какие факторы влияют на производительность, и разберем по шагам методы оптимизации процесса записи и проведения документов.
Проанализируем типичную ошибку в программном коде: использование методов поиска (НайтиПоНаименованию, НайтиПоРеквизиту) внутри цикла обхода строк. Каждый такой вызов — это не просто обращение к памяти, а полноценный, пусть и неявный, запрос к базе данных. Если у вас 200 документов и в каждом вы дважды ищете одного и того же пользователя, система выполнит 400 лишних запросов.
Рассмотрим, как правильно организовать получение ссылок. Выясним причину замедления: постоянные обращения к СУБД. Решением будет вынос поиска за пределы цикла или использование кэширования (соответствия).
Плохой пример:
Для Каждого СтрТз Из ТзЗагрузки Цикл
НовыйДок = Документы.Реестр.СоздатьДокумент();
НовыйДок.Ответственный = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.", Истина);
// ... заполнение полей ...
НовыйДок.Записать();
КонецЦикла;
Оптимизированный вариант:
// Находим ссылку один раз до начала цикла
НужныйПользователь = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.", Истина);
Для Каждого СтрТз Из ТзЗагрузки Цикл
НовыйДок = Документы.Реестр.СоздатьДокумент();
НовыйДок.Ответственный = НужныйПользователь; // Используем готовую ссылку
// ... заполнение полей ...
НовыйДок.Записать();
КонецЦикла;
Если же данные в строках разные (например, разные контрагенты), рекомендуется использовать объект Соответствие для кэширования уже найденных ссылок в рамках текущей сессии загрузки.
Посмотрим на метод Записать(РежимЗаписиДокумента.Проведение). Проведение — это сложный процесс, который в 1С:ERP включает не только запись движений по регистрам, но и выполнение многочисленных проверок, актуализацию взаиморасчетов и работу подписок на события. Если документ не должен делать движений сразу, стоит использовать РежимЗаписиДокумента.Запись.
Проанализируем ситуацию: если запись документа занимает 0.1 секунды, а проведение — 5 секунд, то проблема кроется в ОбработкеПроведения или в общих подписках. Для массовой загрузки данных часто эффективнее сначала просто записать все документы, а затем провести их отдельным регламентным заданием или групповой обработкой в периоды низкой нагрузки на систему.
Выясним, как ускорить запись объекта, если нам нужно обойти стандартные проверки. У каждого объекта в 1С есть свойство ОбменДанными.Загрузка. Установка этого флага в значение Истина сообщает платформе и конфигурации, что данные загружаются «как есть» (например, при переносе из другой базы), и большинство проверок в модулях объекта и подписках на события будут пропущены.
НовыйДок = Документы.ХХХ_РеестрВыданныхПТС.СоздатьДокумент();
// Установка флага для ускорения
НовыйДок.ОбменДанными.Загрузка = Истина;
// Заполнение данных
ЗаполнитьЗначенияСвойств(НовыйДок, СтрТзДок);
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
Важное ограничение: Если установлен флаг Загрузка = Истина, метод Записать с режимом Проведение может выдать ошибку или отработать некорректно, так как проведение подразумевает бизнес-логику, которая в режиме загрузки отключается. Используйте этот флаг только для записи (РежимЗаписиДокумента.Запись).
В конфигурациях уровня ERP даже на самописный документ могут действовать десятки «Общих подписок на события». Разберем наиболее ресурсоемкие из них:
ВерсииОбъектов. При массовой загрузке, такой как загрузка номенклатуры контрагентов, это создает огромную нагрузку на дисковую подсистему и процессор.Если код кажется простым, но «зависает», не нужно гадать — воспользуемся встроенным инструментом отладки. Рассмотрим алгоритм действий:
В открывшемся окне мы увидим таблицу со списком всех выполненных строк кода. Отсортируйте колонку «Чистое время» по убыванию. Чаще всего в топе окажутся:
Записать() — это значит, что время уходит на триггеры БД, RLS или подписки.Проанализируем техническое окружение. 1С:ERP очень чувствительна к скорости работы с временными файлами и логами транзакций. Если база данных работает в режиме Full Recovery Model, файл лога транзакций (.ldf) может мгновенно разрастись при массовой вставке записей, вызывая паузы (Wait) в работе SQL-сервера. Также убедитесь, что антивирус на сервере исключает из проверки рабочие каталоги кластера 1С и файлы базы данных, иначе проверка каждой новой записи антивирусом превратит загрузку в бесконечный процесс.
При использовании подсистемы «Присоединенные файлы» в ERP, обратите внимание, куда физически сохраняются файлы (в базу или на диск). Если на диске настроен сетевой путь (UNC-путь), то любая задержка сети приведет к «зависанию» документа при записи.
Таким образом, комплексный подход — оптимизация поиска, осознанный выбор режима записи, использование механизмов загрузки данных и обязательный замер производительности — позволит ускорить создание документов в десятки раз.