В практике сопровождения систем на платформе 1С:Предприятие 7.7 встречается загадочная ситуация: при проведении одного и того же документа или формировании отчета функция ИтогиАктуальны() возвращает разное состояние для разных пользователей. У одного пользователя функция выдает 1 (истина), и система работает с рассчитанными итогами, а у другого — 0 (ложь), что заставляет конфигурацию запускать ресурсоемкий временный расчет. Разберем подробно, почему так происходит и как привести систему в порядок.
Рассмотрим типовой фрагмент кода, где возникает проблема. Программисты часто используют проверку актуальности итогов перед получением остатков из регистров, чтобы определить, нужно ли выполнять ВременныйРасчет(). Проанализируем ситуацию на примере следующего кода:
Если Конт.ИтогиАктуальны()=0 Тогда
// подготовка фильтров
СписокТМЦ = СоздатьОбъект("СписокЗначений");
ТаблНоменклатуры.Выгрузить(СписокТМЦ,,,"Номенклатура");
// установка фильтров
ВремОстаткиТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
ВремОстаткиТМЦ.ВременныйРасчет();
Если (ТипЗначенияСтр(ВремРезервыТМЦ) = "Регистр") Тогда
// установка фильтров
ВремРезервыТМЦ.УстановитьЗначениеФильтра("Номенклатура",СписокТМЦ,2);
ВремРезервыТМЦ.ВременныйРасчет();
КонецЕсли;
КонецЕсли;
Если у одного пользователя условие ИтогиАктуальны() = 0 срабатывает, а у другого нет, это напрямую влияет на производительность и, что более критично, может приводить к получению разных данных об остатках. Выясним основные причины такого поведения.
Одной из наиболее частых причин является рассинхронизация времени. 1С 7.7 крайне чувствительна к разнице во времени между сервером, где расположена база данных, и локальной рабочей станцией пользователя. Рассмотрим, как это работает: если локальное время на компьютере пользователя отстает от времени сервера, на котором зафиксирована последняя запись в таблицах итогов, система может посчитать текущее состояние итогов «будущим» или недостоверным. Проверим синхронизацию времени на всех узлах сети и убедимся, что разница не превышает нескольких секунд.
Проанализируем настройки самой 1С. У каждого пользователя в меню Сервис -> Параметры -> Общие может быть установлена индивидуальная «Рабочая дата». Если один пользователь работает с текущей датой, а у другого установлена дата из прошлого или будущего периода, функция ИтогиАктуальны() будет возвращать результат относительно этого контекста. Убедимся, что у всех пользователей, столкнувшихся с проблемой, параметры рабочей даты идентичны или установлены в значение «Использовать системную дату».
В современных операционных системах Windows (начиная с Windows 7 и выше) по умолчанию включены механизмы оптимистических блокировок (Oplocks) и агрессивное кэширование метаданных файлов. Это приводит к тому, что один пользователь видит обновленный файл индексов .cdx или таблицу итогов RG*, а другой — старую версию из локального сетевого кэша. Для решения этой проблемы выполним следующие действия:
Выясним, из каких каталогов запускается программа у разных пользователей. Бывают ситуации, когда на сервере терминалов или на разных ПК установлены разные релизы платформы (например, 25-й и 27-й). Даже если версии совпадают, одно ядро может быть «пропатчено» для работы с большими базами или исправлено для работы в среде SQL, а другое — нет. Проанализируем содержимое папок с программой (bin) и убедимся, что файлы 1cv7.exe, 1cv7s.exe и соответствующие .dll идентичны по размеру и дате изменения.
Для корректной работы и определения актуальности итогов пользователю необходимы полные права в каталоге базы данных. Если у пользователя ограничено право на удаление или создание временных файлов, система может переходить в «безопасный» режим работы, возвращая 0 для ИтогиАктуальны(), так как не может гарантировать корректное обновление или чтение статусных файлов. Проверим, чтобы у всех пользователей были права «Изменение» (Modify) на всю папку с базой и вложенные объекты.
Иногда проблема кроется в локальном «мусоре». 1С 7.7 активно использует временные файлы для хранения промежуточных итогов и кэша индексов. Выполним очистку следующих директорий:
Temp в профиле Windows.Удаление файлов .tmp и очистка рабочих каталогов часто помогают устранить необъяснимые программные сбои.
Если вышеперечисленные методы не помогли, стоит рассмотреть возможность логического повреждения данных, которое проявляется только при определенных фильтрах. Проанализируем состояние базы, выполнив следующие шаги:
*.cdx в каталоге базы и позволим системе переиндексировать их при входе.Важный момент: если используется SQL-версия, обратим внимание на блокировки таблиц. Если в момент вызова функции ИтогиАктуальны() другой пользователь удерживает транзакцию, в которой происходит запись в регистры, результат функции может быть нестабильным из-за настроек уровней изоляции транзакций в SQL Server.
Ситуация, когда ИтогиАктуальны() выдает разные результаты — это не магия, а следствие разницы в окружении. Последовательная проверка синхронизации времени, настроек рабочей даты и устранение сетевого кэширования SMB в 99% случаев решают данную проблему, обеспечивая стабильную и одинаковую работу всех пользователей в системе.