Система 1С:Предприятие оперирует большими объемами данных, и одним из ключевых механизмов, влияющих на производительность, являются текущие вызовы и накопленные данные. Эти понятия часто становятся источником ошибок, замедления работы базы или некорректных отчетов, особенно в крупных конфигурациях типа 1С:ERP, 1С:УТ или 1С:Бухгалтерия. В этой статье мы разберем, что скрывается за этими терминами, как они связаны с работой платформы, и почему их неправильная обработка может привести к серьезным проблемам.

Текущие вызовы — это временные объекты, создаваемые платформой для выполнения операций (например, открытие формы, запуск отчета или выполнение транзакции). Они хранятся в оперативной памяти и должны корректно закрываться после завершения задачи. Накопленные данные, в свою очередь, представляют собой результаты расчетов или промежуточные итоги, которые платформа кеширует для ускорения повторных операций — но при ошибках в коде они могут "зависнуть" в базе, занимая место и искажая результаты. Если вы сталкиваетесь с медленной работой системы, неожиданными блокировками или расхождениями в отчетах, велика вероятность, что проблема кроется именно здесь.

Далее мы подробно рассмотрим, как эти механизмы работают "под капотом", какие ошибки наиболее распространены, и как их диагностировать. Особое внимание уделим практическим советам по очистке накопленных данных и оптимизации текущих вызовов — с примерами кода и пошаговыми инструкциями.

Что такое текущие вызовы в 1С и почему они важны

Текущие вызовы (current calls) — это внутренний механизм платформы 1С:Предприятие, который отвечает за управление потоками выполнения кода. Каждый раз, когда пользователь или система инициирует действие (например, открытие документа, запуск обработки или выполнение HTTP-запроса), платформа создает новый вызов. Эти вызовы могут быть:

  • 🔄 Синхронными — выполняются последовательно, блокируя интерфейс до завершения (например, открытие формы документа).
  • Асинхронными — работают в фоновом режиме (например, отправка email или интеграция с внешними сервисами через HTTPЗапрос).
  • 🔒 Транзакционными — связаны с изменениями данных в базе (например, проведение документа).

Проблемы начинаются, когда вызовы не закрываются корректно. Например, если в коде отсутствует обработка исключений, а транзакция не откатывается при ошибке, платформа может "забыть" освободить ресурсы. Это приводит к:

  • 🐢 Замедлению работы — накопление не закрытых вызовов увеличивает нагрузку на сервер.
  • 🚫 Блокировкам — другие пользователи не могут получить доступ к тем же данным.
  • 💥 Падениям сеансов — при превышении лимита одновременно открытых вызовов (особенно актуально для 1С:Предприятие 8.3 в режиме управляемого приложения).

Чтобы проверить текущие вызовы в своей базе, используйте встроенный инструмент Администрирование → Поддержка и обслуживание → Текущие вызовы. Здесь можно увидеть:

  • ID вызова и связанного с ним сеанса,
  • время начала выполнения,
  • статус (активен, ожидает, завершен с ошибкой).
⚠️ Внимание: В кластерных установках (например, с использованием 1С:Сервер Предприятия) текущие вызовы распределены по рабочим процессам. Если один из процессов "завис", это может парализовать работу всей системы. В таких случаях требуется принудительное завершение через ras cluster или перезапуск сервера.
📊 С какой частотой вы сталкиваетесь с проблемами текущих вызовов в 1С?
Никогда
Редко (раз в несколько месяцев)
Иногда (раз в месяц)
Часто (еженедельно)

Накопленные данные: как они формируются и где хранятся

Накопленные данные (accumulated data) — это промежуточные результаты расчетов, которые платформа сохраняет для оптимизации производительности. Они используются в:

  • 📊 Отчетах — кеширование итогов по периодам (например, обороты по счетам в 1С:Бухгалтерии).
  • 📈 Регламентных заданиях — результаты фоновых расчетов (например, актуализация остатков в 1С:УТ).
  • 🔄 Механизме полнотекстового поиска — индексы для ускорения поиска по документам.

Основные места хранения накопленных данных:

Тип данных Где хранится Как очищается
Итоги отчетов Таблицы _AccumRgTn в базе данных Через ОчиститьКешИтогов() или регламентное задание
Полнотекстовые индексы Системные таблицы СУБД (например, sys.fulltext_indexes в MS SQL) Перестроением индекса через Администрирование → Полнотекстовый поиск
Временные таблицы сеансов Оперативная память сервера 1С Автоматически при завершении сеанса
Кеш запросов Файл 1Cv8.cdn в каталоге пользователя Удалением файла или через ОчиститьКешЗапросов()

