1C-Code → Основы 1С → Поддержка, обновление и расширения
Почему нельзя просто взять и поправить типовую. Три способа доработки и цена каждого при обновлении.
Глава 31 из 36 · чтение примерно 24 минут
Задача звучит безобидно: «добавьте в накладную колонку Скидка». В своей конфигурации это десять минут. В типовой — решение, которое будет аукаться годами.
Причина в том, что типовую конфигурацию обновляют. Фирма «1С» выпускает новую версию, и ваши правки должны пережить это обновление.
Типовая конфигурация поставляется на поддержке: платформа помнит, как выглядит эталон от поставщика, и умеет сравнить его с вашим.
У каждого объекта есть правило поддержки:
Не редактируется — менять нельзя, обновление заменит его целиком и молча.
Редактируется с сохранением поддержки — менять можно, при обновлении платформа покажет, что разошлось, и предложит объединить.
Снят с поддержки — объект больше не сравнивается с эталоном. Обновление его не тронет — и новое от поставщика в него тоже не попадёт.
Цена «снять с поддержки»
Снять с поддержки легко — одна галочка. Дальше начинается долг, который платят при каждом обновлении.
Поставщик исправил ошибку в этом объекте — вам это исправление не придёт. Поставщик изменил его под новое законодательство — тоже не придёт. Разбираться, что именно вы потеряли, придётся вручную и каждый раз.
Поэтому снятие с поддержки — последний способ, а не первый.
«На поддержке» — это не одно состояние, а настройка у КАЖДОГО объекта конфигурации по отдельности. И вариантов у неё три, а не два.
Объект поставщика не редактируется. Обычное состояние: поставщик обновляет его сам, вы не трогаете. Замок закрыт.
Объект поставщика редактируется с сохранением поддержки. Вы правите, но объект остаётся связанным с поставщиком: при обновлении платформа покажет и его правку, и вашу, и спросит. Это рабочее состояние для доработанного объекта.
Объект снят с поддержки. Связь разорвана. Поставщик может переписать эту процедуру целиком — вы об этом не узнаете никогда, потому что при обновлении объект даже не покажут.
Разница между вторым и третьим — самая дорогая в этой главе. Второе означает «обновление будет спрашивать», третье — «обновление молчит». Молчание тут не экономия времени, а потеря исправлений поставщика.
1. Расширение конфигурации. Отдельный «слой» поверх основной конфигурации: свои объекты, свои формы, перехват процедур. Основная конфигурация не меняется вовсе и остаётся на поддержке целиком.
Это правильный способ по умолчанию. Ограничения есть — не всё можно перехватить, — но начинать надо с него.
2. Внешняя обработка или отчёт. Отдельный файл, подключаемый через механизм дополнительных обработок БСП. Конфигурацию не трогает вообще. Годится, когда нужна отдельная операция, а не изменение поведения.
3. Правка в конфигурации. Последний вариант. Если без него нельзя — стараются остаться «с сохранением поддержки» и писать так, чтобы объединение при обновлении было простым.
Расширение подключается к конфигурации и умеет:
Добавлять своё — справочники, обработки, реквизиты к существующим объектам, элементы на существующие формы.
Перехватывать процедуры — директивами &Перед, &После, &Вместо. Первые две добавляют своё до или после чужого кода, третья заменяет его целиком.
&Вместо — самая опасная: заменённая процедура больше не получает обновлений от поставщика, и вы об этом не узнаете. Её берут, когда &Перед и &После не годятся.
Слово «обновить» скрывает пять шагов, и пропуск любого из них — это ночь на работе.
1. Копия базы. Не «на всякий случай», а обязательный шаг: откатиться иначе будет некуда.
2. Обновление на КОПИИ. Все сюрпризы — здесь, а не на рабочей базе с людьми.
3. Сравнение и объединение. Конфигуратор показывает, что изменилось у поставщика и что менялось у вас. Правки, сделанные в типовых объектах, придётся решать вручную: взять поставщика, оставить своё или соединить.
4. Проверка. Провести документы, построить отчёты, запустить обмен. Тем же способом, которым пользуются люди.
5. Обновление рабочей базы — в монопольном режиме, и лучше не в конце месяца.
Замок и галочка «Объект не редактируется»
В дереве конфигурации у типовых объектов стоит замок. Убрать его можно тремя способами, и они очень разные по цене.
Разрешить изменение объекта — объект остаётся на поддержке, и при обновлении конфигуратор предложит объединение. Это нормальный, обратимый шаг.
Снять с поддержки объект — обновления этого объекта больше не приходят. Иногда оправдано, но каждый такой объект придётся вести самому.
Снять с поддержки конфигурацию целиком — дорога в один конец: типовые обновления больше не применятся никак. Это делают, когда конфигурация уже не типовая.
Расширение выглядит решением всех бед: код отдельно, типовая цела, обновление не мешает. Границы у него всё-таки есть, и знать их надо ДО того, как начали.
Удалить чужое нельзя. Расширение добавляет и заменяет, но не убирает: реквизит типового документа из него не выкинуть.
Изменить состав чужого — не всегда. Добавить реквизит или табличную часть в заимствованный объект можно, а вот поменять тип существующего реквизита — уже нет.
&Вместо отключает типовой код целиком. И вместе с ним — все исправления, которые поставщик внесёт в эту процедуру потом. Это тот же риск, что и снятие с поддержки, только спрятанный внутри расширения.
Расширений может быть несколько. И тогда встаёт вопрос, в каком порядке они накладываются. Два расширения, обработавшие одно и то же событие через &Вместо, — это ссора, в которой побеждает кто-то один.
| Что нужно | Чем делать | Почему |
|---|---|---|
| Разовая выгрузка или проверка | внешняя обработка | конфигурацию трогать незачем вовсе |
| Своя печатная форма | внешняя печатная форма через БСП | подключается в базе, переживает обновление |
| Добавить проверку при проведении | расширение, &После | типовой код остаётся и продолжает обновляться |
| Добавить свой реквизит в типовой документ | расширение | объект заимствуется, конфигурация цела |
| Переписать типовой алгоритм целиком | расширение &Вместо — и с осторожностью | исправления поставщика в эту процедуру до вас не дойдут |
| Свои справочники и документы | расширение или конфигурация | своё новое поставщику не мешает и с поддержки не снимает |
Вопрос, который решают в начале каждой задачи на типовой базе.
Расширение берут, когда правка небольшая и прицельная: добавить реквизит, вставить проверку, поменять печатную форму. Конфигурация остаётся нетронутой, обновления применяются как обычно.
Доработку самой конфигурации — когда меняется механика: новые регистры, своё проведение, переписанные отчёты. Расширение такое тоже вытянет, но станет вторым проектом, который надо чинить после каждого обновления типовой.
Правило, по которому выбирают: расширение по умолчанию, доработка — по необходимости. Не наоборот.
Расширение тоже ломается при обновлении
Распространённое заблуждение: «положили в расширение — и обновления не страшны».
Расширение цепляется к типовым процедурам по имени и сигнатуре. Переименовали процедуру в новой версии типовой — аннотация больше ни к чему не цепляется, и расширение отваливается. Иногда молча, иногда с ошибкой при запуске.
Поэтому после каждого обновления расширения проверяют: открываются ли формы, работают ли кнопки, срабатывают ли проверки. Список того, что делает расширение, полезно держать записанным — иначе проверять будет некого.
Когда разработчиков больше одного, конфигурацию держат в хранилище: объект захватывается, правится и помещается обратно.
Правила простые и нарушаются одинаково: захватывать только то, что правишь, помещать в тот же день, писать комментарий к помещению. Захваченный на неделю общий модуль останавливает всю команду.
Хранилище — не система контроля версий: оно хранит историю, но сливать параллельные ветки не умеет. Поэтому в больших командах поверх него ставят выгрузку в файлы и git.
Захваченный объект — чужая работа, а не препятствие
В хранилище объект берут на себя: пока он захвачен, править его может только один. Первая мысль новичка — «отменить чужой захват», благо кнопка есть.
Отмена захвата у коллеги выбрасывает его правки без предупреждения и без возможности вернуть. Это не механизм разблокировки, а аварийный инструмент для случая, когда человек уволился с захваченным объектом.
Правильный порядок скучный и работающий: спросить, подождать, поместить своё. Захват — это не замок на двери, а табличка «здесь работают».
Обновление типовой на боевой базе — это не «нажать кнопку», а последовательность, в которой каждый шаг существует потому, что кто-то однажды его пропустил.
| Шаг | Зачем именно он |
|---|---|
| Прочитать, что в новой версии | бывают изменения, требующие ваших правок ДО обновления |
| Сделать копию базы | единственный способ вернуться, если не пошло |
| Обновить на КОПИИ | все конфликты вылезут здесь, а не на боевой в понедельник |
| Разобрать конфликты | по каждому решить: чья версия остаётся и почему |
| Проверить свои доработки | обновление их не проверяет — это делаете вы |
| Запланировать окно | обновление боевой базы — это простой, и о нём предупреждают |
| Обновить боевую и дать отработать обработчикам | первый запуск после обновления выполняет обработчики обновления данных |
| Остаться рядом на день | ошибки обновления вылезают на живых данных, а не на запуске |
На чём спотыкаются
Снимают с поддержки всю конфигурацию «чтобы не мешала». После этого обновляться можно только вручную и целиком — то есть практически никогда.
Пишут в расширении &Вместо, не разобравшись. Поставщик поправил процедуру — у вас работает старая, и ошибка возвращается после каждого обновления.
Забывают, что расширение может отвалиться. Если поставщик переименует процедуру, перехват перестанет применяться. Молча: расширение просто отключится.
Держат доработки без описания. Через год никто не помнит, зачем эта правка. Комментарий с номером задачи и датой — не формальность, а единственный способ понять при следующем обновлении, нужна ли она ещё.
Упражнение 1. Чем дорабатывать
Функция ЧемДорабатывать(Что) возвращает способ: "ВнешняяОбработка", если в описании есть "разов" или "отчёт"; "Расширение", если есть "поведени" или "форм"; иначе "Расширение" — потому что начинать всегда стоит с него.
Решается в тренажёре: код запускается и проверяется сразу.
Упражнение 2. Дойдут ли исправления поставщика
Функция ИсправленияДойдут(Состояние) получает состояние объекта: "не редактируется", "редактируется с сохранением поддержки" или "снят с поддержки". Вернуть Истина, если при обновлении платформа покажет правку поставщика по этому объекту, и Ложь, если она пройдёт мимо молча.
Решается в тренажёре: код запускается и проверяется сразу.
Типовая стоит на поддержке, и это не помеха, а способ получать исправления. Снятие с поддержки — долг, который платят при каждом обновлении. Дорабатывают по порядку: расширение, внешняя обработка, и только потом правка в конфигурации. В расширении &Перед и &После безопаснее &Вместо. Каждую доработку описывают — через год это единственный способ понять, нужна ли она ещё.
Читать про код и писать код — разные умения. В тренажёре к этой главе идут упражнения: вы пишете решение, оно запускается на настоящем интерпретаторе 1С и проверяется сразу, без установки платформы.
← БСП: зачем она и что в ней искать
→ Обработки и отчёты: внешние и встроенные