← На главную
В процессе работы, особенно в периоды высокой нагрузки, например, при закрытии месяца, можно столкнуться с очень странной и неприятной ситуацией: два окна одной и той же базы 1С, запущенные на одном компьютере, показывают разные данные в одном и том же отчете. Классический пример — «Оборотно-сальдовая ведомость». В одном сеансе, запущенном сегодня, данные актуальны и отражают последние проведенные документы, а в другом, который остался открытым со вчерашнего дня, отчет показывает устаревшую информацию, даже после повторного формирования. Давайте разберемся, почему так происходит и что с этим делать.
Проанализируем ситуацию: у пользователя открыто два сеанса 1С:ERP. Один — «старый», который не закрывался пару дней, второй — «свежий». После проведения нового документа в «свежем» сеансе отчет ОСВ показывает правильные, обновленные данные. А в «старом» сеансе, даже после многократного нажатия кнопки «Сформировать», отчет продолжает показывать старые цифры, как будто нового документа не существует. Это может привести к серьезным ошибкам в учете, если вовремя не заметить расхождение. Выясним, что является корнем этой проблемы.
Причина 1: Все дело в кэше
Самая частая и вероятная причина такого поведения — работа механизмов кэширования платформы 1С. Для ускорения работы система сохраняет множество данных как на стороне клиента (вашего компьютера), так и на стороне сервера. В «зависшем» на несколько дней сеансе этот кэш может «застрять» и не обновиться вовремя.
Рассмотрим, какие виды кэша здесь играют роль:
- Кэш сеансовых данных. Для каждого запущенного сеанса 1С создает свой набор временных данных. В старом, «позавчерашнем» сеансе, сохранился снимок данных на момент его активной работы. Новый документ, проведенный в другом, «свежем» сеансе, не всегда инициирует принудительную очистку кэша в соседнем, старом сеансе. Платформа считает, что старый сеанс может продолжать работать со своими данными для ускорения. Обычно кэш должен обновляться или сбрасываться по истечении определенного времени (например, 20 минут неактивности), но иногда этот механизм дает сбой.
- Кэш итогов регистров. Для быстрого построения отчетов, таких как ОСВ, система не пересчитывает все движения документов каждый раз. Вместо этого она использует специальные таблицы с заранее рассчитанными итогами. При проведении документов итоги должны обновляться. Однако в сложных системах, как 1С:ERP, этот процесс может происходить с задержкой или быть заблокирован другими операциями (например, фоновым пересчетом). Ваш старый сеанс мог «видеть» версию итогов до обновления, а новый — уже после.
- Кэш управляемых форм. Сами формы отчетов в управляемом приложении также имеют свой кэш. Возможно, при нажатии на кнопку «Сформировать» форма отчета в старом сеансе по какой-то причине не отправила на сервер запрос на полное обновление данных, а использовала уже имеющиеся у себя кэшированные значения.
Тот факт, что проблема разрешилась сама собой наутро, как раз и указывает на то, что за ночь сработали внутренние регламенты платформы или сервера, которые очистили устаревший кэш.
Причина 2: Блокировки, фоновые задания и изоляция транзакций
Даже если вы не запускали процедуру «Закрытие месяца» вручную, в системе могли выполняться другие длительные операции в фоновом режиме. 1С:ERP — это сложная система, в которой постоянно работают регламентные задания: пересчет итогов, обновление каких-либо данных, расчет себестоимости и т.д.
Как это влияет на отчеты:
- Блокировки таблиц. Длительное фоновое задание может временно заблокировать таблицы итогов в базе данных MS SQL. Старый сеанс мог успеть прочитать данные до начала блокировки, а новый сеанс обратился к ним уже после того, как блокировка была снята и данные частично обновились.
- Изоляция транзакций. Каждый сеанс 1С работает со своей транзакцией к базе данных. По умолчанию используется уровень изоляции
Read Committed. Это означает, что одна транзакция (старый сеанс) не увидит незафиксированные изменения другой транзакции (новый сеанс, где проводят документ). Но даже после фиксации изменений (когда документ проведен окончательно), старому сеансу нужно инициировать новый запрос к базе, чтобы эти изменения увидеть. Если из-за «застрявшего» кэша он этого не делает, он продолжает работать со старыми данными.
Причина 3: Человеческий фактор
Никогда не стоит сбрасывать со счетов самую простую причину. Прежде чем искать сложные технические проблемы, стоит убедиться, что не было допущено ошибки со стороны пользователя. Как показывает практика, часто пользователи могут:
- Сравнить свежесформированный отчет с ранее сохраненным в Excel или PDF файлом, забыв об этом.
- Думать, что переформировали отчет, но на самом деле просто переключились между окнами.
- Смотреть отчеты с разными настройками (например, разные периоды или отборы по организации) и не заметить этого.
В описанной на форуме ситуации автор сам перепроверил все действия, что исключает эту причину. Однако при диагностике подобных проблем всегда начинайте с проверки этих простых моментов.
Что делать для решения и диагностики проблемы?
Если вы столкнулись с подобным расхождением данных, действуйте пошагово, от простого к сложному.
- Повторно сформируйте отчет. Первое и самое очевидное действие — нажать кнопку «Сформировать» в проблемном отчете еще раз.
- Полностью закройте и откройте форму отчета. Не просто переформируйте, а закройте окно ОСВ и откройте его заново через меню. Это заставит форму инициализироваться с нуля и с большей вероятностью запросить свежие данные с сервера.
- Перезапустите проблемный сеанс 1С. Самый надежный способ сбросить весь накопленный кэш сеанса — это полностью закрыть «старое» окно программы и войти в базу заново. В 99% случаев после этого отчеты начнут показывать одинаковые, актуальные данные.
- Выполните пересчет итогов. Если проблема носит массовый характер и встречается у разных пользователей, возможно, нарушился расчет итогов в самой базе. Для этого существует стандартная обработка.
Важно: выполнять эту операцию должен администратор или опытный пользователь, так как она может занять продолжительное время и создать дополнительную нагрузку на сервер.
Для запуска пересчета необходимо:
- Перейти в меню «Все функции» (если его нет, его нужно включить в «Настройках» -> «Параметры»).
- Найти раздел «Стандартные» и выбрать пункт «Управление итогами».
- В открывшемся окне можно увидеть текущее состояние итогов и запустить их полный пересчет.
- Очистите локальный кэш 1С. Если перезапуск сеанса не помог, можно прибегнуть к полной очистке временных файлов 1С на компьютере пользователя. Для этого закройте все окна 1С и удалите папки с кэшем, которые обычно находятся по путям:
C:\Users\%username%\AppData\Roaming\1C\1cv8
C:\Users\%username%\AppData\Local\1C\1cv8
После удаления этих папок (они пересоздадутся автоматически при следующем запуске) первый запуск 1С будет немного дольше обычного, но это гарантированно очистит весь локальный кэш.
Рекомендации по предотвращению
Чтобы минимизировать риск повторения таких ситуаций, придерживайтесь следующих правил:
- Не оставляйте сеансы открытыми на несколько дней. Приучите себя и пользователей закрывать программу в конце рабочего дня. Это лучшая профилактика проблем с «зависшим» кэшем.
- Регулярно обновляйте платформу 1С. В новых версиях платформы разработчики постоянно совершенствуют механизмы кэширования и управления данными, исправляя подобные скрытые ошибки.
- Настройте тайм-ауты на сервере 1С (для администраторов). В консоли кластера серверов 1С можно настроить параметры, которые будут автоматически завершать неактивные или «зависшие» сеансы пользователей по истечении заданного времени.
В итоге, корень проблемы почти всегда кроется в рассинхронизации кэша в долгоживущем сеансе 1С. Понимание этого механизма поможет вам быстро диагностировать и решать подобные инциденты, не тратя время на поиски несуществующих ошибок в данных.