При выполнении регламентных операций, свертке базы или массовой пометке на удаление документов за несколько лет разработчики часто сталкиваются с критическим падением производительности: обработка может выполняться часами или даже сутками. Разберем основные причины медленной работы платформы 1С:Предприятие 7.7 и рассмотрим эффективные способы ускорения пакетной обработки документов.
Проанализируем факторы, которые сильнее всего тормозят массовую отмену проведения и пометку документов на удаление:
Сообщить() и Состояние() на каждой итерации цикла приводят к постоянной перерисовке графических элементов окна сообщений и строки состояния. При миллионах строк это перегружает очередь системных сообщений потока и подвешивает интерфейс.1syslog\1cv7.mlg) создает огромный объем дисковых операций ввода-вывода. При включенном ЖР на каждое действие над документом тратится больше времени, чем на само изменение данных в базе.Разберем по шагам порядок действий для максимального ускорения штатной обработки без риска потери целостности структуры данных:
Сообщить() внутри тела цикла либо настроим вывод прогресса только через определенные интервалы (например, каждые 500–1000 обработанных документов).НачатьТранзакцию() и ЗафиксироватьТранзакцию(). Это радикально снизит нагрузку на дисковую подсистему MS SQL Server.ОбработкаПрерыванияПользователя() в цикле, чтобы операционная система не помечала окно программы как «Не отвечает».Если необходимо отслеживать протокол работы обработки без замедления интерфейса, вывод информации лучше перенаправить в текстовый файл с помощью объекта Scripting.FileSystemObject. Посмотрим на пример оптимизированной функции для записи лога:
// Функция быстрой записи информации в текстовый лог-файл
Функция глЗаписатьВЛогФайл(псИмяЛога, псСтрокаЗаписи) Экспорт
Перем глКаталогЛогов, вИмяФайлаЛога, fso, вТекстСтрим, вСтрокаДатыВремени;
Если ПустоеЗначение(псСтрокаЗаписи) = 1 Тогда
Возврат 0;
КонецЕсли;
глКаталогЛогов = КаталогИБ() + "Logs\";
Если ФС.СуществуетФайл(глКаталогЛогов) = 0 Тогда
ФС.СоздатьКаталог(глКаталогЛогов);
КонецЕсли;
вИмяФайлаЛога = глКаталогЛогов + псИмяЛога + ".log";
fso = СоздатьОбъект("Scripting.FileSystemObject");
Попытка
вТекстСтрим = fso.OpenTextFile(вИмяФайлаЛога, 8, 1, 0); // Режим дозаписи
Исключение
Возврат 0;
КонецПопытки;
вСтрокаДатыВремени = "" + ТекущаяДата() + " " + ТекущееВремя();
вТекстСтрим.WriteLine(вСтрокаДатыВремени + " " + псСтрокаЗаписи);
вТекстСтрим.Close();
Возврат 1;
КонецФункции
Для опытных специалистов самым быстрым способом свертки или удаления документов является прямое выполнение инструкций SQL. Проанализируем структуру таблиц 1С 7.7, которые необходимо очистить или модифицировать:
_1SJOURN. Для пометки на удаление достаточно изменить флаги в поле CLOSED. Для полного физического удаления выполняется DELETE FROM _1SJOURN WHERE ....DH<ID> и DT<ID>, где <ID> — идентификатор конкретного вида документа из файла словаря 1Cv7.DD._1SCRDOC, хранящая связи «документ-родитель» и «документ-потомок»._1SCONST, где удаляются записи с признаком привязки к удаляемым документам._1SOPER и _1SENTRY, если в конфигурации используется план счетов бухгалтерского учета.RA<ID> (активности/движения регистров). После очистки движений обязательно выполняется полный пересчет итогов регистров RG<ID>.При аварийных остановках сервера, отключении питания или переполнении журнала транзакций база данных 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
Перед проведением любых тяжелых процедур массового изменения или исправления таблиц обязательно создавайте полную резервную копию файлов базы данных.