Расширение не применяется после обновления: ищем и чиним нарушения целостности

· 10 мин

Содержание

Проверка логической целостности расширения запускается в конфигураторе: откройте расширение, затем Конфигурация → Проверка конфигурации..., отметьте флажок «Проверка логической целостности конфигурации» и нажмите «Выполнить». Платформа покажет, какие объекты расширения ссылаются на то, чего больше нет в основной конфигурации или в самом расширении. Ошибки исправляют прямо в дереве расширения, а если дерево «замусорено» — пересобирают расширение через сохранение в файл .cfe и обратную загрузку.

Типичная ситуация: вечером обновили БП 3.0 на новый релиз, утром бухгалтер открывает базу, а доработанная печатная форма счёта пропала. Расширение с ней не применилось: в новом релизе поменялся заимствованный макет или реквизит. Проверка целостности за минуту показывает, что именно сломалось.

Что такое логическая целостность расширения и чем она отличается от целостности базы

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

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

Не путайте две похожие проверки:

ПроверкаГде запускаетсяЧто проверяет
Логическая целостность конфигурацииКонфигурация → Проверка конфигурации...Метаданные: типы, ссылки между объектами, формы, обработчики
Логическая целостность информационной базыАдминистрирование → Тестирование и исправление...Данные в таблицах: структуру записей, служебные поля

Первая работает с описанием программы, вторая — с данными. Если не применяется расширение, нужна первая. Тестирование и исправление базы здесь не поможет, а на большой базе займёт часы и потребует монопольного доступа.

Когда расширение конфигурации теряет целостность

Ошибки появляются не сами по себе. За каждой стоит изменение одной из двух сторон: основной конфигурации или расширения.

  • 🔄 Обновление основной конфигурации. Самый частый сценарий. В новом релизе разработчик типовой удалил реквизит, переделал форму или переименовал общий модуль, а расширение заимствовало старый вариант.
  • ✂️ Ручное удаление объекта из основной конфигурации. Программист убрал «лишний» справочник, не проверив, что его заимствует расширение.
  • 🧩 Контролируемые свойства. Расширение может контролировать свойства заимствованного объекта — например, тип реквизита. Если в основной конфигурации тип изменился, расширение откажется применяться.
  • 📦 Загрузка чужого .cfe. Расширение сделано под другой релиз или другую конфигурацию. Загрузилось без вопросов, а при применении — ошибки.
  • 🗂️ Несколько расширений на один объект. Два расширения переопределяют один и тот же метод или элемент формы. Каждое по отдельности корректно, а вместе — конфликт.
  • ⚙️ Режим совместимости. У расширения и основной конфигурации разные режимы совместимости. После обновления типовой режим в ней поднялся, а у расширения остался старый.
  • 🧹 Внутренний «мусор» после долгих правок. Расширение годами правили, переносили через буфер обмена, сравнивали и объединяли. В нём остались служебные ссылки на удалённые элементы, которые не видны в дереве.

В пользовательском режиме это выглядит одинаково: расширение есть в списке, но доработки не работают. Список расширений в БП 3.0 и ЗУП 3.1 открывается так: Администрирование → Печатные формы, отчеты и обработки → Расширения. В строке проблемного расширения обычно видна пометка об ошибке применения, а по ссылке — текст с указанием объекта.

Проверка конфигурации в конфигураторе: пошагово для расширения

Шаг 1. Откройте расширение

  1. Запустите конфигуратор под пользователем с правами администратора.
  2. Конфигурация → Открыть конфигурацию, если основная ещё не открыта.
  3. Конфигурация → Расширения конфигурации — откроется список расширений базы.
  4. Дважды щёлкните по нужному расширению. Откроется его собственное дерево метаданных.

Монопольный доступ для этого не нужен: пользователи могут продолжать работать.

Шаг 2. Запустите проверку

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

Сначала проверьте основную конфигурацию тем же способом. Если ошибки есть уже в ней, расширение тут ни при чём, и чинить нужно её.

Шаг 3. Разберите сообщения

Результат выводится в окно служебных сообщений. Двойной щелчок по строке переводит к объекту или к строке модуля. Читайте сообщение целиком: в нём указан путь к объекту вида Справочник.Контрагенты.Форма.ФормаЭлемента и суть нарушения.

Что обычно делают с найденным:

