Таблицы на управляемых формах: создание, расширение, управление.

0. 2292 10.01.17 16:33 Сейчас в теме
Как вывести результат запроса в таблицу на управляемую форму, ведь здесь нет метода "СоздатьКолонки()"? Как добавить поле ввода в табличную часть документа, если нет желания менять документ?
Разбираемся...

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. mars207 27 11.01.17 13:31 Сейчас в теме
Я бы еще добавил динамическое изменение таблицы в процессе работы. Имею в виду проверку наличия реквизита и элемента, возможность удаления лишних колонок. Например, показать движения по месяцам в зависимости от указанного количества месяцев. А то как-то жиденько…
Lena272; kraynev-navi; +2 Ответить
2. starik-2005 2292 11.01.17 14:10 Сейчас в теме
(1) справедливо, но задача была показать, как в принципе это делать. А уж обращать внимание на второй параметр метода "ИзменитьРеквизиты()" - это дело для самостоятельного изучения. Но, как показала практика, лучше полностью сносить таблицу и создавать новую, чем заморачиваться изменениями колонок - пользы чуть, а геморроя - масса.
3. kraynev-navi 492 12.01.17 13:39 Сейчас в теме
поддерживаю (1). Приведенный код обильно присутствует на всем известных форумах.
Если бы сделали всеобъемлющее руководство, привели нюансы с какими багами предстоит встретиться на разных платформах, про удаление и т.д.
А так... В чем новость?
4. starik-2005 2292 12.01.17 15:19 Сейчас в теме
(3) по поводу "обильности" что-то не замечал, а по поводу изменений - это лишь одна из манипуляций с данными формы. Я в последнее время отказался от создания на форме таблиц - формирую их динамически. Для того, чтобы знать, какие элементы нужно удалить, просто делаю на форме список значений, в который добавляю созданные реквизиты и связанные с ними элементы (идентификаторы). Дальше при необходимости просто удаляю все созданные элементы/реквизиты и создаю заново. Ничего тут "такого" в плане нюансов нет.
5. fomix 29 13.01.17 10:22 Сейчас в теме
Можете пояснить на словах "просто делаю на форме список значений, в который добавляю созданные реквизиты и связанные с ними элементы (идентификаторы). Дальше при необходимости просто удаляю все созданные элементы/реквизиты и создаю заново.".
Желательно с кодом. Заранее спасибо!
6. starik-2005 2292 13.01.17 11:59 Сейчас в теме
(5) а что конкретно непонятно? В вышеуказанный код добавляете "СписокЗанченийСРеквизитами.Добавить(Колонка.Имя, Реквизит.Имя)", а перед этим можете вызвать функцию, которая пробежится по элементам списка, удалит элементы "Элементы.Удалить(Элементы.Найти(ЭлементСписка.Представление))", добавит в массив реквизитов для удаления имя реквизита (именно имя, а не реквизит) и вызовет функцию "ИзменитьРеквизиты(, УдаляемыеРеквизиты)". Все же просто.
7. fomix 29 17.01.17 14:04 Сейчас в теме
(6) Фигня получается, если делать как написали!
Зачем использовать конструкцию "ИзменитьРеквизиты(, УдаляемыеРеквизиты)", если выше элемент с формы уже удален строкой: "Элементы.Удалить(Элементы.Найти(ЭлементСписка.Представление))"?!
Тогда и "СписокЗначенийСРеквизитами" не нужен.
Может не так понял...
8. starik-2005 2292 17.01.17 16:37 Сейчас в теме
(7) понял действительно не так.Не стоит путать реквизиты формы и элементы формы. Через "Элементы.Удалить()" удаляется элемент формы, а через ИзменитьРеквизиты добавляются и удаляются... что?.. правильно - реквизиты формы, которые ни разу не элементы формы.
9. fomix 29 28.01.17 11:36 Сейчас в теме
(8) Получается, что список удаляемых Колонок нужно готовить во время или после создания реквизитов (таблицы и колонок), но до добавления элементов формы. Т.е. подставлять в вашем коде так:

