Программное добавление реквизитов на форму документа. Без изменения самой формы.

11.04.13

Разработка - Работа с интерфейсом

Применимо к обычным формам. Методика не требует изменения формы, актуально для полностью типовых форм.

Долгое время искал способ программного добавления реквизитов на обычную форму. Не хотелось изменять и включать возможность редактирования у типовой формы, так как это вызывает трудности при обновлении типовой конфигурации. Но в виду того что надо было добавить один - два реквизита в один - два типовых документам, острой необходимости не было. И вот потребовалось добавить в более чем 30 документах реквизит "Подразделение организации" с типом справочник "Подразделения организаций", справочник типовой.

 

Итак. В данном случае выводим новые реквизиты снизу формы. Исходим от того, что у нас в типовых формах есть процедура обновления заголовка, которая выводить текущее состояние документа (новый, проведен, не проведен или записан), в ней и вызовем процедуру вывода новых реквизитов.

 

Вкраце последовательность действий:

1. Выводиться форма

2. Увеличиваем высоту формы на общую высоту добавляемых реквизитов  (некая высота - n).

3. Обратно уменьшаем высоту растягиваемых элементов на n, а остальные элементы формы, которые прикреплены к нижнему краю, смещаем на n вверх.

4. Добавляем новые реквизиты, устанавливаем их свойства и привязки. Profit!

 На форме появляются новые реквизиты, привязки корректно отрабатывают, так как мы их не трогали и не меняли. Раньше моя ошибка заключалась в том что я пытался отключить привязку элементов к нижней границе формы, а после добавления новых элементов, пытался их восстановить. В итоге формы нещадно глючили, ломались привязки. А решение оказалось на поверхности. Не надо трогать привязки, все корректируется высотой и положением самого элемента.

 

З.Ы. Возможно будут проблемы с элементами которые привязаны к нижней границе через другой элемент, но в моих 30 документах такого не наблюдалось. В крайнем случае можно сохранить параметры всех элементов на форме: верхняя точка и высота элемента. И после увеличения высоты формы восстановить эти параметры.


Примеры кода, думаю комментариев будет достаточно:


Функция ВыводитьДополнительныеРеквизиты(ДокументОбъект, ФормаДокумента)

   
Результат = Ложь;

    Если
ДокументОбъект.Метаданные().Реквизиты.Найти("ПодразделениеОрганизации") <> Неопределено Тогда

        Для Каждого
Стр из ФормаДокумента.ЭлементыФормы Цикл

            Если
Стр.Данные = "ПодразделениеОрганизации" Тогда

                Возврат
Результат;

            КонецЕсли;

        КонецЦикла;

       
Результат = Истина;

    КонецЕсли;

    Возврат
Результат;

КонецФункции



Процедура
ВыводДополнительныхРеквизитов(ДокументОбъект, ФормаДокумента) Экспорт



   
// Проверка на наличие дополнительных реквизитов

   
Если Не ВыводитьДополнительныеРеквизиты(ДокументОбъект, ФормаДокумента) Тогда Возврат КонецЕсли;



   
// Вывод или сохранение дополнительных реквизитов

    // Если элемент формы существует то сохраняем значение

   
Элемент = ФормаДокумента.ЭлементыФормы.Найти("_ПодразделениеОрганизации");

    Если
Элемент = Неопределено Тогда

       
ВысотаОбщаяДобавляемыхЭлементовПоВертикали = 27; // Общая высота всех добавляемых элементов

       
ВысотаОдногоЭлемента = 19;

       
ВысотаНижнейПанели = 0; // будет вычислятся если нижняя панель есть

       
РасстояниеМеждуЭлементами = 8;



       
// Увеличение высоты

       
ФормаДокумента.Высота = ФормаДокумента.Высота + ВысотаОбщаяДобавляемыхЭлементовПоВертикали;



       
// Обработка элементов формы

       
Для Каждого Стр из ФормаДокумента.ЭлементыФормы Цикл

           
_ПервыйЭлемент = Неопределено;

           
_ГраницаПервогоЭлемента = Неопределено;

           
_ВторойЭлемент = Неопределено;

           
_ГраницаВторогоЭлемента = Неопределено;

           
Стр.ПолучитьПривязку(ГраницаЭлементаУправления.Низ, _ПервыйЭлемент, _ГраницаПервогоЭлемента, _ВторойЭлемент, _ГраницаВторогоЭлемента);

            Если
_ПервыйЭлемент = ФормаДокумента.Панель И _ГраницаПервогоЭлемента = ГраницаЭлементаУправления.Низ Тогда



               
// Исключаем нижнюю панель команд

               
Если ВРЕГ(СокрЛП(Стр.Имя)) = "ОСНОВНЫЕДЕЙСТВИЯФОРМЫ" Тогда

                   
ВысотаНижнейПанели = Стр.Высота;

                    Продолжить;

                КонецЕсли;



               
