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