Самая распространенная ошибка — некорректная актуализация накопленных данных. Например, если в конфигурации изменилась структура регистра накопления, а итоги не были пересчитаны, отчеты начнут выдавать неверные цифры. Другая типичная проблема — "раздувание" базы из-за накопления устаревших кешей (особенно актуально для файлового варианта ).

Чтобы избежать этого, рекомендуется:

  1. Настраивать регулярную очистку кеша через регламентные задания.
  2. Использовать метод ОбновитьИтоги() после изменений в структуре данных.
  3. Контролировать размер файла 1Cv8.cdn (если он превышает 1 ГБ, его стоит очистить).
💡

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

Типичные ошибки, связанные с текущими вызовами

Ошибки в работе с текущими вызовами часто проявляются как "зависание" системы, невозможность открыть документ или внезапные разрывы соединения. Рассмотрим наиболее распространенные сценарии:

1. Утечка вызовов из-за необработанных исключений

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

НачатьТранзакцию();

Документ.Провести();

// Если здесь произойдет ошибка, транзакция останется открытой!

ЗафиксироватьТранзакцию();

Исправленный вариант:

НачатьТранзакцию();

Попытка

Документ.Провести();

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение ОписаниеОшибки();

КонецПопытки;

2. Превышение лимита одновременно открытых вызовов

В 1С:Предприятие 8.3 по умолчанию установлен лимит в 20 одновременно открытых вызовов на сеанс. При его превышении пользователь получает ошибку:

Ошибка при вызове метода контекста (Выполнить): Превышено максимально допустимое количество одновременно открытых вызовов (20)

Решения:

  • 🔧 Увеличить лимит в настройках сервера (параметр MaxCallsPerSession в файле conf.cfg).
  • 🔄 Оптимизировать код, избегая вложенных вызовов (например, заменить рекурсию на цикл).
  • ⏳ Разбить тяжелые операции на более мелкие этапы.

3. Блокировки из-за долгих транзакций

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

Ошибка блокировки при обращении к базе данных

Как диагностировать:

  1. В MS SQL Server выполните запрос:
    SELECT * FROM sys.dm_tran_locks WHERE resource_associated_entity_id = OBJECT_ID('ВашаТаблица')
  2. В PostgreSQL используйте:
    SELECT * FROM pg_locks WHERE relation = 'ВашаТаблица'::regclass;
Как принудительно разблокировать таблицу в MS SQL?

Используйте команду KILL {SPID}, где SPID — идентификатор процесса, удерживающего блокировку. Будьте осторожны: это может прервать работу пользователя!

Как очистить накопленные данные без потерь

Накопленные данные требуют периодической очистки, особенно после обновлений конфигурации или изменений в структуре регистров. Рассмотрим безопасные способы:

1. Очистка кеша итогов через конфигуратор

Самый простой способ — использовать встроенные инструменты:

  1. Откройте конфигуратор в режиме Администратор.
  2. Перейдите в Администрирование → Поддержка и обслуживание → Очистка кеша итогов.
  3. Выберите нужные регистры накопления и нажмите Очистить.

Для программной очистки используйте метод:

ОчиститьКешИтогов(Истина, Истина); // Очищает итоги и служебные данные

2. Пересчет итогов через регламентные задания

В крупных базах (например, 1С:ERP) очистка кеша может занять часы. Чтобы не блокировать работу пользователей, настройте регламентное задание:

Процедура ПересчитатьИтоги()

Регламент = РегламентныеЗадания.СоздатьРегламентноеЗадание();

Регламент.Имя = "ПересчетИтогов";

Регламент.Метод = "ОбновитьИтогиПоВсемРегистрам";

Регламент.ВремяВыполнения = ТекущаяДата() + 3600; // Через 1 час

Регламент.Запустить();

КонецПроцедуры

3. Очистка временных файлов и кеша запросов

Временные файлы и кеш запросов могут занимать гигабайты дискового пространства. Их расположение зависит от ОС:

  • 🪟 Windows: C:\Users\<Пользователь>\AppData\Roaming\1C\1Cv8\
  • 🐧 Linux: ~/.1cv8/

Удалите файлы:

  • 1Cv8.cdn — кеш запросов,
  • 1Cv8.log — устаревшие логи,
  • *.tmp — временные файлы.
⚠️ Внимание: Не удаляйте файлы 1Cv8.1CD — это рабочие данные текущей сессии! Также избегайте очистки каталога extform, если используете внешние обработки.

Сделать резервную копию базы|Предупредить пользователей о возможных задержках|Закрыть все сеансы 1С|Проверить свободное место на диске|Запустить очистку в нерабочее время-->

Оптимизация текущих вызовов: практические советы

Чтобы минимизировать проблемы с текущими вызовами, следуйте этим рекомендациям:

1. Используйте асинхронные вызовы для тяжелых операций

