Своя кнопка на форме типовой 1С без снятия с поддержки

· 9 мин

Содержание

Чтобы добавить кнопку в 1С через расширение, откройте в Конфигураторе Конфигурация → Расширения конфигурации, создайте расширение, позаимствуйте в него нужную форму (правый щелчок по форме в дереве основной конфигурации → Добавить в расширение), заведите на вкладке «Команды» новую команду с обработчиком и перетащите её в командную панель формы. Потом обновите расширение в базе и перезапустите 1С:Предприятие — кнопка появится.

Типичная ситуация: бухгалтер просит «одну кнопочку» в реализации, чтобы не копировать руками одно и то же в комментарий. Снимать типовую БП 3.0 с поддержки ради этого нельзя — следующее обновление превратится в сравнение-объединение. Расширение решает задачу аккуратно: основная конфигурация остаётся на поддержке, а кнопка живёт отдельно. Всё ниже относится к платформе 8.3 и подходит для любой конфигурации на управляемых формах: БП 3.0, ЗУП 3.1, УТ 11 и других.

Что проверить до начала работы

Расширения конфигурации появились в платформе 8.3.6. Для кнопок этого хватает, но удобные аннотации вроде &ИзменениеИКонтроль требуют номера платформы не ниже 8.3.11. На актуальных сборках 8.3.2x ограничений нет.

Перед стартом проверьте:

  • 🔑 Права. Нужен пользователь с полными правами: и в Конфигураторе, и в режиме 1С:Предприятие для подключения расширений.
  • 🧩 Режим совместимости. У нового расширения он подставляется из основной конфигурации. Выше, чем у конфигурации, его ставить нельзя — расширение не применится.
  • 🖥️ Управляемые формы. Расширение дорабатывает управляемые формы. Обычные формы (толстый клиент старых конфигураций) так не меняются.
  • 🧪 Копия базы для экспериментов. Отлаживать удобнее на копии: в рабочей базе каждое промежуточное применение расширения увидят пользователи.

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

Шаг 1. Создайте расширение конфигурации

  1. Откройте базу в Конфигураторе.
  2. Выберите Конфигурация → Расширения конфигурации. Откроется окно со списком расширений.
  3. Нажмите «Добавить». Заполните имя (латиница или кириллица без пробелов), синоним и префикс.
  4. Выберите назначение. Для кнопки подходит «Дополнение» или «Адаптация»: назначение влияет на порядок применения, если расширений несколько.
  5. Откройте созданное расширение двойным щелчком — появится его собственное дерево метаданных.

В свойствах расширения (палитра свойств корня дерева) есть два важных флага.

СвойствоЧто делаетКогда включать
Безопасный режимЗапрещает коду расширения работу с файлами, COM, внешними компонентамиЕсли кнопка только меняет данные формы или делает запрос — оставьте включённым
Защита от опасных действийПользователь увидит предупреждение при подключении расширенияДля расширений из чужих рук — всегда

Если кнопка должна, например, сохранять файл на диск, безопасный режим придётся снять. Тогда при загрузке расширения в пользовательском режиме 1С предупредит об этом.

Шаг 2. Позаимствуйте форму, где будет кнопка

Кнопку нельзя положить «в документ вообще». Её размещают на конкретной форме: форме документа, форме списка, форме выбора, форме отчёта.

Как понять, какая форма нужна:

  1. Откройте объект в режиме 1С:Предприятие и решите, где нужна кнопка: в карточке документа или в журнале.
  2. В Конфигураторе найдите объект и раскройте у него ветку «Формы». У документов обычно есть ФормаДокумента и ФормаСписка.
  3. Если форм несколько, откройте свойства объекта на вкладке «Формы»: там указано, какая форма основная для объекта, списка и выбора.

Дальше в дереве основной конфигурации щёлкните правой кнопкой по форме и выберите Добавить в расширение. Платформа спросит, в какое расширение заимствовать, и сама добавит в него владельца формы (документ или справочник) как заимствованный объект.

Заимствуйте только то, что дорабатываете. Каждый лишний заимствованный объект — ещё одна точка, которая может сломаться после обновления типовой.

Где разместить кнопку на форме

Откройте заимствованную форму в расширении. Слева сверху — дерево элементов, справа — вкладки «Реквизиты», «Команды», «Параметры». Варианты размещения такие:

МестоКак добавитьПлюсы и минусы
Командная панель формыПеретащить команду в элемент «Командная панель» в начале дереваСамое привычное место, кнопка рядом с «Провести»
Подменю «Еще»В свойствах кнопки включить «Только во всех действиях»Не занимает место, но пользователь её ищет
Группа на формеПеретащить команду в нужную группу или рядом с полемЛогично для действий над конкретным полем
Командная панель табличной частиПеретащить в панель таблицы «Товары»Для действий над строками

