Система 1С:Предприятие оперирует большими объемами данных, и одним из ключевых механизмов, влияющих на производительность, являются текущие вызовы и накопленные данные. Эти понятия часто становятся источником ошибок, замедления работы базы или некорректных отчетов, особенно в крупных конфигурациях типа 1С:ERP, 1С:УТ или 1С:Бухгалтерия. В этой статье мы разберем, что скрывается за этими терминами, как они связаны с работой платформы, и почему их неправильная обработка может привести к серьезным проблемам.
Текущие вызовы — это временные объекты, создаваемые платформой 1С для выполнения операций (например, открытие формы, запуск отчета или выполнение транзакции). Они хранятся в оперативной памяти и должны корректно закрываться после завершения задачи. Накопленные данные, в свою очередь, представляют собой результаты расчетов или промежуточные итоги, которые платформа кеширует для ускорения повторных операций — но при ошибках в коде они могут "зависнуть" в базе, занимая место и искажая результаты. Если вы сталкиваетесь с медленной работой системы, неожиданными блокировками или расхождениями в отчетах, велика вероятность, что проблема кроется именно здесь.
Далее мы подробно рассмотрим, как эти механизмы работают "под капотом", какие ошибки наиболее распространены, и как их диагностировать. Особое внимание уделим практическим советам по очистке накопленных данных и оптимизации текущих вызовов — с примерами кода и пошаговыми инструкциями.
Что такое текущие вызовы в 1С и почему они важны
Текущие вызовы (current calls) — это внутренний механизм платформы 1С:Предприятие, который отвечает за управление потоками выполнения кода. Каждый раз, когда пользователь или система инициирует действие (например, открытие документа, запуск обработки или выполнение HTTP-запроса), платформа создает новый вызов. Эти вызовы могут быть:
- 🔄 Синхронными — выполняются последовательно, блокируя интерфейс до завершения (например, открытие формы документа).
- ⚡ Асинхронными — работают в фоновом режиме (например, отправка email или интеграция с внешними сервисами через
HTTPЗапрос). - 🔒 Транзакционными — связаны с изменениями данных в базе (например, проведение документа).
Проблемы начинаются, когда вызовы не закрываются корректно. Например, если в коде отсутствует обработка исключений, а транзакция не откатывается при ошибке, платформа может "забыть" освободить ресурсы. Это приводит к:
- 🐢 Замедлению работы — накопление не закрытых вызовов увеличивает нагрузку на сервер.
- 🚫 Блокировкам — другие пользователи не могут получить доступ к тем же данным.
- 💥 Падениям сеансов — при превышении лимита одновременно открытых вызовов (особенно актуально для 1С:Предприятие 8.3 в режиме управляемого приложения).
Чтобы проверить текущие вызовы в своей базе, используйте встроенный инструмент Администрирование → Поддержка и обслуживание → Текущие вызовы. Здесь можно увидеть:
- ID вызова и связанного с ним сеанса,
- время начала выполнения,
- статус (активен, ожидает, завершен с ошибкой).
⚠️ Внимание: В кластерных установках 1С (например, с использованием 1С:Сервер Предприятия) текущие вызовы распределены по рабочим процессам. Если один из процессов "завис", это может парализовать работу всей системы. В таких случаях требуется принудительное завершение через ras cluster или перезапуск сервера.
Накопленные данные: как они формируются и где хранятся
Накопленные данные (accumulated data) — это промежуточные результаты расчетов, которые платформа 1С сохраняет для оптимизации производительности. Они используются в:
- 📊 Отчетах — кеширование итогов по периодам (например, обороты по счетам в 1С:Бухгалтерии).
- 📈 Регламентных заданиях — результаты фоновых расчетов (например, актуализация остатков в 1С:УТ).
- 🔄 Механизме полнотекстового поиска — индексы для ускорения поиска по документам.
Основные места хранения накопленных данных:
| Тип данных | Где хранится | Как очищается |
|---|---|---|
| Итоги отчетов | Таблицы _AccumRgTn в базе данных |
Через ОчиститьКешИтогов() или регламентное задание |
| Полнотекстовые индексы | Системные таблицы СУБД (например, sys.fulltext_indexes в MS SQL) |
Перестроением индекса через Администрирование → Полнотекстовый поиск |
| Временные таблицы сеансов | Оперативная память сервера 1С | Автоматически при завершении сеанса |
| Кеш запросов | Файл 1Cv8.cdn в каталоге пользователя |
Удалением файла или через ОчиститьКешЗапросов() |
Самая распространенная ошибка — некорректная актуализация накопленных данных. Например, если в конфигурации изменилась структура регистра накопления, а итоги не были пересчитаны, отчеты начнут выдавать неверные цифры. Другая типичная проблема — "раздувание" базы из-за накопления устаревших кешей (особенно актуально для файлового варианта 1С).
Чтобы избежать этого, рекомендуется:
- Настраивать регулярную очистку кеша через регламентные задания.
- Использовать метод
ОбновитьИтоги()после изменений в структуре данных. - Контролировать размер файла
1Cv8.cdn(если он превышает 1 ГБ, его стоит очистить).
Перед массовой очисткой накопленных данных сделайте резервную копию базы! В некоторых конфигурациях (например, 1С:ERP) пересчет итогов может занять несколько часов и заблокировать работу пользователей.
Типичные ошибки, связанные с текущими вызовами
Ошибки в работе с текущими вызовами часто проявляются как "зависание" системы, невозможность открыть документ или внезапные разрывы соединения. Рассмотрим наиболее распространенные сценарии:
1. Утечка вызовов из-за необработанных исключений
Если в коде отсутствует конструкция Попытка...Исключение, а транзакция не откатывается при ошибке, платформа может не освободить ресурсы. Пример проблемного кода:
НачатьТранзакцию();
Документ.Провести();
// Если здесь произойдет ошибка, транзакция останется открытой!
ЗафиксироватьТранзакцию();
Исправленный вариант:
НачатьТранзакцию();
Попытка
Документ.Провести();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
2. Превышение лимита одновременно открытых вызовов
В 1С:Предприятие 8.3 по умолчанию установлен лимит в 20 одновременно открытых вызовов на сеанс. При его превышении пользователь получает ошибку:
Ошибка при вызове метода контекста (Выполнить): Превышено максимально допустимое количество одновременно открытых вызовов (20)
Решения:
- 🔧 Увеличить лимит в настройках сервера (параметр
MaxCallsPerSessionв файлеconf.cfg). - 🔄 Оптимизировать код, избегая вложенных вызовов (например, заменить рекурсию на цикл).
- ⏳ Разбить тяжелые операции на более мелкие этапы.
3. Блокировки из-за долгих транзакций
Если транзакция выполняется слишком долго (например, при массовом проведении документов), она блокирует таблицы базы данных, что приводит к ошибкам у других пользователей:
Ошибка блокировки при обращении к базе данных
Как диагностировать:
- В MS SQL Server выполните запрос:
SELECT * FROM sys.dm_tran_locks WHERE resource_associated_entity_id = OBJECT_ID('ВашаТаблица') - В PostgreSQL используйте:
SELECT * FROM pg_locks WHERE relation = 'ВашаТаблица'::regclass;
Как принудительно разблокировать таблицу в MS SQL?
Используйте команду KILL {SPID}, где SPID — идентификатор процесса, удерживающего блокировку. Будьте осторожны: это может прервать работу пользователя!
Как очистить накопленные данные без потерь
Накопленные данные требуют периодической очистки, особенно после обновлений конфигурации или изменений в структуре регистров. Рассмотрим безопасные способы:
1. Очистка кеша итогов через конфигуратор
Самый простой способ — использовать встроенные инструменты:
- Откройте конфигуратор в режиме
Администратор. - Перейдите в
Администрирование → Поддержка и обслуживание → Очистка кеша итогов. - Выберите нужные регистры накопления и нажмите
Очистить.
Для программной очистки используйте метод:
ОчиститьКешИтогов(Истина, Истина); // Очищает итоги и служебные данные
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С, если текущие вызовы постоянно превышают лимит?
Попробуйте следующие мероприятия:
- Увеличьте лимит вызовов в
conf.cfg(параметрMaxCallsPerSession). - Оптимизируйте код: замените рекурсию на циклы, разбивайте тяжелые операции на части.
- Настройте пул соединений с базой данных (особенно актуально для MS SQL и PostgreSQL).
- Разделите пользователей по разным информационным базам, если нагрузка слишком высока.
Для диагностики используйте технологический журнал (techlog) — он поможет выявить "узкие места".
Можно ли восстановить данные, если после очистки кеша пропали документы?
Очистка кеша итогов не удаляет документы — она сбрасывает только промежуточные расчеты. Если документы пропали, причина в другом:
- Проверьте журнал регистрации на наличие ошибок типа
DELETE FROM. - Восстановите данные из резервной копии (если она есть).
- Используйте утилиту
chdbfl.exeдля проверки целостности базы.
Если документы были помечены на удаление, их можно вернуть через ПоказатьПомеченныеНаУдаление = Истина в списке документов.