Каждый системный администратор, обслуживающий серверную инфраструктуру «1С:Предприятия», рано или поздно сталкивается с загадочным поведением системы: свободное дисковое пространство на системном диске C: начинает стремительно исчезать со скоростью в десятки или даже сотни мегабайт в секунду. Часто это происходит во внерабочее время — поздно вечером или ночью. При этом через некоторое время место освобождается так же внезапно, «одним куском».
В этой статье мы подробно разберем причины возникновения этой проблемы, проанализируем механизмы работы платформы «1С:Предприятие 8.3» и предоставим пошаговый алгоритм для устранения этой неполадки раз и навсегда.
Для начала проанализируем путь к файлу, который «пожирает» свободное место на диске. В типичном случае папка выглядит следующим образом:
C:\Windows\Temp\1c_logs\1CV8C_9580\19070422.log
Давайте детально разберем структуру этого пути, чтобы понять, какой именно процесс его создает:
1cv8c.exe). Если бы это был рабочий процесс сервера 1С, каталог назывался бы rphost. Наличие папки 1CV8C однозначно указывает на то, что на сервере запущен именно сеанс клиентского приложения (например, через RDP-сессию или планировщик задач Windows).ГГММДДЧЧ.log (в данном случае: 2019 год, 07 месяц, 04 число, 22 часа). Такое именование файлов уникально и используется исключительно механизмом Технологического журнала (ТЖ) 1С.Технологический журнал — это мощный инструмент для разработчиков и администраторов, предназначенный для анализа производительности и расследования критических ошибок платформы. По умолчанию в 1С он полностью отключен.
Если ТЖ начинает записывать файлы логов, это означает, что платформа обнаружила файл конфигурации logcfg.xml. Если в этом файле настроена избыточная детализация (например, сбор абсолютно всех событий с помощью тега <property name="all"/>), то при выполнении любой тяжелой операции (закрытие месяца, расчет себестоимости, выгрузка или обмен данными, массовое проведение документов) платформа начинает записывать в текстовый файл каждое микрособытие. Это и приводит к генерации гигантских объемов данных со скоростью до 100 МБ/с.
Почему свободное место возвращается «одним куском»? В настройках logcfg.xml обычно задается параметр history, определяющий время хранения логов в часах. Как только наступает новый час (например, время переходит с 22:59 на 23:00) или когда клиентский процесс 1С завершает свою работу, платформа автоматически удаляет файлы ТЖ, вышедшие за рамки лимита хранения. Огромный файл мгновенно стирается с диска, возвращая администратору заветные гигабайты.
Если сбор логов ТЖ не требуется для текущей отладки, его необходимо отключить. Для этого достаточно найти и переименовать или удалить файл logcfg.xml. Платформа 1С опрашивает каталоги на наличие этого файла каждые 60 секунд, поэтому отмена логирования произойдет мгновенно и «на лету» — перезагружать службу сервера 1С или сервер целиком не требуется.
Проанализируем основные места на сервере, где может находиться файл logcfg.xml:
C:\Program Files\1cv8\conf\ (или C:\Program Files (x86)\1cv8\conf\ для 32-битной версии).C:\Program Files\1cv8\8.3.X.YYYY\bin\conf\.%USERPROFILE%\AppData\Local\1C\1cv8\Conf\.Достаточно переименовать этот файл в logcfg.xml.bak, и запись логов прекратится.
Если логи технологического журнала действительно необходимы разработчикам 1С для локализации ошибок, их сбор нужно оптимизировать. Во-первых, файлы логов следует перенести на другой, более емкий несистемный диск (например, на диск D:). Во-вторых, необходимо ограничить собираемые события только критическими ошибками.
Рассмотрим пример правильной настройки файла logcfg.xml, который собирает только информацию об исключительных ситуациях (событие EXCP) и сохраняет логи на диске D: со сроком хранения 12 часов:
<config xmlns="http://v8.1c.ru/v8/tech-journal">
<log location="D:\1C_logs" history="12">
<event>
<eq property="Name" value="EXCP"/>
</event>
<property name="all"/>
</log>
</config>
При использовании такой конфигурации нагрузка на дисковую подсистему снизится до минимума, а системный диск C: больше не будет переполняться.
Если вы проверили все папки, но обнаружили, что диск забивается не логами .log, а огромными временными файлами с расширением .tmp в папках локального кэша, причина кроется в неоптимальных запросах внутри конфигурации 1С.
Такая ситуация часто возникает, когда программисты совершают классическую ошибку: выбирают запросом поля с типом ХранилищеЗначения, содержащие тяжелые бинарные данные (картинки, файлы PDF, файлы отчетов). При выполнении такого запроса сервер 1С вынужден временно выгрузить все эти данные на жесткий диск во временные файлы.
Проанализируем неправильный пример запроса:
ВЫБРАТЬ
Ссылка,
Наименование,
ФайлХранилище // Неправильно! Поле содержит двоичные данные файлов
ИЗ
Справочник.ПрисоединенныеФайлы
Для исправления этой проблемы разработчикам необходимо переписать алгоритм: выбирать запросом только легкие ссылочные данные и метаданные, а сами двоичные файлы извлекать порционно, только в момент непосредственного обращения через объектную модель платформы:
// Выбираем только ссылку
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Ссылка
|ИЗ
| Справочник.ПрисоединенныеФайлы";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем двоичные данные точечно, только когда это необходимо
ДвоичныеДанные = Выборка.Ссылка.ФайлХранилище.Получить();
КонецЦикла;
Этот подход гарантирует, что сервер не будет пытаться кэшировать весь объем файлов базы данных во временную директорию на диске C:.