Удаление процедуры в расширении конфигурации 1С без поломки базы

· 9 мин

Содержание

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

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

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

В расширении процедуры бывают трёх видов, и последствия удаления у них разные.

  • 🧩 Собственная процедура. Вы написали её сами, её вызывают другие места расширения. Удалив её, вы сломаете все вызовы: платформа сообщит об ошибке на синтаксическом контроле или при запуске.
  • 🔀 Перехватчик типовой процедуры. Над ней стоит аннотация &Перед, &После, &Вместо или &ИзменениеИКонтроль. После удаления типовая процедура снова работает по штатному алгоритму.
  • 📌 Процедура с директивой компиляции. &НаКлиенте, &НаСервере, &НаСервереБезКонтекста. Если вы удаляете серверную процедуру, которую вызывала клиентская, удалите или поправьте и вызов.

Для перехватчика с &Вместо есть тонкость. Внутри такой процедуры вызывается ПродолжитьВызов(). Когда вы удаляете её, типовая логика возвращается целиком, в том числе та часть, которую ваша процедура подменяла. Если вы подменяли проверку заполнения или расчёт суммы, результаты в документах изменятся. Предупредите пользователей до удаления.

Что удаляетеЧто происходит с типовым кодомРиск
&Перед / &ПослеТиповая процедура работает без вашей добавкиИсчезнет ваша дополнительная логика
&ВместоВозвращается штатный алгоритмИзменится результат расчёта или проверки
Собственная процедураНичего, это ваш кодСломаются вызовы из других модулей
Обработчик события формыСобытие перестанет обрабатыватьсяКнопка или поле перестанет реагировать

Что сделать до первой правки

Проверьте три вещи. На это уйдёт десять минут, а ошибка стоит часов.

  1. Сохраните расширение в файл. В Конфигураторе откройте список расширений (меню Конфигурация → Расширения конфигурации), выберите нужное и сохраните его в .cfe. Это точка возврата.
  2. Найдите все вызовы. Откройте модуль, поставьте курсор на имя процедуры и воспользуйтесь командой поиска по конфигурации (Ctrl+Shift+F). Ищите по имени, не по части слова, и по всему расширению.
  3. Определите, где живёт расширение: в рабочей базе, в тестовой копии или в хранилище. Править рабочую базу напрямую можно, но делают это вне часов активной работы.

Правка расширения на рабочей базе в разгар дня прерывает работу пользователей: после обновления конфигурации базы данных им придётся перезапустить 1С. Договоритесь о времени заранее.

Сделайте резервную копию информационной базы, если расширение подменяло расчёты, и после его правки поменяется результат проведения. Выгрузка в .dt через Конфигуратор занимает несколько минут, откат без неё — часы.

Перед удалением процедуры
Выполнено: 0 / 5

Способ 1. Правка модуля прямо в Конфигураторе

Это основной способ, и для большинства случаев его достаточно.

Открытие расширения

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

Удаление самой процедуры

  1. Найдите в дереве объект, в чьём модуле находится процедура. Для общих модулей это ветка Общие → Общие модули.
  2. Откройте модуль, выделите процедуру целиком: от строки с ключевым словом Процедура до КонецПроцедуры. Вместе с ней захватите строки аннотаций и директив над заголовком, иначе на пустом месте останется «висящая» директива, и платформа выдаст синтаксическую ошибку.
  3. Удалите выделенный фрагмент. Если процедура была обработчиком события формы, проверьте, что в свойствах формы или элемента не осталось привязки к ней.
  4. Запустите синтаксический контроль модуля (Ctrl+F7 в окне модуля, пункт Проверка модуля в меню Текст). Платформа укажет на строки, где остались вызовы удалённой процедуры.
// Удаляем весь блок целиком, вместе с аннотацией:
&После("ПриЗаписи")
Процедура Расш1_ПриЗаписи()
    // ...
КонецПроцедуры

Если вы не уверены, что процедура больше не нужна, не удаляйте её сразу. Закомментируйте блок (Ctrl+Shift+Q в модуле) и поработайте с базой несколько дней. Затем удалите окончательно.

Применение изменений

Сама правка модуля ничего не меняет для пользователей. Нужно обновить конфигурацию базы данных: клавиша F7 или команда Конфигурация → Обновить конфигурацию базы данных. Для расширений такое обновление применяет изменения к базе, к которой оно подключено.

После этого пользователям нужно закрыть и снова открыть 1С. Открытые сеансы продолжают жить со старым кодом.

Когда процедуру удалять не нужно

Удаление не всегда лучший выход. Три случая, когда стоит остановиться.

  • 🕐 Процедура нужна лишь часть года, например для сезонной отчётности. Проще отключить её условием в коде, чем потом писать заново.
  • 🔗 Её вызывает внешняя обработка или другое расширение, которого вы не видите. Спросите коллег, прежде чем убирать.
  • 🧪 Вы не можете воспроизвести проблему и удаляете «на всякий случай». Сначала найдите причину, иначе через неделю вернёте код обратно, а время потратите дважды.

