Модификация конфигурации УТ 11, КА 2 и ERP 2 удобнее всего делается через типовой механизм — общие модули МодификацияКонфигурацииПереопределяемый и родственные им. Их процедуры вызываются из событий форм объектов (ПриСозданииНаСервере, ПриЧтенииНаСервере, ПередЗаписьюНаСервере и других), поэтому форму можно изменить кодом в одном месте, не трогая саму форму. При обновлении релиза такие изменения не нужно вручную объединять с новой версией формы.

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

Из чего состоит механизм

Общие модули:

МодульГде выполняется
МодификацияКонфигурацииПереопределяемыйСервер
МодификацияКонфигурацииВызовСервераПереопределяемыйСервер, вызов с клиента
МодификацияКонфигурацииКлиентПереопределяемыйКлиент
МодификацияКонфигурацииКлиентСерверПереопределяемыйКлиент и сервер

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

Точки вызова в формах объектов:

Событие формыВызов
ПриСозданииНаСервереМодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере(Форма, СтандартнаяОбработка, Отказ)
ПриЧтенииНаСервереМодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(Форма, ТекущийОбъект)
ПередЗаписьюНаСервереМодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(Форма, Отказ, ТекущийОбъект, ПараметрыЗаписи)
ПослеЗаписиНаСервереМодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(Форма, ТекущийОбъект, ПараметрыЗаписи)
ПослеЗаписиМодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(Форма, ПараметрыЗаписи)

Во многих формах вызов идёт не напрямую, а через общий модуль СобытияФорм (СобытияФорм.ПриСозданииНаСервере, СобытияФорм.ПриЧтенииНаСервере), который уже вызывает процедуры модификации. Для подключаемых команд есть СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду, который передаёт управление в МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду. Сигнатуры и набор событий от релиза к релизу дополнялись — перед работой откройте модули своей версии.

Модификация конфигурации УТ 11: события всех форм собираются в переопределяемых модулях
Модификация конфигурации УТ 11: события всех форм собираются в переопределяемых модулях

Код для конкретной формы

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

1С
// МодификацияКонфигурацииПереопределяемый
Процедура ПриСозданииНаСервере(Форма, СтандартнаяОбработка, Отказ) Экспорт

	Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда
		пр_НоменклатураФормаЭлементаПриСоздании(Форма);
	ИначеЕсли Форма.ИмяФормы = "Документ.ЗаказКлиента.Форма.ФормаДокумента" Тогда
		пр_ЗаказКлиентаПриСоздании(Форма);
	КонецЕсли;

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

// Добавляет на форму номенклатуры поле нового реквизита «пр_КодПоставщика».
Процедура пр_НоменклатураФормаЭлементаПриСоздании(Форма)

	Если Форма.Элементы.Найти("пр_КодПоставщика") <> Неопределено Тогда
		Возврат;
	КонецЕсли;

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

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

Поле вставляется рядом с типовым элементом через Элементы.Вставить с указанием родителя и элемента, перед которым ставить. Привязка к типовому элементу по имени — единственная точка, которая может сломаться при обновлении: если элемент переименуют, код упадёт. Поэтому проверяйте Элементы.Найти и при отсутствии ставьте поле в безопасное место.

Что можно изменить таким способом

  1. Свойства типовых элементов: видимость, доступность, заголовки, параметры выбора.
  2. Вывод новых реквизитов и табличных частей объекта, добавленных в конфигурацию.
  3. Новые реквизиты формы через Форма.ИзменитьРеквизиты.
  4. Обработчики событий новых элементов.
  5. Подмена обработчиков типовых элементов и самой формы.
  6. Замена типовых элементов своими.

Ограничение старого механизма: процедуры-обработчики новых элементов должны физически находиться в модуле формы — переопределяемый модуль не может быть обработчиком события элемента. На практике в конце модуля формы заводят свою область (например, #Область пр_Доработки) со всеми добавленными процедурами, чтобы при обновлении её было легко перенести одним блоком.

Своя команда на форме

Для команд механизм даёт обходной путь, при котором обработчик в модуле формы не нужен. Команда создаётся с действием Подключаемый_ВыполнитьПереопределяемуюКоманду, которое есть в формах, поддерживающих механизм, а логика пишется в клиентском переопределяемом модуле:

1С
// Сервер: добавляем команду в ПриСозданииНаСервере
Команда = Форма.Команды.Добавить("пр_ПроверитьЦены");
Команда.Заголовок = "Проверить цены";
Команда.Действие = "Подключаемый_ВыполнитьПереопределяемуюКоманду";

Кнопка = Форма.Элементы.Добавить("пр_ПроверитьЦены", Тип("КнопкаФормы"), Форма.КоманднаяПанель);
Кнопка.ИмяКоманды = "пр_ПроверитьЦены";
1С
// МодификацияКонфигурацииКлиентПереопределяемый
Процедура ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Экспорт

	Если Команда.Имя = "пр_ПроверитьЦены" Тогда
		пр_ПроверкаЦенВызовСервера.ПроверитьЦеныЗаказа(Форма.Объект.Ссылка);
	КонецЕсли;

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

Перед использованием убедитесь, что в модуле нужной формы действительно есть процедура Подключаемый_ВыполнитьПереопределяемуюКоманду — поддержка добавлена не во все формы.

Связка с расширениями

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

1С
// Расширение, заимствованный модуль МодификацияКонфигурацииПереопределяемый
&После("ПриСозданииНаСервере")
Процедура пр_ПриСозданииНаСервере(Форма, СтандартнаяОбработка, Отказ)

	пр_ДоработкиФорм.ПриСозданииФормы(Форма);

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

Обработчики событий новых элементов в этом случае живут в заимствованных формах расширения или подключаются через команды механизма. Подробнее о проектировании доработок в расширениях — в услуге разработка расширений 1С.

Ограничения и ошибки

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

Такая организация доработок напрямую влияет на стоимость обновления 1С: чем меньше изменений в типовых формах, тем быстрее и дешевле переход на новый релиз. На проектах внедрения 1С:ERP я закладываю этот подход с первого дня.

Итог

  • В УТ 11, КА 2 и ERP 2 события форм объектов вызывают процедуры модулей МодификацияКонфигурации…Переопределяемый.
  • Код для конкретной формы отбирается по Форма.ИмяФормы и выносится в отдельные процедуры с префиксом.
  • Свои команды без обработчика в модуле формы делаются через Подключаемый_ВыполнитьПереопределяемуюКоманду.
  • В расширении процедуры переопределяемых модулей перехватываются через &После — основная конфигурация не меняется.
  • Проверяйте наличие элементов и поддержку механизма в нужной форме своей версии.