Часто требуется внести изменения в типовые формы объектов (документов, справочников, журналов, обработок и т.д.)
Есть несколько методов решения этих задач:
- Снимать с поддержки форму, вносить в нее изменения. Все просто, но проблемы возникнут при обновлении релиза конфигурации.
- Переносить форму в расширение и править там. Тоже просто, но если при обновлении релиза форма поменяется (добавятся новые поля к примеру), то придется еще дорабатывать расширение.
- Создавать элементы формы программно в общем модуле. Проблем с обновлением на новый релиз не будет. Рассмотрим данный метод.
В типовых конфигурациях в формах объектов в процедуре ПриСозданииНаСервере есть обращение к общему модулю СобытияФорм.ПриСозданииНаСервере
Далее идет обращение к общему модулю МодификацияКонфигурацииПереопределяемый.ПриСозданииНаСервере
В этом модуле процедура ПриСозданииНаСервере пустая. Тут и добавляем ссылку уже на наш модуль (не типовой модуль).
Доработка_ФормаПриСозданииНаСервере.ИзменитьФорму
В этой процедуре разбиваем формы по объектам и названиям форм.
Для удобства можно добавлять отельные общие модули для каждого объекта.
Доработка_ДокументСчетФактураПолученныйФормаСпискаДокументов
Доработка_ДокументСчетФактураПолученныйФормаДокумента
Тут редактируем запрос в динамическом списке. Методом СтрЗаменить. Добавляем левое соединение, добавляем новое поле в выборку запроса.
Программно добавляем колонку. ПутьКДанным указываем наша новое поле, которое мы добавили в запрос "Список.Д_ЕстьФайлы".
Процедура ПриСозданииНаСервере(Форма, Объект = Неопределено) Экспорт
ДинСписок = Форма.Список;
ТекстЗапроса =
"Документ.СчетФактураПолученный КАК ДокументСчетФактураПолученный
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НаличиеФайлов КАК НаличиеФайлов
| ПО ДокументСчетФактураПолученный.Ссылка = НаличиеФайлов.ОбъектСФайлами";
ДинСписок.ТекстЗапроса = СтрЗаменить(ДинСписок.ТекстЗапроса, "Документ.СчетФактураПолученный КАК ДокументСчетФактураПолученный", ТекстЗапроса);
ТекстЗапроса = "ДокументСчетФактураПолученный.Ссылка,
| ВЫБОР
| КОГДА НаличиеФайлов.ЕстьФайлы ЕСТЬ NULL ТОГДА 1
| КОГДА НаличиеФайлов.ЕстьФайлы ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК Д_ЕстьФайлы,";
ДинСписок.ТекстЗапроса = СтрЗаменить(ДинСписок.ТекстЗапроса, "ДокументСчетФактураПолученный.Ссылка,", ТекстЗапроса);
ПодчиненныйЭлемент = Форма.Элементы.Вставить("Д_ЕстьФайлы", Тип("ПолеФормы"), Форма.Элементы.Список, Форма.Элементы.СодержитНекорректныхКонтрагентов);
ПодчиненныйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
ПодчиненныйЭлемент.ПутьКДанным = "Список.Д_ЕстьФайлы";
ПодчиненныйЭлемент.Вид = ВидПоляФормы.ПолеКартинки;
ПодчиненныйЭлемент.КартинкаШапки = БиблиотекаКартинок.Скрепка;
ПодчиненныйЭлемент.КартинкаЗначений = БиблиотекаКартинок.Скрепка;
ПодчиненныйЭлемент.Ширина = 1;
КонецПроцедуры
В результате появляется заполненная колонка.
Еще для примера приведу добавление "полей ввода" на форму.
Процедура ПриСозданииНаСервере(Форма, Объект = Неопределено) Экспорт
//Поле ввода. Реквизит формы
Реквизит = Новый РеквизитФормы("Д_ФИОРодительныйПадеж", Новый ОписаниеТипов("Строка"), , "ФИО родительный падеж", Истина);
мРеквизиты = Новый Массив;
мРеквизиты.Добавить(Реквизит);
Форма.ИзменитьРеквизиты(мРеквизиты);
НовыйЭлемент = Форма.Элементы.Вставить("Д_ФИОРодительныйПадеж", Тип("ПолеФормы"), Форма.Элементы.ГруппаОсновныеСведения ,Форма.Элементы.ДолжностьПоВизитке);
НовыйЭлемент.ПутьКДанным = "Д_ФИОРодительныйПадеж";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ОтметкаНезаполненного = Истина;
НовыйЭлемент.АвтоОтметкаНезаполненного = Истина;
//Поле ввода. Реквизит объекта
НовыйЭлемент = Форма.Элементы.Добавить("Д_ДанныеОТранспортировкеИГрузе", Тип("ПолеФормы"), Форма.Элементы.ГруппаДополнительно);
НовыйЭлемент.ПутьКДанным = "Объект.Д_ДанныеОТранспортировкеИГрузе";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.Заголовок = "Данные о транспортировке и грузе";
НовыйЭлемент.РастягиватьПоГоризонтали = Ложь;
НовыйЭлемент.Ширина = 28;
КонецПроцедуры
Проверял на конфигурации 1С:Комплексная автоматизация 2
Платформа 1С:Предприятие 8.3 (8.3.13.1644)