Работа с расширениями в экосистеме 1С:Предприятие 8.3 — это удобный инструмент для быстрой адаптации типовых решений. Однако на практике разработчики часто сталкиваются с ситуациями, когда расширение начинает вести себя нестабильно: «слетают» типы реквизитов, возникают ошибки кэширования или конфликты при обновлении основной конфигурации. В таких случаях встает задача «накатить» изменения из расширения в основную конфигурацию. Рассмотрим подробно, как это сделать правильно, разберем причины технических сбоев и выясним, почему программная настройка форм является «золотым стандартом» разработки.
К сожалению для многих разработчиков, в платформе 1С на текущий момент отсутствует функционал «слияния» (merge) расширения с основной конфигурацией одной кнопкой. Если вы решили перенести форму с модулем, нам придется действовать комбинированными методами. Разберем основные способы.
1. Использование буфера обмена (Copy-Paste) для элементов формы. Самый доступный метод для визуальных элементов. Мы можем открыть форму в расширении и форму в основной конфигурации параллельно. Выделив все элементы дерева формы (Ctrl+A), их можно скопировать и вставить в целевую форму.
Однако здесь есть критически важные нюансы, которые мы должны учитывать:
ПриИзменении или Нажатие) могут не перенестись. Нам придется вручную зайти в свойства каждого важного элемента и заново выбрать соответствующие процедуры в модуле формы.2. Использование механизма «Сравнение и объединение». Хотя платформа не позволяет напрямую сравнивать расширение (файл .cfe) с основной конфигурацией, мы можем применить «обходной маневр». Рассмотрим его по шагам:
Конфигурация — Сравнить, объединить с конфигурацией из файла.Одной из главных причин отказа от расширений в пользу основной конфигурации является баг, когда реквизит типа СправочникСсылка или ДокументСсылка внезапно превращается в тип Строка. Давайте проанализируем, почему это происходит.
Проблема кроется в механизме динамического связывания метаданных. Когда мы заимствуем объект в расширение, платформа создает внутреннюю ссылку на уникальный идентификатор (GUID) этого объекта в основной базе. Если в основной конфигурации объект был удален и создан заново (даже с тем же именем) или если при обновлении конфигурации произошла реструктуризация, связь может разорваться. В ситуации, когда 1С не может определить тип данных реквизита, она по умолчанию интерпретирует его как строку, что и приводит к ошибкам в коде модуля.
Также стоит проверить режим совместимости. Если ваша конфигурация работает в режиме совместимости ниже 8.3.11, работа с типами в расширениях может быть крайне нестабильной. Проанализируем также влияние серверного кэша: иногда некорректные типы — это результат устаревшего кэша метаданных, который лечится его полной очисткой.
В профессиональном сообществе считается хорошим тоном не менять визуальную структуру формы в расширении через редактор, а делать это программно. Это минимизирует риски при обновлении основной конфигурации вендором.
Посмотрим на пример того, как можно добавить кнопку на форму программно, используя расширение модуля формы:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Добавляем новую команду
МояКоманда = ЭтаФорма.Команды.Добавить("Расш1_ДополнительноеДействие");
МояКоманда.Действие = "Расш1_ДополнительноеДействие";
МояКоманда.Заголовок = "Выполнить действие";
// Добавляем кнопку на панель
НоваяКнопка = ЭтаФорма.Элементы.Добавить("Расш1_КнопкаДействия", Тип("КнопкаФормы"), ЭтаФорма.Элементы.КоманднаяПанель);
НоваяКнопка.ИмяКоманды = "Расш1_ДополнительноеДействие";
КонецПроцедуры
Разберем, почему этот метод лучше:
Объект.ИмяРеквизита платформа строже следит за типизацией в момент исполнения.Важно помнить: если вы создавали собственные реквизиты внутри расширения, данные в них хранятся в отдельных таблицах СУБД. Как только вы удалите расширение, чтобы заменить его функционалом в основной конфигурации, эти данные будут безвозвратно потеряны.
Выясним правильный порядок действий для сохранения данных:
Перенос изменений — это всегда ручной и ответственный процесс. Наиболее надежным способом остается ручное воссоздание логики в основной конфигурации с использованием копирования кода модулей и аккуратным переносом элементов формы. Чтобы в будущем не сталкиваться с «глюками» типов, старайтесь использовать программное создание элементов интерфейса. Это сделает вашу конфигурацию более устойчивой к обновлениям и техническим сбоям платформы.