Динамический вывод таблицы значений на форму
Разработка - Работа с интерфейсом
Возможно, это уже где-то было, но мне не попалось.
Появилась необходимость выводить на форму таблицу значений в зависимости от загруженных данных, с различным количеством и названиями полей. На эту тему статей хватает. Но большинство из них касается только создания, а надо было не только создавать элементы, но ещё и удалять их при выводе туда же другой ТЗ с другими полями. А с этим пришлось немного повозиться.
В итоге получилась такая штука, в которую можно раз за разом пихать разные ТЗ, и она будет их показывать.
В реквизитах формы в конфигураторе заранее создаётся таблица значений ТабРеквизит и вытаскивается на форму на необходимое место под именем ТабЭлементФормы (если имя совпадает с ТабРеквизит, как обычно и бывает, в параметрах процедуры его можно не указывать).
Процедура удаляет (если они были) уже имеющиеся программно созданные (возможно, этой же процедурой) элементы формы из ТабЭлементФормы с реквизитами, в которых хранились выводимые значения. На основании переданной ТаблицаЗначений формируются новые реквизиты, которые в последнем цикле привязываются к вновь создаваемым элементам формы. Осталось заполнить ТабРеквизит данными из ТаблицаЗначений ,что и происходит в предпоследней строчке. На этом всё. Готово. Конец процедуры.
&НаСервере
Процедура ВывестиТаблицуЗначенияВТаблицуНаФорме(ТаблицаЗначений, ТабРеквизит, ТабЭлементФормы = Неопределено)
Если ТабЭлементФормы = Неопределено Тогда
ТабЭлементФормы = ТабРеквизит;
КонецЕсли;
// Собирается инофрмация по добавленным ранее элементам формы и реквизитам, на которые элементы формы ссылаются.
УдаляемыеРеквизиты = Новый Массив;
УдаляемыеЭлементы = Новый Массив;
Для каждого Эл Из Элементы[ТабЭлементФормы].ПодчиненныеЭлементы Цикл
УдаляемыеРеквизиты.Добавить(Эл.ПутьКДанным);
УдаляемыеЭлементы.Добавить(Эл);
КонецЦикла;
Для каждого Эл Из УдаляемыеЭлементы Цикл
Элементы.Удалить(Эл);
КонецЦикла;
// Добавляются колонки из ТаблицыЗначений в реквизит таблицы ТабРеквизит
НовыеРеквизиты = Новый Массив;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
НовыйРеквизит = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ТабРеквизит, Колонка.Заголовок);
НовыеРеквизиты.Добавить(НовыйРеквизит);
КонецЦикла;
//Удаляются старые и устанавливаются новые реквизиты
ИзменитьРеквизиты(НовыеРеквизиты, УдаляемыеРеквизиты);
// Добавляются колонки из ТаблицыЗначений в элементы ТабЭлементФормы со ссылкой на колонки в ТабРеквизит
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
НовыйЭлемент = Элементы.Добавить( ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабЭлементФормы]);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеНадписи; //Или ПолеВвода, или что-то другое;
НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя;
КонецЦикла;
// В созданный реквизит загружается ТЗ
ЭтаФорма[ТабРеквизит].Загрузить(ТаблицаЗначений);
КонецПроцедуры
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)
Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!
31720 руб.
27.03.2025 92198 69 44
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3625 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10293 2 2
Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна
20.08.2024 57296 mrXoxot 44
Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.
27.05.2024 29956 smielka 39
Инструментарий разработчика Работа с интерфейсом Разработчик 1С 8.3 Абонемент ($m)
Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.
1 стартмани
10.04.2023 19413 190 acces969 31
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Питничная фантазия на возможности в разработке интерфейсов формы с помощью Платформы 1С - делаем свою подсказку. Публикация содержит готовую библиотеку программного формирования данной подсказки.
12.08.2022 16902 top_1c 39
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.
1 стартмани
05.07.2022 17923 kalyaka 8
ИзменитьРеквизиты(НовыеРеквизиты, УдаляемыеРеквизиты)
А если получится дать МНОГО таких ссылок на Инфостарт (согласен считать что две - это много), то готов под Н-ным (по количеству приведённых ссылок) количеством Ваших постов написать - "да, этот человек знает, о чём говорит!". ;)
Но всё же я так не думаю.
Хотя спасибо Вам. Начинаю гордиться собой. Меньше, чем 30 строчек кода, оказывается, не только могут вывести разные ТЗ на форму, но и справиться с "массой геморроя"! :)
По этой причине возможность программного изменения формы является скорее опциональной, дополнительной. Она рассчитана на отдельные конкретные сценарии работы и не предполагает массового использования в большом количестве форм конфигурации или в часто используемых формах. Основным подходом при разработке прикладных решений должно являться визуальное конструирование форм в конфигураторе. А программное изменение форм рекомендуется использовать лишь в отдельных специфических сценариях работы.
Нужно было выводить и обрабатывать загружаемые xls файлы, в которых верхняя строка - название колонок, остальные строки - данные. Количество колонок, название и смысловая информация различные в различных файлах. Думаю, это тот самый случай. :)
Посоветуйте, пожалуйста, как задёшево решить эту часть задания заказчика, в котором надо выводить на форму ТЗ, с учётом того, что структура её и данных заранее неизвестна. Вариант "убедить заказчика, что ему это не надо" не предлагать. :)
Ну и понятно, что никто печатную форму не выводит табличным документом. Но не стоит печатную форму путать с полем для ввода данных.
НовыйРеквизит = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ТабРеквизит, Колонка.Заголовок);
Эту строку нужно доработать. Уже столкнулся с этим на практике. Есть типы полей, которые приемлемы в ТЗ, но никак не в реквизите формы. Например Null или МоментВремени. В первом случае у вас будет платформа выдавать странную ошибку при попытке поиска чего-либо в такой таблице. Во втором - платформа сразу выдаст ошибку при добавлении. Ошибки такого рода коварны тем, что в какой-то момент начинаешь готовый код по отображению ТЗ на форме переносить в другие задачи, где таблицы значений могут быть самыми разнообразными и потом удивляться почему все перестало работать.
Понятно, что это взято из документации, и многие даже не задумывались, что это значит.
Мне бы хотелось узнать мнение практиков, а не теоретиков. В чем именно выражается эта дороговизна?
Я в нескольких проектах использовал этот метод. Всегда все работало быстро. Никаких задержек не ощущалось.
При каких условиях начинает проявляться эта дороговизна? Было бы интересно прочитать подробности из личного опыта
Экселевская таблица 5.200 строк 22 колонки. Её загрузка и первичная обработка занимает порядка минуты, включая и процесс засовывания в ТЗ и вывода этой ТЗ на экран (внизу скрина как раз оно).
Непосредственно процедура, которую я привёл, занимает, если верить замеру производительности... ммм... нисколько. :)
Т. е. на фоне всего остального - ни о чём.
Отрисовка формы. Нагрузка на сервер.
Ведь если такое количество пользователей, то там и функционала, наверное тоже довольно много, и должно быть полно и других методов, которые тормозят.
Изменение реквизитов делается менее чем за секунду. Это нужно, чтобы ваши 100 пользователей очень часто выполняли эту операцию. Причем замедление возможно было при динамическом изменении ЭЛЕМЕНТОВ формы, а не РЕКВИЗИТОВ.
В замере тоже очень мало вероятно, чтобы эта операция вылезла в топ. Если только она не выполнялась в цикле по 50 раз.
По поводу тех. журнала - ответ расплывчатый.
Ну да ладно...
Программные счетчики.
Устанавливаете стек ELK и анализируете тех. журнал.
Почему маловероятно? Просто представьте, что документ не делает движений.
понял, наверное программные счетчики типа этого:
НачВремя = ТекущаяДата();
ДолгаяПроцедура();
КонВремя = ТекущаяДата();
ЗафиксироватьЗамерКудаНадо(НачВремя, КонВремя, "ДолгаяПроцедура");
и вопрос:
в БСП же ИзменитьРеквизиты() на каждом шагу, вроде. Они там доп. реквизиты добавляют.
Удалось с этим что-нибудь сделать?
1) Создал таблицу значений "ТаблицаНаФорме" в реквизите управляемой формы
2)Перетащил ее в элементы
3) На сервере формирую ТЗ и гружу ее в таблицу формы:
...
ТаблицаНаФорме.Очистить();
ТаблицаНаФорме.Загрузить(ТЗ);
Допустим, в ТЗ было 20 строк
После этого при даблклике на какую - нить строчку срабатывает событие"Выбор":
Процедура ТаблицаНаФормеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
...
КонецПроцедуры
Все хорошо... Но, только, при первой загрузке...
Если еще раз произвести:
ТаблицаНаФорме.Очистить();
ТаблицаНаФорме.Загрузить(ТЗ);
То, метод ТаблицаНаФорме.Количество() возвращает число 20, а, в событии номер выбранной строки уже 21, 22, 23... То есть поле таблицы при каждой загрузке инкрементирует номера строк и не сбрасывает пока не закроешь форму
Элементы.ТаблицаНаФорме.Обновить() не помогает!!!!!!!!!!!!!!
Как скинуть этот счетчик строк?????
В общем, добавил колонку дополнительную, к таблице, где уникальный номер каждой строки, который совпадает с номером массива и по нему только получается позиционироваться, вообще, странно, что в 1С не предусмотрено позиционирование по номеру кликнутой строки
НомерСтроки = ТаблицаНаФорме.Индекс(ТаблицаНаФорме.НайтиПоИдентификатору(ВыбраннаяСтрока));
Вчера не додумался...
Но, поздно, я уже колонку с номерами добавил, ленива переделывать)))
Спасибо за помощь!
"{ВнешняяОбработка.ЗагрузкаИзExcel.Форма.РаботасExcel.Форма(65)}: Получение элемента по индексу для значения не определено
Для каждого Эл Из Элементы[ТабЭлементФормы].ПодчиненныеЭлементы Цикл "
В чем заключается ошибка?
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 960353
Создание 11.01.19 10:56
Обновление 11.01.19 10:56
Просмотры 40099
Загрузки 0
Рейтинг
59
Комментарии 37
Код открыт Да
Рубрики Работа с интерфейсом
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)