Как заменить текстовый макет в обработке с помощью расширения 1С

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

В процессе сопровождения типовых конфигураций, таких как "1С:Бухгалтерия предприятия 3.0", разработчики часто сталкиваются с необходимостью изменения логики заполнения справочников, базирующихся на макетах. Типичный пример — обработка ЗаполнениеКалендарныхГрафикав и её текстовый макет ДанныеПроизводственныхКалендарей. При обновлении конфигурации типовые макеты перезаписываются, и внесенные вручную изменения теряются. Чтобы избежать этого и сохранить конфигурацию "на замочке", оптимальным решением является использование расширений. Рассмотрим подробно, как правильно подменить макет в расширении и какие нюансы при этом возникают.

Метод 1. Автоматическое замещение макета по имени

Платформа "1С:Предприятие 8.3" поддерживает механизм автоматического переопределения объектов. Если в расширение добавлен объект (например, обработка) и в этом расширении создан макет с идентичным именем, система при выполнении кода будет отдавать приоритет макету из расширения.

Разберем по шагам процесс добавления:

  1. Откроем основную конфигурацию и найдем нужную обработку.
  2. Нажмем правой кнопкой мыши на макет и выберем команду "Добавить в расширение".
  3. Перейдем в окно конфигурации расширения. Теперь этот макет доступен для редактирования.

Проанализируем ситуацию, когда макет не открывается для редактирования (открывается только окно свойств). Это часто происходит, если разработчик пытается редактировать макет в основном дереве конфигурации, а не в окне расширения. Убедимся, что мы работаем именно с объектом в расширении. Если проблема сохраняется, проверим Режим совместимости расширения — он должен соответствовать режиму совместимости основной конфигурации или быть выше, иначе редакторы текстовых документов могут блокироваться платформой.

При использовании метода ЭтотОбъект.ПолучитьМакет("ИмяМакета") или УдаленныеОбработки.ИмяОбработки.ПолучитьМакет("ИмяМакета") система сначала выполнит поиск в активных расширениях. Если макет с таким именем найден — будет возвращен именно он.

Метод 2. Программная подмена макета через аннотацию &Вместо

Иногда стандартное замещение может работать нестабильно, особенно если обращение к макету происходит специфическим образом или через менеджер объекта в контексте, который расширение "подхватывает" некорректно. В этом случае применим более надежный способ — перехват процедуры, вызывающей макет.

Рассмотрим пример, когда нам нужно подменить данные производственного календаря. Вместо того чтобы просто заимствовать типовой макет, мы создадим в расширении свой собственный макет с уникальным именем, например, П_ДанныеПроизводственныхКалендарей.

Выполним следующие действия:

  1. Добавим в расширение обработку ЗаполнениеКалендарныхГрафиков.
  2. Создадим в ней новый макет (текстовый документ) и наполним его нашими данными.
  3. Найдем в модуле обработки процедуру или функцию, которая обращается к макету. Например, это может быть функция ПолучитьДанныеИзМакета().
  4. В модуле расширения создадим метод-перехватчик с использованием аннотации &Вместо.

Посмотрим на пример кода, который позволит нам перенаправить вызов к нашему новому макету:


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

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

Важные технические нюансы работы с текстовыми макетами

Выясним причины, по которым макет в расширении может "не подхватываться" или вызывать ошибки:

1. Формат данных. В конфигурации "Бухгалтерия предприятия 3.0" макеты с данными календарей часто хранятся в формате JSON или XML. При редактировании текстового макета в расширении крайне важно соблюдать структуру тегов и кодировку (UTF-8). Любая лишняя скобка или неверный символ в JSON приведет к тому, что стандартная обработка не сможет прочитать данные.

2. Область видимости менеджера. Если код в основной конфигурации обращается к макету через менеджер: Обработки.ЗаполнениеКалендарныхГрафиков.ПолучитьМакет("..."), убедитесь, что в расширение заимствован именно менеджер этой обработки. Если вызов идет через созданный объект (ЭтотОбъект), заимствование должно быть соответствующим.

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

Обслуживание и обновление данных

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

Рекомендуемая стратегия актуализации:

Таким образом, мы рассмотрели два основных способа замены макета. Первый (через идентичное имя) проще в реализации, но второй (через &Вместо) дает разработчику полный контроль над процессом и исключает нестабильность платформенных механизмов замещения.

← На главную