// добавим реквизиты на форму
ИзменитьРеквизиты(Реквизиты, _УдаляемыеРеквизиты_); !?
10. starik-2005 2292 30.01.17 22:35 Сейчас в теме
(9) тут как раз проблема одна: метод "ИзменитьРеквизиты" в первом параметре принимает созданные реквизиты (массив), чтобы они "приаттачились" к форме (не совсем, конечно, ясно, зачем 1С делает так - но это их дело), а вот во втором параметре - массив имен реквизитов, которые нужно удалить. Объясняют они это просто - если нужно поменять что-то на форме в плане реквизитов, то удаляем и добавляем одной командой. При том сначала реквизиты удаляются, потом добавляются (на сколько я помню). Но если в новых реквизитах есть реквизит с именем старого? При создании нового реквизита уже произойдет обломс - реквизит не создастся. Поэтому проще гораздо сначала удалить все реквизиты (просто дернув метод с массивом имен ранее созданных реквизитов, которые были сохранены в списке значений, например), потом удаляем все элементы формы (колонки нашей ТЗ), потом создаем новые реквизиты, добавляем их в список значений, потом создаем элементы формы (колонки нашей новой ТЗ). Так гораздо проще и нет шансов наступить на грабли.
11. Yashazz 3733 10.02.17 13:55 Сейчас в теме
Я фигею. Стопицотая публикация на тему, которую можно уже смотреть в БСП и таскать оттуда; которую давно разжевали в методичках и на куче ресурсов. Нет, ажиотаж зашкаливает... неужели столько новичков, которые эти азы не знают?

При эдаком тренде скоро Сообщить("Hello, world") будет "выбором экспертов" на ИС...

Ну и по сути.
1. Если задача "номер РАЗ" это вывести результаты - поместите на форму поле табличного документа и вывалите всё туда, хоть через построитель отчёта, хоть через СКД. Возни меньше на порядок.
2. Если уж упомянули про добавление подчинённых реквизитов к объектам "ДанныеФормыКоллекция", связанным с объектами БД, особенно с основным реквизитом формы, то уж распишите нормально, когда этот кэш сбрасывается и когда нет. И как сериализуется, и как передаётся, итд. А то, знаете, фраза "заполнять данную колонку придется при каждом открытии документа" это далеко-о-о не всё, что придётся делать)))
koks17v; v.l.; PolinkaKMS; nbeliaev; +4 Ответить
12. starik-2005 2292 11.02.17 20:50 Сейчас в теме
(11)
Ну и по сути.
1. Если задача "номер РАЗ" это вывести результаты - поместите на форму поле табличного документа и вывалите всё туда, хоть через построитель отчёта, хоть через СКД. Возни меньше на порядок.
2. Если уж упомянули про добавление подчинённых реквизитов к объектам "ДанныеФормыКоллекция", связанным с объектами БД, особенно с основным реквизитом формы, то уж распишите нормально, когда этот кэш сбрасывается и когда нет. И как сериализуется, и как передаётся, итд. А то, знаете, фраза "заполнять данную колонку придется при каждом открытии документа" это далеко-о-о не всё, что придётся делать)))

Ух-ты, мы вышли из бухты (с)
1. Да, возни меньше, но: а) не на порядок; б) СКД и построитель, конечно, посредством обработки событий табличного документа тоже редактируемы, но возни с этим, как Вы сами сказали, на тот самый порядок больше...
2. Всегда "этот кеш сбрасывается", ничего не надо сериализовать, с передачей и так кому надо - разберутся. А коли что не поняли - спросите, подскажем!

3. Да, азы - это главное. Войти в АТ где-то к тридцати пяти все хотят, а рыться в архивах лениво. Именно по этому (и я об том уже не раз говорил, возможно даже Вам лично) народ такие статьи крайне любит, а авторов холит и лелеет.

4. Завидуйте молча.
15. fomix 29 15.02.17 19:12 Сейчас в теме
(11) И откуда столько желчи?! По моему мнению здесь площадка для обмена опытом, а не закрытый клуб "знатоков" 1С.
Tolpinski; Team leader; dreamcreal; +3 Ответить
13. Yashazz 3733 13.02.17 18:01 Сейчас в теме
1. "редактируемы" в постановке задачи не было) Формулируйте точнее)
2. Теперь не понял - это статья с разжёвыванием для начинающих, или заметки профи? Или просто подлянка из серии "дальше сами разбирайтесь"?
3. Ага. Статьи из серии "hello world". Кстати, что такое "АТ"?
4. Я не завидую, я огорчён: спрос рождает предложение; такими темпами мы рискуем превратить ИС в песочницу для студентов, а на то и других ресурсов полно, вот хоть devtrain.

