Модификация конфигурации УТ 11, КА 2 и ERP 2 удобнее всего делается через типовой механизм — общие модули МодификацияКонфигурацииПереопределяемый и родственные им. Их процедуры вызываются из событий форм объектов (ПриСозданииНаСервере, ПриЧтенииНаСервере, ПередЗаписьюНаСервере и других), поэтому форму можно изменить кодом в одном месте, не трогая саму форму. При обновлении релиза такие изменения не нужно вручную объединять с новой версией формы.
Ниже — из чего состоит механизм, как написать код для конкретной формы, как добавить свою команду и как связать всё это с расширением.
Из чего состоит механизм
Общие модули:
| Модуль | Где выполняется |
|---|---|
МодификацияКонфигурацииПереопределяемый | Сервер |
МодификацияКонфигурацииВызовСервераПереопределяемый | Сервер, вызов с клиента |
МодификацияКонфигурацииКлиентПереопределяемый | Клиент |
МодификацияКонфигурацииКлиентСерверПереопределяемый | Клиент и сервер |
Суффикс «Переопределяемый» по стандартам 1С означает, что модуль предназначен для изменения внедренцами: при обновлении фирма «1С» не перезаписывает ваш код в нём (новые процедуры при этом могут добавляться — модуль всё равно попадает в сравнение).
Точки вызова в формах объектов:
| Событие формы | Вызов |
|---|---|
| ПриСозданииНаСервере | МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере(Форма, СтандартнаяОбработка, Отказ) |
| ПриЧтенииНаСервере | МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(Форма, ТекущийОбъект) |
| ПередЗаписьюНаСервере | МодификацияКонфигурацииПереопределяемый.ПередЗаписьюНаСервере(Форма, Отказ, ТекущийОбъект, ПараметрыЗаписи) |
| ПослеЗаписиНаСервере | МодификацияКонфигурацииПереопределяемый.ПослеЗаписиНаСервере(Форма, ТекущийОбъект, ПараметрыЗаписи) |
| ПослеЗаписи | МодификацияКонфигурацииКлиентПереопределяемый.ПослеЗаписи(Форма, ПараметрыЗаписи) |
Во многих формах вызов идёт не напрямую, а через общий модуль СобытияФорм (СобытияФорм.ПриСозданииНаСервере, СобытияФорм.ПриЧтенииНаСервере), который уже вызывает процедуры модификации. Для подключаемых команд есть СобытияФормКлиент.ВыполнитьПереопределяемуюКоманду, который передаёт управление в МодификацияКонфигурацииКлиентПереопределяемый.ВыполнитьПереопределяемуюКоманду. Сигнатуры и набор событий от релиза к релизу дополнялись — перед работой откройте модули своей версии.

