Разработка внешних отчетов на базе Системы компоновки данных (СКД) — одна из самых частых задач программиста 1С. Однако многие сталкиваются с крайне неприятной ситуацией: вы открываете схему компоновки, вносите изменения в текст запроса (например, добавляете условие или удаляете лишние таблицы), сохраняете файл, запускаете отчет через «Файл — Открыть», но результат остается прежним. Отчет упорно выводит данные по старому алгоритму, игнорируя ваши правки.
В этой статье мы подробно разберем, почему платформа 1С «запоминает» старую структуру отчета и какие шаги нужно предпринять, чтобы изменения вступили в силу. Мы проанализируем механизмы кэширования, влияние Библиотеки стандартных подсистем (БСП) и особенности работы платформы 8.3.
Самая распространенная причина кроется во взаимодействии платформы и механизмов БСП. Если ваш внешний отчет уже был зарегистрирован в базе данных через справочник ДополнительныеОтчетыИОбработки, система создает внутреннюю связь между файлом и его метаданными в базе.
Рассмотрим ситуацию: вы открываете отчет просто как файл. Платформа видит его Имя (идентификатор объекта) и UUID. Если в базе уже есть отчет с такими же данными, механизмы БСП могут подменить настройки или даже саму схему данными из хранилища вариантов в информационной базе. В итоге, даже запуская файл с диска, вы фактически работаете с «призраком» отчета из справочника.
Что нужно сделать:
Проанализируем наиболее эффективный способ, предложенный опытными разработчиками. Чтобы «обмануть» кэш платформы и заставить ее воспринимать отчет как совершенно новый объект, необходимо изменить его внутреннее имя.
Разберем этот процесс по шагам:
ВнешнийОтчет.ПродажиПоСкладам, переименуйте его в ПродажиПоСкладам_Новый.Система компоновки данных активно кэширует XML-описание схемы компоновки (макет ОсновнаяСхемаКомпоновкиДанных) в рамках текущего сеанса. Это делается для повышения производительности. Если вы изменили запрос, но не поменяли структуру полей, платформа может решить, что схема идентична старой.
Выясним причину устойчивости кэша: иногда очистки стандартного кэша конфигурации бывает недостаточно. Платформа копирует внешние файлы в локальные временные папки пользователя (%LOCALAPPDATA%\1C\1cv8). Если метка времени файла или его размер изменились незначительно, механизм синхронизации может дать сбой.
Попробуйте следующие действия:
ExtDataProc, которая находится глубоко в профиле пользователя 1С. Именно там хранятся временные копии запущенных внешних обработок.Если в свойствах вашего отчета указано ХранилищеВариантов (обычно это ХранилищеВариантовОтчетов), то при каждом открытии система пытается инициализировать настройки из этого хранилища. Если вы удалили таблицы из запроса, но эти поля все еще фигурируют в «настройках по умолчанию» в базе данных, может возникнуть конфликт или отображение старых данных.
Проанализируем ситуацию: если вы добавили отбор по дате, как в примере из темы:
И ЗаказПоставщикуТовары.Ссылка.Дата МЕЖДУ &Нач И &Кон
Но при этом в настройках СКД на вкладке «Параметры» эти переменные не отмечены как доступные или имеют старые значения «по умолчанию», отчет может их игнорировать.
Рассмотрим продвинутый способ, который гарантирует использование актуального макета прямо из файла. Мы можем программно переопределить схему компоновки в модуле объекта отчета.
Разберем пример кода, который нужно разместить в модуле объекта:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартную обработку, чтобы вручную контролировать процесс
СтандартнаяОбработка = Ложь;
// Принудительно получаем актуальную схему из макета файла
Схема = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
// Выполняем компоновку
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Этот код гарантирует, что при каждом нажатии кнопки «Сформировать» платформа будет брать макет ОсновнаяСхемаКомпоновкиДанных непосредственно из текущего состояния объекта, игнорируя любые кэшированные варианты.
Мы проанализировали проблему игнорирования изменений в запросе СКД и выяснили, что основной виновник — механизмы кэширования идентификаторов. Подведем итог нашим действиям:
ПриКомпоновкеРезультата для программной инициализации схемы.Соблюдение этих правил позволит вам избежать «рака мозга», как выразились участники форума, и сделает процесс разработки внешних отчетов на СКД предсказуемым и эффективным.