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