// У растягиваемых элементов уменьшаем высоту, а элементы с фиксированной высотой смещаем вверх

               
Стр.ПолучитьПривязку(ГраницаЭлементаУправления.Верх, _ПервыйЭлемент, _ГраницаПервогоЭлемента, _ВторойЭлемент, _ГраницаВторогоЭлемента);

                Если
_ПервыйЭлемент = ФормаДокумента.Панель И _ГраницаПервогоЭлемента = ГраницаЭлементаУправления.Низ Тогда

                   
Стр.Верх = Стр.Верх - ВысотаОбщаяДобавляемыхЭлементовПоВертикали;

                Иначе

                   
Стр.Высота = Стр.Высота - ВысотаОбщаяДобавляемыхЭлементовПоВертикали;

                КонецЕсли;



            КонецЕсли;

        КонецЦикла;



       
ПоложениеПервогоЭлемента = ФормаДокумента.Высота - ВысотаОбщаяДобавляемыхЭлементовПоВертикали - ВысотаНижнейПанели - ВысотаОбщаяДобавляемыхЭлементовПоВертикали;



       
// Создание заголовка

       
Элемент = ФормаДокумента.ЭлементыФормы.Добавить(Тип("Надпись"), "_ЗаголовокПодразделениеОрганизации", Истина, ФормаДокумента.Панель);

       
Элемент.Заголовок = "Подразделение организации:";



       
// Настройка

       
Элемент.Лево = РасстояниеМеждуЭлементами;

       
Элемент.Верх = ПоложениеПервогоЭлемента;

       
Элемент.Высота = ВысотаОдногоЭлемента;

       
Элемент.Ширина = 155;



       
// Установка привязок

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ФормаДокумента.Панель, ГраницаЭлементаУправления.Низ);

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ФормаДокумента.Панель, ГраницаЭлементаУправления.Низ);

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Право, ФормаДокумента.Панель, ГраницаЭлементаУправления.Лево);

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ФормаДокумента.Панель, ГраницаЭлементаУправления.Лево);



       
// Создание поле ввода

       
Элемент = ФормаДокумента.ЭлементыФормы.Добавить(Тип("ПолеВвода"), "_ПодразделениеОрганизации", Истина, ФормаДокумента.Панель);

       
Элемент.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций");

       
Элемент.Данные = "ПодразделениеОрганизации";



       
// Настройка

       
Элемент.Лево = РасстояниеМеждуЭлементами + 155 + РасстояниеМеждуЭлементами;

       
Элемент.Верх = ПоложениеПервогоЭлемента;

       
Элемент.Высота = ВысотаОдногоЭлемента;

       
Элемент.Ширина = ФормаДокумента.Ширина - (РасстояниеМеждуЭлементами * 3) - 155;



       
// Установка привязок

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Верх, ФормаДокумента.Панель, ГраницаЭлементаУправления.Низ);

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Низ, ФормаДокумента.Панель, ГраницаЭлементаУправления.Низ);

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Право, ФормаДокумента.Панель, ГраницаЭлементаУправления.Право);

       
Элемент.УстановитьПривязку(ГраницаЭлементаУправления.Лево, ФормаДокумента.Панель, ГраницаЭлементаУправления.Лево);



       
// Заполнение значения

       
Если ДокументОбъект.ЭтоНовый() Тогда

           
Элемент.Значение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ОсновноеПодразделениеОрганизации");

        КонецЕсли;



    КонецЕсли;

КонецПроцедуры

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55445    17    23    

43

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    19728    28    6    

44

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    21891    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    11012    smielka    37    

105

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    17968    1225    elcoan    53    

125

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

3 стартмани

10.04.2023    12662    167    acces969    31    

126

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    7400    kalyaka    6    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. adhocprog 1144 11.04.13 13:18 Сейчас в теме
Пробежался глазами, не понял, куда код вставлять? :)
Сам таким пользуюсь, но у меня код в самой форме.
2. panika 73 11.04.13 14:06 Сейчас в теме
В каждой типовой форме в предопределенной процедуре "ПриОткрытии" есть вызов процедуры из общего модуля "РаботаСДиалогами.УстановитьЗаголовокФормыДокумента()" в ней и добавляем вызов процедуры ВыводДополнительныхРеквизитов(). В этой процедуре в самом начале производится проверка (функция "ВыводитьДополнительныеРеквизиты") нужен ли вывод дополнительных реквизитов.
9. Sabfir 09.08.13 18:42 Сейчас в теме
(2) Подскажите, пожалуйста.
В вашем коде приведен вот такой код:
ПоложениеПервогоЭлемента = ФормаДокумента.Высота - ВысотаОбщаяДобавляемыхЭлементовПоВертикали - ВысотаНижнейПанели - ВысотаОбщаяДобавляемыхЭлементовПоВертикали;

