Прием №1: добавление реквизитов на форму программными средствами.
Задача знакома многим разработчикам. Заказчик хочет видеть какой то свой реквизит в форме объекта (документа/справочника).
Для примера возьмем документ "ПоступлениеТоваровУслуг" (конфигурация Бухгалтерия предприятия 2.0) и реквизит СтатьяЗатрат, который надо добавить в шапку. Смысл этого реквизита в том, что если он заполнен, то необходимо автоматически списать эти товары/услуги на счет затрат.
Сначала добавим этот реквизит в метаданные документа:
У нас он будет иметь смешанный тип. Это необходимо для определения счета отнесения затрат в зависимости от выбранного типа статьи затрат.
Как видно на рисунке выше, на форме документа практически отсутствует свободное место для размещения реквизитов. Тем не менее, мы можем программным способом слегка изменить размеры/ место расположение уже размещенных типовых реквизитов. Для удобства создадим некий общий модуль "_Формы" в который будем помещать процедуры, связанные с изменением форм любых объектов метаданных. Для начала, добавим несколько стандартных процедур:
&НаКлиенте
Процедура ДобавитьПолеВвода(Форма,ИмяРекв,Панель,Доступность,Л,В,Ш,Выс,ПривязкаЛев,ПривязкаПрав,Данные,КнВыбора,КнОткрытия) Экспорт
Реквизит = Форма.ЭлементыФормы.Добавить(Тип("ПолеВВода"),ИмяРекв,Истина,Панель);
Реквизит.Данные = Данные;
Реквизит.Лево = Л;
Реквизит.Верх = В;
Реквизит.Ширина = Ш;
Реквизит.Высота = Выс;
Реквизит.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ПривязкаЛев, ГраницаЭлементаУправления.Право);
Реквизит.УстановитьПривязку(ГраницаЭлементаУправления.Право, ПривязкаПрав, ГраницаЭлементаУправления.Право);
Реквизит.КнопкаВыбора = КнВыбора;
Реквизит.КнопкаОткрытия = КнОткрытия;
Реквизит.Доступность = Доступность;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьКнопку(Форма,ИмяРекв,Панель,Л,В,Ш,Выс,ПривязкаЛев,ПривязкаПрав,Заголовок,Картинка) Экспорт
Реквизит = Форма.ЭлементыФормы.Добавить(Тип("Кнопка"),ИмяРекв,Истина,Панель);
Реквизит.Заголовок = Заголовок;
Реквизит.Лево = Л;
Реквизит.Верх = В;
Реквизит.Ширина = Ш;
Реквизит.Высота = Выс;
Реквизит.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ПривязкаЛев, ГраницаЭлементаУправления.Право);
Реквизит.УстановитьПривязку(ГраницаЭлементаУправления.Право, ПривязкаПрав, ГраницаЭлементаУправления.Право);
Если Картинка<>Неопределено Тогда
Реквизит.Картинка = Картинка;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДобавитьНадпись(Форма,ИмяРекв,Панель,Л,В,Ш,Выс,ПривязкаЛев,Данные,Текст)
Реквизит = Форма.ЭлементыФормы.Добавить(Тип("Надпись"),ИмяРекв,Истина,Панель);
Если ЗначениеЗаполнено(Данные) Тогда
Реквизит.Данные = Данные;
КонецЕсли;
Реквизит.Лево = Л;
Реквизит.Верх = В;
Реквизит.Ширина = Ш;
Реквизит.Высота = Выс;
Реквизит.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ПривязкаЛев, ГраницаЭлементаУправления.Право);
Реквизит.УстановитьПривязку(ГраницаЭлементаУправления.Право, Реквизит, ГраницаЭлементаУправления.Лево);
Реквизит.Значение = Текст;
КонецПроцедуры
Теперь добавим в этот же модуль обработку нашего случая:
&НаКлиенте
Процедура ДорисоватьРеквизитыФорм(Форма,Объект = Неопределено) Экспорт
Если ТипЗНЧ(Объект) = Тип("ДокументОбъект.ПоступлениеТоваровУслуг") Тогда
// Изменим ширину поля "СпособЗачетаАвансов"
Форма.ЭлементыФормы.СпособЗачетаАвансов.Ширина = 70;
//Добавим надпись, которая будет меняться в зависимости от типа справочника ("СтатьиЗатрат" или "ПрочиеДоходыИРасходы")
НадписьСтатья = ?(ТипЗНЧ(Объект.СтатьяЗатрат)=Тип("СправочникСсылка.ПрочиеДоходыИРасходы"),"Статья дохода/расхода:","Статья затрат:");
ДобавитьНадпись(Форма,"НадписьСтатья",Форма.ЭлементыФормы.ПанельКонтрагент,150,48,50,19,Форма.ЭлементыФормы.СпособЗачетаАвансов,Неопределено,НадписьСтатья);
//Добавим поле ввода для выбора статьи
ДобавитьПолеВвода(Форма,"СтатьяЗатрат",Форма.ЭлементыФормы.ПанельКонтрагент,Истина,200,48,100,19,Форма.ЭлементыФормы.НадписьСтатья,Форма.ЭлементыФормы.ПанельКонтрагент,"СтатьяЗатрат",Истина,Истина);
//Добавим действие "СтатьяПриИзменении" для изменения надписи
НовоеДействие = Новый Действие("СтатьяПриИзменении");
//Закрепим это действие за нашим полем ввода "СтатьяЗатрат"
форма.ЭлементыФормы.СтатьяЗатрат.УстановитьДействие("ПриИзменении",НовоеДействие);
КонецЕсли;
КонецПроцедуры
В первую очередь мы поменяем ширину поля "СпособЗачетаАвансов", затем выведем надпись, которая тоже будет изменяться в зависимости от типа выбранного реквизита (в нашем случае это либо "СправочникСсылка.СтатьиЗатрат" либо "СправочникСсылка.ПрочиеДоходыИРасходы").
После чего добавляем поле ввода "СтатьяЗатрат" и связываем с ним действие "СтатьяЗатратПриИзменении", которое отвечает за то, чтобы изменялась надпись при изменении типа статьи затрат.
Теперь необходимо в модуле формы добавить вызов нашей процедуры а также процедуру "СтатьяПриИзменении", чтобы наш механизм заработал:
Процедура ПриОткрытии()
...
...
//Добавляем вызов нашей процедуры
_Формы.ДорисоватьРеквизитыФорм(ЭтаФорма,ЭтотОбъект);
//КонецДобавления
КонецПроцедуры
Процедура СтатьяПриИзменении(Элемент)
Если ТипЗНЧ(ЭлементыФормы.СтатьяЗатрат.Значение)=Тип("СправочникСсылка.ПрочиеДоходыИРасходы") Тогда
ЭлементыФормы.НадписьСтатья.Значение = "Статья дохода/расхода:";
Иначе
ЭлементыФормы.НадписьСтатья.Значение ="Статья затрат:";
КонецЕсли;
КонецПроцедуры
Вот так будет выглядеть документ после наших доработок:
Теперь останется создать подписку на событие "ОбработкаПроведения", выбрать в качестве источника документ "ПоступлениеТоваровУслуг" и написать процедуру добавления проводки на списание номенклатуры.
После такого внесения изменений в форму при следующем обновлении конфигурации через меню "Поддержка->Обновить конфигурацию" мы на 99% вообще не сталкнемся с проблемами. Т.к. модуль формы "ПриОткрытии" практически никогда не меняется.
Но даже если он поменяется, то не составит особого труда добавить в него одну строку кода:
//Добавляем вызов нашей процедуры
_Формы.ДорисоватьРеквизитыФорм(ЭтаФорма,ЭтотОбъект);
//КонецДобавления
То же самое можно сделать и с формой списка документов и справочников.
Надеюсь, эти нехитрые советы помогут Вам значительно ускорить процесс обновления доработанной типовой конфигурации.
P.S. Все эти приемы будут работать на платформе 8.1. и 8.2 (обычные формы)