(1) Думал, что будут проблемы при выводе новых реквизитов, аналогичных удаляемым. Проверил - действительно, так работает и с совпадающими реквизитами. Исправил. Спасибо за замечание.
(3)Был бы признателен за ссылку на аналогичную статью на Инфостарте, где подробно написано про удаление старых и создание новых элементов и реквизитов ТЗ, сразу про оба этих момента. Ну так, чисто поржать над собой - мол, вот я чайник, велосипед-то уже давно изобрели. С такой ссылкой Ваш, без сомнения, поражающий своей информативностью комментарий был бы ещё информативнее.
А если получится дать МНОГО таких ссылок на Инфостарт (согласен считать что две - это много), то готов под Н-ным (по количеству приведённых ссылок) количеством Ваших постов написать - "да, этот человек знает, о чём говорит!". ;)
(9) Несомненно, Ваша фраза из второго комментария к Вашей статье "лучше полностью сносить таблицу и создавать новую, чем заморачиваться изменениями колонок - пользы чуть, а геморроя - масса." гораздо полнее и лучше раскрывает решение вопроса, который стоял передо мной (и, возможно, возникнет у кого-то ещё), чем способ, который я предложил. Вероятно, мне стоит согласиться с тем, что в статье, написанной мною, вместо кучи бессмысленного текста было бы достаточно привести ссылку на Вашу всеобъемлющую статью.
Но всё же я так не думаю.
Хотя спасибо Вам. Начинаю гордиться собой. Меньше, чем 30 строчек кода, оказывается, не только могут вывести разные ТЗ на форму, но и справиться с "массой геморроя"! :)
Меньше, чем 30 строчек кода, оказывается, не только могут вывести разные ТЗ на форму, но и справиться с "массой геморроя"!
В девстве, помню, консоль запросов делал на УФ - ровно 30 строк занял вывод результата запроса в форму (с учетом изменившихся реквизитов). Но это по-молодости. Сейчас все в 10 строк умещается.
Программное создание элементов формы после события ПриСозданииНаСервере() очень дорогая операция. Точно так же программное создание и удаление реквизитов управляемой формы. Пруфы: Синтаксис-помощник, Программное изменение формы.
Форма не рождается на клиенте. Форма рождается на сервере, она проходит несколько важных стадий предварительной обработки, прежде чем достичь глаз пользователя. Платформа содержит достаточно сложные механизмы многоуровневого кеширования различных частей формы как на сервере, так и на клиенте.
По этой причине возможность программного изменения формы является скорее опциональной, дополнительной. Она рассчитана на отдельные конкретные сценарии работы и не предполагает массового использования в большом количестве форм конфигурации или в часто используемых формах. Основным подходом при разработке прикладных решений должно являться визуальное конструирование форм в конфигураторе. А программное изменение форм рекомендуется использовать лишь в отдельных специфических сценариях работы.
Внимание! Действия добавления и удаления выполняются за один вызов. Следует учитывать, что операция изменения состава реквизитов является ресуркоемкой, поэтому операции изменения состава реквизитов формы выполняются пакетным образом.
(4) Из Вашего же пруфа: "Такими сценариями могут быть, например, отображение в форме имеющихся типовых операций или характеристик объектов. То есть той информации, которая содержится в базе данных и структура которой неизвестна на этапе конфигурирования. Ее можно узнать только уже в процессе функционирования прикладного решения, в режиме 1С:Предприятие. Поэтому для ее отображения в форме и требуется ее программное изменение."
Нужно было выводить и обрабатывать загружаемые xls файлы, в которых верхняя строка - название колонок, остальные строки - данные. Количество колонок, название и смысловая информация различные в различных файлах. Думаю, это тот самый случай. :)
(13) Хорошо, не буду спорить.
Посоветуйте, пожалуйста, как задёшево решить эту часть задания заказчика, в котором надо выводить на форму ТЗ, с учётом того, что структура её и данных заранее неизвестна. Вариант "убедить заказчика, что ему это не надо" не предлагать. :)
НовыйРеквизит = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ТабРеквизит, Колонка.Заголовок);
Эту строку нужно доработать. Уже столкнулся с этим на практике. Есть типы полей, которые приемлемы в ТЗ, но никак не в реквизите формы. Например Null или МоментВремени. В первом случае у вас будет платформа выдавать странную ошибку при попытке поиска чего-либо в такой таблице. Во втором - платформа сразу выдаст ошибку при добавлении. Ошибки такого рода коварны тем, что в какой-то момент начинаешь готовый код по отображению ТЗ на форме переносить в другие задачи, где таблицы значений могут быть самыми разнообразными и потом удивляться почему все перестало работать.
Почитал комментарии, многие написали, что ИзменитьРеквизиты() - это дорогая операция.
Понятно, что это взято из документации, и многие даже не задумывались, что это значит.
Мне бы хотелось узнать мнение практиков, а не теоретиков. В чем именно выражается эта дороговизна?
Я в нескольких проектах использовал этот метод. Всегда все работало быстро. Никаких задержек не ощущалось.
При каких условиях начинает проявляться эта дороговизна? Было бы интересно прочитать подробности из личного опыта
(15) Экселевская таблица 5.200 строк 22 колонки. Её загрузка и первичная обработка занимает порядка минуты, включая и процесс засовывания в ТЗ и вывода этой ТЗ на экран (внизу скрина как раз оно).
Непосредственно процедура, которую я привёл, занимает, если верить замеру производительности... ммм... нисколько. :)
Т. е. на фоне всего остального - ни о чём.
(20) Ну если больше 100 пользователей, то там могут быть любые причины торможения. Как определили, что причина именно в методе ИзменитьРеквизиты()?
Ведь если такое количество пользователей, то там и функционала, наверное тоже довольно много, и должно быть полно и других методов, которые тормозят.
Изменение реквизитов делается менее чем за секунду. Это нужно, чтобы ваши 100 пользователей очень часто выполняли эту операцию. Причем замедление возможно было при динамическом изменении ЭЛЕМЕНТОВ формы, а не РЕКВИЗИТОВ.
Люди, а, подскажите, пжлста, такую вещь:
1) Создал таблицу значений "ТаблицаНаФорме" в реквизите управляемой формы
2)Перетащил ее в элементы
3) На сервере формирую ТЗ и гружу ее в таблицу формы:
...
ТаблицаНаФорме.Очистить();
ТаблицаНаФорме.Загрузить(ТЗ); Допустим, в ТЗ было 20 строк
После этого при даблклике на какую - нить строчку срабатывает событие"Выбор":
Процедура ТаблицаНаФормеВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) ...
КонецПроцедуры
Все хорошо... Но, только, при первой загрузке...
Если еще раз произвести:
ТаблицаНаФорме.Очистить();
ТаблицаНаФорме.Загрузить(ТЗ);
То, метод ТаблицаНаФорме.Количество() возвращает число 20, а, в событии номер выбранной строки уже 21, 22, 23... То есть поле таблицы при каждой загрузке инкрементирует номера строк и не сбрасывает пока не закроешь форму
Элементы.ТаблицаНаФорме.Обновить() не помогает!!!!!!!!!!!!!!
Как скинуть этот счетчик строк?????
(27) В событии Выбор таблицы формы, связанной с таблицей значений, параметр ВыбраннаяСтрока – это идентификатор выбранной строки. Строго говоря, он может быть каким угодно и его фактическое значение нас интересовать не должно, потому что, чтобы получить данные выбранной строки, нужно использовать ТаблицаНаФорме.НайтиПоИдентификатору(ВыбраннаяСтрока) или Элемент.ТекущиеДанные.
(28) Мне важно не данные, а, именно, номер строки, по нему ищутся данные в другом объекте - в массиве структур который перегоняется с клиента на сервер и обратно, поскольку непосредственно таблицу значений для работы с данными на клиенте использовать невозможно - ее можно только рисовать на форме со стороны сервера.
В общем, добавил колонку дополнительную, к таблице, где уникальный номер каждой строки, который совпадает с номером массива и по нему только получается позиционироваться, вообще, странно, что в 1С не предусмотрено позиционирование по номеру кликнутой строки
(28) Можно еще так, как Вы и написали, только:
НомерСтроки = ТаблицаНаФорме.Индекс(ТаблицаНаФорме.НайтиПоИдентификатору(ВыбраннаяСтрока)); Вчера не додумался...
Но, поздно, я уже колонку с номерами добавил, ленива переделывать)))
Спасибо за помощь!
Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2")
Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2")