Что нашла проверкаКак исправить
Заимствованный объект отсутствует в основной конфигурацииУдалить заимствование из расширения или заимствовать новый объект, который пришёл на замену
Не совпадает контролируемое свойствоОткрыть объект в расширении, сверить свойство с основной конфигурацией, привести к новому значению или снять контроль
Элемент формы ссылается на несуществующий реквизитПерепривязать элемент к актуальному реквизиту или удалить элемент
Обработчик ссылается на отсутствующую процедуруСоздать процедуру в модуле расширения или очистить обработчик в свойствах
Ошибка синтаксиса в модуле расширенияИсправить код: чаще всего вызывается метод общего модуля, который в новом релизе переименован

Шаг 4. Сохраните и примените

После правок нажмите Конфигурация → Обновить конфигурацию базы данных при активном окне расширения (или F7). Изменения расширения запишутся в базу. Пользователям достаточно перезапустить сеанс, чтобы получить исправленное расширение.

Перед правкой расширения в рабочей базе сохраните его копию в файл .cfe. Откат к файлу занимает минуту, а восстановление удалённых заимствований по памяти — полдня.

Диагностика: выберите симптом

Пересборка через файл: способ cf2cf для расширения

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

Для расширения тот же приём делается с файлом .cfe.

Вариант 1. Сохранение и загрузка .cfe

  1. Активируйте окно дерева расширения.
  2. В меню Конфигурация выберите команду сохранения расширения в файл. Получите .cfe.
  3. Проверьте, что файл открывается: размер не нулевой, дата свежая.
  4. В том же меню выберите загрузку из файла и укажите только что сохранённый .cfe.
  5. Обновите конфигурацию базы данных (F7).
  6. Повторите проверку логической целостности.

Этот вариант быстрый, но чистит не всё.

Вариант 2. Выгрузка в XML и обратная загрузка

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

  1. В меню Конфигурация для активного расширения выберите выгрузку в файлы, укажите пустую папку.
  2. Найдите по файлам имя объекта из сообщения об ошибке — обычный поиск по папке в редакторе кода.
  3. Удалите или исправьте ссылку в XML. Делайте это, только если понимаете структуру файла.
  4. Загрузите расширение из файлов обратно и примените его.

То же из командной строки (пути замените на свои):

set V8="C:\Program Files\1cv8\8.3.25.1374\bin\1cv8.exe"
set IB=/F"D:\Bases\Buh"
set USR=/N"Администратор" /P""

rem выгрузить расширение в XML
%V8% DESIGNER %IB% %USR% /DumpConfigToFiles "D:\ext_xml" -Extension "МоиДоработки" /Out "D:\dump.log"

rem загрузить обратно
%V8% DESIGNER %IB% %USR% /LoadConfigFromFiles "D:\ext_xml" -Extension "МоиДоработки" /Out "D:\load.log"

rem применить расширение
%V8% DESIGNER %IB% %USR% /UpdateDBCfg -Extension "МоиДоработки" /Out "D:\update.log"

Номер платформы в пути C:\Program Files\1cv8\... подставьте свой. Если в базе несколько платформ, используйте ту, на которой работают пользователи.

СпособКогда применятьРиски
Правка в дереве расширенияОшибок немного, объекты видныМинимальные
Сохранение и загрузка .cfeПроверка ругается на «невидимые» элементыНизкие, если сохранили копию
Выгрузка в XML, правка, загрузкаПересборка .cfe не помоглаОшибка в XML сломает загрузку; нужна копия
Пересоздание расширения с нуляРасширение маленькое и проще написать зановоПотеря истории правок

Особенности расширений: заимствование, контроль свойств, назначение

Расширение ломается иначе, чем основная конфигурация. Три вещи стоит знать, чтобы быстро понять сообщение проверки.

Заимствование — это ссылка, а не копия. Заимствованный объект в дереве расширения помечен особым значком. Его состав берётся из основной конфигурации при каждом применении. Поэтому удалить что-то в типовой — значит удалить это и «внутри» расширения.

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

Назначение расширения. В свойствах расширения задаётся назначение: исправление, адаптация или дополнение. От него зависит порядок применения, если расширений несколько. Конфликт двух расширений на один метод часто решается сменой порядка или переносом правки в одно расширение.

