Как ускорить массовую обработку и пометку на удаление документов в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При выполнении регламентных операций, свертке базы или массовой пометке на удаление документов за несколько лет разработчики часто сталкиваются с критическим падением производительности: обработка может выполняться часами или даже сутками. Разберем основные причины медленной работы платформы 1С:Предприятие 7.7 и рассмотрим эффективные способы ускорения пакетной обработки документов.

1. Причины замедления при массовой обработке

Проанализируем факторы, которые сильнее всего тормозят массовую отмену проведения и пометку документов на удаление:

  1. Интерфейсный вывод сообщений: Вызовы функций Сообщить() и Состояние() на каждой итерации цикла приводят к постоянной перерисовке графических элементов окна сообщений и строки состояния. При миллионах строк это перегружает очередь системных сообщений потока и подвешивает интерфейс.
  2. Журнал регистрации (ЖР): Запись каждого системного события в журнал регистрации (файл 1syslog\1cv7.mlg) создает огромный объем дисковых операций ввода-вывода. При включенном ЖР на каждое действие над документом тратится больше времени, чем на само изменение данных в базе.
  3. Пересчет итогов регистров и проверка Точки Актуальности (ТА): Если документы отменяются или удаляются задним числом до текущей ТА, платформа выполняет пересчет временных итогов регистров, что многократно увеличивает нагрузку на СУБД.
  4. Отсутствие пакетных транзакций (Auto-commit): Если цикл не обрамлен явными транзакциями, СУБД фиксирует каждый отдельный документ отдельной операцией, что блокирует дисковую подсистему частыми сбросами буферов.

2. Пошаговая оптимизация штатной обработки

Разберем по шагам порядок действий для максимального ускорения штатной обработки без риска потери целостности структуры данных:

  1. Перенос Точки Актуальности назад: Открываем базу в монопольном режиме, переходим в общий журнал документов, позиционируемся на самый первый документ в базе данных и через контекстное меню (ПКМ) выбираем пункт Установить ТА на документ. Когда ТА установлена в начало периода, при отмене проведения документов пересчет итогов вперед не выполняется, и скорость работы возрастает в разы.
  2. Отключение журнала регистрации: Заходим в конфигуратор в меню Администрирование — Настройка журнала регистрации и временно снимаем все флаги фиксации событий.
  3. Отказ от вывода сообщений на каждом шаге: Полностью закомментируем вызовы Сообщить() внутри тела цикла либо настроим вывод прогресса только через определенные интервалы (например, каждые 500–1000 обработанных документов).
  4. Пакетное объединение в транзакции: Объединяем обработку документов в пачки по 200–500 штук с помощью операторов НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Это радикально снизит нагрузку на дисковую подсистему MS SQL Server.
  5. Обработка системных событий: Добавим вызов функции ОбработкаПрерыванияПользователя() в цикле, чтобы операционная система не помечала окно программы как «Не отвечает».

3. Организация быстрого логирования в файл

Если необходимо отслеживать протокол работы обработки без замедления интерфейса, вывод информации лучше перенаправить в текстовый файл с помощью объекта Scripting.FileSystemObject. Посмотрим на пример оптимизированной функции для записи лога:


// Функция быстрой записи информации в текстовый лог-файл
Функция глЗаписатьВЛогФайл(псИмяЛога, псСтрокаЗаписи) Экспорт
    Перем глКаталогЛогов, вИмяФайлаЛога, fso, вТекстСтрим, вСтрокаДатыВремени;
    
    Если ПустоеЗначение(псСтрокаЗаписи) = 1 Тогда
        Возврат 0;
    КонецЕсли; 
    
    глКаталогЛогов = КаталогИБ() + "Logs\";
    Если ФС.СуществуетФайл(глКаталогЛогов) = 0 Тогда
        ФС.СоздатьКаталог(глКаталогЛогов);
    КонецЕсли; 
    
    вИмяФайлаЛога = глКаталогЛогов + псИмяЛога + ".log";
    fso = СоздатьОбъект("Scripting.FileSystemObject");
    
    Попытка
        вТекстСтрим = fso.OpenTextFile(вИмяФайлаЛога, 8, 1, 0); // Режим дозаписи
    Исключение
        Возврат 0;
    КонецПопытки;
    
    вСтрокаДатыВремени = "" + ТекущаяДата() + " " + ТекущееВремя();
    вТекстСтрим.WriteLine(вСтрокаДатыВремени + " " + псСтрокаЗаписи);
    вТекстСтрим.Close();
    
    Возврат 1;
КонецФункции

4. Массовое удаление прямыми SQL-запросами

Для опытных специалистов самым быстрым способом свертки или удаления документов является прямое выполнение инструкций SQL. Проанализируем структуру таблиц 1С 7.7, которые необходимо очистить или модифицировать:

  1. Общий журнал документов: Таблица _1SJOURN. Для пометки на удаление достаточно изменить флаги в поле CLOSED. Для полного физического удаления выполняется DELETE FROM _1SJOURN WHERE ....
  2. Таблицы шапки и табличной части: Таблицы вида DH<ID> и DT<ID>, где <ID> — идентификатор конкретного вида документа из файла словаря 1Cv7.DD.
  3. Таблицы подчиненных документов: Таблица _1SCRDOC, хранящая связи «документ-родитель» и «документ-потомок».
  4. Периодические реквизиты и константы: Таблица _1SCONST, где удаляются записи с признаком привязки к удаляемым документам.
  5. Проводки и операции: Таблицы _1SOPER и _1SENTRY, если в конфигурации используется план счетов бухгалтерского учета.
  6. Таблицы движений регистров: Таблицы вида RA<ID> (активности/движения регистров). После очистки движений обязательно выполняется полный пересчет итогов регистров RG<ID>.

5. Восстановление базы MS SQL Server при сбоях и повреждении LDF

При аварийных остановках сервера, отключении питания или переполнении журнала транзакций база данных MS SQL Server может перейти в состояние Recovery Pending или Suspect. Если файл транзакций .ldf поврежден или утерян, восстановим базу через SQL Server Management Studio (SSMS).

Для версий MS SQL Server 2005/2008 и выше используется команда подключения с перестроением журнала:


CREATE DATABASE [ИмяБазы] 
ON (FILENAME = 'D:\Bases\1C_Base\ИмяФайла.mdf') 
FOR ATTACH_REBUILD_LOG;
GO

Если база уже подключена, но находится в аварийном режиме, выполним следующую цепочку команд для исправления ошибок:


-- Переводим базу данных в режим экстренного доступа
ALTER DATABASE [ИмяБазы] SET EMERGENCY;
GO

-- Переводим в однопользовательский режим с откатом активных сессий
ALTER DATABASE [ИмяБазы] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO

-- Проверяем целостность и восстанавливаем структуру с возможной потерей несохраненных данных
DBCC CHECKDB ([ИмяБазы], REPAIR_ALLOW_DATA_LOSS);
GO

-- Возвращаем базу данных в стандартный многопользовательский режим
ALTER DATABASE [ИмяБазы] SET MULTI_USER;
GO
ALTER DATABASE [ИмяБазы] SET ONLINE;
GO

Перед проведением любых тяжелых процедур массового изменения или исправления таблиц обязательно создавайте полную резервную копию файлов базы данных.

← На главную