Как лучше дорабатывать 1С: напрямую в конфигурации или с помощью расширений и директивы &ИзменениеИКонтроль?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← К списку

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

Расширения конфигурации: Что это и зачем они нужны?

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

Основные преимущества использования расширений:

  1. Простота обновлений: Доработки сохраняются отдельно от типовой конфигурации, что минимизирует конфликты при установке новых версий поставщика. Обновления проходят быстрее и с меньшими трудозатратами.
  2. Стабильность системы: Расширения позволяют изолировать доработки, снижая риск непреднамеренного влияния на стандартный функционал.
  3. Параллельная разработка: Разные команды или разработчики могут работать над разными расширениями одновременно, не мешая друг другу.
  4. Гибкость: Расширение можно отключить или удалить без потери данных и без необходимости отката всей конфигурации, что удобно для тестирования или временных решений.
  5. Типизация: Фирма 1С предлагает классификацию расширений по ожидаемому применению (Исправление, Адаптация, Дополнение), что помогает структурировать доработки, хотя контроль их использования лежит на разработчике.

Директивы расширений: &ИзменениеИКонтроль против других

Для внедрения изменений в существующий код модулей конфигурации в расширениях используются специальные директивы. Рассмотрим подробнее основные из них.

  1. Директива &ИзменениеИКонтроль

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

    Как это работает:

    • Мы копируем типовую процедуру или функцию в модуль расширения и добавляем в нее директиву &ИзменениеИКонтроль.
    • Внутри этой процедуры мы можем вносить свои изменения, добавлять новый код, сохраняя при этом исходный текст метода.
    • При обновлении конфигурации, если исходный текст метода в типовой конфигурации изменился, расширение с &ИзменениеИКонтроль не применится. Платформа 1С сообщит об ошибке и предложит восстановить соответствие с методом конфигурации.
    • Для восстановления соответствия мы можем использовать механизм объединения по трем точкам, который позволяет нам перенести изменения типовой конфигурации, сохраняя свои доработки. Это значительно упрощает процесс адаптации к новым версиям.

    Важный момент: Каждый метод конфигурации может быть расширен с помощью &ИзменениеИКонтроль только один раз.

    Пример использования (концептуальный):

    
    &ИзменениеИКонтроль
    Процедура ПриКомпоновкеРезультата(ДокументРезультат, СтандартнаяОбработка)
        // Типовой код процедуры
        // ...
                
        // Наш дополнительный код
        Сообщить("Выполняется доработка через &ИзменениеИКонтроль!");
        // ...
                
        // Продолжение типового кода
        // ...
    КонецПроцедуры
    
  2. Директивы &Вместо, &Перед, &После

    Эти директивы предоставляют другие возможности для вмешательства в типовой код, но с разной степенью контроля и ответственности.

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

      Пример:

      
      &Вместо
      Процедура ОбработатьНажатиеКнопки(Команда)
          // Полностью наш код, типовой не вызывается
          Сообщить("Кнопка обработана нашим способом!");
      КонецПроцедуры
      
    • &Перед и &После: Эти директивы позволяют выполнить наш код до или после выполнения типового метода соответственно. Они более безопасны, чем &Вместо, так как типовой код продолжает выполняться. Рекомендуется использовать их вместо &Вместо, когда это возможно, чтобы минимизировать риски при обновлениях.

      Пример &Перед:

      
      &Перед("ОбработатьНажатиеКнопки")
      Процедура МояПроцедураПеред(Команда)
          Сообщить("Выполняем что-то перед типовой обработкой!");
      КонецПроцедуры
      

      Пример &После:

      
      &После("ОбработатьНажатиеКнопки")
      Процедура МояПроцедураПосле(Команда)
          Сообщить("Выполняем что-то после типовой обработки!");
      КонецПроцедуры
      

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

Прямая доработка конфигурации: Преимущества и недостатки

Альтернативный подход заключается в модификации непосредственно основной конфигурации. Этот метод позволяет нам вносить любые изменения, но имеет свои особенности.

Преимущества прямой доработки:

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

Недостатки прямой доработки:

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

Контроль применимости и риски обновления

Платформа 1С предоставляет команду "Проверка возможности применения расширения" в конфигураторе, которая позволяет выявить некоторые проблемы. Однако, давайте проанализируем ее ограничения и другие риски.