Ещё два свойства влияют на применение:

  • 🔒 Безопасный режим. Расширение в безопасном режиме не может вызывать часть методов. Код, который проходил проверку синтаксиса, падает при выполнении.
  • 🏷️ Префикс имён. Новые объекты расширения должны начинаться с префикса, указанного в свойствах. Объекты без префикса проверка отмечает предупреждением — это сигнал, что при обновлении типовой возможен конфликт имён.

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

Автоматическая проверка: пакетный режим и код

Проверять расширения руками после каждого обновления надоедает. Обе проверки — конфигурации и применимости — можно поставить в скрипт.

Пакетная проверка конфигурации

Конфигуратор умеет запускать ту же проверку без интерфейса. Ключ -AllExtensions проверяет все расширения базы, -Extension — одно:

%V8% DESIGNER %IB% %USR% /CheckConfig -ConfigLogIntegrity -IncorrectReferences -AllExtensions /Out "D:\check_ext.log"

После выполнения откройте check_ext.log. Пустой журнал без строк с ошибками — хороший знак. Такой bat удобно запускать сразу после обновления тестовой копии базы, до переноса обновления в рабочую.

Полный список параметров /CheckConfig для вашей версии платформы смотрите в справке конфигуратора, раздел о пакетном режиме: набор ключей пополняется от версии к версии.

Какие расширения не применились в сеансе

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

&НаСервере
Процедура ПроверитьРасширенияНаСервере()

	Отключенные = РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные);

	Если Отключенные.Количество() = 0 Тогда
		Сообщить("Все расширения применены.");
		Возврат;
	КонецЕсли;

	Для Каждого Расширение Из Отключенные Цикл
		Сообщить(СтрШаблон("Не применено: %1 (версия %2)", Расширение.Имя, Расширение.Версия));
	КонецЦикла;

КонецПроцедуры

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

После каждого обновления типовой
Выполнено: 0 / 6

Как не допускать ошибок целостности в расширениях

Большую часть проблем снимают привычки разработки, а не инструменты.

  1. Заимствуйте минимум. Берите только объекты и формы, которые реально дорабатываете. Каждое лишнее заимствование — лишняя точка отказа при обновлении.
  2. Не правьте форму целиком. Добавляйте свои элементы и обработчики, а не перестраивайте типовую форму. Чем меньше изменений в заимствованной форме, тем меньше конфликтов.
  3. Своё — в своих объектах. Новый реквизит лучше добавить в расширение с префиксом, чем менять тип типового.
  4. Одно расширение — одна задача. Печатные формы отдельно, исправления ошибок отдельно. Сломалось одно — остальные работают.
  5. Храните .cfe вне базы. Папка с версиями или хранилище конфигурации. В имени файла — дата и релиз типовой, под который собрано расширение.
  6. Проверяйте на копии. Обновление типовой и применение расширений — сначала на тестовой базе, потом в рабочей.
  7. Записывайте, что заимствовано и зачем. Короткий комментарий в модуле расширения экономит время тому, кто будет чинить после обновления.

Не включайте в рабочей базе расширение, которое не прошло проверку, «чтобы посмотреть, что будет». Расширение с ошибками в модулях может мешать записи документов и проведению, а пользователи узнают об этом первыми.

Частые вопросы

Нужен ли монопольный доступ для проверки расширения?
Нет. Проверка конфигурации читает метаданные и не трогает данные, пользователи могут работать. Монопольный доступ нужен для тестирования и исправления информационной базы, но это другая проверка.
Почему проверка в конфигураторе чистая, а расширение не применяется?
Проверка расширения отдельно не видит конфликтов с другими расширениями на тот же объект. Отключите остальные расширения по одному и найдите, с каким идёт конфликт.
Можно ли проверить расширение, не открывая конфигуратор?
Частично. Список неприменённых расширений можно получить кодом через ИсточникРасширенийКонфигурации.СеансОтключенные. А саму проверку логической целостности запускают в пакетном режиме конфигуратора без открытия его окна.
Удалится ли что-то из данных, если удалить заимствование?
Если расширение добавляло в заимствованный объект свои реквизиты с данными, при их удалении данные этих реквизитов будут потеряны. Перед удалением выгрузите нужные значения или сделайте резервную копию базы.
Помогает ли очистка кэша при ошибке применения расширения?
Только если ошибка в устаревшем кэше клиента, а не в метаданных. Если проверка логической целостности находит ошибки, очистка кэша ничего не изменит — сначала исправьте расширение.