Для формы списка кнопку ставят в командную панель списка: тогда она работает с выделенными строками.

Шаг 3. Добавьте команду и кнопку в форму

  1. На вкладке «Команды» в разделе «Команды формы» нажмите «Добавить». Задайте имя, например рсш_ОтметитьПроверку, и заголовок «Отметить проверку».
  2. В свойстве «Действие» нажмите кнопку с лупой. Платформа предложит создать обработчик на клиенте — и, при желании, парную процедуру на сервере. Выберите вариант «на клиенте и процедура на сервере».
  3. Перетащите команду мышью из списка команд в дерево элементов, в командную панель формы. Появится элемент типа «Кнопка».
  4. В свойствах кнопки при необходимости задайте «Картинку», «Отображение» (картинка, текст или оба), «Сочетание клавиш».
  5. Сохраните. Изменения в форме расширения не трогают основную форму.

Альтернатива: создать кнопку программно

Если типовая форма часто меняется, надёжнее создавать кнопку кодом при открытии формы. Тогда расширение не зависит от состава элементов, которые вы перетаскивали.

В свойствах заимствованной формы найдите событие ПриСозданииНаСервере и создайте для него обработчик расширения с вызовом после типового. Платформа поставит аннотацию &После:

&НаСервере
&После("ПриСозданииНаСервере")
Процедура рсш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

    НоваяКоманда = Команды.Добавить("рсш_Отметить");
    НоваяКоманда.Действие = "рсш_ОтметитьПроверку";
    НоваяКоманда.Заголовок = "Отметить проверку";

    Кнопка = Элементы.Добавить("рсш_КнопкаОтметить", Тип("КнопкаФормы"), КоманднаяПанель);
    Кнопка.ИмяКоманды = "рсш_Отметить";

КонецПроцедуры

Процедура рсш_ОтметитьПроверку из свойства «Действие» должна быть в модуле формы расширения — её код ниже.

Шаг 4. Напишите обработчик нажатия кнопки

Пример для формы документа: кнопка дописывает в комментарий отметку о проверке с именем пользователя и временем.

&НаКлиенте
Процедура рсш_ОтметитьПроверку(Команда)

    рсш_ОтметитьПроверкуНаСервере();

КонецПроцедуры

&НаСервере
Процедура рсш_ОтметитьПроверкуНаСервере()

    ИмяПользователя = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
    Отметка = СтрШаблон("Проверено: %1, %2", ИмяПользователя,
        Формат(ТекущаяДатаСеанса(), "ДЛФ=DT"));

    Объект.Комментарий = СокрЛП(Объект.Комментарий + " " + Отметка);
    Модифицированность = Истина;

КонецПроцедуры

Обработчик меняет только данные формы. Документ запишется, когда пользователь нажмёт «Записать» или «Провести».

Второй пример — для формы списка реализаций. Кнопка считает сумму выделенных документов:

&НаКлиенте
Процедура рсш_СуммаВыделенных(Команда)

    Выделенные = Элементы.Список.ВыделенныеСтроки;
    Если Выделенные.Количество() = 0 Тогда
        ПоказатьПредупреждение(, "Выделите хотя бы один документ.");
        Возврат;
    КонецЕсли;

    Итог = рсш_СуммаДокументов(Выделенные);
    ПоказатьПредупреждение(, "Сумма выделенных: " + Формат(Итог, "ЧДЦ=2; ЧН=0"));

КонецПроцедуры

&НаСервереБезКонтекста
Функция рсш_СуммаДокументов(Ссылки)

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЕСТЬNULL(СУММА(Док.СуммаДокумента), 0) КАК Сумма
    |ИЗ
    |    Документ.РеализацияТоваровУслуг КАК Док
    |ГДЕ
    |    Док.Ссылка В (&Ссылки)";
    Запрос.УстановитьПараметр("Ссылки", Ссылки);

    Выборка = Запрос.Выполнить().Выбрать();
    Выборка.Следующий();
    Возврат Выборка.Сумма;

КонецФункции

Почему именно так:

  • 🖱️ Обработчик команды всегда клиентский — с &НаКлиенте. Диалоги вроде ПоказатьПредупреждение работают только на клиенте.
  • 🗄️ Запросы к базе выполняются на сервере. Если данные формы не нужны, используйте &НаСервереБезКонтекста: так на сервер не передаётся вся форма, и кнопка срабатывает быстрее.
  • 🔢 Число в строку склеивайте через Формат, иначе в сумме появятся пробелы-разделители или «неожиданные» форматы.

