Почему СКД выдает старые данные после изменения запроса и как бороться с кэшированием?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Каждый разработчик 1С рано или поздно сталкивается с ситуацией: вы открываете внешний отчет на Системе компоновки данных (СКД), вносите изменения в текст запроса, сохраняете файл, запускаете его в пользовательском режиме, а результат остается прежним. Вы проверяете запрос в консоли — там данные верные. Вы меняете условия, ставите константы в поля выбора, но СКД упорно выводит информацию, которой в новом запросе просто нет. Создается впечатление, что платформа «запомнила» старую версию отчета и игнорирует все ваши правки.

В этой статье мы подробно разберем, почему возникает эффект «странного кэширования», где именно платформа хранит старые данные и как гарантированно заставить отчет работать по новому алгоритму. Мы проанализируем ситуацию с разных сторон: от простых пользовательских настроек до глубокого программного вмешательства в механизмы компоновки.

Причина 1: Кэширование настроек в хранилище системных настроек

Одной из наиболее частых причин «залипания» старых данных является механизм сохранения пользовательских настроек. Платформа 1С:Предприятие 8 стремится сделать работу пользователя комфортной, поэтому сохраняет последние настройки отчета (отборы, группировки, выбранные поля) в специальную таблицу базы данных — ХранилищеСистемныхНастроек.

Проблема заключается в том, что вместе с настройками компоновщика часто сохраняется и «снимок» структуры схемы. Если вы изменили состав полей в запросе или логику их формирования, старые настройки, привязанные к имени отчета, могут конфликтовать с новой схемой или принудительно накладывать старые условия. Рассмотрим, как это исправить.

Способ А: Сброс настроек в интерфейсе

Прежде чем переходить к коду, попробуем решить вопрос стандартными средствами. В окне настроек отчета (обычно кнопка «Настройки...») необходимо найти команду возврата к стандартным установкам. Часто это кнопка с изображением шестеренки или пункт меню «Установить стандартные настройки». Это заставит СКД перечитать структуру полей непосредственно из текущей схемы компоновки данных (СхемаКомпоновкиДанных), игнорируя то, что было сохранено в базе ранее.

Способ Б: Программная очистка хранилища

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


КлючОбъекта = "ВнешнийОтчет.ИмяВашегоОтчета"; // Для встроенных отчетов имя будет другим
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, Неопределено, ИмяПользователя());

Этот метод полностью очищает «память» системы о конкретном объекте, заставляя платформу инициализировать настройки с чистого листа при следующем открытии.

Причина 2: Временные файлы операционной системы (%TEMP%)

Когда мы запускаем внешний отчет (файл .erf), платформа не работает с ним напрямую в той папке, где он лежит. Она копирует его во временную директорию профиля пользователя. Иногда механизм синхронизации между вашим файлом и его временной копией дает сбой.

Проанализируем путь к этим файлам. Чаще всего они находятся по адресу: C:\Users\ИмяПользователя\AppData\Local\Temp\v8_XXXX_XX. Очистка папки 1cv8 в Local и Roaming часто оказывается бесполезной, так как исполняемый код внешнего отчета может «застрять» именно в системной папке Temp.

Что нужно сделать:

  1. Закройте все сеансы 1С:Предприятия.
  2. Перейдите в папку %TEMP% (введите это в адресной строке проводника).
  3. Удалите все папки, названия которых начинаются на v8_.
  4. Попробуйте снова запустить отчет.

Причина 3: Хэширование схемы компоновки данных

Платформа 1С использует механизм хэширования для оптимизации производительности СКД. Если вы изменили только текст запроса (например, поменяли условие в ГДЕ), но при этом состав полей, их псевдонимы и типы остались прежними, система может вычислить тот же самый хэш для схемы. В результате вместо того, чтобы компилировать новый макет компоновки, она возьмет уже готовый макет из внутреннего кэша сеанса.

Выясним, как «обмануть» этот механизм. Чтобы заставить платформу пересчитать хэш и обновить схему, внесите любое косметическое изменение в структуру запроса:

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

Причина 4: Кэш сеанса на стороне сервера (rphost)

В клиент-серверном варианте работы часть объектов кэшируется процессами rphost. Даже если вы перезагрузили клиентское приложение, серверный сеанс может продолжать удерживать кэшированные данные схемы. Это особенно актуально, если отчет вызывается через фоновые задания или используется в составе расширений.

Проанализируем ситуацию: если отчет работает в контексте серверного вызова, попробуйте завершить сеанс через консоль администрирования серверов 1С или просто перезапустить службу 1C:Enterprise 8.3 Server Agent. Если проблема исчезла — значит, дело было именно в серверном кэшировании.

Причина 5: Неправильная работа с Компоновщиком Настроек в коде

Иногда мы сами создаем проблему, неправильно инициализируя настройки. Если в модуле объекта отчета вы используете программную компоновку, убедитесь, что вы не загружаете старые настройки поверх новой схемы. Рассмотрим правильный алгоритм в процедуре ПриКомпоновкеРезультата:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
    
    // Принудительно инициализируем настройки из текущей (измененной вами) схемы
    Настройки = ЭтотОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
    
    // Далее выполняем стандартную компоновку
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(ЭтотОбъект.СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

Использование метода ЗагрузитьНастройки(ЭтотОбъект.СхемаКомпоновкиДанных.НастройкиПоУмолчанию) гарантирует, что СКД проигнорирует все сохраненные ранее «кривые» настройки и возьмет актуальную структуру из файла отчета. Для упрощения программного управления структурой и настройками схемы можно использовать модуль-обертку над объектной моделью СКД.

Рекомендация по отладке: Консоль компоновки данных

Если ничего не помогает, разберем еще один важный инструмент — «Консоль компоновки данных». Важно понимать различие: «Консоль запросов» показывает результат выполнения вашего исходного запроса. Однако СКД перед выполнением модифицирует этот запрос: добавляет условия из отборов, убирает неиспользуемые поля, накладывает параметры. Консоль компоновки данных позволяет увидеть финальный текст запроса, который реально уходит на СУБД. Часто выясняется, что запрос в конфигураторе верный, но из-за старых пользовательских настроек СКД «обрезает» его так, что данные кажутся старыми. Для анализа реальных данных и настроек отчета в пользовательском сеансе можно использовать расширение для отладки СКД и запросов под пользователем.

Резюме

Подведем итог. Если вы столкнулись со странным поведением СКД при разработке внешнего отчета, пройдите по следующим шагам:

  1. Сбросьте настройки в пользовательском режиме к стандартным.
  2. Переименуйте отчет (измените имя объекта в свойствах) — это самый быстрый, хоть и «грязный» способ разорвать связь с кэшем.
  3. Очистите папку %TEMP% и кэш сеанса.
  4. Измените структуру схемы (добавьте поле), чтобы принудительно обновить хэш макета.
  5. Проверьте программный код на предмет принудительной загрузки старых настроек.

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

← На главную