В процессе разработки отчетов на Системе Компоновки Данных (СКД) на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда новая колонка, добавленная в запрос и в выводимые поля схемы СКД, корректно отображается при работе с внешним файлом отчета, но не появляется при запуске непосредственно из режима 1С:Предприятия. Эта проблема может быть вызвана рядом причин, от сохраненных настроек пользователя до программного управления выводом отчета. Давайте рассмотрим все возможные сценарии и способы их диагностики и устранения.
Одна из наиболее частых причин отсутствия новой колонки — это использование старых сохраненных настроек отчета, которые не включают в себя новую структуру. Даже если мы добавили колонку в схему СКД, система может загружать пользовательские настройки, где эта колонка не выбрана для отображения.
Очистка пользовательских настроек через интерфейс 1С:Предприятия:
Программная очистка хранилища настроек:
Иногда обычная очистка кэша или сброс настроек через меню может быть недостаточным. Пользовательские варианты отчетов и настройки хранятся в специальных системных хранилищах, например, в регистре сведений СохраненныеНастройки. Необходимо убедиться, что удаляются настройки для всех пользователей, которые могли работать с этим отчетом. Для более глубокой очистки можно воспользоваться следующим кодом (например, через универсальную обработку или консоль запросов), чтобы удалить соответствующие записи:
// Пример кода для очистки настроек конкретного отчета
// Замените "ВашОтчет" на фактическое имя объекта отчета (например, "Отчет.ВзаиморасчетыСКонтрагентами")
ИмяОбъектаОтчета = "ВашОтчет";
// Создаем запрос для поиска настроек, связанных с отчетом
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СохраненныеНастройки.Ссылка
|ИЗ
| РегистрСведений.СохраненныеНастройки КАК СохраненныеНастройки
|ГДЕ
| СохраненныеНастройки.ИмяОбъекта = &ИмяОбъектаОтчета
| ИЛИ СохраненныеНастройки.ИмяОбъекта ПОДОБНО &ИмяОбъектаОтчетаДляВариантов";
Запрос.УстановитьПараметр("ИмяОбъектаОтчета", ИмяОбъектаОтчета);
// Добавляем параметр для поиска вариантов, которые часто именуются как "ИмяОтчета.ИмяВарианта"
Запрос.УстановитьПараметр("ИмяОбъектаОтчетаДляВариантов", ИмяОбъектаОтчета + ".%");
// Выполняем запрос и обходим найденные записи
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Попытка
// Создаем менеджер записи для удаления
МенеджерЗаписи = РегистрыСведений.СохраненныеНастройки.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Ссылка = Выборка.Ссылка;
МенеджерЗаписи.Прочитать(); // Считываем запись
МенеджерЗаписи.Удалить(); // Удаляем запись
Сообщить("Удалена запись настроек: " + Выборка.Ссылка);
Исключение
Сообщить("Не удалось удалить запись настроек " + Выборка.Ссылка + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Сообщить("Очистка настроек отчета " + ИмяОбъектаОтчета + " завершена.");
Переименование отчета:
Как вариант, предложенный на форуме, можно попробовать переименовать отчет. Если мы изменим имя объекта отчета в конфигураторе, система будет воспринимать его как совершенно новый отчет и, соответственно, создаст для него новые, чистые настройки, полностью игнорируя старые. Однако этот метод не всегда применим, так как может потребовать переработки ссылок на отчет в других местах конфигурации.
Часто разработчики используют программный код для динамического изменения структуры отчета СКД или даже для его полного формирования. Если отчет является типовым или доработанным, всегда следует проверять его модуль на наличие такого кода, который может полностью переопределять настройки, сделанные в СКД.
Обработчик ПриКомпоновкеРезультата:
Это первое место, куда следует заглянуть в модуле объекта отчета. Разработчики часто используют этот обработчик для изменения уже сформированного макета компоновки данных. В этом коде могут быть строки, которые удаляют или скрывают определенные поля из итогового табличного документа, или программно меняют состав выбранных полей в настройках компоновки. Давайте рассмотрим пример:
// Пример обработчика ПриКомпоновкеРезультата, который может скрывать колонку
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Если СтандартнаяОбработка установлена в Ложь,
// это означает, что отчет формируется полностью программно,
// и настройки из конфигуратора будут проигнорированы.
// Если вы видите эту строку, внимательно изучите весь код ниже.
// СтандартнаяОбработка = Ложь;
// Получаем текущие настройки компоновки данных
// Это может быть сделано из КомпоновщикаНастроек (если отчет не полностью программный)
// или программно созданы новые настройки.
// Например:
// НастройкиКомпоновки = КомпоновщикМакета.Настройки;
// или:
// НастройкиКомпоновки = Новый СхемаКомпоновкиДанных().НастройкиПоУмолчанию;
// Предположим, у нас есть доступ к текущим настройкам:
Если НЕ СтандартнаяОбработка Тогда // Если мы сами управляем компоновкой
// Получаем схему компоновки (если она не получена ранее)
СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Получаем текущие настройки (или создаем новые)
// В реальном коде здесь будет более сложная логика получения настроек
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
// Пример программного изменения настроек
// Например, удаляем поле "НоваяКолонка" из выбранных полей, если оно там есть
Для Каждого ВыбранноеПоле Из НастройкиКомпоновки.Выбор Цикл
Если ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("НоваяКолонка") Тогда
НастройкиКомпоновки.Выбор.Удалить(ВыбранноеПоле);
Сообщить("Колонка 'НоваяКолонка' была удалена программно из выбранных полей.");
Прервать;
КонецЕсли;
КонецЦикла;
// Также могут быть изменения в группировках, ресурсах или условном оформлении.
// Пример изменения условного оформления
// Для Каждого ЭлементОформления Из НастройкиКомпоновки.УсловноеОформление Цикл
// Если ЭлементОформления.Поля.Найти("НоваяКолонка") <> Неопределено Тогда
// ЭлементОформления.Использование = Ложь; // Отключаем правило
// КонецЕсли;
// КонецЦикла;
// Далее следует стандартный код компоновки, если СтандартнаяОбработка = Ложь
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.СкомпоноватьМакет(СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Иначе
// Если СтандартнаяОбработка = Истина, то компоновка происходит автоматически.
// Здесь можно, например, изменить уже готовый ДокументРезультат.
// Например, скрыть колонку после ее формирования:
// Для Каждого КолонкаТД Из ДокументРезультат.Области.ПолучитьОбластиПоИмени("ЗаголовокКолонки").Область.Колонки Цикл
// Если КолонкаТД.Имя = "НоваяКолонка" Тогда
// КолонкаТД.Ширина = 0; // Скрываем колонку, устанавливая ширину в 0
// КонецЕсли;
// КонецЦикла;
Сообщить("Стандартная обработка включена.");
КонецЕсли;
КонецПроцедуры
Внимательно изучаем код внутри этого обработчика. Если СтандартнаяОбработка устанавливается в Ложь, это означает, что отчет формируется полностью программно, и все изменения, внесенные в схему через конструктор, будут игнорироваться, если они не продублированы в коде.
Программное создание макета:
В некоторых случаях весь макет отчета формируется кодом. В модуле объекта отчета может находиться процедура, которая получает схему компоновки, затем программно изменяет ее настройки (например, удаляет или добавляет поля, меняет структуру группировок) и только после этого выводит результат. В таком случае, изменения, внесенные в схему через конструктор, будут игнорироваться.
Внешние отчеты и БСП:
Если отчет является внешним и подключен через Библиотеку стандартных подсистем (БСП), его вызов и формирование могут управляться общими модулями БСП. Стоит проверить код, связанный с подсистемой "Дополнительные отчеты и обработки", на предмет наличия алгоритмов, изменяющих структуру отчета перед его отображением пользователю. Эти модули могут переопределять настройки СКД или добавлять свои обработчики.
Механизм условного оформления (УО) в СКД — это мощный инструмент, который позволяет гибко управлять внешним видом отчета, включая видимость отдельных элементов. Наша новая колонка могла быть случайно скрыта правилом условного оформления.
ПриКомпоновкеРезультата), проверьте код на предмет добавления элементов условного оформления, которые могут скрывать нашу колонку.Если вышеперечисленные шаги не помогли, рассмотрим менее очевидные, но не менее важные причины, которые могут привести к невидимости колонки.
Заключение:
Проблема с отсутствием колонки в отчете СКД при запуске из 1С:Предприятия может быть многофакторной и требовать систематического подхода к диагностике. Начинать следует с самых простых и распространенных причин — очистки сохраненных настроек пользователя и проверки кэша. Если это не помогло, переходите к более глубокому анализу программного кода отчета, который может переопределять настройки СКД, а также к проверке условного оформления, функциональных опций и прав доступа. Внимательный и методичный подход к каждому из этих пунктов поможет вам выявить и устранить проблему, обеспечив корректное отображение новой колонки в отчете.