Если сомнения остаются, оставьте процедуру и запишите в комментарии над ней, почему она больше не используется. Это дешевле аварии.

Способ 2. Правка через выгрузку расширения в файлы

Этот способ нужен, когда процедур много, когда нужен массовый поиск и замена или когда файлы лежат в Git.

Конфигуратор умеет выгружать расширение в каталог с XML и модулями .bsl. Через пакетный режим это делается так (путь к платформе и параметры подставьте свои):

"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" DESIGNER /F "C:\Bases\Work" /N Админ /P Пароль ^
  /DumpConfigToFiles "C:\Dump\ext" -Extension "ИмяРасширения"

В каталоге выгрузки модули лежат в файлах Module.bsl, а формы — в подкаталогах Forms. Откройте нужный файл в редакторе (VS Code с расширением для BSL удобнее блокнота), удалите процедуру и сохраните.

Загрузка обратно:

"C:\Program Files\1cv8\<версия>\bin\1cv8.exe" DESIGNER /F "C:\Bases\Work" /N Админ /P Пароль ^
  /LoadConfigFromFiles "C:\Dump\ext" -Extension "ИмяРасширения" /UpdateDBCfg

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

Параметры пакетного режима зависят от версии платформы. Если команда не срабатывает, посмотрите справку по командной строке в документации платформы.

Способ 3. Снятие и повторная установка расширения

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

  1. Выгрузите текущее расширение в .cfe (резервная копия).
  2. Правьте его в Конфигураторе или в выгрузке (способы 1 и 2).
  3. Сохраните новую версию в .cfe.
  4. В списке расширений удалите старое и загрузите новое из файла.

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

Проще всего временно отключить расширение , не снимая. В управляемом интерфейсе типовых конфигураций на БСП это делается в разделе Администрирование → Печатные формы, отчёты и обработки в пункте расширений: у расширения снимается флаг активности. Этим способом удобно проверить, не оно ли вызывает проблему, до любого удаления.

Как поступить с процедурой?

Расширение в хранилище конфигурации

Если расширение ведётся в хранилище, прямая правка в локальной базе приведёт к рассинхрону: хранилище о ней не узнает, а следующий коллега затрёт ваше изменение при обновлении из хранилища.

Порядок такой:

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

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

Разработчикам в команде полезно договориться: расширение правит один человек за раз, а освободив объекты, он сообщает об этом остальным.

Как проверить результат и очистить кэш

После обновления конфигурации базы данных проверьте результат в три шага.

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

Если после перезапуска всё ещё видно старое поведение, дело в кэше клиента. Закройте 1С у этого пользователя и очистите кэш:

  • запустите платформу с ключом /ClearCache: 1cv8.exe ENTERPRISE /ClearCache;
  • либо удалите папки с идентификаторами баз в %LOCALAPPDATA%\1C\1cv8 и %APPDATA%\1C\1cv8.

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

Кэш не хранит данные базы, но 1С после очистки откроется медленнее обычного: перестроит списки и формы.

Типичные ошибки при удалении

  • Остался вызов удалённой процедуры. Синтаксический контроль в Конфигураторе не всегда видит вызов из другого расширения или через Выполнить(). Дополнительно поищите имя текстом.
  • Удалена процедура, а директива осталась. Над пустым местом болтается &НаСервере, и модуль не компилируется. Выделяйте блок вместе с директивой.
  • Снято расширение с реквизитами. Данные потеряны вместе со структурой. Лечится только восстановлением из копии базы.
  • Правка выполнена не в той базе. Расширение открыли в тестовой, а пользователи работают в рабочей. Проверьте строку подключения в заголовке Конфигуратора.
  • Не обновлена конфигурация БД. Модуль изменён, но F7 не нажата. Пользователи видят старое поведение, администратор уверен, что всё сделано.

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

Можно ли править `.cfe`-файл напрямую?
Нет. Файл расширения бинарный. Загрузите его в базу, правьте в Конфигураторе и сохраните заново, либо выгрузите в файлы и загрузите обратно.
Исчезнет ли типовая процедура, если удалить перехватчик в расширении?
Нет. Расширение не меняет конфигурацию поставщика. После удаления перехватчика типовая процедура работает штатно.
Нужно ли отключать пользователей на время правки?
Сама правка модуля им не мешает. Помеха возникает после обновления конфигурации базы данных: сеансы нужно перезапустить. Выбирайте время вне пика работы.
Что делать, если после удаления форма не открывается?
Скорее всего, в форме осталась привязка к удалённому обработчику. Откройте свойства формы и элементов в расширении и очистите ссылку, затем обновите конфигурацию БД.
Как вернуть удалённую процедуру?
Из сохранённого .cfe или из истории хранилища. Загрузите старую версию в тестовую базу, скопируйте нужный блок и вставьте в рабочее расширение.