Работа с чужим кодом — это всегда вызов для разработчика. Но когда дело касается чужих расширений в 1С, задача усложняется в несколько раз. Часто в расширение «тянут» половину метаданных основной конфигурации, из которых реально используется лишь малая часть. При обновлении типового решения такое перегруженное расширение начинает конфликтовать, вызывать аварийное завершение работы Конфигуратора или приводить к логическим ошибкам в режиме «1С:Предприятие».
В этой статье мы подробно разберем, как систематизировать процесс «чтения» и анализа чужих расширений, как избавиться от лишнего «мусора», правильно работать с заимствованными формами и использовать современные инструменты автоматизации анализа.
Прежде чем приступать к построчному чтению кода, необходимо сократить объем анализируемых данных. Часто разработчики заимствуют объекты «на всякий случай» или переносят их вместе со всеми реквизитами, табличными частями и формами, хотя планировали изменить лишь одну строку в модуле менеджера. Проанализируем, как очистить расширение от лишних элементов:
Анализ форм в расширениях — одна из самых трудоемких задач. Нам необходимо понять, что именно изменил предыдущий разработчик: добавил ли он новые элементы, скрыл ли старые или изменил обработчики событий. Разберем механизм работы платформы с заимствованными формами подробнее.
При заимствовании формы в расширение платформа не копирует ее целиком как статичный объект. Вместо этого при запуске системы в режиме «1С:Предприятие» платформа берет актуальную форму из основной конфигурации и применяет к ней «дельту» — те изменения, которые были сделаны в расширении. Наша задача — найти эту дельту.
Рассмотрим два основных способа сопоставления форм:
ПриСозданииНаСервере, ПриОткрытии), будут иметь специальные аннотации (директивы компиляции). Именно эти процедуры и содержат логику вмешательства в типовой процесс.Когда визуальный анализ в Конфигураторе не дает полной картины или приводит к зависаниям интерфейса, применим профессиональный метод — выгрузку конфигурации расширения в файлы. Это позволит нам проанализировать структуру XML-описаний форм и элементов управления.
Выполним следующие шаги:
.bsl), а формы и структуры данных — в формате .xml.Имея текстовые файлы, мы можем использовать любую внешнюю утилиту сравнения файлов и папок (например, WinMerge, KDiff3 или Beyond Compare). Мы сможем сравнить выгруженные файлы расширения с чистой выгрузкой аналогичных объектов из типовой конфигурации. Любые расхождения в XML-структуре сразу покажут нам измененные свойства элементов формы:
<!-- Пример фрагмента XML-структуры заимствованной формы, показывающий изменение видимости элемента -->
<Button name="ФормаЗаписатьИЗакрыть" id="1">
<Visible>false</Visible> <!-- Свойство изменено в расширении -->
</Button>
Перейдем к модулям расширения. В чужом коде мы можем встретить различные директивы выполнения методов. Проанализируем их влияние на стабильность системы и определим правила их рефакторинга:
&Вместо (InsteadOf). Это наиболее опасный метод переопределения бизнес-логики. Если автор расширения полностью заменил метод типовой конфигурации своим кодом, то при обновлении системы любые изменения в логике вендора (фирмы 1С) пройдут мимо нашей программы.
Рекомендация: Постараемся переписать методы &Вместо на комбинацию методов с директивами &Перед (Before) или &После (After), чтобы сохранить выполнение оригинального кода основной конфигурации.
&ИзменениеИКонтроль (ChangeAndControl). Это наиболее прогрессивный и безопасный метод, предоставляемый платформой «1С:Предприятие». Он позволяет зафиксировать только изменяемый участок кода внутри метода, контролируя неизменность остальной части процедуры.
Рассмотрим пример использования этой директивы для безопасного изменения логики:
&Вместо("РассчитатьСуммуДокумента")
&ИзменениеИКонтроль("РассчитатьСуммуДокумента")
Процедура Расш1_РассчитатьСуммуДокумента(СтрокаТабличнойЧасти)
// Сохраняем оригинальный расчет, но добавляем свою специфику для определенного вида номенклатуры
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
#Вставка
// Наша доработка: учет дополнительной скидки для оптовиков
Если ПолучитьФункциональнуюОпцию("ИспользоватьСпецСкидки") Тогда
СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Сумма * (1 - СтрокаТабличнойЧасти.Скидка / 100);
КонецЕсли;
#КонецВставки
КонецПроцедуры
Если проект содержит объемные расширения, работа в классическом Конфигураторе становится неэффективной. Современный подход предполагает импорт проекта в среду разработки 1С:EDT, которая базируется на Eclipse и штатно интегрирована с системой контроля версий Git.
Какие преимущества мы получаем при анализе расширения в EDT?
git blame) и понять, кто, когда и зачем добавил ту или иную строку кода в расширение.Часто при переносе или обновлении чужих расширений разработчики сталкиваются с ситуацией, когда Конфигуратор аварийно завершает работу без вывода ошибок при попытке открыть форму или обновить конфигурацию базы данных. Выясним основные причины этой проблемы и способы борьбы с ними:
Систематический подход к анализу чужого расширения — от грубой очистки «мусорных» метаданных до тонкого анализа кода с использованием современных инструментов сравнения и среды EDT — позволяет существенно сократить время на адаптацию доработок под новые релизы и гарантирует стабильную работу информационной системы.