Расширение не применяется после обновления: ищем и чиним нарушения целостности
Содержание
Проверка логической целостности расширения запускается в конфигураторе: откройте расширение, затем Конфигурация → Проверка конфигурации..., отметьте флажок «Проверка логической целостности конфигурации» и нажмите «Выполнить». Платформа покажет, какие объекты расширения ссылаются на то, чего больше нет в основной конфигурации или в самом расширении. Ошибки исправляют прямо в дереве расширения, а если дерево «замусорено» — пересобирают расширение через сохранение в файл .cfe и обратную загрузку.
Типичная ситуация: вечером обновили БП 3.0 на новый релиз, утром бухгалтер открывает базу, а доработанная печатная форма счёта пропала. Расширение с ней не применилось: в новом релизе поменялся заимствованный макет или реквизит. Проверка целостности за минуту показывает, что именно сломалось.
Что такое логическая целостность расширения и чем она отличается от целостности базы
Логическая целостность — это согласованность метаданных между собой. Каждый реквизит ссылается на существующий тип. Каждый элемент формы привязан к существующему реквизиту. Каждый обработчик события указывает на процедуру, которая есть в модуле.
У расширения есть дополнительный слой связей — с основной конфигурацией. Расширение не хранит заимствованный объект целиком. Оно хранит ссылку на объект основной конфигурации и список своих изменений поверх него. Если в основной конфигурации объект удалили, переименовали или изменили его контролируемые свойства, связь рвётся.
Не путайте две похожие проверки:
| Проверка | Где запускается | Что проверяет |
|---|---|---|
| Логическая целостность конфигурации | Конфигурация → Проверка конфигурации... | Метаданные: типы, ссылки между объектами, формы, обработчики |
| Логическая целостность информационной базы | Администрирование → Тестирование и исправление... | Данные в таблицах: структуру записей, служебные поля |
Первая работает с описанием программы, вторая — с данными. Если не применяется расширение, нужна первая. Тестирование и исправление базы здесь не поможет, а на большой базе займёт часы и потребует монопольного доступа.
Когда расширение конфигурации теряет целостность
Ошибки появляются не сами по себе. За каждой стоит изменение одной из двух сторон: основной конфигурации или расширения.
- 🔄 Обновление основной конфигурации. Самый частый сценарий. В новом релизе разработчик типовой удалил реквизит, переделал форму или переименовал общий модуль, а расширение заимствовало старый вариант.
- ✂️ Ручное удаление объекта из основной конфигурации. Программист убрал «лишний» справочник, не проверив, что его заимствует расширение.
- 🧩 Контролируемые свойства. Расширение может контролировать свойства заимствованного объекта — например, тип реквизита. Если в основной конфигурации тип изменился, расширение откажется применяться.
- 📦 Загрузка чужого
.cfe. Расширение сделано под другой релиз или другую конфигурацию. Загрузилось без вопросов, а при применении — ошибки. - 🗂️ Несколько расширений на один объект. Два расширения переопределяют один и тот же метод или элемент формы. Каждое по отдельности корректно, а вместе — конфликт.
- ⚙️ Режим совместимости. У расширения и основной конфигурации разные режимы совместимости. После обновления типовой режим в ней поднялся, а у расширения остался старый.
- 🧹 Внутренний «мусор» после долгих правок. Расширение годами правили, переносили через буфер обмена, сравнивали и объединяли. В нём остались служебные ссылки на удалённые элементы, которые не видны в дереве.
В пользовательском режиме это выглядит одинаково: расширение есть в списке, но доработки не работают. Список расширений в БП 3.0 и ЗУП 3.1 открывается так: Администрирование → Печатные формы, отчеты и обработки → Расширения. В строке проблемного расширения обычно видна пометка об ошибке применения, а по ссылке — текст с указанием объекта.
Проверка конфигурации в конфигураторе: пошагово для расширения
Шаг 1. Откройте расширение
- Запустите конфигуратор под пользователем с правами администратора.
Конфигурация → Открыть конфигурацию, если основная ещё не открыта.Конфигурация → Расширения конфигурации— откроется список расширений базы.- Дважды щёлкните по нужному расширению. Откроется его собственное дерево метаданных.
Монопольный доступ для этого не нужен: пользователи могут продолжать работать.
Шаг 2. Запустите проверку
- Сделайте окно дерева расширения активным (щёлкните по нему).
Конфигурация → Проверка конфигурации....- Отметьте «Проверка логической целостности конфигурации».
- Добавьте «Поиск некорректных ссылок» — он ловит ссылки на объекты, которых нет.
- Отметьте проверку модулей для нужных режимов: тонкий клиент, сервер, веб-клиент.
- Нажмите «Выполнить».
Сначала проверьте основную конфигурацию тем же способом. Если ошибки есть уже в ней, расширение тут ни при чём, и чинить нужно её.
Шаг 3. Разберите сообщения
Результат выводится в окно служебных сообщений. Двойной щелчок по строке переводит к объекту или к строке модуля. Читайте сообщение целиком: в нём указан путь к объекту вида Справочник.Контрагенты.Форма.ФормаЭлемента и суть нарушения.
Что обычно делают с найденным:
| Что нашла проверка | Как исправить |
|---|---|
| Заимствованный объект отсутствует в основной конфигурации | Удалить заимствование из расширения или заимствовать новый объект, который пришёл на замену |
| Не совпадает контролируемое свойство | Открыть объект в расширении, сверить свойство с основной конфигурацией, привести к новому значению или снять контроль |
| Элемент формы ссылается на несуществующий реквизит | Перепривязать элемент к актуальному реквизиту или удалить элемент |
| Обработчик ссылается на отсутствующую процедуру | Создать процедуру в модуле расширения или очистить обработчик в свойствах |
| Ошибка синтаксиса в модуле расширения | Исправить код: чаще всего вызывается метод общего модуля, который в новом релизе переименован |
Шаг 4. Сохраните и примените
После правок нажмите Конфигурация → Обновить конфигурацию базы данных при активном окне расширения (или F7). Изменения расширения запишутся в базу. Пользователям достаточно перезапустить сеанс, чтобы получить исправленное расширение.
Перед правкой расширения в рабочей базе сохраните его копию в файл .cfe. Откат к файлу занимает минуту, а восстановление удалённых заимствований по памяти — полдня.
Пересборка через файл: способ cf2cf для расширения
Если ошибки ссылаются на элементы, которых в дереве нет, или исправления не держатся, помогает пересборка. Для основной конфигурации её называют cf2cf: сохранить конфигурацию в .cf и загрузить этот же файл обратно. Платформа при загрузке заново собирает внутреннее хранилище и отбрасывает часть служебных хвостов.
Для расширения тот же приём делается с файлом .cfe.
Вариант 1. Сохранение и загрузка .cfe
- Активируйте окно дерева расширения.
- В меню
Конфигурациявыберите команду сохранения расширения в файл. Получите.cfe. - Проверьте, что файл открывается: размер не нулевой, дата свежая.
- В том же меню выберите загрузку из файла и укажите только что сохранённый
.cfe. - Обновите конфигурацию базы данных (F7).
- Повторите проверку логической целостности.
Этот вариант быстрый, но чистит не всё.
Вариант 2. Выгрузка в XML и обратная загрузка
Глубже чистит выгрузка расширения в файлы. В текстовом виде видно каждое свойство, и битые ссылки можно найти поиском по файлам.
- В меню
Конфигурациядля активного расширения выберите выгрузку в файлы, укажите пустую папку. - Найдите по файлам имя объекта из сообщения об ошибке — обычный поиск по папке в редакторе кода.
- Удалите или исправьте ссылку в XML. Делайте это, только если понимаете структуру файла.
- Загрузите расширение из файлов обратно и примените его.
То же из командной строки (пути замените на свои):
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)", Расширение.Имя, Расширение.Версия));
КонецЦикла;
КонецПроцедуры
Обработку можно повесить на регламентное задание в копии базы и отправлять результат администратору. Если список не пуст — открывайте конфигуратор и запускайте проверку логической целостности для названных расширений.
Как не допускать ошибок целостности в расширениях
Большую часть проблем снимают привычки разработки, а не инструменты.
- Заимствуйте минимум. Берите только объекты и формы, которые реально дорабатываете. Каждое лишнее заимствование — лишняя точка отказа при обновлении.
- Не правьте форму целиком. Добавляйте свои элементы и обработчики, а не перестраивайте типовую форму. Чем меньше изменений в заимствованной форме, тем меньше конфликтов.
- Своё — в своих объектах. Новый реквизит лучше добавить в расширение с префиксом, чем менять тип типового.
- Одно расширение — одна задача. Печатные формы отдельно, исправления ошибок отдельно. Сломалось одно — остальные работают.
- Храните
.cfeвне базы. Папка с версиями или хранилище конфигурации. В имени файла — дата и релиз типовой, под который собрано расширение. - Проверяйте на копии. Обновление типовой и применение расширений — сначала на тестовой базе, потом в рабочей.
- Записывайте, что заимствовано и зачем. Короткий комментарий в модуле расширения экономит время тому, кто будет чинить после обновления.
Не включайте в рабочей базе расширение, которое не прошло проверку, «чтобы посмотреть, что будет». Расширение с ошибками в модулях может мешать записи документов и проведению, а пользователи узнают об этом первыми.
Частые вопросы
Нужен ли монопольный доступ для проверки расширения?
Почему проверка в конфигураторе чистая, а расширение не применяется?
Можно ли проверить расширение, не открывая конфигуратор?
ИсточникРасширенийКонфигурации.СеансОтключенные. А саму проверку логической целостности запускают в пакетном режиме конфигуратора без открытия его окна.