1с программно создать реквизит табличной части
Введение в управляемая форма 1С реквизиты элементы команды
Рекомендуется модифицировать управляемые формы типового решения 1С программно для удобного будущего обновления и исключения конфликтов, а также для удобной работы с изменениями и надежности при использовании механизма расширений.
В некоторых типовых конфигурациях 1С (ЕРП 2, УТ 11) используется механизм упрощенного изменения конфигурации. Статьи о типовом механизме можно найти в разделе полезных ссылок. Данный механизм используется в БСП, и его необходимо знать при модификации типовых конфигураций.
При добавлении элементов на форму программно можно отредактировать практически любое свойство из панель свойств, которое можно установить вручную в конфигураторе.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Программное переопределение обработчиков событий формы и элементов формы
В теле модуля формы:
А в новой процедуре нужно добавить вызов основной, если такая процедура есть.
Аналогично можно поступить и с обработчиками элементов формы:
Программное создание групп формы.
Доступные виды групп формы:
Программное добавление команды на форму.
Удалить команду можно при помощи метода коллекции формы команд: Команды.Удалить(<Команда>). Удалять можно только те команды, которые были созданы программно.
Программное создание декораций форм.
Программное добавление реквизита на форму.
Добавлять новые реквизиты в управляемую форму и удалять необходимо с помощью метода ИзменитьРеквизиты(), куда в параметры передается массив добавляемых реквизитов и массив удаляемых. Удалять при этом можно только те реквизиты, которые были созданы программно.
Вывод реквизитов на форму.
Вызов процедур при создании на сервере 1С
После описания всех процедур выводим их в процедуре ПриСозданииНаСервере. Также можно изменить программно некоторые свойства формы, например, заголовок. Чтобы был виден только наш заголовок, нужно отключить свойство Автозаголовок.
Некоторые советы при программном редактировании формы
Итак, взглянем на получившийся результат. Все элементы на форме созданы программно:
Начиная с платформы 1С версии 8.3.12 и выше появилась возможность добавлять реквизиты объектов в расширениях, чем я и воспользовался:
Но для вывода данного реквизита на форму элемента добавлять саму форму в расширение совсем не хотелось.
Во-первых добавление (заимствование) формы в расширение может привести к некоторым нежелательным эффектам, которые могут возникнуть после обновления конфигурации. Приведем немного теории.
Платформа использует сразу три формы:
- Форму из основной конфигурации
- Сохраненную форму
- Форму из расширения
Данные формы взаимодействуют между собой и в результате такого взаимодействия получается Результирующая форма, которую видит пользователь. В ходе взаимодействия указанных форм может возникнуть нежелательная ситуация, например, мы доработали форму в расширении, потом в новом релизе добавились реквизиты и они на форме не отображаются! Более подробно тут.
Во-вторых добавление формы в расширение привело бы к автоматическому добавлению всех реквизитов этого объекта и объектов метаданных (соответствующих ссылочным типам реквизитов объекта) в данное расширение, что загромождало бы само расширение и также не желательно.
Поэтому возникла задача программного создания элемента формы для добавленного реквизита в самом расширении, этому и посвящена данная публикация.
Посмотрев начало процедуры ПриСозданииНаСервере() модуля формы объекта, видим что вызываются экспортные методы ПриСозданииНаСервере() общих модулей подсистем БСП:
Было принято решение код для программного добавления реквизита формы объекта добавить в метод ПриСозданииНаСервере() общего модуля УправлениеСвойствами. Данный модуль предназначен для работы с дополнительными реквизитами и сведениями, но переопределив его в расширении он вполне сгодится и для наших целей.
Добавляем общий модуль УправлениеСвойствами в наше расширение:
и создаем обработчик события НП_ПриСозданииНаСервере(), вызываемый после типовой процедуры УправлениеСвойствами.ПриСозданииНаСервере().
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания:
При разработке решений возникает необходимость добавить реквизит формы, состав и типы которых зависят от данных. Например при построении динамических деревьев с периодами, или при выводе контактной информации и т.д.
Задача
Для наглядности разберем простой пример, в котором можно было обойтись только элементами формы, но мы создадим и реквизиты.
Есть некая конфигурация, в форме элемента справочника Номенклатура необходимо программно создавать реквизиты формы и элементы к ним:
- ЯчейкаХранения, тип СправочникСсылка.ЯчейкиХранения;
- ТекущийОстаток, тип Число.
Элементы объединить в группу с горизонтальной группировкой. На текущий момент форма имеет следующий вид:
Добавление реквизитов
В обработчике формы ПриСозданииНаСервере() опишем код, который разбивается на 3 этапа:
- Описание и создание реквизитов формы;
- Создание элементов формы, объединение в группу без отображения;
- Заполнение данных.
Ниже приведен готовый код, код снабжен комментариями и разбит на области для лучшего понимания
После выполнения приведенного кода форма будет выглядеть так:
Удаление реквизитов
Для удаления необходимо передать массив содержащий пути реквизитов в качестве второго параметра метода формы ИзменитьРеквизиты().
Внимание. Удалять можно только реквизиты созданные программно.
Добавление реквизита табличной части
Добавление реквизита с типом Произвольный
В одной из задач стало необходимо добавить реквизит с типом Произвольный, но ни СП, ни интернеты ответа не дали. В итоге через несколько попыток было найдено решение
Внимание. Данные добавленного реквизита сохраняться в ИБ не будут.
Я уже писал об общем принципе программного добавления элементов на управляемую форму, теперь напишу конкретно о том, как добавить колонку табличной части или таблицы значений.
Выглядит это приблизительно так:
нРеквизиты.Добавить(Новый РеквизитФормы("Тест3", Новый ОписаниеТипов("Строка"), "Объект.Тест", "Тест3", Истина)); нЭлемент = Элементы.Добавить("Тест3", Тип("ПолеФормы"), Элементы.Тест);Следующие три строки добавляют саму колонку на форму.
На этом все, надеюсь данная статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 13, средняя оценка: 4,46 из 5)Спасибо, за подсказку!
А как сделать эту колонку в табличной части второй по порядку?
Переместить(, , )
вот как-то так..
Элементы.Переместить(нЭлемент,Элементы.Тест,Элементы.)
помогите пожалуйста я в 1с чайник это много сказано) 1С 7.7 бух. учет (7.70.307) в реестр документов нужно добавить колонку ИНН контрагента. Что нужно написать в таблице и в модуле?
Предлагаю добавить обработчик событий ПриИзменении
Чтобы вывести реквизиты на форму программно нужно в обработчике "ПриСозданииНаСервере" в форме выполнить следующий алгоритм:
Реквизит должен находится в метаданных.
Поле = Элементы.Добавить("ТестовыйРеквизит", Тип("ПолеФормы"), Элементы.ГруппаРеквизиты);
//"ТестовыйРеквизит" - Название реквизита (Метаданные)
//Тип("ПолеФормы") - тип добавляемого объекта
//Элементы.ГруппаРеквизиты - группа куда добавляем наш реквизит
Поле.ПутьКДанным = "Объект.ТестовыйРеквизит";//Обязательно надо указывать путь к данным, иначе поле не отобразится на форме
Поле.Вид = ВидПоляФормы.ПолеВвода; //Указываем что это поле ввода
//Все свойства созданного элемента "Поле" можно глянуть при отладке, там все как в свойствах
Чтобы вставить нужный нам реквизит перед каким либо уже существующим реквизитом нужно использовать параметр "Вставить()" . Четвертым параметром этого метода и будет являть тот реквизит перед которым мы будем вставлять наш реквизит.
Поле = Элементы.Вставить("ТестовыйРеквизит", Тип("ПолеФормы"),Элементы.ГруппаРеквизиты,Элементы.СтранаПроисхождения);
//Элементы.СтранаПроисхождения - реквизит перед которым вставляем
Поле.ПутьКДанным = "Объект.ТестовыйРеквизит";
Поле.Вид = ВидПоляФормы.ПолеВвода;
Программное добавление поля ввода на форму:
//Программное создание реквизита на форме
Массив = Новый Массив;
Массив.Добавить(Новый РеквизитФормы("Статус", Новый ОписаниеТипов("Строка")));
ИзменитьРеквизиты(Массив); //Изменяем массив содержащий реквизиты формы
//Теперь добавим созданный нам реквизит на форму уже изученным способом программно
Поле = Элементы.Вставить("Статус", Тип("ПолеФормы"),Элементы.ГруппаРеквизиты,Элементы.СтранаПроисхождения);
Поле.ПутьКДанным = "Статус";
Поле.Вид = ВидПоляФормы.ПолеВвода;
Чтобы подключить событие к созданному полю нужно создать процедуру и подключить ее к полю:
*Процедура команды обязательно должна выполняться в директиве компиляции "&НаКлиенте"
НашаКоманда = Команды.Добавить("НашаКоманда");
НашаКоманда.Действие = "НашаКомандаПроцедура"; //Указываем имя процедуры на клиенте
//которую будет вызывать команда
Кнопка = Элементы.Вставить("НашаКоманда", Тип("КнопкаФормы"));
Кнопка.ИмяКоманды = "НашаКоманда";
Кнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;
3 комментария:
Последние коррективы: В типовых конфигурациях: Общий модуль - "МодификацияКонфигурацииПереопределяемый" - Обработчик - "ПриСозданииНаСервере";
Пример кода:
Если Форма.ИмяФормы = "Справочник.Номенклатура.Форма.ФормаЭлемента" Тогда
//Добавляем новые реквизиты
НовыеРеквизиты = Новый Массив;
НовыйРеквизит = Новый РеквизитФормы("мзКодМАНоменклатуры", Новый ОписаниеТипов("Число"),, "Код МА Номенклатуры");
НовыйЭлемент = Форма.Элементы.Вставить("мзКодМАНоменклатуры", Тип("ПолеФормы"), Форма.Элементы.ГруппаЗаголовокДополнительныеРеквизиты);
НовыйЭлемент.ПутьКДанным = "Объект.мзКодМАНоменклатуры";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
КонецЕсли;
Читайте также: