Как правильно перенести доработки из нетиповой конфигурации в расширение для возврата на типовую поддержку?

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

При сопровождении доработанных баз данных нередко возникает задача вернуть основную конфигурацию на полную поддержку поставщика, чтобы последующие обновления проходили безболезненно и в автоматическом режиме. Для этого все пользовательские доработки выносят в механизм расширений. Однако разработчики часто сталкиваются с ошибками: удаление исходного объекта ломает расширение, заимствованные формы тянут за собой половину метаданных, а методы модулей не срабатывают так, как ожидалось. Разберем по шагам правильную методологию обратного переноса доработок в расширение конфигурации.

Понимание разницы между заимствованными и собственными объектами расширения

Проанализируем главную причину ошибки «Объект не обнаружен в конфигурации», которая возникает при попытке вынести новый отчет или обработку в расширение с последующим удалением прототипа из основной конфигурации. Механизм заимствования привязывает объект расширения к уникальному внутреннему идентификатору (UUID) объекта основной базы. Если разработчик использует команду «Добавить в расширение», а затем удаляет прототип из основной конфигурации, связь разрывается и платформа выдает критическую ошибку применимости.

Для переноса полностью новых объектов метаданных (отчетов, обработок, общих модулей, ролей) необходимо создавать собственные объекты расширения, а не заимствовать их. Разберем правильный порядок переноса:

  1. Выгрузим новый отчет или обработку из основной конфигурации в виде внешнего файла (файл .erf или .epf).
  2. Обратим внимание на модуль менеджера: у внешних отчетов и обработок он отсутствует. Обязательно скопируем текст модуля менеджера исходного объекта во временный буфер или текстовый файл перед выгрузкой.
  3. В дереве метаданных расширения создадим новый собственный объект (по кнопке «Добавить», либо через буфер обмена).
  4. Загрузим сохраненный внешний файл в созданный объект расширения и вручную восстановим код модуля менеджера.
  5. Только после этого удалим прототип из основной конфигурации. Так как объект в расширении является собственным, платформа не потребует наличия оригинала в базовой конфигурации.

Перенос доработок типовых форм и модулей

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

Рассмотрим подробнее механизм аннотаций для процедур и функций управляемых форм и модулей:

  1. Директива &Перед: вызывается перед выполнением типовой процедуры конфигурации.
  2. Директива &После: вызывается после отработки базового алгоритма. Например, если нам нужно выполнить дополнительную проверку или вывести служебное сообщение при создании формы на сервере:

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

&Вместо("РассчитатьСкидку")
Функция Расш1_РассчитатьСкидку(СуммаДокумента)
    // Модифицируем входной параметр
    СкорректированнаяСумма = СуммаДокумента * 0.95;
    // Вызываем оригинальный метод типовой конфигурации
    Результат = ПродолжитьВызов(СкорректированнаяСумма);
    Возврат Результат;
КонецФункции
  1. Директива &ИзменениеИКонтроль: позволяет модифицировать только определенную часть типовой процедуры через теги #Вставить и #Удалить. Главное преимущество этого метода заключается в автоматическом контроле: если поставщик при обновлении перепишет исходную процедуру, расширение выдаст предупреждение о несовместимости, предотвратив скрытую логическую ошибку в учете.

Очистка лишних заимствованных связей формы

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

  1. Открываем заимствованную форму в расширении.
  2. Удаляем из формы все реквизиты и таблицы, которые не задействованы в нашей доработке. Если реквизит используется в доработанном коде расширения (например, Объект.Контрагент), его и связанный с ним справочник удалять нельзя, иначе поле потеряет составной тип и станет строковым.
  3. После очистки состава реквизитов формы переходим в дерево метаданных самого расширения и удаляем неиспользуемые справочники, документы и регистры. Платформа предупредит, если удаляемый объект все еще где-то задействован. Если предупреждений нет — объект удаляется безопасно.
  4. Визуальное представление заимствованной формы в дизайнере конфигуратора может выглядеть неполным, однако в режиме «1С:Предприятие» платформа объединит визуальные элементы типовой формы и изменения из расширения без потери исходных полей.

Как скопировать новую форму в заимствованный объект

Если в доработанной конфигурации у типового справочника или документа была создана полностью новая нестандартная форма (например, форма дополнительного подбора), ее перенос нельзя выполнить простым заимствованием. Чтобы форма стала собственной формой расширения, выполним следующую цепочку действий:

  1. Создаем пустую внешнюю обработку в основной конфигурации.
  2. Перетаскиваем доработанную форму из документа конфигурации во внешнюю обработку мышью или через буфер обмена.
  3. Заимствуем типовой документ в расширение (если он еще не заимствован).
  4. Перетаскиваем сохраненную форму из внешней обработки в ветку «Формы» документа внутри расширения. Форма становится собственным объектом расширения, а из исходной конфигурации ее теперь можно удалить.

Управление свойствами: контролируемые и модифицируемые

Выясним причину, почему некоторые свойства объектов (например, флаг Использовать стандартные команды) не получается произвольно изменить в расширении. В платформе 1С разработчик не может вручную назначить произвольное системное свойство модифицируемым. Состав доступных для модификации свойств жестко предопределен платформой:

  1. Свойства, доступные для редактирования, отображаются в палитре свойств заимствованного объекта и помечаются специальным маркером модификации.
  2. Если свойство заблокировано или отсутствует в палитре расширения, переопределить его через расширение невозможно. В таком случае настройка должна быть оставлена в основной конфигурации, либо реализована программно в коде модулей (например, управление видимостью командных панелей в процедуре формы).
  3. Контролируемые свойства отслеживают совпадение параметров расширения с основной конфигурацией. Если при очередном обновлении поставщик изменил тип данных реквизита, флаг контроля предотвратит запуск некорректного кода.

Стратегия разделения расширений и перенос между базами

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

  1. Дробление по подсистемам: логически независимые доработки (интеграция с внешними сервисами, модуль согласования, дополнительные отчеты) выносим в отдельные расширения с назначением «Дополнение» или «Адаптация».
  2. Изоляция форм: избегаем изменения одной и той же экранной формы документа из двух разных расширений во избежание конфликтов компоновки интерфейса.
  3. Перенос на рабочие базы: готовое расширение выгружается в файл с расширением .cfe через меню «Конфигурация — Расширения конфигурации — Сохранить конфигурацию в файл». При загрузке в однотипную рабочую базу важно помнить, что системные флаги «Безопасный режим» и «Защита от опасных действий» не сохраняются в файле и настраиваются администратором при подключении.
← На главную