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