Каждый разработчик 1С, работающий с управляемыми формами, рано или поздно сталкивается с раздражающей ситуацией: вы вносите изменения в схему компоновки данных (СКД) внешнего отчета (удобнее через инструментарий для анализа метаданных и объектов СКД), меняете текст запроса или состав полей, сохраняете файл, открываете его в режиме «Предприятие», а отчет продолжает работать по-старому. Создается впечатление, что программа игнорирует ваши правки и «помнит» то, что было в самой первой версии файла.
Разберем детально, почему это происходит, где платформа прячет эти настройки и какими способами можно заставить 1С «забыть» старую структуру отчета. Проанализируем ситуацию с точки зрения механизмов платформы 8.3 и Библиотеки стандартных подсистем (БСП).
Для начала выясним причину такого поведения. Платформа 1С идентифицирует внешний отчет не по имени файла (например, МойОтчет_v2.erf), а по внутреннему имени объекта, которое задано в корне свойств отчета в Конфигураторе. Когда вы открываете внешний отчет, 1С обращается к своим системным хранилищам, чтобы найти последние использованные настройки для объекта с таким именем.
Проблема усугубляется механизмом СКД. Система компоновки данных при открытии пытается выполнить «слияние» (merge) текущих настроек из файла и тех, что сохранены в базе данных для этого пользователя. Если в базе сохранен старый вариант настроек, он будет иметь приоритет над тем, что вы жестко задали в схеме. В итоге, даже если вы полностью переписали запрос в СКД, пользовательские настройки «накладываются» сверху, восстанавливая старые отборы и группировки.
Рассмотрим наиболее простой и эффективный способ для разработчика в процессе отладки — для этого подойдёт инструмент для пошаговой отладки и вычисления выражений в 1С. Чтобы платформа восприняла отчет как абсолютно новый, достаточно изменить его внутренний идентификатор. Посмотрим на алгоритм действий:
МойОтчет -> МойОтчет_20231027).Поскольку имя изменилось, 1С не найдет в хранилище старых настроек для этого «нового» объекта и загрузит структуру СКД непосредственно из файла. Это гарантирует, что вы увидите актуальный результат запроса и полей.
Если вы не хотите менять имя отчета (например, если он уже зарегистрирован в дополнительных отчетах и обработках), можно воспользоваться стандартными средствами интерфейса. Проанализируем, как это сделать в управляемой форме:
В этот момент платформа отбросит все пользовательские изменения и принудительно прочитает настройки по умолчанию из схемы компоновки данных, находящейся внутри файла. В большинстве случаев этого достаточно, чтобы изменения в запросе или составе полей вступили в силу.
Иногда настройки «залипают» настолько глубоко (особенно в части кэширования форм), что стандартный сброс не помогает. В этом случае мы можем программно обратиться к объектам, где хранятся данные. В 1С 8.3 за это отвечают ХранилищеСистемныхНастроек, ХранилищеОбщихНастроек и ХранилищеПользовательскихНастроекОтчетов.
Рассмотрим пример кода, который можно выполнить во внешней обработке или в консоли кода, чтобы принудительно удалить записи о настройках конкретного отчета для текущего пользователя:
// Определим ключ объекта. Для внешних отчетов он обычно строится так:
// ВнешнийОтчет.ИмяВашегоОтчета/НастройкиКомпоновщика
КлючОбъекта = "ВнешнийОтчет.ИмяВашегоОтчета.НастройкиКомпоновщика";
// Удаляем настройки из системного хранилища
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, Неопределено, ИмяПользователя());
// Также стоит очистить настройки формы, если они мешают обновлению
КлючФормы = "ВнешнийОтчет.ИмяВашегоОтчета.Форма.ФормаОтчета/НастройкиФормы";
ХранилищеОбщихНастроек.Удалить(КлючФормы, Неопределено, ИмяПользователя());
Этот метод позволяет точечно «почистить память» системы без необходимости переименовывать файл или менять метаданные.
Если вы находитесь в процессе активной разработки и часто меняете структуру СКД, постоянная очистка настроек может утомлять. Проанализируем, как автоматизировать этот процесс на этапе проектирования. В свойствах Формы отчета есть важный параметр — АвтоматическоеСохранениеДанныхВНастройках.
По умолчанию он может быть установлен в значение Использовать. Если на время разработки перевести его в значение Не использовать, платформа перестанет записывать состояние компоновщика в системные таблицы при каждом закрытии формы. Однако стоит помнить, что после завершения разработки это свойство лучше вернуть обратно, чтобы конечные пользователи могли сохранять свои варианты настроек.
В современных конфигурациях (УТ 11, ERP, БСП) настройки внешних отчетов могут дублироваться в справочнике ВариантыОтчетов или регистрах сведений типа НастройкиВариантовОтчетов — для таких случаев полезен инструмент анализа логики и зависимостей объектов 1С. Если ваш отчет подключен через механизм «Дополнительные отчеты и обработки», то после каждого изменения файла в Конфигураторе обязательно нужно зайти в карточку дополнительного отчета в режиме «Предприятие» и нажать кнопку «Обновить из файла». Это инициирует обновление кэша метаданных в справочниках БСП.
Выясним еще один нюанс: кэш клиента. Иногда помогает полная очистка локального кэша пользователя (папки в AppData/Local/1C). Хотя настройки СКД хранятся в базе, некоторые элементы оформления и представления полей могут кэшироваться локально на компьютере разработчика.
Мы рассмотрели несколько уровней решения проблемы: от простого переименования объекта Метаданные до программного манипулирования ХранилищеСистемныхНастроек. Помните, что платформа 1С стремится к максимальному удобству пользователя, сохраняя его настройки, и именно эта «забота» часто мешает программисту увидеть плоды своих трудов. Используйте комбинацию переименования и команды «Установить стандартные настройки», и проблема «залипания» данных исчезнет.