Разработка
Расширение или правка типовой: как выбирать и чем за это платят
«Делайте расширениями» — совет правильный, но неполный: часть задач расширением не решается, а часть решается так, что дороже правки. Разбираем, где проходит граница, какие ограничения есть у расширений и во что каждый вариант обходится на горизонте трёх лет.
Три способа и чем они отличаются на самом деле
Доработать типовую конфигурацию можно правкой самой конфигурации, расширением или внешней обработкой. Разница между ними не в трудоёмкости разработки — она сопоставима. Разница в том, что происходит потом, при каждом следующем релизе поставщика.
- Правка типовой. Объект снимается с поддержки. Каждое обновление, затрагивающее этот объект, требует ручного сравнения и объединения. Долг накапливается и платится при каждом релизе.
- Расширение. Живёт отдельно, подключается к конфигурации при запуске. Типовая остаётся на поддержке, обновления проходят штатно. При несовместимости расширение отключается и сообщает об этом при старте.
- Внешняя обработка. Вообще не входит в конфигурацию. Обновление её не трогает, но и связь с базой у неё хрупкая: меняются реквизиты — обработка падает.
Как устроено расширение внутри
Основа расширения — заимствованные объекты. Чтобы доработать справочник или документ, его сначала особым образом копируют из конфигурации в расширение, а изменения вносят уже там. Заимствование решает 2 задачи сразу: даёт объект для визуального конструирования и служит проверкой совместимости.
Если при подключении нужного объекта в конфигурации не окажется, расширение не применится, и вы узнаете об этом сразу при старте прикладного решения. Разработчики платформы называют такое поведение методологически правильным, и логика здесь простая: без проверки расширение подключилось бы молча и упало бы позже, посреди работы пользователя, когда он уже потерял час на ввод данных.
Контроль можно сделать тоньше. У отдельного свойства включается флажок «Проверять значение при подключении расширения» — и тогда платформа сверит не только наличие справочника, но и то, что у него, например, код остался строкового типа. Свойство становится контролируемым, и расхождение выключает расширение до того, как оно навредит данным.
Как расширение вмешивается в код
Методы типовой конфигурации расширяются аннотациями: &Перед — выполнить свой код до оригинала, &После — после, &Вместо — заменить оригинал целиком. Правила сочетания жёсткие: если на метод уже стоит «Вместо», добавить «Перед» или «После» нельзя, и наоборот — «Вместо» недоступно, если уже существуют методы с «Перед» или «После».
Отсюда практическое следствие для команд, где расширений несколько: первый, кто занял метод аннотацией «Вместо», закрывает его для всех остальных. В базе с 4–5 расширениями от разных подрядчиков это становится реальным ограничением, а не теорией.
Ограничения, о которых узнают поздно
Расширение мощнее, чем принято думать, но у него есть углы, на которые натыкаются уже в процессе.
- Директивы компиляции должны совпадать. Директива перед расширяемой процедурой в модуле формы обязана совпадать с директивой этой процедуры в конфигурации.
- Инструкции препроцессора не переносятся. Если расширяемый метод обрамлён ими, в расширение они не попадут, и поведение разойдётся с ожидаемым.
- Из заимствованной подсистемы нельзя удалить объекты. Добавить свои — можно, убрать уже присутствующие — нет.
- Права ролей берутся из конфигурации, пока флажки в расширении не выставлены явно. Зато можно позаимствовать роль и снять у неё право на конкретный объект — например, закрыть продавцам отчёт по продажам, оставив его менеджерам.
- Порядок применения задаётся назначением. «Исправление», «Адаптация» или «Дополнение»: расширения с назначением «Дополнение» применяются последними. И новый порядок вступает в силу только после обновления конфигурации базы данных, а не сразу после смены настройки.
Матрица выбора
| Задача | Чем делать |
|---|---|
| Своя печатная форма | расширение |
| Отчёт на СКД | внешний отчёт или расширение |
| Реквизит и его обработка в документе | расширение |
| Изменение логики проведения | расширение, аннотации «Перед» и «После» |
| Разовая обработка данных | внешняя обработка |
| Обмен с внешней системой | расширение плюс веб-сервис |
| Глубокая переделка типовой логики | правка типовой, осознанно и с расчётом стоимости |
Правило, которым пользуемся мы: правка типовой допустима, когда расширением задача не решается технически или решается настолько сложным перехватом, что сопровождать его дороже, чем сравнивать объекты при обновлении. Таких случаев меньше, чем принято считать, — примерно 1 из 10.
Цена владения на три года
Разработка одной доработки стоит примерно одинаково в обоих вариантах. Считать надо не её, а сумму обновлений.
Допустим, у вас 15 доработок и вы обновляетесь 4 раза в год. При расширениях обновление проходит штатно: время уходит на проверку, что расширения применились и ничего не отвалилось, — это часы, а не дни. При правке типовой каждое обновление означает ручное сравнение и объединение по изменённым объектам: 10 расхождений разбираются за несколько часов, 30–40 — это 2–3 дня работы. За 3 года и 12 обновлений разница набегает в десятки дней, и оплачиваются они каждый раз заново.
Есть и вторая статья расхода, которую не видно в счёте: при правке типовой растёт риск не получить изменение поставщика. Выбрали свою версию объекта — и новая форма отчётности или исправленный расчёт в вашу базу не приехали. Подробно этот сценарий разобран в статье про слетевшие после обновления доработки.
Как проверить, что подрядчик сделал правильно
- Спросите список расширений базы. Он виден в режиме предприятия, и его можно получить за минуту, не будучи программистом.
- Спросите, снята ли конфигурация с поддержки. Ответ «частично» означает правку типовой, и дальше уместен вопрос, почему её нельзя было избежать.
- Попросите список доработанных объектов. Нормальный подрядчик ведёт его сам. Отсутствие списка — признак, что через год никто не вспомнит, что и зачем меняли.
- Уточните, у кого исходники. Файл расширения должен быть у вас, а не только на стенде подрядчика.
- Проверьте на копии перед боевой. Любое обновление с доработками сначала прогоняется на копии базы — как это устроено у нас, описано в разделе «Как работаем».
Вопросы, которые задают
Всё ли можно сделать расширением конфигурации 1С
Нет, но большинство прикладных задач — да: печатные формы, реквизиты, формы, отчёты, изменение логики проведения через аннотации, собственные объекты. Упирается это обычно не в саму возможность, а в сложность перехвата: если для простой по смыслу задачи требуется подменить длинный метод целиком, стоит пересчитать, что дешевле сопровождать.
Сколько расширений можно подключить к одной базе
Технического предела нет, на практике встречаются базы с 5–10 расширениями. Проблема не в количестве, а в пересечениях: два расширения, претендующие на один метод с аннотацией «Вместо», уживутся плохо, и порядок их применения начнёт влиять на результат.
Почему расширение иногда работает не так, как вчера
Первое, что стоит проверить, — порядок применения. Он задаётся назначением расширения, и после его смены порядок меняется только с обновлением конфигурации базы данных. Второе — обновление конфигурации, из-за которого заимствованный объект перестал совпадать с ожиданием расширения.
Можно ли перевести существующие правки типовой в расширения
Можно, и на длинной дистанции это почти всегда окупается. Работа проектная: нужно разобрать каждое изменение, понять его смысл, перенести в расширение и вернуть объект на поддержку. Оценивается по числу изменённых объектов, а не по строкам кода, и делается на копии базы.
Кто должен хранить файл расширения
Вы. Расширение выгружается в файл и передаётся заказчику так же, как передают исходники. Если подрядчик держит его только у себя, при смене подрядчика вы начинаете с нуля — и это один из вопросов, который стоит задавать до подписания договора, а не после. Что входит в нашу подписку, перечислено на странице тарифов.
Посмотрим вашу базу
Скажем, что можно вернуть на поддержку и сколько это стоит
Разберём на копии, что у вас доработано и каким способом, и посчитаем, во что обходятся обновления сейчас и во что будут обходиться после перевода в расширения.