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

11.04.13

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

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

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

 

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

 

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

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

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

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

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

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

 

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


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


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

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

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

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

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

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

            КонецЕсли;

        КонецЦикла;

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

    КонецЕсли;

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

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



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



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

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



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

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

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

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

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

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

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

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



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

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



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

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

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

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

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

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

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

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



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

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

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

                    Продолжить;

                КонецЕсли;



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

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

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

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

                Иначе

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

                КонецЕсли;



            КонецЕсли;

        КонецЦикла;



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



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

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

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



       
// Настройка

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

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

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

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



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

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

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

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

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



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

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

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

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



       
// Настройка

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

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

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

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



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

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

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

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

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



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

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

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

        КонецЕсли;



    КонецЕсли;

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

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61796    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

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

5000 руб.

14.01.2016    54402    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16697    21    4    

35

Новогоднее оформление для 1С

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

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

27.12.2023    10736    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    9614    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12080    1    5    

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

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

Почему дважды отнимается высота добавленного реквизита не понятно, хотя работает :)
3. TrinitronOTV 14 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 577 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. buganov 200 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 102 12.09.16 11:37 Сейчас в теме
Реквизит на форму вышеуказанным методом добавила. Можно ли как-то вызвать процедуру "ПриИзменении" для данного реквизита формы?
17. foxey 4 23.09.16 12:29 Сейчас в теме
(16) Чтобы прописать обработчик события новому реквизиту, используйте метод УстановитьДействие.
Например,
НашЭлемент.УстановитьДействие("ПриИзменении", Новый Действие("ФлагЗапретРедактированияНажатие"));

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

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