Разработка

Расширение или правка типовой: как выбирать и чем за это платят

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

Три способа и чем они отличаются на самом деле

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

  • Правка типовой. Объект снимается с поддержки. Каждое обновление, затрагивающее этот объект, требует ручного сравнения и объединения. Долг накапливается и платится при каждом релизе.
  • Расширение. Живёт отдельно, подключается к конфигурации при запуске. Типовая остаётся на поддержке, обновления проходят штатно. При несовместимости расширение отключается и сообщает об этом при старте.
  • Внешняя обработка. Вообще не входит в конфигурацию. Обновление её не трогает, но и связь с базой у неё хрупкая: меняются реквизиты — обработка падает.

Как устроено расширение внутри

Основа расширения — заимствованные объекты. Чтобы доработать справочник или документ, его сначала особым образом копируют из конфигурации в расширение, а изменения вносят уже там. Заимствование решает 2 задачи сразу: даёт объект для визуального конструирования и служит проверкой совместимости.

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

Контроль можно сделать тоньше. У отдельного свойства включается флажок «Проверять значение при подключении расширения» — и тогда платформа сверит не только наличие справочника, но и то, что у него, например, код остался строкового типа. Свойство становится контролируемым, и расхождение выключает расширение до того, как оно навредит данным.

Как расширение вмешивается в код

Методы типовой конфигурации расширяются аннотациями: &Перед — выполнить свой код до оригинала, &После — после, &Вместо — заменить оригинал целиком. Правила сочетания жёсткие: если на метод уже стоит «Вместо», добавить «Перед» или «После» нельзя, и наоборот — «Вместо» недоступно, если уже существуют методы с «Перед» или «После».

Отсюда практическое следствие для команд, где расширений несколько: первый, кто занял метод аннотацией «Вместо», закрывает его для всех остальных. В базе с 4–5 расширениями от разных подрядчиков это становится реальным ограничением, а не теорией.

Ограничения, о которых узнают поздно

Расширение мощнее, чем принято думать, но у него есть углы, на которые натыкаются уже в процессе.

  • Директивы компиляции должны совпадать. Директива перед расширяемой процедурой в модуле формы обязана совпадать с директивой этой процедуры в конфигурации.
  • Инструкции препроцессора не переносятся. Если расширяемый метод обрамлён ими, в расширение они не попадут, и поведение разойдётся с ожидаемым.
  • Из заимствованной подсистемы нельзя удалить объекты. Добавить свои — можно, убрать уже присутствующие — нет.
  • Права ролей берутся из конфигурации, пока флажки в расширении не выставлены явно. Зато можно позаимствовать роль и снять у неё право на конкретный объект — например, закрыть продавцам отчёт по продажам, оставив его менеджерам.
  • Порядок применения задаётся назначением. «Исправление», «Адаптация» или «Дополнение»: расширения с назначением «Дополнение» применяются последними. И новый порядок вступает в силу только после обновления конфигурации базы данных, а не сразу после смены настройки.

Матрица выбора

ЗадачаЧем делать
Своя печатная формарасширение
Отчёт на СКДвнешний отчёт или расширение
Реквизит и его обработка в документерасширение
Изменение логики проведениярасширение, аннотации «Перед» и «После»
Разовая обработка данныхвнешняя обработка
Обмен с внешней системойрасширение плюс веб-сервис
Глубокая переделка типовой логикиправка типовой, осознанно и с расчётом стоимости

Правило, которым пользуемся мы: правка типовой допустима, когда расширением задача не решается технически или решается настолько сложным перехватом, что сопровождать его дороже, чем сравнивать объекты при обновлении. Таких случаев меньше, чем принято считать, — примерно 1 из 10.

Цена владения на три года

Разработка одной доработки стоит примерно одинаково в обоих вариантах. Считать надо не её, а сумму обновлений.

Допустим, у вас 15 доработок и вы обновляетесь 4 раза в год. При расширениях обновление проходит штатно: время уходит на проверку, что расширения применились и ничего не отвалилось, — это часы, а не дни. При правке типовой каждое обновление означает ручное сравнение и объединение по изменённым объектам: 10 расхождений разбираются за несколько часов, 30–40 — это 2–3 дня работы. За 3 года и 12 обновлений разница набегает в десятки дней, и оплачиваются они каждый раз заново.

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

Как проверить, что подрядчик сделал правильно

  1. Спросите список расширений базы. Он виден в режиме предприятия, и его можно получить за минуту, не будучи программистом.
  2. Спросите, снята ли конфигурация с поддержки. Ответ «частично» означает правку типовой, и дальше уместен вопрос, почему её нельзя было избежать.
  3. Попросите список доработанных объектов. Нормальный подрядчик ведёт его сам. Отсутствие списка — признак, что через год никто не вспомнит, что и зачем меняли.
  4. Уточните, у кого исходники. Файл расширения должен быть у вас, а не только на стенде подрядчика.
  5. Проверьте на копии перед боевой. Любое обновление с доработками сначала прогоняется на копии базы — как это устроено у нас, описано в разделе «Как работаем».

Вопросы, которые задают

Всё ли можно сделать расширением конфигурации 1С

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

Сколько расширений можно подключить к одной базе

Технического предела нет, на практике встречаются базы с 5–10 расширениями. Проблема не в количестве, а в пересечениях: два расширения, претендующие на один метод с аннотацией «Вместо», уживутся плохо, и порядок их применения начнёт влиять на результат.

Почему расширение иногда работает не так, как вчера

Первое, что стоит проверить, — порядок применения. Он задаётся назначением расширения, и после его смены порядок меняется только с обновлением конфигурации базы данных. Второе — обновление конфигурации, из-за которого заимствованный объект перестал совпадать с ожиданием расширения.

Можно ли перевести существующие правки типовой в расширения

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

Кто должен хранить файл расширения

Вы. Расширение выгружается в файл и передаётся заказчику так же, как передают исходники. Если подрядчик держит его только у себя, при смене подрядчика вы начинаете с нуля — и это один из вопросов, который стоит задавать до подписания договора, а не после. Что входит в нашу подписку, перечислено на странице тарифов.

Посмотрим вашу базу

Скажем, что можно вернуть на поддержку и сколько это стоит

Разберём на копии, что у вас доработано и каким способом, и посчитаем, во что обходятся обновления сейчас и во что будут обходиться после перевода в расширения.