Ограничения контроля применимости:

  1. Неполный охват: Проверка не всегда учитывает переопределение событий форм и их реквизитов. Она также может не обнаружить изменения в количестве параметров или названии перехватываемой процедуры, особенно для директив &Вместо, &Перед и &После.
  2. "Черный ящик": Самая большая проблема заключается в том, что контроль применимости может пройти успешно, но доработка при этом перестает работать. Это происходит, когда поставщик изменяет логику типового алгоритма, и расширенная нами процедура больше не используется или вызывается в другом контексте, хотя формально она все еще существует.
  3. Изменения вендора: Фирма 1С может полностью выпилить функцию, общий модуль или даже подсистему, в которой мы делали инъекцию. В таком случае наша доработка просто перестанет быть актуальной, и это может быть обнаружено только при тестировании.
  4. Сложности отладки: Отладка может быть сложнее, если логика доработки сильно переплетена с базовой логикой конфигурации.
  5. Производительность: При очень большом количестве обработчиков в расширениях, особенно если они часто вызываются, иногда может наблюдаться незначительное снижение производительности.
  6. Конфликты нескольких расширений: При работе с большим количеством одновременно примененных расширений могут возникнуть неочевидные проблемы и конфликты, когда несколько расширений пытаются изменить один и тот же участок кода или метаданных.
  7. Доработка форм: При существенных изменениях структуры форм в основной конфигурации, результат в пользовательском режиме может быть неожиданным, если форма была доработана в расширении через редактор форм.
  8. Регламентные задания: На текущий момент в расширении нельзя создавать регламентные задания. Если требуется фоновая обработка, придется искать обходные пути или дорабатывать конфигурацию.

Сравнение и объединение: Инструменты и подходы

Независимо от выбранного подхода, нам потребуется сравнивать и объединять изменения. Давайте посмотрим, какие инструменты нам в этом помогут.

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

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

Мы должны понимать, что процесс сравнения и объединения, особенно при большом объеме доработок, всегда требует внимания и экспертизы. Важно не просто скопировать код, а проанализировать изменения в логике типового решения и адаптировать под них свои доработки.

Гибридный подход и лучшие практики

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

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

    
    // Доработка: Добавлен контроль остатков по складу X для документа "РеализацияТоваровУслуг" (Задача #12345 от 01.01.2023)
    // Исходная логика: Проверяла только общие остатки.
    // Изменения: Добавлен запрос к регистру "ОстаткиТоваровНаСкладах" с отбором по складу X.
    Если Не ПроверитьОстаткиПоСкладуX(СсылкаНаДокумент) Тогда
        Отказ = Истина;
        Сообщить("Недостаточно товаров на складе X.");
    КонецЕсли;
    
  2. Программное изменение форм: При доработке форм в расширениях рекомендуется делать это кодом, а не изменять формы через редактор форм. Это снижает риск конфликтов и проблем при обновлении, когда 1С меняет структуру типовых форм.

    
    &Вместо("Форма.ФормаДокумента.ПриСозданииНаСервере")
    Процедура ФормаДокументаПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // Вызываем типовую обработку, если это необходимо
        ПродолжитьВызов("ПриСозданииНаСервере", Отказ, СтандартнаяОбработка);
                
        // Наш код для изменения формы
        Элементы.МояНоваяКнопка = Элементы.Добавить("МояНоваяКнопка", Тип("КнопкаФормы"), Элементы.ГруппаКоманд);
        Элементы.МояНоваяКнопка.Заголовок = "Специальная операция";
        Элементы.МояНоваяКнопка.Действие = "ВыполнитьСпециальнуюОперацию";
                
        // ... другие изменения формы кодом
    КонецПроцедуры
    
  3. Принцип минимального вмешательства: При разработке расширений следует изменять только то, что действительно необходимо. Избегайте глобальных изменений поведения форм и модулей. Чем меньше мы вмешиваемся в типовой код, тем меньше вероятность проблем при обновлениях.

  4. Тщательное тестирование: Тестирование является критически важным этапом, независимо от выбранного метода доработки. Оно должно покрывать все доработки автоматизированными тестами. Перекладывание трудозатрат с обновления на тестирование – это не решение, если тесты не автоматизированы и не покрывают все сценарии. Только автоматизированные тесты могут гарантировать работоспособность доработок после обновления.

  5. Выбор подхода в зависимости от характера доработки:

    • Расширения: Идеально подходят для добавления нового функционала (новые отчеты, обработки, документы), изменения интерфейса, доработки алгоритмов через подписки на события и интеграций, а также для небольших точечных изменений существующего кода с использованием &ИзменениеИКонтроль. Они сокращают трудоемкость обновления в разы для таких сценариев.
    • Прямая доработка конфигурации: Более оправдана для серьезных изменений структуры данных, переработки сложных внутренних механизмов, которые невозможно реализовать через расширения (например, изменение типа реквизита, добавление нового измерения в регистр накопления с изменением логики движений). Здесь мы получаем полный контроль и прозрачность изменений при сравнении с конфигурацией поставщика.
  6. Использование хранилища: Для расширений можно и нужно создавать хранилище, аналогичное хранилищу конфигурации. Это значительно упрощает командную разработку, версионирование и отслеживание изменений в расширениях.

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

← К списку