При доработке конфигураций 1С с помощью механизма расширений часто возникает задача добавить на форму документа или справочника дополнительные реквизиты, колонки и кнопки. Например, нужно отображать текущие остатки товаров на складе прямо в табличной части документа РеализацияТоваровУслуг.
Многие разработчики опасаются заимствовать форму целиком в расширение, опасаясь, что после обновления типовой конфигурации заимствованная форма перекроет интерфейсные изменения, внесенные вендором, или вызовет ошибки объединения. Разберем два эффективных и правильных подхода к решению этой задачи.
Рассмотрим наиболее изящный вариант, который позволяет вовсе не заимствовать визуальную форму документа в расширение. Во многих типовых конфигурациях 1С (на базе БСП) перед созданием любой управляемой формы на сервере вызываются процедуры специализированных переопределяемых модулей.
Для реализации этого подхода выполним следующие шаги:
МодификацияКонфигурацииПереопределяемый и заимствуем только его в расширение.ПриСозданииНаСервере с помощью аннотации &Перед.Проанализируем пример кода в модуле расширения:
&Перед("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
// Проверяем, что открывается именно нужная нам форма документа
Если Форма.ИмяФормы = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента" Тогда
// 1. Создаем реквизит формы для хранения данных
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(
"Остатки",
Новый ОписаниеТипов("Число", Новый ОписаниеТиповЧисла(15, 2)),
"Объект.Товары",
"Доступно на складе",
Ложь
));
Форма.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);
// 2. Добавляем новый элемент формы (колонку) в табличную часть Товары
НовыйЭлемент = Форма.Элементы.Добавить("ТоварыОстатки", Тип("ПолеФормы"), Форма.Элементы.Товары);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ТолькоПросмотр = Истина;
НовыйЭлемент.ПутьКДанным = "Объект.Товары.Остатки";
КонецЕсли;
КонецПроцедуры
Главное преимущество этого способа заключается в том, что визуальная форма остаётся полностью типовой. При обновлении конфигурации любые изменения формы от разработчиков 1С применятся автоматически, а ваш код расширения продолжит внедрять колонку динамически.
Если для решения задачи требуется перехватывать специфические клиентские события формы (например, ПриОткрытии, ПриИзменении элементов табличной части) и прописывать логику непосредственно в модуле формы, без заимствования самой формы не обойтись.
Однако бытует заблуждение, что заимствованная форма жестко "замораживает" интерфейс. На самом деле платформа 1С при работе расширения накладывает изменения из расширения на обновленную типовую форму. Чтобы снизить риски конфликтов, придерживаемся следующего алгоритма:
&После или &Перед.Рассмотрим пример кода в модуле заимствованной формы в расширении:
&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Динамическое добавление реквизита и элемента
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы(
"Остатки",
Новый ОписаниеТипов("Число", Новый ОписаниеТиповЧисла(15, 3)),
"Объект.Товары",
"Остаток",
Ложь
));
ИзменитьРеквизиты(МассивРеквизитов);
НовоеПоле = Элементы.Добавить("ТоварыОстатки", Тип("ПолеФормы"), Элементы.Товары);
НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
НовоеПоле.ПутьКДанным = "Объект.Товары.Остатки";
НовоеПоле.ТолькоПросмотр = Истина;
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
ЗаполнитьОстаткиНаСкладе();
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ТоварыНоменклатураПриИзмененииПосле(Элемент)
ЗаполнитьОстаткиНаСкладе();
КонецПроцедуры
При использовании вызовов с аннотацией &После типовой код формы выполняется в полном объеме, после чего срабатывает алгоритм из расширения. Это обеспечивает высокую стабильность работы даже при регулярном обновлении релизов.
Если автоматическое заполнение при открытии формы не является критически обязательным требованием, стоит рассмотреть использование внешней обработки с типом команды ТипКомандыЗаполнениеФормы. В этом случае конфигурация и формы остаются полностью нетронутыми, а пользователь вызывает процедуру расчета и заполнения остатков по кнопке Заполнить.
Выясним, какой подход выбрать для вашей задачи:
МодификацияКонфигурацииПереопределяемый без заимствования формы.&После.