p.s. к сведению: в разных релизах 1С методы преобразования данных формы в значение и обратно очень по-разному обходятся с "добавленными" реквизитами, а уж КопироватьДанныеФормы чего творил, аж страшно было. Особенно 8.3.7 этим отличается.
14. starik-2005 2292 14.02.17 11:47 Сейчас в теме
1. Ну а зачем еще нужны ТЗ на форме?
2. Так не стесняйся - спроси прямо.
3. АТ - это типа АйТи. Я считал, что все это песенку слышали. Не?
4. Огорчайтесь молча - это ж должно было подавить Вашу ранимую психику. Поплакаться в жилетку - это полезно бывает.

пысы: преобразования данных формы в значения и обратно работают прямо у тех, у кого руки из нужного места растут. У иных могут быть проблемы - но это руки, хотя вина 1С тут тоже есть - не может толком обучить своих специалистов по платформе.
16. Yashazz 3733 18.02.17 19:43 Сейчас в теме
(14)
Огорчайтесь молча - это ж должно было подавить Вашу ранимую психику. Поплакаться в жилетку - это полезно бывает.
А вот переходить на личности не надо, за это можно и администрации ресурса пожаловаться на публичное оскорбление.

Поясню для понимающих: последний год я нахожу внятные ответы на свои вопросы где угодно, только не на ИС. Потому что ИС подобными публикациями всё более напоминает песочницу. Давайте я выложу, например, как динамически подключается условное оформление. Это ооочень сложная штука, конечно, и у большинства нет возможности глянуть реализацию БСП, так что будет бешеный спрос))) А потом через пару лет возникнет действительно серьёзный вопрос, и мне не придётся даже надеяться найти ответ на ИС. Так, что ли?

Ладно, оффтопим. А вот по теме публикации могу одно сказать: неполно, очень неполно и не совсем точно.
17. fomix 29 22.02.17 18:00 Сейчас в теме
(16) Давайте я выложу, например, как динамически подключается условное оформление. Это ооочень сложная штука, конечно, и у большинства нет возможности глянуть реализацию БСП, так что будет бешеный спрос)))

А ДАВАЙТЕ, МЫ ТОЛЬКО ЗА!
18. starik-2005 2292 23.02.17 12:09 Сейчас в теме
(16)
А вот по теме публикации могу одно сказать: неполно, очень неполно и не совсем точно.
Я всегда был за конкретику и конструктивную критику. Но то, что пишите Вы - это, увы и ах, нытье. Не нойте - и люди к Вам потянутся.

ЗЫ: Я уже давно не ищу что-либо на Инфостарте - я тут пишу. Некоторые простые вещи пишу потому, что у коллег возникают вопросы, я пытаюсь получить требуемый им результат и то, что у меня получается, выкладываю. Заметьте, я все, что мне надо, всегда в дебаггере нахожу, но не все же такие. Вот для тех, кому лень рыться в дебаггере, я и пишу свои статейки (последние две по крайней мере, остальные куда сложнее).

Если же посмотреть на Ваши статьи, то можно таких вот велосипедов кучу найти. И то, что у них рейтинг ниже плинтуса - это не моя вина. А есть и хорошие статьи - и это тоже не моя заслуга, так ведь? Ну вот и не нойте тут, а трудитесь.
19. Yashazz 3733 23.02.17 16:10 Сейчас в теме
(18)
Если же посмотреть на Ваши статьи, то можно таких вот велосипедов кучу найти.
Очередной некрасивый приёмчик. Очередной переход на личности. Подобная реакция характеризует Вас определённым образом, да.

Я сделал замечания по статье, а Вы (вероятно, не найдя достойного ответа) всё норовите на личность перейти. Ай-ай.

Если бы я гнался за рейтингом, я бы ещё лет семь назад вывалил бы кучу своих наработок и айда. Мои публикации в основном вынужденные, либо life-эмоции. Желай я рейтинга, я б их, наверное, в "лайф" не вносил, верно?))) Так это не статьи, это именно заметочки с личной позицией, навроде того срача про асинхронность или передачу клиент-сервер.