Почему мы дважды отнимаем ВысотаОбщаяДобавляемыхЭлементовПоВертикали?
Ведь логично будет так: высота формы - высота нижней панели - высота самого реквизита.
То есть:
ПоложениеПервогоЭлемента = ФормаДокумента.Высота - ВысотаНижнейПанели - ВысотаОбщаяДобавляемыхЭлементовПоВертикали;

Почему дважды отнимается высота добавленного реквизита не понятно, хотя работает :)
3. TrinitronOTV 16 12.04.13 13:46 Сейчас в теме
списибо автору для данный материал, пригодиться в практической работе
4. sstar90 14.04.13 11:36 Сейчас в теме
5. Vyatcheslav 22 17.04.13 10:34 Сейчас в теме
очень актуально. давно ждал подобного примера. А то франчи понаделали правок в типовые формы, а обновлять мне. )) Буду переписывать.
6. daho 8 17.04.13 19:20 Сейчас в теме
Да полезная информация. Спасибо!!
7. q_i 584 13.05.13 19:10 Сейчас в теме
Спасибо за публикацию!
вот это скорее всего не нужно:
Элемент.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций");

т.к.
ТипЗначения (ValueType)
...
Тип: ОписаниеТипов.
Содержит объект, описывающий допустимые типы значений для элемента управления.
...
Примечание:
Для элементов управления, не связанных с данными, свойство доступно для записи.
Для элементов управления, связанных с данными, свойство доступно только для чтения.
...
8. Sabfir 03.07.13 10:58 Сейчас в теме
Класная статья. Было бы хорошо еще это все дело подвязать на некий регистр сведений, где бы указывалось какой реквизит на какую форму добавлять.
10. StepanZaytsev 16.12.13 14:14 Сейчас в теме
нельзя ли было так сделать, за место перебора всех элементов формы.

Для Каждого Стр из ФормаДокумента.ЭлементыФормы Цикл

Если Стр.Данные = "ПодразделениеОрганизации" Тогда

Возврат Результат;

КонецЕсли;

КонецЦикла;


а просто написать Если ФормаДокумента.ЭлементыФормы.Найти("ПодразделениеОрганизации")<> Неопределенно Тогда Возврат Результат; КонецЕсли;
11. Nickon 03.08.14 18:32 Сейчас в теме
Инересно, а что делать с этим реквизитом. Да, добавился он на форму. Но данные в нем не сохраняются. Закрыл документ,открыл - данных нет. В чем его "нужность"?
13. AndrewKiev 08.09.14 13:56 Сейчас в теме
(11) Nickon,
если я верно понял вопрос, то ответ таков: реквизит предварительно должен быть добавлен в конфигураторе, сути этого метода в том, чтобы облегчить обновление релизов. При обновлении тяжело сравнивать изменения в диалогах форм, а так их не будет
14. bugagashenka 203 08.09.14 10:19 Сейчас в теме
(13) AndrewKiev, но ведь весь колхоз делается на форме? Или я не прав? Все равно ковырять изменения формы. Я лично новые реквизиты когда добавляю, помечаю их пурпурным цветом, чтобы после меня было проще ориентироваться в изменениях в диалоге. И это вам известно, что там и как делается, а придет после вас программист и будет думать, что же это за колдунство такое. Да еще в 30 доках!
12. validat 1 03.08.14 20:29 Сейчас в теме
Интересный подход к модификации формы. Было бы хорошо если результат сохранялся на форме.
15. yermak 51 30.06.16 08:26 Сейчас в теме
Спасибо! Пригодилось!
16. Asenka 108 12.09.16 11:37 Сейчас в теме
Реквизит на форму вышеуказанным методом добавила. Можно ли как-то вызвать процедуру "ПриИзменении" для данного реквизита формы?
17. foxey 4 23.09.16 12:29 Сейчас в теме
(16) Чтобы прописать обработчик события новому реквизиту, используйте метод УстановитьДействие.
Например,
НашЭлемент.УстановитьДействие("ПриИзменении", Новый Действие("ФлагЗапретРедактированияНажатие"));

Ну и, соответственно, в модуле формы надо прописать код обработчика:
Процедура ФлагЗапретРедактированияНажатие(Элемент)
....
КонецПроцедуры

18. Xytras 35 21.07.17 12:31 Сейчас в теме
спасибо большое автору!
19. пользователь 02.03.18 13:24
Сообщение было скрыто модератором.
...
20. trupo 14.01.21 12:03 Сейчас в теме
Название не соответствует содержанию - это не "добавление реквизитов на форму" - это добавление элементов формы отображающих существующие реквизиты. Такие статьи мешают правильному поиску.
Pyryrym; Oldsad; +2 Ответить
Оставьте свое сообщение