Если операция может занять более 5 секунд (например, формирование большого отчета), выполняйте ее в фоновом режиме:

ФоновоеЗадание = ФоновыеЗадания.СоздатьФоновоеЗадание();

ФоновоеЗадание.Имя = "ФормированиеОтчета";

ФоновоеЗадание.Метод = "СформироватьБольшойОтчет";

ФоновоеЗадание.Параметры = Новый Структура("Период, Организация", НачалоМесяца(ТекущаяДата()), ТекущаяОрганизация());

ФоновоеЗадание.Выполнить();

2. Ограничивайте количество одновременно открытых транзакций

В цикле по документам не открывайте транзакцию для каждого элемента отдельно. Лучше группировать операции:

НачатьТранзакцию();

Для Каждого Док Из Документы.НайтиПоРеквизиту("ПометкаУдаления", Ложь) Цикл

Док.Провести();

КонецЦикла;

ЗафиксироватьТранзакцию();

3. Контролируйте время выполнения вызовов

Если вызов выполняется дольше 30 секунд, это повод для оптимизации. Используйте Таймер для мониторинга:

Начало = ТекущаяДатаВремя();

// ... ваш код ...

Если (ТекущаяДатаВремя() - Начало) > 30 Тогда

ЗаписатьВЛог("Превышено время выполнения: " + Строка(ТекущаяДатаВремя() - Начало));

КонецЕсли;

4. Настройте пул соединений с базой данных

В conf.cfg добавьте параметры для оптимизации работы с СУБД:

# Для MS SQL

SrvrPoolSize=100

SrvrMaxPoolSize=200

SrvrPoolWaitTimeout=60

Для PostgreSQL

PgPoolSize=50

PgMaxPoolSize=100

💡

Асинхронные вызовы и пул соединений — два ключевых инструмента для уменьшения нагрузки на сервер 1С при работе с большим количеством пользователей.

Диагностика проблем с накопленными данными

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

1. Проверьте размер системных таблиц

В MS SQL Server выполните запрос для анализа объема данных:

SELECT

t.NAME AS TableName,

s.Name AS SchemaName,

p.rows AS RowCounts,

SUM(a.total_pages) * 8 AS TotalSpaceKB

FROM

sys.tables t

INNER JOIN

sys.indexes i ON t.OBJECT_ID = i.object_id

INNER JOIN

sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id

INNER JOIN

sys.allocation_units a ON p.partition_id = a.container_id

LEFT OUTER JOIN

sys.schemas s ON t.schema_id = s.schema_id

WHERE

t.NAME NOT LIKE 'dt%'

AND t.is_ms_shipped = 0

AND i.OBJECT_ID > 255

GROUP BY

t.Name, s.Name, p.Rows

ORDER BY

TotalSpaceKB DESC;

Обратите внимание на таблицы с префиксами:

  • _AccumRg — регистры накопления,
  • _InfoRg — регистры сведений,
  • _Doc — документы.

2. Анализируйте журнал регистрации

Включите расширенное ведение журнала в Администрирование → Журнал регистрации и отфильтруйте события по:

  • 🔴 Ошибки — критические сбои,
  • 🟡 Предупреждения — потенциальные проблемы (например, таймауты),
  • 🔄 Длительные операции — вызовы, занявшие >10 секунд.

3. Используйте технологический журнал

Для глубокой диагностики настройте технологический журнал (techlog) в файле conf.cfg:

# Включение технологического журнала

enable-techlog = yes

techlog-path = C:\Logs\1C\techlog

techlog-file-size = 100

techlog-file-count = 10

techlog-level = debug

После сбора логов проанализируйте их с помощью утилиты tlviewer.exe (входит в комплект поставки 1С:Предприятие). Обратите внимание на:

  • 🔍 Длительные SQL-запросы (более 1 секунды),
  • 🔒 Блокировки (lock события),
  • 🗑️ Утечки памяти (рост потребления RAM).
⚠️ Внимание: Технологический журнал может быстро заполнить дисковое пространство! Настройте ротацию логов и контролируйте размер каталога techlog-path.

Примеры кода для работы с текущими вызовами и накопленными данными

В этом разделе мы собрали готовые решения для типичных задач.

1. Программное завершение "зависших" вызовов

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

Процедура ЗакрытьЗависшиеВызовы()

Вызовы = ПолучитьТекущиеВызовы();

Для Каждого Вызов Из Вызовы Цикл

Если (ТекущаяДатаВремя() - Вызов.ВремяНачала) > 3600 Тогда // Более 1 часа

Попытка

ЗавершитьВызов(Вызов.Ид);

ЗаписатьВЛог("Завершен вызов: " + Вызов.Ид);

Исключение

ЗаписатьВЛог("Ошибка завершения вызова " + Вызов.Ид + ": " + ОписаниеОшибки());

