Каждый раз при необходимости создать программно элементы формы посещает мысль что надо бы сделать модуль, но все некогда и некогда. А у автора руки, таки, дошли. Полезно!
пара замечаний, ну куда ж без них
1. Напишите жирным шрифтом
синтаксис ЭтаФорма.Элементы. использовать только если этот фрагмент кода расположена в методе с параметром
ЭтаФорма, например Функция СоздатьГруппуФормы(ЭтаФорма, ПараметрыГруппы)
если же этот фрагмент кода будет расположен в модуле формы, то достаточно
написать Элементы. Когда будет копипастить код из этой шпаргалки, то всегда думайте чтобы НЕ рукоягодничить.
2. Практически все примеры представленного функционала можно найти в общих модулях типовых конфигураций и если вы изучите эту шпаргалку, то логичнее не
плодить еще тонну кода в типовой, а использовать аналоги оттуда.
пожалуй все остальное чики-пуки, больше замечаний нет.
(7) А вы, товарисч, не ленитесь, время - оно денег стоит, а опыт по отыскиванию чего-либо в коде БСП и вовсе бесценен. А то вам мало что разжуй, так ещё и пищеварить, а как отказывают, так вы сразу хамите? Ну-ну.
(2) этот код вызывается из общего модуля, по другому не получилось. Я знаю, что в модуле формы не обязательно писать ЭтаФорма. Я предлагаю не функции копипастить в модуль формы, а целиком модуль создать для этих целей. И при необходимости вызывать с модуля формы, функцию общего модуля.
(12), это будет до тех пор, пока разработчики типовых сами не избавятся от этого. Так-то, да я сам всегда использую ЭтотОбъект вместо ЭтаФорма и другим рекомендую.
В примере создания полей я бы поменял местами присваивание вида и пути к данным. Сначала устанавливаем путь к данным, потом вид поля формы. По крайней мере раньше при установке пути к данным вид автоматически устанавливался в поле надписи
Спасибо, полезный материал!
Сам хотел написать подобную статью, Вы меня опередили ))
Для расширений динамическое создание элементов форм - это уже почти стандарт.
(11) Вот и убивать надо за такой стандарт. Есть же нормальная возможность перегрузить форму своей собственной, нафига такие танцы с бубном? Чтоб ваши последователи тратили втрое больше времени, пытаясь а) спрогнозировать внешний вид, б) поменять, чтоб ничего не сдохло?
(14)Позволю себе с Вами не согласиться. Я сам сперва добавлял и изменял реквизиты в загруженной в расширение форме. Но потом перешел на программное создание именно для большей прозрачности и управляемости. Хотя, в целом, я сторонник использования расширений.
(17) При программном создании в больших доработках очень сильно увеличивает код конфигурации что становится весьма неудобно. А так статья конечно полезна.
(14) Программное создание отлично подходит для подключаемых механизмов, в виде API. Пример. Вы реализовали визуальный инструмент, который нужно подключить к нескольким формам. Вносить интерфейсные изменения во все формы - так себе решение. При каждом изменении внешнего вида и поведения необходимо будет вносить изменения во все экземпляры. Работа же через API - более логичное решение. Условно, при создании формы вызывается конструктор, который дополняет форму. И вся работа инструмента идет через 1-3 обработчика, которые используют единую логику, вынесенную в общий модуль.
Как и любая мода, этот подход сейчас на слуху и популярен, а потому шпаргалка, безусловно, невредная для начинающих. Но, уверен, программное создание под тяжестью собственной непрозрачности, негибкости, времязатратности и громоздкости рано или поздно займёт подобающее ему небольшое место в ряду иных инструментов. Это костыль, однажды он на 90% отомрёт.
(15) Знаете, примерно так же со мной не соглашались, когда я говорил, что концепция "переопределяемых" модулей - это костыль. Мне говорили, ты что, это удобно, прогрессивно и прозрачно, дописал своё в типовой и обновлять легче! А потом появились расширения)
Так что, господа, попрыгаете на грабли программной доработки формы (особенно чужой и криво сделанной), поймёте. Лет через 5 вернёмся к этой теме)
(18) Ну, во-первых 5 лет еще как-то надо прожить, работать и зарабатывать, а не ждать непонятно чего.
А во вторых, кто на этих расширениях уже что называется "собаку съел" советуют новые элементы форм создавать в расширениях программно, что бы потом не было проблем с обновлениями.
(18) Не проблема использовать переопределяемые интерфейсы внутри расширения. При интерактивной доработке это всё не контролируется, форму нужно (вручную) обновлять в расширении нажатием соответствующей кнопки, чтобы она заново объединилась. При сложном изменении бывают (как минимум, бывали) разные артефакты. Расширения вообще не панацея от программной работы с формой. Правильно и в расширении их программно дорабатывать.
Так что, господа, попрыгаете на грабли программной доработки формы (особенно чужой и криво сделанной), поймёте. Лет через 5 вернёмся к этой теме)
Наоборот, за пределами 1С моветон рисовать формы. Даже в декларативном стиле, как это на управляемых сделано. Весь веб-интерфейс описывается кодом. Все эти конструктора для Веб'а канули в лету.
Наоборот, функционал для программной работы с формами давно напрашивается в БСП. Но он почему-то есть только в выборочных конфигурациях (как мне говорили, в Документообороте 3 есть такой модуль).
программное создание под тяжестью собственной непрозрачности, негибкости, времязатратности и громоздкости
Если сделана грамотная декомпозиция методов по созданию элементов, команд, реквизитов и обработчиков, то трудозатраты на доработку программно-генерируемого интерфейса формы лишь незначительно больше, чем на изучение и разработку в конструкторе.
(37) Если вам за 1С-ников обидно, то не понимаю сути ваших претензий.
Везде тупой не осмысленный код встречается, а не у только "1С-ников".
Давайте процитирую мой исходный комментарий:
Среди 1С-ников качественный и осмысленный код встречается не столь часто.
Разве я в нем сравнивал разработчиков 1С и разработчиков, пишущих на других языках? Только подчеркнул факт, что 1С-никам надо чаще писать качественный и сопровождаемый код. Желательно с соблюдением стандартов. Весь посыл.
(38)Наверное вы очень образованный человек, т. к. считаете возможным указывать на грамматические и синтаксические ошибки. По моему мнению, это форум где разбираются алгоритмы, а не грамматические и синтаксические ошибки, написания текста сообщений. На основании этого делаю вывод, что вам нужен форум, где разбираются ошибки правописания русского языка.
Ваша фраза "Среди 1С-ников качественный и осмысленный код встречается не столь часто.". По моему мнению означает, что вы встречали код в разработках не на платформе 1С, написанный гораздо качественней с вашей точки зрения.
Заранее извиняюсь за ошибки, которые вам "режут глаз".
Отличная работа, спасибо. Для полноты картины хотелось бы ещё увидеть сложные ЭУ: таблица формы, динамический список, командная панель, контекстное меню таблиц.
Есть реквизит формы "Таблица значений". При выборе у колонки на форме "ПутьКДанным"
открывается форма "Выбор реквизита" в которой помимо реквизитов (колонки) есть еще реквизит Строка[0]
в которой тоже присутствуют колонки. Может кто то подсказать, как и для чего используется реквизит Сnрока[0]? или ссылку где можно почитать? Изображение прикреплено.
Спасибо заранее.
(29) Т.о. можно, например, реализовать два варианта интерфейса: полный (с таблицей) и упрощенный (реквизиты первой строки отображаются как обычные поля ввода). Такое встречается в типовых конфигурация, например УТ11, документ "Заявка на расходование денежных средств". Он содержит переключатель для расшифровки платежа "Без разбиения / Списком" (см. рис.)
P.S. Я немного слукавил. В УТ используется не первая строка таблицы, а текущая. Подход немного другой, но сути это не меняет.
(29)Коллекция строк таблицы, т.е. как я понял можно заполнить таблицу программно или конкретными значениями в конфигураторе - например внести таблицу умножения...
Очень удобно использовать в общем модуле МодификацияКонфигурацииПереопределяемый - так можно вносить изменения в типовые формы практически не изменяя их модуль (только добавляя процедуры обработчиков событий)
Можно добавить вопрос изменения реквизитов. На днях искал как добавить столбец в реквизит формы Таблица значений. Не сразу нашел. А в шпаргалке было бы полезно.
А как бы, например, добавить реквизит в табличную часть?
На примере документа ПТУ в конфигурации БП 3.0. В реквизиты табличной части добавлено поле Склад. Как его программно выводить на форму?
Если ВставитьПеред = Неопределено Тогда
НовыйЭлемент = Форма.Элементы.Добавить(ИмяКолонки,Тип("ПолеФормы"),ТаблицаФормы);
Иначе
НовыйЭлемент = Форма.Элементы.Вставить(ИмяКолонки,Тип("ПолеФормы"),ТаблицаФормы,ВставитьПеред);
КонецЕсли;
А тут зачем так ? Можно всегда метод "Вставить" использовать, последний параметр не обязателен. В справке написано "Элемент, перед которым должен быть вставлен новый элемент. Если не указан, то элемент будет вставлен в конец."
Добрый день.
Случайно наткнулся на вашу статью и не смог пройти мимо. Программное создание элементов на форме использовал ранее в конфигурации и было ровно также реализовано, через общий модуль и далее вызов всего этого "чуда" при создании формы.
Да, соглашусь, проблему на типовое обновление это решает вопрос, но вот когда база стала расти, пользователей в базе стало больше 300 активных, вот тут мы стали получать проблему производительности, так как, каждый раз при открытии формы создаются программно элементы. Когда пользователей стало более 1000 было принято решение перехода на расширения, так как, показатели производительности стремились к нулю.
А после, я где-то на ИТС встетил информацию, что сами разработчики 1С не рекомендуют использовать программное создание элементов на форме, ровно по той причине, которую я выше описал. Так сказать, получил практический опыт, как делать не нужно.
А так, статья хорошая, но наверное не стоит злоупотреблять программным созданием элементов + помнить, что чем больше активных пользователей. тем медленнее будет работать система.
(56) Это практический опыт:) Попробуйте написать нагрузочный тест и поставить замеры Apdex в формы, где создаются программно элементы, сразу увидите все изменения.
Опять же я создавал 120 элементов. Разница в миллисекундах вышла почти в два раза. Грубо говоря расширением 82 мс, программно 179 мс :) ну и конечно речь идёт про повторное открытие, при первом открытие формы разница не так велика, где-то 195 (расширение) против 207 (программно).
ИзменитьРеквизиты (ChangeAttributes)
Синтаксис:
ИзменитьРеквизиты(<ДобавляемыеРеквизиты>, <УдаляемыеРеквизиты>)
Параметры:
<ДобавляемыеРеквизиты> (необязательный)
Тип: Массив.
Массив, содержащий объекты типа РеквизитФормы.
Добавлять можно реквизиты верхнего уровня и вложенные реквизиты, являющиеся колонками.
К добавленным реквизитам верхнего уровня из модуля можно обращаться только с помощью конструкции ЭтотОбъект.<Имя реквизита>.
<УдаляемыеРеквизиты> (необязательный)
Тип: Массив.
Массив, содержащий строки, описывающие пути к удаляемым реквизитам.
Удалять можно только ранее программно добавленные реквизиты.
(60) Если элементы тоже тогда можно удалять разом все - удалив родителя.
Допустим удаляя динамический список - не нужно удалять каждую колонку, достаточно удалить элемент динамического списка.
Спасибо за описание механизмов. Многое использовал. Столкнулся только с одной проблемой - реквизит и его сохранение. Не Сохраняемые данные, а именно Сохранение. В списке всех реквизитов столбец который. Не могу программно найти, как установить Истина. Возможно это кодом описать ?
Заменил :
Если СтруктураСвойств = Неопределено Тогда
СтруктураСвойств = Новый Структура;
КонецЕсли;
......
Для Каждого Элемента Из СтруктураСвойств Цикл
НовыйЭлемент[Элемента.Ключ] = Элемента.Значение;
КонецЦикла;
На:
Если СтруктураСвойств <> Неопределено Тогда
Для Каждого Свойства Из СтруктураСвойств Цикл
НовыйЭлемент[Свойства.Ключ] = Свойства.Значение;
КонецЦикла;
КонецЕсли;
Но в целом большое спасибо за работу, у самого был подобный модуль,
но у Вас все удобнее и красивее )).
(71) Пардон. пишу код для добавления кнопки в процедуре "ПриСозданииНаСервере", но никакой кнопки не добавляется. код просто проходит мимо. не могу понять, что еще нужно дописать, чтобы было отображение.
Подскажите, пожалуйста, как программно добавить на форму строку поиска, источником которой является таблица формы? По какой-то причине у добавляемого элемента формы нет свойства источник... Удалось нагуглить только саму проблему, решение не могу найти.
https://dev.mista.ru/topic.php?id=867412
код по добавлению элемента управления
НовыйЭлемент = Элементы.Добавить("СтрокаПоиска", Тип("ДополнениеЭлементаФормы"), Элементы.ГруппаОтбора);
НовыйЭлемент.Вид = ВидДополненияЭлементаФормы.ОтображениеСтрокиПоиска;
//НовыйЭлемент.Источник = ??? //нет свойства источник
(79) "Автозаполнение" я с ним сталкивался когда пытался полноценно влиять на командную панель динамического списка, но увы управлять этим свойством программно никак нельзя было, думаю и сейчас не возможно.
(80) опять же дополняя прошлый ответ - делал костыльно в процедуре создания динамического списка - скрывал стандартную панель списка и наполнял её уже необходимыми кнопками.
Всем доброго времени суток!
В расширение добавлен регистр сведений. Желаю в регистр сведений сделать запись, источником данных для которой, являются динамически(программно) созданные реквизиты на форме элемента справочника.
Никак не могу получить значение "своего" реквизита.
Подскажите пожалуйста выход из тупика, или как его обойти.
Еще подскажите пожалуйста, как повлиять на размеры Элемента формы если Тип "ПолеФормы" Вид "ПолеКартинки". В поле выводится сама картинка. Вызов методов: НовыйЭлемент.Высота = 2; НовыйЭлемент.Ширина = 5;, свойства изменяют, но на форме все без изменения.