Обновление доработанной конфигурации 1С — это всегда ответственный процесс, особенно если изменения вынесены в расширения. Одной из самых частых проблем является ситуация, когда после установки релиза расширение перестает компилироваться, выдавая ошибки о несуществующих процедурах или функциях. Разберем детально, как действовать, если вы столкнулись с ошибкой в методе, помеченном директивой &Вместо, и как правильно адаптировать код под новые реалии типового решения.
Рассмотрим типичную ситуацию: в расширении была переопределена процедура, которая вызывала вспомогательный метод основной конфигурации, например, УстановитьВариантыОтраженияФрагментБезИнвентаризации. После обновления системы синтаксический контроль сообщает, что данный метод не найден. Выясним причину этого явления.
В современных конфигурациях (таких как ERP, КА 2 или УТ 11) фирма «1С» постоянно проводит рефакторинг. Код, который раньше находился в модулях форм, переносится в общие модули или модули менеджеров. Это делается для универсализации логики, чтобы она могла работать и на клиенте, и на сервере, а также в фоновых заданиях. Процедуры с именами, содержащими слово «Фрагмент», часто являются временными техническими решениями разработчиков, которые в новых релизах заменяются более изящными механизмами или встраиваются напрямую в вызывающие методы.
Прежде чем приступать к поиску пропавшего кода, проанализируем, где именно система «не видит» процедуру. Часто бывает так, что процедура в основной конфигурации осталась, но изменились условия её вызова.
Проверим свойства общего модуля, в котором находилась (или могла оказаться) процедура. Если ваш код в расширении выполняется &НаКлиенте, а процедура в общем модуле теперь доступна только для сервера, возникнет ошибка компиляции. Посмотрим на свойства модуля:
Если глобальный поиск не дал результатов, значит, процедура была удалена или переименована. Разберем, как найти «преемника» удаленного кода. Нам необходимо понять, какой обработчик теперь назначен на ту же команду или событие в основной конфигурации.
Рассмотрим пример из практики. В расширении был изменен обработчик команды:
&НаКлиенте
Процедура Расш1_1УстановитьВариантыОтраженияВместо(Команда)
УстановитьВариантыОтраженияФрагментБезИнвентаризации(
ВариантОтраженияУвеличениеКоличестваПоОрдерномуСкладу,
ЕстьУвеличениеКоличестваБезИнвентаризации,
ЕстьУменьшениеКоличестваБезИнвентаризации,
ЕстьУменьшениеКоличестваПоОрдерномуСкладу,
ЕстьУменьшениеСуммы,
ЕстьУвеличениеСуммы
);
КонецПроцедуры
Чтобы понять, что изменилось, откроем форму документа в основной конфигурации и найдем команду, к которой привязана эта процедура. Посмотрим на её свойство Действие. Скорее всего, там теперь указано имя новой процедуры. Проанализируем её содержимое — вероятно, код, который раньше был в «Фрагменте», теперь написан там явно или вызывается через другой общий модуль.
Использование директивы &Вместо является «жестким» методом доработки. Она полностью подменяет типовой алгоритм. Если «1С» добавит в этот метод важную проверку или изменит расчеты, ваше расширение просто проигнорирует эти обновления, что может привести к порче данных.
Рекомендуемый подход: использование директивы &ИзменениеИКонтроль. Это позволит вам заимствовать не весь метод, а только его часть. При обновлении конфигурации система сама подсветит блоки #Вставить и #Удалить, если исходный код типового метода изменился. Рассмотрим, как это выглядит в расширении:
&НаСервере
&ИзменениеИКонтроль("НадписьВалютыНажатиеЗавершениеСервер")
Процедура Расш1_1НадписьВалютыНажатиеЗавершениеСервер(РезультатЗакрытия)
// #Вставить
// Ваша дополнительная логика
// #КонецВставить
ПродолжитьВызов(РезультатЗакрытия);
КонецПроцедуры
Если вы все же используете &Вместо для перехвата обработчика команды, убедитесь, что вы не вызываете в нем процедуры, которые могут быть удалены. Если логика типового метода сильно поменялась, правильнее будет удалить старую процедуру из расширения и создать новую через механизм «Добавить в расширение», выбрав наиболее подходящую директиву (&Перед, &После или &ИзменениеИКонтроль).
Иногда возникает соблазн просто скопировать старую (удаленную из типовой конфигурации) процедуру прямо в модуль расширения, чтобы «все просто заработало». Проанализируем риски такого решения.
Если разработчики «1С» удалили процедуру УстановитьВариантыОтраженияФрагмент..., значит, изменилась бизнес-логика документа или структура регистров. Оживляя старый код в расширении, вы рискуете тем, что:
Поэтому копирование кода — это крайняя мера, допустимая только после глубокого анализа того, почему этот код был удален из оригинала.
Чтобы быстро найти все проблемные места после обновления, не обязательно запускать предприятие и ждать ошибок. Используем встроенные инструменты платформы:
Система проанализирует все связи расширения с основной конфигурацией и выдаст список всех методов, объектов и реквизитов, которые более не существуют или к которым изменился доступ. Это будет вашим списком задач по адаптации кода.
Подводя итог, при обнаружении ошибок в расширении после обновления, пройдем по следующим пунктам:
&Вместо на более безопасную &ИзменениеИКонтроль.Такой системный подход позволит сохранить стабильность информационной системы и обеспечит корректную работу доработок на новых релизах конфигураций.