КонецПопытки;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

2. Оптимизированный пересчет итогов по регистру

Для ускорения пересчета используйте пакетную обработку:

Процедура ПересчитатьИтогиПоРегистру(ИмяРегистра)

Регистр = Метаданные.РегистрыНакопления[ИмяРегистра];

НачалоПериода = НачалоГода(ТекущаяДата());

КонецПериода = КонецДня(ТекущаяДата());

// Разбиваем на месяцы для уменьшения нагрузки

ТекущаяДата = НачалоПериода;

Пока ТекущаяДата <= КонецПериода Цикл

КонецМесяца = КонецМесяца(ТекущаяДата);

Регистр.ОбновитьИтоги(ТекущаяДата, КонецМесяца);

ТекущаяДата = НачалоСледующегоМесяца(КонецМесяца);

КонецЦикла;

КонецПроцедуры

3. Мониторинг использования памяти сеансом

Чтобы отслеживать "прожорливые" сеансы, используйте этот код:

Функция ПолучитьИспользованиеПамятиСеанса(ИдСеанса)

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Сеансы.Ид КАК Ид,

| Сеансы.Память КАК ПамятьМб

|ИЗ

| РегламентныеЗадания.Сеансы КАК Сеансы

|ГДЕ

| Сеансы.Ид = &ИдСеанса";

Запрос.УстановитьПараметр("ИдСеанса", ИдСеанса);

Результат = Запрос.Выполнить();

Если Результат.Пустой() Тогда

Возврат 0;

Иначе

Возврат Результат[0].ПамятьМб;

КонецЕсли;

КонецФункции

4. Автоматическая очистка кеша по расписанию

Добавьте это регламентное задание для еженедельной очистки:

Процедура ОчиститьКешПоРасписанию()

// Очистка кеша итогов

ОчиститьКешИтогов(Истина, Ложь);

// Очистка кеша запросов

ОчиститьКешЗапросов();

// Удаление временных файлов старше 7 дней

КаталогВременныхФайлов = КаталогВременныхФайлов();

Для Каждого Файл Из КаталогВременныхФайлов.НайтиФайлы("*.tmp") Цикл

Если (ТекущаяДата() - Файл.ДатаМодификации) > 7 Тогда

Файл.Удалить();

КонецЕсли;

КонецЦикла;

КонецПроцедуры

FAQ: Частые вопросы по текущим вызовам и накопленным данным

Как узнать, сколько текущих вызовов открыто в моей базе?

Перейдите в Администрирование → Поддержка и обслуживание → Текущие вызовы. Здесь отображается список активных вызовов с указанием сеанса, времени начала и статуса. В кластерных установках информация распределена по рабочим процессам — используйте ras cluster --status для мониторинга.

Можно ли полностью отключить накопление данных в 1С?

Нет, это системный механизм платформы. Однако можно уменьшить объем накопленных данных:

  • Отключите кеширование отчетов, если они формируются редко.
  • Настройте автоматическую очистку кеша через регламентные задания.
  • Используйте параметр DisableAccumulation в conf.cfg для тестовых баз (не рекомендуется для рабочих систем!).

Почему после обновления конфигурации отчеты показывают неверные данные?

Скорее всего, не были пересчитаны итоги по измененным регистрам. Выполните:

  1. Очистку кеша итогов (ОчиститьКешИтогов()).
  2. Пересчет итогов по всем регистрам (ОбновитьИтогиПоВсемРегистрам()).
  3. Проверку структуры базы данных (ТестированиеИИсправление в конфигураторе).

Если проблема сохраняется, сравните структуру регистров до и после обновления — возможно, изменились измерения или ресурсы.

Как ускорить работу 1С, если текущие вызовы постоянно превышают лимит?

Попробуйте следующие мероприятия:

  • Увеличьте лимит вызовов в conf.cfg (параметр MaxCallsPerSession).
  • Оптимизируйте код: замените рекурсию на циклы, разбивайте тяжелые операции на части.
  • Настройте пул соединений с базой данных (особенно актуально для MS SQL и PostgreSQL).
  • Разделите пользователей по разным информационным базам, если нагрузка слишком высока.

Для диагностики используйте технологический журнал (techlog) — он поможет выявить "узкие места".

Можно ли восстановить данные, если после очистки кеша пропали документы?

Очистка кеша итогов не удаляет документы — она сбрасывает только промежуточные расчеты. Если документы пропали, причина в другом:

  • Проверьте журнал регистрации на наличие ошибок типа DELETE FROM.
  • Восстановите данные из резервной копии (если она есть).
  • Используйте утилиту chdbfl.exe для проверки целостности базы.

Если документы были помечены на удаление, их можно вернуть через ПоказатьПомеченныеНаУдаление = Истина в списке документов.