Нам часто приходится сталкиваться с необходимостью пересчета итогов в базах 1С. Эта задача может быть особенно актуальной при возникновении ошибок в данных (поможет диагностика и исправление битых ссылок в регистрах), при миграции, обновлении или просто для оптимизации производительности. Мы рассмотрим различные подходы к решению этой проблемы, начиная от штатных средств платформы 1С до прямого взаимодействия с SQL Server.
Прежде всего, давайте обратимся к встроенным возможностям платформы 1С. В большинстве случаев именно они являются предпочтительным и наиболее безопасным методом.
Стандартный пересчет итогов через "Тестирование и исправление"
Это основной и рекомендованный способ для поддержания целостности и актуальности данных. Мы можем запустить его из
Конфигуратор -> Администрирование -> Тестирование и исправление ИБ
При этом необходимо установить флажки:
Проверка логической целостностиПересчет итоговЭта операция включает не только сам пересчет итогов, но и реиндексацию, а также сжатие таблиц, что способствует общей оптимизации производительности базы данных — для этой задачи есть утилита для сжатия и свертки баз данных 1С. Важность регулярного выполнения данной процедуры нельзя недооценивать, особенно для активно используемых баз.
Параллельный пересчет итогов (начиная с платформы 8.3.18)
Начиная с версии платформы 8.3.18, фирма "1С" реализовала возможность параллельного пересчета итогов регистров. Это значительное улучшение, которое позволяет существенно ускорить процесс на серверах с большим количеством высокопроизводительных ядер.
Пересчет осуществляется с использованием системных фоновых заданий, идентификатор которых – SystemBackgroundJob.RecalcTotals.
Для настройки этой функции мы можем использовать параметр Количество заданий пересчета итогов, который находится в диалоге Параметры информационной базы. По умолчанию количество фоновых заданий равно 4, но мы можем увеличить его до 4-8 и более, если это позволяют процессорные ресурсы сервера. Это особенно эффективно для больших баз данных, где полный пересчет итогов может занимать значительное время.
Пересчет итогов по частям (выборочно)
В определенных ситуациях, когда полный пересчет итогов занимает слишком много времени или проблема локализована в конкретном периоде или по определенным измерениям, мы можем применить выборочный пересчет. Это позволяет сосредоточиться на проблемных участках данных, не затрагивая всю базу.
В 1С часто доступны обработки для установки границы итогов или перепроведения документов за определенный период. Такой подход значительно снижает нагрузку на СУБД и сокращает время простоя системы.
Несмотря на наличие мощных штатных средств, иногда возникают ситуации, когда прямой доступ к SQL Server становится необходим для ускорения или решения специфических проблем, особенно в очень больших или проблемных базах. Мы рассмотрим, как можно использовать SQL для этих целей.
Причины обращения к SQL
Мы можем столкнуться с необходимостью использования SQL по следующим причинам:
Основные шаги по пересчету итогов через SQL
Подготовка
Перед началом любых прямых манипуляций с базой данных обязательно сделайте полную резервную копию. Любые ошибки при работе с SQL могут привести к необратимой потере данных.
Также отключите всех пользователей от информационной базы 1С, чтобы избежать конфликтов и некорректных операций — удобно через обработку для принудительного завершения сеансов пользователей.
Очистка таблиц итогов
Для массового и быстрого удаления записей из таблиц итогов (например, таблиц регистров бухгалтерии, которые обычно называются
_AccRgTxxxx_Totals
_AccumRgTxxxx_Totals
TRUNCATE TABLE. Эта команда значительно быстрее, чем `DELETE FROM`, так как она не логирует каждую удаляемую строку, а просто сбрасывает выделенное пространство таблицы.
Пример использования:
TRUNCATE TABLE _AccumRgTxxxx_Totals;
TRUNCATE TABLE _AccRgTxxxx_Totals;
-- Замените xxxx на реальные ID таблиц ваших регистров
ВНИМАНИЕ: `TRUNCATE TABLE` безвозвратно удаляет все данные из таблицы. Используйте с крайней осторожностью и только после полного резервного копирования.
Управление индексами
Перед выполнением массовых операций (таких как загрузка большого объема данных или пересчет) мы можем отключить некластерные индексы на таблицах регистра бухгалтерии. Это позволит ускорить вставку или изменение данных, так как SQL Server не будет тратить время на поддержание актуальности этих индексов. После завершения массовых операций обязательно включите индексы обратно, перестроив их.
Пример отключения всех индексов на таблице:
ALTER INDEX ALL ON ИмяТаблицы DISABLE;
Пример включения (перестроения) всех индексов на таблице:
ALTER INDEX ALL ON ИмяТаблицы REBUILD;
Перенос данных с помощью BCP (Bulk Copy Program)
Для работы с очень большими объемами данных, мы можем рассмотреть использование утилиты BCP (Bulk Copy Program). Она позволяет быстро выгружать и загружать данные напрямую в SQL Server. Это более сложный подход, требующий глубоких знаний SQL Server и файловых форматов BCP, но он может дать значительный выигрыш в скорости для миллионов записей.
Процесс обычно включает выгрузку данных из таблиц проводок, очистку целевых таблиц итогов (возможно, с отключением индексов), а затем загрузку данных обратно через BCP.
Пересчет итогов средствами 1С после SQL-манипуляций
После того как мы очистили или подготовили таблицы через SQL, обязательно запускаем штатный пересчет итогов средствами 1С (через "Тестирование и исправление", как описано выше). Это гарантирует, что данные будут сформированы в соответствии с внутренней логикой 1С, обеспечивая их корректность и целостность. Процесс будет значительно ускорен благодаря предварительной очистке или оптимизации таблиц итогов.
Производительность работы 1С на SQL Server напрямую зависит от правильной настройки и регулярного обслуживания самой СУБД. Мы рассмотрим ключевые аспекты, которые помогут нам поддерживать базу в оптимальном состоянии.
Актуализация статистики
SQL Server использует статистику по данным для построения оптимальных планов выполнения запросов. Если статистика устарела, SQL Server может выбирать неэффективные планы, что замедляет пересчет итогов и другие операции — для диагностики есть инструмент анализа производительности SQL-запросов и блокировок. Мы рекомендуем отключать AUTO_UPDATE_STATISTICS для базы 1С и вместо этого настраивать ежедневное задание на целевой пересчет статистик. Это дает нам полный контроль над процессом и гарантирует своевременное обновление.
Пример обновления статистики для конкретной таблицы:
UPDATE STATISTICS ИмяТаблицы;
Для обновления статистики по всем таблицам в базе данных:
EXEC sp_updatestats;
Обновление статистики перед пересчетом итогов критически важно для сокращения времени его выполнения.
Реиндексация и обслуживание таблиц
Регулярное обслуживание основной таблицы регистра, включая реиндексацию, помогает сократить время выполнения запросов. Фрагментация индексов и таблиц может существенно замедлять доступ к данным. Для серверных баз 1С необходимо настраивать планы обслуживания SQL Server, так как операции через конфигуратор 1С больше подходят для файловых баз.
Параллелизм на уровне SQL Server (MAXDOP)
Параметр `MAXDOP` (Maximum Degree of Parallelism) управляет максимальным количеством ядер, которые SQL Server может использовать для выполнения одного запроса. В связке с многопоточным пересчетом итогов в 1С (начиная с 8.3.18), мы можем рассмотреть настройку `MAXDOP > 1` (например, 4 или 8) с учетом общего количества процессорных ресурсов сервера. Это позволит SQL Server более эффективно использовать доступные ядра для параллельных операций.
В процессе работы с итогами могут возникать специфические ситуации, о которых мы должны знать, чтобы эффективно их решать.
Проблема "разделителя итогов" (splitter)
Платформа 1С использует "разделитель итогов" (поле splitter) для оптимизации времени записи и распараллеливания процесса в конкурентных таблицах. Однако это может привести к тому, что в таблице итогов будет храниться значительно больше записей, чем уникальных ключей прикладной аналитики. Такое избыточное количество записей увеличивает нагрузку на СУБД при запросах и снижает общую производительность.
Штатный пересчет итогов сворачивает такие записи. Но при установке новой границы итогов текущие итоги могут оставаться "разделенными". Для устранения этой проблемы иногда может потребоваться последовательный пересчет итогов по месяцам с установкой максимального периода рассчитанных итогов и последующим включением использования текущих итогов.
"Нулевые итоги"
При интенсивной работе с базой данных в таблицах итогов регистров могут накапливаться записи с нулевыми значениями ресурсов, которые не удаляются автоматически. Эти "нулевые итоги" увеличивают объем таблиц и, как следствие, время выполнения запросов, обращающихся к таблицам итогов, а также повышают затраты ресурсов СУБД. Регулярный пересчет итогов помогает предотвратить эту проблему, очищая такие записи.
Особенности пересчета при обновлении платформы (8.3.8+)
При переходе на платформу 1С:Предприятие версии 8.3.8 и старше, если в регистрах используются строковые измерения и большое количество полей в индексе по измерениям (более 16), может потребоваться однократное выполнение операции тестирования и исправления с включенными флажками "Проверка логической целостности" и "Пересчет итогов". Это необходимо для устранения некорректного расчета итогов, который мог возникнуть после обновления платформы.
Проблемы с 1С 7.7 на SQL
В некоторых ранних релизах ядра 1С 7.7 (например, 17-й, 18-й, 25-й, 26-й) на SQL-базах наблюдались проблемы с некорректным пересчетом бухгалтерских итогов, в том числе ошибки округления. В таких случаях рекомендовался пересчет поквартально или переход на более новые релизы платформы. В целом, "поехавшие" итоги в 1С 7.7 чаще указывали на уже существующие ошибки в данных, а не на проблему самого пересчета.
Пересчет итогов в 1С — это комплексная задача, требующая понимания как механизмов платформы, так и особенностей работы с СУБД. Всегда начинайте с анализа проблемы, оценивайте объем данных и только потом выбирайте подходящий метод, будь то штатные средства 1С или прямое вмешательство в SQL Server. И, конечно же, не забывайте о регулярном резервном копировании!