Расширение конфигурации 1С 8.3 без снятия с поддержки: от первого объекта до выпуска
Содержание
Чтобы сделать расширение в 1С 8.3, откройте Конфигуратор, выберите Конфигурация → Расширения конфигурации и нажмите «Добавить». Дальше заимствуйте нужные объекты основной конфигурации, добавьте свои реквизиты, формы или код и выполните «Обновить конфигурацию
базы данных» для расширения. Типовая при этом остаётся на поддержке и обновляется как обычно.
Типичная ситуация: бухгалтер просит добавить в счёт на оплату поле «Ответственный менеджер» и вывести его в печатную форму. Раньше разработчик снимал конфигурацию с поддержки, правил объект и потом при каждом обновлении сливал изменения вручную. С расширением правка живёт отдельно, а типовой релиз ставится поверх без объединения. Механизм есть в платформе начиная с 8.3.6, и для разработчиков он давно стал основным способом доработки типовых.
Что подготовить до создания расширения
Расширение не работает в отрыве от основной конфигурации. Поэтому сначала соберите исходные данные.
📌 Что проверить перед началом:
- 🖥️ Версия платформы. Чем новее платформа, тем больше умеет расширение: собственные объекты, реквизиты у заимствованных объектов, директива
&ИзменениеИКонтроль. Посмотреть номер можно в Конфигураторе:Справка → О программе. - ⚙️ Режим совместимости. Откройте свойства корня основной конфигурации и запишите значение «Режим совместимости». У расширения этот режим не может быть новее, чем у конфигурации.
- 🧪 Копия базы для разработки. Расширение пишут и отлаживают на копии, а в рабочую базу переносят готовый файл
.cfe. - 🔒 Права. Нужны административные права в базе: без них ни Конфигуратор, ни окно управления расширениями в пользовательском режиме не дадут ничего подключить.
Когда расширение — правильный выбор
| Задача | Расширение подходит? | Комментарий |
|---|---|---|
| Новый реквизит в документе или справочнике | ✅ Да | Реквизит хранится в таблицах расширения |
| Своя печатная форма, отчёт, обработка | ✅ Да | Можно сделать и внешним файлом, но расширение удобнее в поставке |
| Изменение логики проведения или записи | ✅ Да | Через перехват методов модуля |
| Новый регистр или справочник | ✅ Да | В современных версиях платформы |
| Изменение структуры типового регистра (новое измерение) | ⚠️ Ограниченно | Проще и безопаснее завести свой регистр |
| Правки, которые ломают обмен с другими базами | ❌ Нет | Нужно согласовывать формат обмена |
Как создать расширение в Конфигураторе: пошагово
Ниже — порядок, который подходит для любой типовой: Бухгалтерии 3.0, ЗУП 3.1, УТ 11. Механизм общий для платформы, пути в Конфигураторе от конфигурации не зависят.
- Откройте базу в режиме Конфигуратора. Если основная конфигурация ещё не открыта, откройте её:
Конфигурация → Открыть конфигурацию. - Выберите
Конфигурация → Расширения конфигурации. Откроется список расширений этой базы. - Нажмите «Добавить». Появится окно свойств нового расширения.
- Заполните поля:
- Имя — латиницей или кириллицей без пробелов, например
ДоработкиСчетов; - Синоним — как расширение увидят пользователи;
- Префикс — платформа подставляет его в имена новых объектов и процедур. По умолчанию это
Расширение1_, лучше задать короткий осмысленный, напримердс_; - Назначение — «Исправление», «Адаптация» или «Дополнение». От назначения зависит порядок применения, если расширений несколько: исправления применяются раньше адаптаций, адаптации — раньше дополнений.
- Имя — латиницей или кириллицей без пробелов, например
- Нажмите «ОК». В списке появится строка, а в дереве откроется пустая конфигурация расширения.
Дальше откройте палитру свойств корня расширения (через контекстное меню корня). Там стоят флажки, о которых часто забывают:
- 🛡️ Безопасный режим — включён по умолчанию. Код расширения не может работать с файлами, COM-объектами и внешними компонентами. Для простых доработок оставьте как есть.
- ⚡ Защита от опасных действий — пользователю при подключении покажут предупреждение.
- 🔁 Использовать в распределённой ИБ — нужно, если расширение должно попадать в узлы РИБ.
Префикс задайте сразу. Переименовывать десятки объектов и процедур после разработки — долгая и рискованная работа.
Заимствование объектов: реквизиты, формы, команды
Расширение может менять только то, что «взяло» из основной конфигурации. Это и есть заимствование.
Как заимствовать объект
- В дереве основной конфигурации найдите нужный объект, например документ
СчетНаОплатуПокупателю. - Правой кнопкой мыши — «Добавить в расширение». Выберите своё расширение, если их несколько.
- Объект появится в дереве расширения с особым значком. Заимствуется только «оболочка»: модули и формы подтягиваются отдельно, по мере надобности.
Новый реквизит
Откройте заимствованный объект в расширении и добавьте реквизит как обычно. Платформа сама подставит префикс: дс_ОтветственныйМенеджер. В коде к нему обращаются по полному имени с префиксом.
Удаление расширения с собственными реквизитами удаляет и данные в них. Если пользователи полгода заполняли поле, а вы удалили расширение, значения пропадут. Перед удалением выгрузите данные или сохраните копию базы .
Форма и команда
Чтобы показать реквизит пользователю, заимствуйте форму документа: в дереве основной конфигурации раскройте Формы, выберите форму и тоже «Добавить в расширение». В редакторе формы расширения перетащите новый реквизит в нужную группу элементов.
Свою команду добавляют так же, как в обычной конфигурации: на вкладке «Команды» редактора формы или как общую команду в ветке Общие → Общие команды расширения.
Свойства заимствованного объекта
У заимствованного объекта есть флажки контроля свойств. Если включить контроль, расширение проверит при подключении, что свойство в основной конфигурации не изменилось. Это защищает от тихих сбоев: например, вы рассчитываете на определённый тип реквизита, а в новом релизе типовой его поменяли.
Модули и внешние компоненты в расширении
Код в расширении не заменяет модуль целиком. Вы перехватываете конкретную процедуру или функцию с помощью аннотаций. Чтобы перехватить метод, откройте модуль заимствованного объекта, найдите процедуру и через контекстное меню выберите добавление в расширение с нужным типом вызова.
Четыре вида перехвата
| Аннотация | Что делает | Когда использовать |
|---|---|---|
&Перед | Ваш код выполняется до типового | Проверки, подготовка данных |
&После | Ваш код выполняется после типового | Дозаполнение, дополнительные движения |
&Вместо | Ваш код вместо типового; типовой можно вызвать через ПродолжитьВызов() | Нужно изменить результат функции |
&ИзменениеИКонтроль | Копия метода с пометками вставок и удалений | Нужно поменять строку в середине типового кода |
Пример дозаполнения реквизита при записи документа, модуль объекта:
&После("ПередЗаписью")
Процедура дс_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЗначениеЗаполнено(дс_ОтветственныйМенеджер) Тогда
дс_ОтветственныйМенеджер = Ответственный;
КонецЕсли;
КонецПроцедуры
Здесь Ответственный — реквизит типового документа, а дс_ОтветственныйМенеджер — ваш. Если в вашей конфигурации у документа нет реквизита Ответственный, подставьте свой источник значения.
Пример &Вместо для функции общего модуля, которую вы заимствовали (имя функции условное):
&Вместо("ПредставлениеДокументаДляПечати")
Функция дс_ПредставлениеДокументаДляПечати(Документ)
Результат = ПродолжитьВызов(Документ);
Возврат Результат + " (копия)";
КонецФункции
ПродолжитьВызов() выполняет исходную функцию с теми же параметрами. Если его не вызвать, типовой код не отработает совсем — это частая причина «пропавших» движений после установки чужого расширения.
Изменение и контроль
Когда нужно поправить одну строку внутри длинной типовой процедуры, используйте &ИзменениеИКонтроль. Платформа копирует текст метода в расширение, а вы размечаете правки:
#Вставка
// новая строка кода
#КонецВставки
#Удаление
// строка типового кода, которую нужно убрать
#КонецУдаления
При подключении платформа сравнивает текст метода в основной конфигурации с сохранённой копией. Если после обновления типовой текст изменился, расширение не применится, и вы сразу увидите проблему, а не через месяц в отчётах.
Обработчики событий формы
В заимствованной форме обработчики назначают в палитре свойств элемента или формы. При назначении можно выбрать тип вызова: перед, после или вместо типового обработчика. Не забывайте директивы &НаКлиенте и &НаСервере — для них действуют те же правила, что и в обычной форме.
Внешние компоненты
Компоненту кладут в общий макет расширения и подключают из кода через ПодключитьВнешнююКомпоненту. Учтите два ограничения:
- 🚫 в безопасном режиме расширение не может подключать внешние компоненты, флажок придётся снять;
- ⚠️ после снятия безопасного режима пользователь при подключении получит предупреждение, а администратор отвечает за то, что компонента не навредит базе.
Отладка и тестирование расширения
Отладчик работает с модулями расширения так же, как с модулями конфигурации. Ставите точку останова, запускаете Отладка → Начать отладку, проходите сценарий в пользовательском режиме.
Что проверить перед выпуском
- Синтаксис. Командой
Конфигурация → Проверка конфигурациипроверьте модули расширения в нужных режимах: тонкий клиент, сервер, внешнее соединение. - Применимость. В окне
Конфигурация → Расширения конфигурацииесть проверка применимости. Она показывает, подключится ли расширение к текущей основной конфигурации. - Сценарий целиком. Создайте документ, заполните новые поля, проведите, распечатайте, сделайте отмену проведения. Перехваты на
ПередЗаписьюиОбработкаПроведенияпроявляют ошибки только в полном цикле. - Права. Зайдите под пользователем без полных прав. Свои объекты расширения нужно добавить в роли: заимствуйте типовую роль или создайте свою роль в расширении.
- Производительность. Если перехватили проведение, проведите месяц документов в копии базы и сравните время с исходным.
Публикация и обновление расширения в рабочей базе
Выгрузка в файл
В Конфигураторе откройте расширение и выберите в меню Конфигурация команду сохранения конфигурации расширения в файл. Получится файл с расширением .cfe. Добавляйте в имя версию: ДоработкиСчетов_1.0.3.cfe. В свойствах корня расширения есть поле «Версия» — заполняйте его тем же номером.
Три способа установить расширение
| Способ | Где | Когда удобен |
|---|---|---|
| Конфигуратор | Конфигурация → Расширения конфигурации → загрузка из файла, затем «Обновить конфигурацию базы данных» | Разработчик сам ставит в базу |
| Пользовательский режим | В БП 3.0: Администрирование → Печатные формы, отчеты и обработки → ссылка «Расширения» | Ставит администратор базы без Конфигуратора |
| Командная строка | Пакетный режим Конфигуратора | Много баз, автоматизация |
Пример установки из командной строки для файловой базы:
"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F"D:\Base\Buh" /N"Администратор" /P"" /LoadCfg "D:\cfe\ДоработкиСчетов_1.0.3.cfe" -Extension ДоработкиСчетов /UpdateDBCfg -Extension ДоработкиСчетов /Out "D:\cfe\log.txt"
Путь к 1cv8.exe и номер платформы подставьте свои. Результат смотрите в файле лога.
Загрузка файла .cfe и обновление конфигурации базы данных — два разных шага. Если остановиться на первом, в Конфигураторе расширение будет новое, а пользователи продолжат работать со старым.
Если расширение добавляет реквизиты или свои объекты, обновление структуры базы требует, чтобы в ней никто не работал. Предупредите пользователей: их сеансы придётся завершить. Ставьте такие обновления вечером или в выходной.
Что происходит при обновлении типовой
Расширение не мешает обновить основную конфигурацию. После обновления откройте список расширений и запустите проверку применимости. Возможны три исхода:
- ✅ всё применилось — работа продолжается;
- ⚠️ изменился контролируемый метод или свойство — расширение не подключится, пока вы не обновите код под новый релиз;
- ❌ из типовой удалён заимствованный объект — расширение тоже не подключится, объект нужно убрать из расширения.
Ошибки при разработке расширений и как их избежать
&Вместо без вызова ПродолжитьВызов(). Типовой код не выполняется. Замените аннотацию на &Перед или &После либо добавьте вызов исходного метода.&ИзменениеИКонтроль или контролируемое свойство объекта. Заново скопируйте метод из обновлённой типовой и перенесите в него свои вставки.Ещё одна ловушка — несколько расширений перехватывают один и тот же метод. Порядок вызова определяется назначением и порядком в списке. Если два разработчика независимо поставили &Вместо на одну процедуру, сработает одна цепочка, и результат станет неочевидным. Договоритесь в команде: один метод — один владелец.
Приёмы, которые экономят время на сопровождении
Эти правила вырастают из опыта поддержки десятков баз с расширениями.
- 🧩 Одно расширение — одна задача. Расширение «ДоработкиСчетов» и отдельное «ПечатьАктов» проще обновлять и отключать, чем одно «ВсёДляКлиента» на 200 объектов.
- 🎯 Минимум заимствований. Берите в расширение только те объекты, формы и методы, которые реально меняете. Каждый лишний заимствованный объект — потенциальная причина неприменимости после обновления.
- 🪝 Сначала
&Переди&После. Они переживают обновления типовой почти без проблем.&Вместои&ИзменениеИКонтрольберите, только когда без них никак. - 📦 Своя логика — в свой общий модуль. В перехвате оставьте одну строку вызова, а основной код вынесите в общий модуль расширения. Так перехват короткий, а логику легко тестировать.
- 🏷️ Версия в свойствах и в имени файла. Через год вы не вспомните, какая сборка стоит у клиента, если номер не записан.
- 🗂️ Хранилище или Git. Расширения подключают к хранилищу конфигурации отдельно от основной. Для работы с Git используйте выгрузку расширения в файлы: в Конфигураторе это команда выгрузки конфигурации в файлы, применённая к расширению.
- 📝 Комментарий в начале каждого перехвата. Кто, когда и зачем перехватил метод. Следующему разработчику это сэкономит часы.
Если расширение не решает задачу
Бывает, что доработку не удаётся сделать расширением: например, нужно изменить состав измерений типового регистра или поведение платформенного механизма. Тогда есть два пути:
- Пересмотреть задачу: завести свой регистр рядом с типовым и заполнять его при проведении через
&После. - Снять объект с поддержки точечно. Для конкретного объекта включается возможность изменения, остальная конфигурация остаётся на поддержке. Цена — ручное объединение этого объекта при каждом обновлении.