Как заменить определяемый тип в расширениях 1С при обновлении конфигурации?

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

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

Это происходит из-за того, что фирма «1С» периодически проводит рефакторинг метаданных. К примеру, определяемый тип ДенежноеПолеНеотрицательное переименовывается в ДенежнаяСуммаНеотрицательная, а ДенежноеПолеЛюбойЗнак становится объектом ДенежнаяСуммаЛюбогоЗнака. Если эти типы использовались в десятках мест вашего расширения (в реквизитах форм, документов, справочников), система заблокирует применение расширения.

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

---

Метод 1. Глобальная автозамена через выгрузку конфигурации в файлы XML

Если измененный определяемый тип используется в вашем расширении в 50–100 местах, вручную заменять его через интерактивный интерфейс Конфигуратора крайне долго и неэффективно. Профессиональный подход заключается в использовании механизма выгрузки и загрузки конфигурации в файлы XML. Рассмотрим этот процесс по шагам.

Шаг 1. Выгрузка расширения в файлы

Для начала нам необходимо получить исходные тексты нашего расширения в виде XML-файлов:

  1. Откройте Конфигуратор и перейдите в меню Конфигурация — Расширения конфигурации.
  2. Выделите в списке ваше проблемное расширение.
  3. В главном меню выберите пункт Конфигурация — Выгрузить конфигурацию в файлы....
  4. Создайте на диске новую пустую папку (например, C:\Ext_Source\) и укажите её в качестве каталога выгрузки. Нажмите кнопку Выполнить.

Шаг 2. Глобальный поиск и автозамена

Для редактирования выгруженных файлов нам понадобится любой современный текстовый редактор, поддерживающий поиск по файлам в папке (например, Visual Studio Code, Notepad++ или Sublime Text). Рассмотрим дальнейшие действия на примере VS Code:

  1. Откройте выгруженную папку в текстовом редакторе.
  2. Вызовите панель глобального поиска и автозамены (сочетание клавиш Ctrl + Shift + F).
  3. В поле поиска введите старый тип метаданных, например: ОпределяемыйТип.ДенежноеПолеНеотрицательное (или соответствующий XML-тег).
  4. В поле замены введите новое имя типа: ОпределяемыйТип.ДенежнаяСуммаНеотрицательная.
  5. Выполните автозамену во всех файлах проекта.
  6. Повторите процедуру для второго типа: замените ОпределяемыйТип.ДенежноеПолеЛюбойЗнак на ОпределяемыйТип.ДенежнаяСуммаЛюбогоЗнака.

Проанализируем структуру файлов. Внутри XML-файлов описание типов реквизитов выглядит следующим образом:


<TypeDescription>
    <Type>cfg:DefinedType.ДенежноеПолеНеотрицательное</Type>
</TypeDescription>

После автозамены этот блок примет корректный вид:


<TypeDescription>
    <Type>cfg:DefinedType.ДенежнаяСуммаНеотрицательная</Type>
</TypeDescription>

Шаг 3. Переименование файлов и обновление манифеста

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

  1. Найдите файлы ДенежноеПолеНеотрицательное.xml и переименуйте их в ДенежнаяСуммаНеотрицательная.xml.
  2. Откройте файл-манифест конфигурации расширения (обычно это Configuration.xml в корне выгрузки) и найдите там ссылки на старые определяемые типы. Замените их имена на новые.

Шаг 4. Загрузка измененных файлов обратно в 1С

  1. Вернитесь в Конфигуратор 1С в окно управления расширениями.
  2. Убедитесь, что выделено нужное расширение, и выберите Конфигурация — Загрузить конфигурацию из файлов....
  3. Укажите папку, в которой производилась автозамена.
  4. После успешной загрузки обновите конфигурацию базы данных, нажав клавишу F7.

---

Метод 2. Временное отключение активности расширения для обхода блокировок

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

Разберем по шагам, как обойти эту блокировку:

  1. Откройте список расширений (Конфигурация — Расширения конфигурации).
  2. В строке с проблемным расширением найдите колонку Активно и снимите с нее галочку.
  3. Нажмите клавишу F7 для применения конфигурации базы данных. Поскольку расширение теперь неактивно, платформа проигнорирует все ошибки совместимости и успешно применит обновление основной конфигурации.
  4. Теперь ваше расширение открыто для безопасного редактирования в Конфигураторе. Вы можете открыть основную конфигурацию, найти новые определяемые типы (ДенежнаяСуммаНеотрицательная и ДенежнаяСуммаЛюбогоЗнака), кликнуть по ним правой кнопкой мыши и выбрать пункт Добавить в расширение.
  5. После этого удалите старые, более не существующие заимствованные определяемые типы из дерева объектов расширения.
  6. Верните галочку в колонку Активно и снова обновите базу данных (F7).

---

Метод 3. Отключение контроля проверки типов при подключении

Существует еще один быстрый способ заставить расширение работать без радикального изменения метаданных в экстренных ситуациях. Рассмотрим механизм свойства проверки объектов.

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

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

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

---

Особенности работы с UUID объектов (платформа 8.3.20 и выше)

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

«Критичная: изменился внутренний идентификатор расширенного объекта основной конфигурации...»

Это происходит потому, что при глубоком рефакторинге фирма «1С» могла не просто переименовать определяемый тип, но и пересоздать его заново в основной конфигурации. В результате у объекта изменился его внутренний уникальный идентификатор (UUID). Платформа версии 8.3.20 и выше осуществляет строгий контроль уникальных идентификаторов заимствованных типов.

Чтобы решить проблему с несовпадением UUID:

  1. Удалите старый заимствованный определяемый тип из дерева объектов вашего расширения.
  2. Заново заимствуйте этот тип из основной конфигурации. Платформа автоматически считает и запишет в расширение его новый актуальный UUID.
  3. Если ручное перепривязывание типов у реквизитов внутри расширения сбрасывает их значения, воспользуйтесь Методом 1: выгрузите расширение в XML и замените в файлах старый UUID определяемого типа на новый. Узнать новый UUID можно, выгрузив аналогичным образом в файлы основную конфигурацию или вновь заимствованный объект.

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

← На главную