Кнопка для нескольких форм сразу

Если одна и та же кнопка нужна во всех формах документа, удобнее общая команда расширения. Создайте в расширении объект «Общие команды», укажите тип параметра команды (например, ссылку на документ) и группу «Командная панель формы». Документ при этом придётся позаимствовать: без заимствования его тип недоступен в свойствах объектов расширения. Команда появится во всех формах, где командная панель заполняется автоматически.

Шаг 5. Проверьте и отладьте кнопку

  1. В окне расширения нажмите Конфигурация → Обновить конфигурацию базы данных (F7) — так расширение применяется к базе. Сохранение в Конфигураторе само по себе этого не делает.
  2. Запустите отладку клавишей F5. Откроется 1С:Предприятие с подключённым расширением.
  3. Поставьте точку останова (F9) в процедуре рсш_ОтметитьПроверку и нажмите кнопку. Отладчик остановится в коде расширения так же, как в коде основной конфигурации.
  4. Проверьте сценарии: новый незаписанный документ, проведённый документ, документ только для чтения, пользователь с ограниченными правами.
Перед передачей кнопки пользователям
Выполнено: 0 / 6

Перед обновлением типовой конфигурации запускайте проверку применимости расширения — команда есть в окне «Расширения конфигурации». Она заранее покажет, что заимствованная форма или обработчик разошлись с новой версией.

Перенос расширения: выгрузка .cfe и загрузка в рабочую базу

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

СпособВыгрузитьЗагрузить
КонфигураторВ окне расширения Конфигурация → Сохранить конфигурацию в файлКонфигурация → Загрузить конфигурацию из файла, затем F7
Пользовательский режим БП 3.0, ЗУП 3.1, УТ 11Администрирование → Печатные формы, отчеты и обработки → Расширения → «Сохранить как»Там же «Добавить из файла»
Любая конфигурацияВсе функции → Стандартные → Управление расширениями конфигурацииТам же «Добавить»
Пакетный запуск1cv8 DESIGNER ... /DumpCfg файл.cfe -Extension Имя/LoadCfg файл.cfe -Extension Имя, затем /UpdateDBCfg -Extension Имя

Загрузка файла и применение к базе — два разных шага. В Конфигураторе после загрузки .cfe обязательно выполните «Обновить конфигурацию базы данных», иначе база продолжит работать со старой версией расширения.

Пользователи увидят кнопку только после перезапуска сеанса. Если вы обновляете расширение днём, предупредите людей: им придётся закрыть и снова открыть 1С. Принудительно завершать чужие сеансы ради кнопки не стоит — вместе с ними пропадут несохранённые документы.

Храните .cfe в репозитории или хотя бы в папке с датой версии. Так проще откатиться, если новая версия кнопки сломала форму.

Почему кнопка не появилась: разбор ошибок

Диагностика: выберите симптом

Ещё три ошибки, на которых чаще всего теряют время:

  • ❌ Диалог в серверной процедуре. ПоказатьПредупреждение или Вопрос в процедуре с &НаСервере дают ошибку компиляции. Все сообщения пользователю — на клиенте, или через Сообщить на сервере.
  • ❌ Правка типовой процедуры через копирование. Если скопировать весь типовой обработчик в расширение с &Вместо, после обновления типовой вы останетесь со старой логикой. Для добавления действия хватает &После.
  • ❌ Изменение свойств типовых элементов «на всякий случай». Любое изменённое свойство заимствованного элемента платформа проверяет при обновлении. Меньше правок — меньше конфликтов.

Частые вопросы о кнопках в расширениях

Сохранится ли кнопка после обновления типовой конфигурации?
Да, если заимствованная форма не изменилась кардинально. Расширение применяется поверх новой версии; при конфликте платформа сообщит об этом при проверке применимости.
Можно ли добавить кнопку в форму отчёта или обработки?
Можно. Позаимствуйте форму отчёта или встроенной обработки так же, как форму документа. Для внешних обработок расширение не нужно — их правят в самом файле .epf.
Как показать кнопку только части пользователей?
Создайте в расширении свою роль с правом на нужную команду или управляйте свойством Видимость кнопки в ПриСозданииНаСервере по результату проверки роли через РольДоступна.
Нужно ли выгонять пользователей, чтобы подключить расширение с кнопкой?
Обычно нет: расширение, которое не меняет структуру данных, применяется без монопольного доступа. Пользователи увидят кнопку после перезапуска своего сеанса.
Чем общая команда лучше кнопки в заимствованной форме?
Общая команда не требует заимствовать саму форму и появляется сразу во всех формах объекта с автозаполняемой командной панелью. Зато точное место кнопки ей задать сложнее.