Код для конкретной формы
Процедура в переопределяемом модуле вызывается для всех форм, поддерживающих механизм. Поэтому первым делом — проверка имени формы, а сама доработка — в отдельной процедуре:
// МодификацияКонфигурацииПереопределяемый
Процедура ПриСозданииНаСервере(Форма, СтандартнаяОбработка, Отказ) Экспорт
Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда
пр_НоменклатураФормаЭлементаПриСоздании(Форма);
ИначеЕсли Форма.ИмяФормы = "Документ.ЗаказКлиента.Форма.ФормаДокумента" Тогда
пр_ЗаказКлиентаПриСоздании(Форма);
КонецЕсли;
КонецПроцедуры
// Добавляет на форму номенклатуры поле нового реквизита «пр_КодПоставщика».
Процедура пр_НоменклатураФормаЭлементаПриСоздании(Форма)
Если Форма.Элементы.Найти("пр_КодПоставщика") <> Неопределено Тогда
Возврат;
КонецЕсли;
Поле = Форма.Элементы.Вставить("пр_КодПоставщика", Тип("ПолеФормы"),
Форма.Элементы.Артикул.Родитель, Форма.Элементы.Артикул);
Поле.ПутьКДанным = "Объект.пр_КодПоставщика";
Поле.Вид = ВидПоляФормы.ПолеВвода;
КонецПроцедурыПоле вставляется рядом с типовым элементом через Элементы.Вставить с указанием родителя и элемента, перед которым ставить. Привязка к типовому элементу по имени — единственная точка, которая может сломаться при обновлении: если элемент переименуют, код упадёт. Поэтому проверяйте Элементы.Найти и при отсутствии ставьте поле в безопасное место.
Что можно изменить таким способом
- Свойства типовых элементов: видимость, доступность, заголовки, параметры выбора.
- Вывод новых реквизитов и табличных частей объекта, добавленных в конфигурацию.
- Новые реквизиты формы через
Форма.ИзменитьРеквизиты. - Обработчики событий новых элементов.
- Подмена обработчиков типовых элементов и самой формы.
- Замена типовых элементов своими.
Ограничение старого механизма: процедуры-обработчики новых элементов должны физически находиться в модуле формы — переопределяемый модуль не может быть обработчиком события элемента. На практике в конце модуля формы заводят свою область (например, #Область пр_Доработки) со всеми добавленными процедурами, чтобы при обновлении её было легко перенести одним блоком.
Своя команда на форме
Для команд механизм даёт обходной путь, при котором обработчик в модуле формы не нужен. Команда создаётся с действием Подключаемый_ВыполнитьПереопределяемуюКоманду, которое есть в формах, поддерживающих механизм, а логика пишется в клиентском переопределяемом модуле:
// Сервер: добавляем команду в ПриСозданииНаСервере
Команда = Форма.Команды.Добавить("пр_ПроверитьЦены");
Команда.Заголовок = "Проверить цены";
Команда.Действие = "Подключаемый_ВыполнитьПереопределяемуюКоманду";
Кнопка = Форма.Элементы.Добавить("пр_ПроверитьЦены", Тип("КнопкаФормы"), Форма.КоманднаяПанель);
Кнопка.ИмяКоманды = "пр_ПроверитьЦены";// МодификацияКонфигурацииКлиентПереопределяемый
Процедура ВыполнитьПереопределяемуюКоманду(Форма, Команда, ДополнительныеПараметры) Экспорт
Если Команда.Имя = "пр_ПроверитьЦены" Тогда
пр_ПроверкаЦенВызовСервера.ПроверитьЦеныЗаказа(Форма.Объект.Ссылка);
КонецЕсли;
КонецПроцедурыПеред использованием убедитесь, что в модуле нужной формы действительно есть процедура Подключаемый_ВыполнитьПереопределяемуюКоманду — поддержка добавлена не во все формы.
Связка с расширениями
Механизм появился раньше, чем расширения стали основным способом доработки. Сегодня я использую их вместе: в расширении заимствую модуль МодификацияКонфигурацииПереопределяемый и перехватываю его процедуры аннотацией &После. Получается единая точка доработки всех форм линейки, а основная конфигурация остаётся на поддержке без изменений.
// Расширение, заимствованный модуль МодификацияКонфигурацииПереопределяемый
&После("ПриСозданииНаСервере")
Процедура пр_ПриСозданииНаСервере(Форма, СтандартнаяОбработка, Отказ)
пр_ДоработкиФорм.ПриСозданииФормы(Форма);
КонецПроцедурыОбработчики событий новых элементов в этом случае живут в заимствованных формах расширения или подключаются через команды механизма. Подробнее о проектировании доработок в расширениях — в услуге разработка расширений 1С.
Ограничения и ошибки
- Не все формы поддерживают механизм. Если вызова нет, его можно добавить в форму самому — это одна строка, но это уже изменение типовой формы.
- Кардинальные изменения. Если форму нужно перекроить полностью, проще сделать свою форму и назначить её основной.
- Тяжёлый код в ПриСозданииНаСервере. Процедура вызывается для многих форм — лишний запрос без проверки имени формы замедлит открытие всего подряд.
- Привязка к типовым именам элементов. После обновления элемент может исчезнуть — проверяйте
Найти. - Дублирование элементов. Если событие сработало повторно,
Элементы.Добавитьупадёт. Проверяйте наличие перед созданием.
Переопределяемые модули — это договор с фирмой «1С»: сюда можно писать, и при обновлении ваш код переживёт релиз. Используйте этот договор, а не правку модулей форм.
Такая организация доработок напрямую влияет на стоимость обновления 1С: чем меньше изменений в типовых формах, тем быстрее и дешевле переход на новый релиз. На проектах внедрения 1С:ERP я закладываю этот подход с первого дня.
Итог
- В УТ 11, КА 2 и ERP 2 события форм объектов вызывают процедуры модулей
МодификацияКонфигурации…Переопределяемый. - Код для конкретной формы отбирается по
Форма.ИмяФормыи выносится в отдельные процедуры с префиксом. - Свои команды без обработчика в модуле формы делаются через
Подключаемый_ВыполнитьПереопределяемуюКоманду. - В расширении процедуры переопределяемых модулей перехватываются через
&После— основная конфигурация не меняется. - Проверяйте наличие элементов и поддержку механизма в нужной форме своей версии.




