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

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

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

В этой статье мы подробно разберем, почему возникает этот неприятный эффект, как устроен механизм кэширования отчетов и рассмотрим пять практических способов решения проблемы — от простых "быстрых" хаков до правильных архитектурных подходов программирования в 1С.

Выясняем причину: почему это происходит?

Описанное поведение не является ошибкой самой платформы «1С:Предприятие». Это следствие работы оптимизационных механизмов внутри Библиотеки стандартных подсистем (БСП), на которой построены почти все современные конфигурации 1С.

Давайте проанализируем ситуацию по шагам:

  1. Кэширование вариантов отчетов в БСП. В подсистеме «Варианты отчетов» БСП при первом обращении к любому отчету происходит его регистрация. Система анализирует структуру схемы СКД, доступные поля, отборы и параметры, после чего сохраняет эти настройки в справочнике ВариантыОтчетов и во внутреннем системном хранилище настроек. При последующих запусках отчета БСП не читает XML-схему макета заново, а берет уже готовую структуру из своего кэша для ускорения работы интерфейса. Новое поле «Штрихкод», добавленное вами в расширении, отсутствует в старом кэше, поэтому пользователь его не видит.
  2. Специфика заимствования макетов СКД платформой. Сама платформа «1С:Предприятие» накладывает определенные ограничения на прямое заимствование макета ОсновнаяСхемаКомпоновкиДанных. Если вы просто перенесли макет в расширение и заменили его содержимое, платформа при определенных условиях (например, при запуске под некоторыми версиями технологической платформы) может приоритетно скомпоновать макет из основной конфигурации, проигнорировав изменения в расширении.

Ниже мы подробно рассмотрим все возможные варианты решения этой проблемы, начиная с простейших и заканчивая профессиональными методами разработки.

Решение 1. Переименование отчета в конфигураторе расширения

Это тот самый быстрый совет, который часто дают на форумах поддержки разработчиков. Давайте разберем, почему он работает.

Если вы зайдете в конфигуратор расширения и переименуете заимствованный отчет (например, измените имя Продажи на Продажи_Модифицированный), для БСП этот отчет станет абсолютно новым объектом метаданных. У системы не будет для него никаких старых записей в справочнике вариантов отчетов или кэше настроек. При первом открытии переименованного отчета БСП считает измененную схему СКД «с нуля» вместе с вашим новым полем «Штрихкод».

Минусы метода:

Решение 2. Сброс настроек отчета к стандартным в режиме Предприятия

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

  1. Откройте проблемный отчет в режиме «1С:Предприятие».
  2. В правом верхнем углу формы нажмите кнопку «Еще».
  3. В выпадающем меню выберите пункт «Установить стандартные настройки».

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

Решение 3. Обновление вспомогательных данных БСП для всей базы

Если отчет уже используется многими пользователями, выполнять ручной сброс настроек у каждого из них нереально. Чтобы принудительно заставить БСП обновить кэш вариантов отчетов для всей информационной базы, администратор может использовать один из двух вариантов:

Вариант А: Параметр запуска конфигурации
Запустите информационную базу в режиме «1С:Предприятие» с дополнительным параметром командной строки: /C СтартОбновленияИнформационнойБазы. В процессе обновления конфигурация перечитает метаданные всех отчетов, включая изменения в расширениях, и обновит записи в справочнике вариантов отчетов.

Вариант Б: Через панель администрирования

  1. Перейдите в раздел «Администрирование» — «Печатные формы, отчеты и обработки».
  2. Откройте гиперссылку «Отчеты».
  3. Найдите в списке отчет «Продажи».
  4. Используйте стандартные команды обновления или пересохранения настроек вариантов отчета, чтобы БСП обновила кэшированную структуру макета.

Решение 4. Правильная методика изменения СКД в расширении (Рекомендация 1С)

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

  1. Заимствуйте в расширение сам объект метаданных Отчет (например, «Продажи»). При этом не нужно заимствовать его оригинальный макет схемы компоновки данных.
  2. В конфигураторе расширения добавьте к вашему заимствованному отчету новый макет типа «Схема компоновки данных» и дайте ему уникальное имя, например, ОсновнаяСхемаКомпоновкиДанных_Кастомная. Загрузите в этот макет вашу измененную схему со штрихкодом.
  3. В окне свойств заимствованного отчета в расширении найдите свойство «Основная схема компоновки данных» и выберите в нем ваш новый макет ОсновнаяСхемаКомпоновкиДанных_Кастомная вместо стандартного.

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

Решение 5. Программное переопределение схемы СКД через код

Если кэширование БСП все равно мешает нормальной работе, вы можете гарантированно решить проблему на программном уровне. Для этого используется программная подмена схемы компоновки непосредственно перед ее инициализацией или загрузкой настроек.

Рассмотрим два варианта программной подмены кода в расширении.

Вариант А. Через модуль объекта отчета (событие компоновки)

Заимствуйте в расширение модуль объекта отчета и добавьте аннотацию &Вместо для предопределенной процедуры компоновки результата:


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

Вариант Б. Через интеграцию с механизмами БСП (модуль объекта)

В БСП предусмотрены специальные экспортные процедуры для мягкой подмены схем. Заимствуйте в расширение обработчик загрузки настроек в модуле объекта отчета:


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

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

Резюме и рекомендации

Мы проанализировали проблему обновления макетов СКД в расширениях 1С и нашли несколько путей ее решения. При выборе метода рекомендуем придерживаться следующих правил:

← На главную