Почему функция ИтогиАктуальны() возвращает разные значения для разных пользователей в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В практике сопровождения систем на платформе 1С:Предприятие 7.7 встречается загадочная ситуация: при проведении одного и того же документа или формировании отчета функция ИтогиАктуальны() возвращает разное состояние для разных пользователей. У одного пользователя функция выдает 1 (истина), и система работает с рассчитанными итогами, а у другого — 0 (ложь), что заставляет конфигурацию запускать ресурсоемкий временный расчет. Разберем подробно, почему так происходит и как привести систему в порядок.

Анализ программного контекста

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


Если Конт.ИтогиАктуальны()=0 Тогда
    // подготовка фильтров
    СписокТМЦ = СоздатьОбъект("СписокЗначений");
    ТаблНоменклатуры.Выгрузить(СписокТМЦ,,,"Номенклатура");
    
    // установка фильтров
    ВремОстаткиТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
    ВремОстаткиТМЦ.ВременныйРасчет();
    
    Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр") Тогда
        // установка фильтров
        ВремРезервыТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
        ВремРезервыТМЦ.ВременныйРасчет();
    КонецЕсли;
КонецЕсли;

Если у одного пользователя условие ИтогиАктуальны() = 0 срабатывает, а у другого нет, это напрямую влияет на производительность и, что более критично, может приводить к получению разных данных об остатках. Выясним основные причины такого поведения.

Причина 1: Разница в системном времени и синхронизации

Одной из наиболее частых причин является рассинхронизация времени. 1С 7.7 крайне чувствительна к разнице во времени между сервером, где расположена база данных, и локальной рабочей станцией пользователя. Рассмотрим, как это работает: если локальное время на компьютере пользователя отстает от времени сервера, на котором зафиксирована последняя запись в таблицах итогов, система может посчитать текущее состояние итогов «будущим» или недостоверным. Проверим синхронизацию времени на всех узлах сети и убедимся, что разница не превышает нескольких секунд.

Причина 2: Настройка «Рабочей даты» пользователя

Проанализируем настройки самой 1С. У каждого пользователя в меню Сервис -> Параметры -> Общие может быть установлена индивидуальная «Рабочая дата». Если один пользователь работает с текущей датой, а у другого установлена дата из прошлого или будущего периода, функция ИтогиАктуальны() будет возвращать результат относительно этого контекста. Убедимся, что у всех пользователей, столкнувшихся с проблемой, параметры рабочей даты идентичны или установлены в значение «Использовать системную дату».

Причина 3: Кэширование сетевых протоколов (SMB2/SMB3)

В современных операционных системах Windows (начиная с Windows 7 и выше) по умолчанию включены механизмы оптимистических блокировок (Oplocks) и агрессивное кэширование метаданных файлов. Это приводит к тому, что один пользователь видит обновленный файл индексов .cdx или таблицу итогов RG*, а другой — старую версию из локального сетевого кэша. Для решения этой проблемы выполним следующие действия:

  1. Отключим Directory Caching на клиентских машинах через реестр.
  2. Настроим параметры FileNotFoundCacheLifetime и MetadataCacheLifetime в значение 0.
  3. Проверим одинаковость путей к базе: желательно, чтобы у всех пользователей путь был прописан единообразно (либо через IP-адрес, либо через имя сервера, либо через один и тот же сетевой диск).

Причина 4: Разные версии исполняемых файлов (ядра)

Выясним, из каких каталогов запускается программа у разных пользователей. Бывают ситуации, когда на сервере терминалов или на разных ПК установлены разные релизы платформы (например, 25-й и 27-й). Даже если версии совпадают, одно ядро может быть «пропатчено» для работы с большими базами или исправлено для работы в среде SQL, а другое — нет. Проанализируем содержимое папок с программой (bin) и убедимся, что файлы 1cv7.exe, 1cv7s.exe и соответствующие .dll идентичны по размеру и дате изменения.

Причина 5: Права доступа на уровне файловой системы

Для корректной работы и определения актуальности итогов пользователю необходимы полные права в каталоге базы данных. Если у пользователя ограничено право на удаление или создание временных файлов, система может переходить в «безопасный» режим работы, возвращая 0 для ИтогиАктуальны(), так как не может гарантировать корректное обновление или чтение статусных файлов. Проверим, чтобы у всех пользователей были права «Изменение» (Modify) на всю папку с базой и вложенные объекты.

Причина 6: Состояние временных файлов (Temp)

Иногда проблема кроется в локальном «мусоре». 1С 7.7 активно использует временные файлы для хранения промежуточных итогов и кэша индексов. Выполним очистку следующих директорий:

Удаление файлов .tmp и очистка рабочих каталогов часто помогают устранить необъяснимые программные сбои.

Причина 7: Физическое повреждение таблиц итогов или индексов

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

  1. Запустим базу в Монопольном режиме.
  2. Выполним процедуру «Пересчет итогов» (Администрирование -> Пересчет итогов).
  3. Если база файловая, удалим все индексные файлы *.cdx в каталоге базы и позволим системе переиндексировать их при входе.
  4. Проведем Тестирование и исправление ИБ с включенными опциями проверки логической целостности.

Важный момент: если используется SQL-версия, обратим внимание на блокировки таблиц. Если в момент вызова функции ИтогиАктуальны() другой пользователь удерживает транзакцию, в которой происходит запись в регистры, результат функции может быть нестабильным из-за настроек уровней изоляции транзакций в SQL Server.

Итог

Ситуация, когда ИтогиАктуальны() выдает разные результаты — это не магия, а следствие разницы в окружении. Последовательная проверка синхронизации времени, настроек рабочей даты и устранение сетевого кэширования SMB в 99% случаев решают данную проблему, обеспечивая стабильную и одинаковую работу всех пользователей в системе.

← На главную