Я вообще не понимаю, зачем делать обучающие статьи, если есть ИТС, дев-трейн и тому подобное, я вообще не понимаю, с какой радости я должен делиться тем, что сам изучил и потратил своё время, с кем-то ещё. Чтобы пионеры халявили и не умели сами? Нетушки, мне потом такие сотрудники не будут нужны. Единственный раз, когда я сделал такую статью, грешен, это когда про XPath - сам себе антисклерозник соорудил, примерно как Трактор в своё время. Ну хотите, её тоже во вне-рейтинговую перекину?

Если человек сам, носом, ползком по шпалам, не пролопатит некую тему - раз, два, десять, - он так и останется "одинэснегом", а не программистом-разработчиком. Спрашивают тут на собеседовании у одного: как будете решать такую задачу. А он мне и говорит: "на инфостарте скачаю". Вот и нафига, спрашивается, поощрять лень?
21. starik-2005 2292 23.02.17 19:06 Сейчас в теме
(19)
Если человек сам, носом, ползком по шпалам, не пролопатит некую тему - раз, два, десять, - он так и останется "одинэснегом", а не программистом-разработчиком. Спрашивают тут на собеседовании у одного: как будете решать такую задачу. А он мне и говорит: "на инфостарте скачаю". Вот и нафига, спрашивается, поощрять лень?
Вот поэтому я и пишу обычно псевдокод, чтобы просто так не скопипастить было. Вы тоже так делаете? А кто тут ныл сначала о "дай код":
Если уж упомянули про добавление подчинённых реквизитов к объектам "ДанныеФормыКоллекция", связанным с объектами БД, особенно с основным реквизитом формы, то уж распишите нормально, когда этот кэш сбрасывается и когда нет. И как сериализуется, и как передаётся, итд. А то, знаете, фраза "заполнять данную колонку придется при каждом открытии документа" это далеко-о-о не всё, что придётся делать)))
а потом сетовал о песочнице:
Я не завидую, я огорчён: спрос рождает предложение; такими темпами мы рискуем превратить ИС в песочницу для студентов, а на то и других ресурсов полно, вот хоть devtrain.

Вы уж определитесь, что хотите.
20. Yashazz 3733 23.02.17 16:26 Сейчас в теме
Собственно, потому у таких публикаций и столь высокий рейтинг, что это позволяет делать бездумный копипаст и вообще поменьше напрягаться. И мне не кажется, что поощрять подобный подход - правильно.
22. softberry 2 10.12.18 05:56 Сейчас в теме
Автору спасибо! Сделал немного более универсально. Выходила ошибка при добавлении более одной таблицы на форму. Поэтому добавил параметр ПостфиксИмениКолонки. Если более 1 таблицы на форме, то его нужно заполнять любым символом, например, "_1"
Процедура СоздатьТаблицуНаФорме(ТаблицаИсточник, ИмяТаблицыНаФорме, ПостфиксИмениКолонки = "")
	// добавим таблицу: сначала саму таблицу, потом колонку.
	Реквизиты = Новый Массив;
	Реквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицыНаФорме, Новый ОписаниеТипов("ТаблицаЗначений")));
	Для Каждого Ст ИЗ ТаблицаИсточник.Колонки Цикл
		Реквизиты.Добавить(Новый РеквизитФормы(Ст.Имя, Ст.ТипЗначения, ИмяТаблицыНаФорме));
	КонецЦикла;

	// добавим реквизиты на форму
	ИзменитьРеквизиты(Реквизиты);

	// добавим элементы формы
	Таб = Элементы.Добавить(ИмяТаблицыНаФорме, Тип("ТаблицаФормы"));
	Таб.ПутьКДанным = ИмяТаблицыНаФорме;

	// запретим менять положение строк и сами строки, отключим командную панель
	Таб.ИзменятьСоставСтрок = Ложь;
	Таб.ИзменятьПорядокСтрок = Ложь;
	Таб.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;

	Для Каждого Ст ИЗ ТаблицаИсточник.Колонки Цикл
		Рек = Элементы.Добавить("Колонка" + Ст.Имя + ПостфиксИмениКолонки, Тип("ПолеФормы"), Таб);
		Рек.Вид = ВидПоляФормы.ПолеНадписи;
		Рек.Заголовок = Ст.Заголовок;
		Рек.ПутьКДанным = ИмяТаблицыНаФорме + "." + Ст.Имя;
	КонецЦикла;

	// заполним таблицу
	ЗначениеВРеквизитФормы(ТаблицаИсточник, ИмяТаблицыНаФорме);
