Почему макет СКД не переносится в расширение или не дает себя редактировать

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

При разработке в среде 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда механизм расширений ведет себя непредсказуемо при работе с макетами. Типичный сценарий: на локальной файловой базе всё работает корректно, а после переноса на серверный кластер (SQL) макет становится недоступным для редактирования или вовсе игнорирует внесенные изменения. Проанализируем, почему это происходит, и рассмотрим детальные алгоритмы решения этой задачи.

Причина 1. Ограничения версии платформы и режима совместимости

Разберем фундаментальную причину, которая чаще всего становится камнем преткновения. Долгое время в платформе 1С существовало жесткое ограничение: в расширениях можно было полноценно заимствовать и изменять только макеты типа Табличный документ. Макеты типа Схема компоновки данных (СКД), Двоичные данные или Текстовый документ заимствовались в режиме "только чтение".

Ситуация изменилась только с выходом версии платформы 8.3.22. Именно в этом релизе разработчики 1С реализовали возможность полноценного расширения макетов всех типов. Если ваша рабочая база (SQL) работает на платформе версии 8.3.18, 8.3.20 или ниже, вы столкнетесь с тем, что макет СКД в расширении будет отображаться, но отредактировать его или заставить систему видеть новые поля не удастся.

Важно помнить, что недостаточно просто обновить сервер 1С до версии 8.3.22. Необходимо проверить режим совместимости конфигурации и самого расширения. Если база запущена на 8.3.22, но в свойствах стоит "Режим совместимости: 8.3.18", новые возможности по работе с макетами будут заблокированы платформой для обеспечения обратной совместимости.

Решение 1. Обновление технологического стека

Проанализируем шаги, которые необходимо выполнить, чтобы макеты СКД стали редактируемыми в расширении "штатным" способом:

  1. Убедимся, что версия платформы на сервере и на рабочих станциях разработчиков не ниже 8.3.22.1709 (или более свежих релизов).
  2. В свойствах основной конфигурации проверим значение свойства Режим совместимости.
  3. В свойствах вашего расширения установим Режим совместимости в значение "Не использовать" или в значение, соответствующее текущей версии платформы (например, 8.3.22).
  4. После этого заимствуем макет заново. Теперь платформа должна позволить открывать конструктор СКД непосредственно внутри расширения.

Решение 2. Программная подмена макета (для старых версий платформы)

Если обновление платформы невозможно (например, из-за требований корпоративных стандартов или совместимости с другим софтом), нам придется использовать обходные пути. Рассмотрим ситуацию на примере макета СКД_ДанныеШаблонаСообщений в конфигурации УНФ.

Поскольку мы не можем отредактировать заимствованный макет СКД в расширении на платформе 8.3.18, мы создадим собственный макет и перенаправим логику программы на него. Разберем этот процесс по шагам:

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

Проанализируем пример кода, который необходимо добавить в расширение общего модуля (например, в ШаблоныСообщенийПереопределяемый или аналогичный механизм перехвата):


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

Обратите внимание: использование аннотации &Вместо позволяет полностью перехватить управление. Однако более мягким способом будет использование &После, если логика программы позволяет изменить структуру уже полученного макета, но в случае с СКД полная подмена макета через &Вместо является наиболее надежным вариантом.

Решение 3. Использование переопределяемых модулей БСП

Если ваша конфигурация (как УНФ 1.6) построена на базе БСП, рассмотрим еще один профессиональный подход. Система шаблонов сообщений спроектирована так, чтобы разработчик мог добавлять свои поля без изменения макетов СКД. Выясним, как это реализовать.

В общем модуле ШаблоныСообщенийПереопределяемый существуют специальные процедуры-события. Мы можем заимствовать этот модуль в расширение и использовать процедуру ПриОпределенииНастроекШаблоновСообщений или аналогичные ей для программного добавления атрибутов.

Посмотрим на пример добавления поля программным способом:


Процедура ПриЗаполненииСпискаРеквизитовШаблона(ИмяНастройки, СписокРеквизитов)
    
    Если ИмяНастройки = "Документ.ЗаказПокупателя" Тогда
        // Добавляем свое поле, которого нет в типовом макете СКД
        НоваяСтрока = СписокРеквизитов.Добавить();
        НоваяСтрока.Имя = "ДополнительноеПолеКонтрагента";
        НоваяСтрока.Псевдоним = "Доп. поле контрагента (из расширения)";
    КонецЕсли;
    
КонецПроцедуры

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

Особенности работы на SQL-базах: кэширование

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

При обновлении расширения на SQL-базе выполните следующие действия:

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

← На главную