Программное добавление элементов на формы является очень удобным подходом при доработке типовых конфигураций. Это позволяет минимизировать коллизии и ошибки при объединении форм, использовать при обновлениях трехсторнонее сравнение кода при помощи внешних программ, например KDiff3, переиспользовать однажды написанный код в других доработках.
Содержание
В качестве примера будем использовать пустую обработку, в которой есть реквизит НашНужныйРеквизит. Все манипуляции по добавлению, удалению элементов и реквизитов формы производятся на сервере, и можно использовать как предопределенные обработчики, например &ПриСозданииНаСервере, так и любые другие методы с директивой &НаСервере. В нашем примере будем все элементы добавлять при помощи отдельных команд, для большей наглядности.
Как в 1С программно добавить элемент формы?
Вывести существующий реквизит
&НаСервере Процедура ДобавитьПолеВводаНаСервере() // Проверка нужна, чтобы избежать ошибки при попытке создания элемента с одним и тем же именем несколько раз Если Элементы.Найти("НашНужныйЭлемент") = Неопределено Тогда // Вначале просто добавляем элемент в коллекцию Элементы НовыйЭлемент = Элементы.Добавить("НашНужныйЭлемент", Тип("ПолеФормы")); //Затем донастраиваем его и указываем нужные свойства НовыйЭлемент.ПутьКДанным = "Объект.НашНужныйРеквизит"; НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.Заголовок = "Программно добавленное поле ввода"; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ДобавитьПолеВвода(Команда) ДобавитьПолеВводаНаСервере(); КонецПроцедуры
Создать новый реквизит формы
&НаСервере Процедура ДобавитьРеквизитФлажокНаСервере() Если Элементы.Найти("НужныйФлажок") = Неопределено Тогда НовыеРеквизиты = Новый Массив; //Обратите внимание, типизация реквизитов использует именно Описание типов, а не отдельный тип. ТипРеквизита = Новый ОписаниеТипов("Булево"); РеквизитФлажок = Новый РеквизитФормы("НужныйФлажок", ТипРеквизита, "", "Нужный флажок"); НовыеРеквизиты.Добавить(РеквизитФлажок); ИзменитьРеквизиты(НовыеРеквизиты); НовыйЭлемент = Элементы.Добавить("НужныйФлажок", Тип("ПолеФормы")); НовыйЭлемент.ПутьКДанным = "НужныйФлажок"; НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ДобавитьРеквизитФлажок(Команда) ДобавитьРеквизитФлажокНаСервере(); КонецПроцедуры
Вставить элемент формы в нужное место
&НаСервере Процедура ВставитьКартинкуПередФлажкомНаСервере() Если Элементы.Найти("ВставленнаяКартинка") = Неопределено Тогда СледующийЭлемент = Элементы.Найти("НужныйФлажок"); // Если флажок найден - вставим элемент перед ним, если нет - добавим в конец // Заодно рассмотрим как добавить программно декорацию-картинку на форму ЭлементКартинка = Элементы.Вставить("ВставленнаяКартинка", Тип("ДекорацияФормы"),,СледующийЭлемент); ЭлементКартинка.Вид = ВидДекорацииФормы.Картинка; // Обратите внимание, картинка в этом случае может быть либо Пустая, либо ИзБиблиотеки ЭлементКартинка.Картинка = БиблиотекаКартинок.Реквизит; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ВставитьКартинкуПередФлажком(Команда) ВставитьКартинкуПередФлажкомНаСервере(); КонецПроцедуры
Как программно добавить команду в управляемую форму?
&НаСервере Процедура ДобавитьПрограммноКомандуНаСервере() Если Элементы.Найти("КнопкаПредупредить") = Неопределено Тогда //Добавим команду в коллекцию команд КомандаПредупредить = Команды.Добавить("Предупредить"); КомандаПредупредить.Заголовок = "Предупредить!"; КомандаПредупредить.Действие = "КомандаПредупредить"; КнопкаКоманды = Элементы.Добавить("КнопкаПредупредить", Тип("КнопкаФормы")); КнопкаКоманды.ИмяКоманды = "Предупредить"; // Если помещаем просто на форму, то вид - обычная кнопка // Если укажем контейнер с типом Командная панель, то вид - КнопкаКоманднойПанели КнопкаКоманды.Вид = ВидКнопкиФормы.ОбычнаяКнопка; КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ДобавитьПрограммноКоманду(Команда) ДобавитьПрограммноКомандуНаСервере(); КонецПроцедуры &НаКлиенте Процедура КомандаПредупредить(Команда) ПоказатьПредупреждение(, "А ведь я предупреждал!"); КонецПроцедуры
Как добавить таблицу на форму программно?
На программном добавлении таблицы на форму стоит остановиться отдельно. Порядок действий следующий:
Сперва создаем основной реквизит – саму таблицу формы. Далее – создаем подчиненные реквизиты-колонки. В простейшем случае колонки можно создать, перебрав колонки таблицы значений – источника. Далее следует создать связанные с только что созданными реквизитами элементы формы – также сперва основной элемент – таблицу, а затем подчиненные элементы – колонки.
&НаСервере Процедура СоздатьТаблицуЗначенийНаСервере() Если Элементы.Найти("ДинамическаяТаблицаЭлемент") <> Неопределено Тогда Возврат; КонецЕсли; НовыеРеквизиты = Новый Массив; ТипРеквизита = Новый ОписаниеТипов("ТаблицаЗначений"); РеквизитТЗ = Новый РеквизитФормы("ДинамическаяТаблица", ТипРеквизита, "", "Динамическая таблица"); НовыеРеквизиты.Добавить(РеквизитТЗ); ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Отметка", Новый ОписаниеТипов("Булево")); ТЗ.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата")); ТЗ.Колонки.Добавить("Комментарий", Новый ОписаниеТипов("Строка")); Для Каждого КолонкаТаблицы Из ТЗ.Колонки Цикл НовыеРеквизиты.Добавить(Новый РеквизитФормы(КолонкаТаблицы.Имя, КолонкаТаблицы.ТипЗначения, "ДинамическаяТаблица")); КонецЦикла; ИзменитьРеквизиты(НовыеРеквизиты); ЭлементТаблица = Элементы.Добавить("ДинамическаяТаблицаЭлемент", Тип("ТаблицаФормы")); ЭлементТаблица.ПутьКДанным = "ДинамическаяТаблица"; ЭлементТаблица.Отображение = ОтображениеТаблицы.Список; Для Каждого КолонкаТаблицы Из ТЗ.Колонки Цикл ЭлементКолонкаТаблицы = Элементы.Добавить(КолонкаТаблицы.Имя, Тип("ПолеФормы"), ЭлементТаблица); Если КолонкаТаблицы.ТипЗначения.СодержитТип(Тип("Булево")) Тогда ЭлементКолонкаТаблицы.Вид = ВидПоляФормы.ПолеФлажка; Иначе ЭлементКолонкаТаблицы.Вид = ВидПоляФормы.ПолеВвода; КонецЕсли; ЭлементКолонкаТаблицы.ПутьКДанным = "ДинамическаяТаблица." + КолонкаТаблицы.Имя; КонецЦикла; КонецПроцедуры &НаКлиенте Процедура СоздатьТаблицуЗначений(Команда) СоздатьТаблицуЗначенийНаСервере(); КонецПроцедуры
Как программно установить обработчик события элемента формы?
&НаСервере Процедура ДобавитьОбработчикДействияНаСервере() // Если таблицу еще не создали, ничего не делаем Если Элементы.Найти("ДинамическаяТаблицаЭлемент") = Неопределено Тогда Возврат; КонецЕсли; Элементы.ДинамическаяТаблицаЭлемент.УстановитьДействие("ПриИзменении", "ПриИзмененииТаблицы"); КонецПроцедуры &НаКлиенте Процедура ДобавитьОбработчикДействия(Команда) ДобавитьОбработчикДействияНаСервере(); КонецПроцедуры // Количество и порядок параметров метода-обработчика должны соответствовать событию // Подробнее см. синтакс-помощник &НаКлиенте Процедура ПриИзмененииТаблицы(Элемент) Сообщить("Изменили колонку " + Элемент.ТекущийЭлемент.Имя); КонецПроцедуры
Ну и почему не указано нигде, что это управляемые формы?
Александр, вы заголовок статьи читали?
“Как программно добавлять элементы на управляемую форму в 1С 8.3?”
Также в п.2 упоминается, что речь идет об управляемых формах. “Как программно добавить команду в управляемую форму?”
Рекомендую читать внимательнее, чтобы не выглядеть глупо 🙂
Интересно, а есть такой механизм, чтобы из дизайна на форме создавался программный код? Например, набросал на форму элементов, красиво их расставил, а потом нажал на кнопку и у тебя готовая процедура.
А программный код – какой? Что он должен делать? Готовая процедура для чего? Получать котировки акций, рисовать тетрис, отправлять сообщения в мессенджер?