КонецПроцедуры
Показать
user7777777; +1 Ответить
23. worker-good 03.07.19 12:14 Сейчас в теме
(22)
Процедура СоздатьТаблицуНаФорме(ТаблицаИсточник, ИмяТаблицыНаФорме, ПостфиксИмениКолонки = "")
// добавим таблицу: сначала саму таблицу, потом колонку.
Реквизиты = Новый Массив;
Реквизиты.Добавить(Новый РеквизитФормы(ИмяТаблицыНаФорме, Новый ОписаниеТипов("ТаблицаЗначений")));
Для Каждого Ст ИЗ ТаблицаИсточник.Колонки Цикл
Реквизиты.Добавить(Новый РеквизитФормы(Ст.Имя, Ст.ТипЗначения, ИмяТаблицыНаФорме));
КонецЦикла;

// добавим реквизиты на форму
ИзменитьРеквизиты(Реквизиты);

// добавим элементы формы
Таб = Элементы.Добавить(ИмяТаблицыНаФорме, Тип("ТаблицаФормы"));
Таб.ПутьКДанным = ИмяТаблицыНаФорме;

// запретим менять положение строк и сами строки, отключим командную панель
Таб.ИзменятьСоставСтрок = Ложь;
Таб.ИзменятьПорядокСтрок = Ложь;
Таб.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;

Для Каждого Ст ИЗ ТаблицаИсточник.Колонки Цикл
Рек = Элементы.Добавить("Колонка" + Ст.Имя + ПостфиксИмениКолонки, Тип("ПолеФормы"), Таб);
Рек.Вид = ВидПоляФормы.ПолеНадписи;
Рек.Заголовок = Ст.Заголовок;
Рек.ПутьКДанным = ИмяТаблицыНаФорме + "." + Ст.Имя;
КонецЦикла;

// заполним таблицу
ЗначениеВРеквизитФормы(ТаблицаИсточник, ИмяТаблицыНаФорме);
КонецПроцедуры
Показать


Не работает твой код
24. user7777777 02.10.19 14:36 Сейчас в теме
(23) Код работает, не выдумывайте, только что проверил
25. кольщик 23.11.19 11:16 Сейчас в теме
А если таблица значений уже есть на форме и ее не нужно создавать, какая часть кода остается?
26. starik-2005 2292 23.11.19 15:28 Сейчас в теме
(25) которая создает подчиненный табличной части реквизит-колонку и элемент, связанный с ней, на форме...
27. gupbhk1 11.04.20 16:10 Сейчас в теме
Ошибка
{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(249)}: Ошибка при вызове метода контекста (ИзменитьРеквизиты)
ИзменитьРеквизиты(Реквизиты);
по причине:

Неуникальное имя реквизита. Имя: "ТаблицаНаФорме"
28. starik-2005 2292 11.04.20 17:21 Сейчас в теме
(27)
Неуникальное имя реквизита. Имя: "ТаблицаНаФорме"
Ну так назовите его уникально )))
29. gupbhk1 11.04.20 21:14 Сейчас в теме
(28) Хорошо, это победил. Но что Вы скажите на ошибку снизу?


// добавим элементы формы
	Таб = Элементы.Добавить("ТаблицаНаФорме", Тип("ТаблицаФормы"));
	Таб.ПутьКДанным = "ТаблицаНаФорме";




{ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(253)}: Ошибка при установке значения атрибута контекста (ПутьКДанным)
Таб.ПутьКДанным = "ТаблицаНаФорме";
по причине:
Недопустимое значение
Недопустимое значение
30. denisros 12.04.20 21:57 Сейчас в теме
(29) А вы уверены, что созданная вами таблица значений или ТЧ формы, как реквизит этой формы, называется "ТаблицаНаФорме"?
Т.е. есть элементы формы, которые вы создаёте в:
Таб = Элементы.Добавить("ТаблицаНаФорме", Тип("ТаблицаФормы"));

А есть реквизиты формы, на который вы ссылаетесь:
Таб.ПутьКДанным = "ТаблицаНаФорме";

Т.о. в этот момент должен существовать реквизит формы "ТаблицаНаФорме"
31. Bespechnii_kot 16.10.20 12:35 Сейчас в теме
Благодарю за код, уже работает)
32. hiduk 104 11.12.20 11:22 Сейчас в теме
Оставьте свое сообщение
Вопросы с вознаграждением