В процессе эксплуатации высоконагруженных или сильно доработанных баз данных на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с аномальным поведением системы. Одной из таких проблем является внезапное «исчезновение» или некорректное отображение записей в периодических независимых регистрах сведений, таких как производственный календарь. Рассмотрим ситуацию, когда после нескольких месяцев стабильной работы календарь начинает «перепрыгивать» через огромные временные интервалы (например, с апреля сразу на ноябрь), хотя данные физически присутствуют в базе.
Проанализируем основную причину, на которую указывают опытные специалисты в сообществе. В 99% случаев подобные «глюки» связаны с использованием механизма динамического обновления конфигурации. В среде разработчиков его часто называют «демоническим» из-за непредсказуемых последствий для стабильности кэша и индексов базы данных.
Разберем, что происходит при динамическом обновлении. Когда вы вносите изменения в метаданные и применяете их, пока пользователи находятся в системе, платформа пытается подменить описание объектов «на лету». Это часто приводит к рассинхронизации между:
В результате запрос к регистру сведений через СрезПоследних или обращение к основной таблице может возвращать неверный результат, игнорируя существующие записи за определенный период.
Выясним причину, почему данные могут быть видны в консоли запросов, но не выбираться программными методами. В платформе 1С для периодических регистров сведений существует функционал «Разрешить итоги: Срез последних». Если эта опция включена, система создает вспомогательную таблицу для ускорения получения актуальных записей. При динамическом обновлении или сбое на уровне СУБД основная таблица может содержать данные, а таблица итогов — оказаться поврежденной или пустой за определенный период.
Проанализируем ситуацию с индексами. Если индексы «битые», SQL-сервер строит неверный план запроса. Вместо того чтобы прочитать записи последовательно, он может «перескочить» к следующему блоку данных, который кажется ему валидным. Именно поэтому автор столкнулся с тем, что следующим рабочим днем после 7 апреля стал ноябрь.
Рассмотрим специфику версии 8.3.25.1394. В этой ветке платформы были внедрены оптимизации для работы с независимыми регистрами сведений, включая новые режимы записи (Слияние и Удаление). Эти оптимизации сделали платформу крайне чувствительной к чистоте кэша сеансов. Файлы snccntx.dat на сервере могут хранить устаревшие описания структуры регистра, что в сочетании с динамическим обновлением порождает трудноуловимые ошибки в логике запросов.
Если вы столкнулись с подобным поведением, разберем алгоритм действий по порядку. Не торопитесь сразу удалять данные, сначала попробуем «мягкие» методы восстановления.
Шаг 1. Очистка клиентского кэша
Прежде всего, необходимо исключить локальные проблемы на стороне пользователя. Кэш клиента располагается в двух местах. Рекомендуем очистить содержимое следующих папок (предварительно завершив работу 1С):
%AppData%\Roaming\1C\1cv8%AppData%\Local\1C\1Cv8Шаг 2. Реиндексация и обслуживание итогов
Посмотрим, как можно исправить ситуацию без перезаполнения данных. В консоли запросов или через обработку попробуйте программно отключить и включить использование итогов для проблемного регистра. Это принудительно пересчитает таблицу «Среза последних».
Если база находится на SQL-сервере, выполните команду REINDEX для таблиц данного регистра. Встроенное «Тестирование и исправление» в конфигураторе (пункт «Реиндексация таблиц информационной базы») также помогает решить проблему с битыми индексами.
Шаг 3. Радикальный метод (Очистка и перезаполнение)
Если мягкие методы не помогли, воспользуемся методом, который применил автор темы. Рассмотрим пример кода для программной очистки данных регистра за определенный период и его последующего заполнения. Это гарантированно обновит все индексы и таблицы итогов.
// Очистка записей регистра за 2025 год
НаборЗаписей = РегистрыСведений.Календарь.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(Дата("20250101"), Дата("20251231"));
НаборЗаписей.Записать(); // Записываем пустой набор для удаления
// Вызов функции заполнения (примерная логика)
ЗаполнитьКалендарьНаГод(2025);
Для предотвращения подобных ситуаций придерживайтесь следующих правил совместной работы:
snccntx).Помните, что «глюки» 1С часто имеют под собой вполне логичное техническое объяснение, связанное с архитектурой хранения данных. Своевременный мониторинг состояния индексов и отказ от «демонических» методов обновления сбережет ваши нервы и данные ваших пользователей.