Програмное обращение к массиву

1. user654641_yaga_m 13 23.06.23 11:46 Сейчас в теме
ДД коллеги, задам может глупый вопрос, но ответа нигде не нашел...

Все знают и пользуются методом НайтиСтроки ТЧ. возвращает Массив, в котором "скопированы" названия колонок ТЧ. Программное обращение к данному массиву сродни обращению к Структуре. Например:

НайденныеСтроки[0].Сумма

Задался вопросом как определить есть ли в массиве условно говоря столбец с нужным названием? В Массиве нет как в Структуре свойство ИмяКлюча.

Кто что знает?
По теме из базы знаний
Найденные решения
14. truba 23.06.23 12:11 Сейчас в теме
(5)
Док = Документы.Документ1.СоздатьДокумент();
НС = Док.ТабличнаяЧасть1.Добавить();
Сообщить(ТипЗнч(НС));
Мт = Метаданные.найтиПоТипу(ТипЗнч(НС));
Сообщить(Мт.Родитель());


дальше сам
user1619761; +1 Ответить
20. spacecraft 23.06.23 12:21 Сейчас в теме
(17)
ТЗ = ТаблТоваров.ВыгрузитьКолонки();
Колонки = ТЗ.Колонки;
Если Колонки.Найти("ИмяКолонки") = Неопределено Тогда
   // нет такой колонки
КонецЕсли;
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. truba 23.06.23 11:53 Сейчас в теме
(1)НайтиСтроки возвращает массив строкТЧ, строкаТЧ это отдельный программный объект. Вот массив этих объектов и возвращается.
Вы когда МояТЧ.Добавить() - пишете, вы вызываете конструктор объекта СтрокаТЧ.
3. user654641_yaga_m 13 23.06.23 11:59 Сейчас в теме
(2)Я это знаю. Вопрос в другом! Хорошо, сформулирую чуть по другому: как найти определенное название Колонки в ТЧ ? или в массиве строк?
5. truba 23.06.23 12:00 Сейчас в теме
(3) некрасиво но быстро Попытка МояСтрока[КакаяТоКолонка] Исключение КонецПопытки. Красиво сейчас покажу
14. truba 23.06.23 12:11 Сейчас в теме
(5)
Док = Документы.Документ1.СоздатьДокумент();
НС = Док.ТабличнаяЧасть1.Добавить();
Сообщить(ТипЗнч(НС));
Мт = Метаданные.найтиПоТипу(ТипЗнч(НС));
Сообщить(Мт.Родитель());


дальше сам
user1619761; +1 Ответить
21. user654641_yaga_m 13 23.06.23 12:36 Сейчас в теме
(14) Спасибо навел на хорошую мысль! Получилось не сложно. Вот так:

Для каждого Строчка Из ТаблицаВыб Цикл
			ТаблТоваров = Строчка.Документ.Товары;
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("Номенклатура", Строчка.Номенклатура);
			СтрокаНомен = ТаблТоваров.НайтиСтроки(ПараметрыОтбора);
			Строчка.Цена = СтрокаНомен[0].Цена;
			ИскомаяКолонка = Метаданные.НайтиПоТипу(ТипЗнч(ТаблТоваров)).Реквизиты.СуммаНДС;
			Если ИскомаяКолонка <> Неопределено Тогда
				Строчка.НДС = СтрокаНомен[0].СуммаНДС;
			КонецЕсли;
		КонецЦикла;
Показать
24. spacecraft 23.06.23 13:22 Сейчас в теме
(21) для такого кода можно не искать колонку в метаданных. Воспользоваться заполнением свойств.
Для каждого Строчка Из ТаблицаВыб Цикл
ТаблТоваров = Строчка.Документ.Товары;
ПараметрыОтбора = Новый Структура("Номенклатура", Строчка.Номенклатура);
СтрокаНомен = ТаблТоваров.НайтиСтроки(ПараметрыОтбора);
Если СтрокаНомен.Количество() > 0 Тогда
   ЗаполнитьЗначенияСвойств(Строчка,СтрокаНомен[0]);
КонецЕсли;
КонецЦикла;
Показать
6. user1826630 23.06.23 12:02 Сейчас в теме
(3) А это уже реквизиты. Ищи в метаданных.
4. spacecraft 23.06.23 12:00 Сейчас в теме
(1) массив содержит только значения.
В данном случае ссылки на строки ТЧ.
Имена колонок можно получить у самой ТЧ.
7. truba 23.06.23 12:02 Сейчас в теме
(4) есть такая тема что массив строк ТЧ (ладно, ссылок на строки ТЧ) уедет в ОбщийМодуль.ОбщийМетод() параметром и там надо без доступа к самому объекту владельцу ТЧ понять с чем имеем дело.
Может у ТС не так, но задачка интересная
11. spacecraft 23.06.23 12:07 Сейчас в теме
(7) а можно передавать просто массив цифр и требовать найти колонки неизвестной ТЧ.
Для правильной работы необходимо предоставить необходимы минимум исходных данных.
Передавать в метод помимо массива ссылок ТЧ и данные о самой ТЧ.
16. truba 23.06.23 12:14 Сейчас в теме
(11) "надо изучать и другие языки программирования"(с) spacecraft - в java у вас бы не возникло таких вопросов, т.к. любой объект это прежде всего объект со всеми вытикающими свойствами и методами.

Вот у любого объекта 1С есть косвенный реквизит по которому что то можно сделать еще это его тип.
18. spacecraft 23.06.23 12:16 Сейчас в теме
(16)
т.к. любой объект это прежде всего объект со всеми вытикающими свойствами и методами.

Вот только не надо... иначе не было бы там рефлексии. Просто в 1С это еще хуже.
8. user654641_yaga_m 13 23.06.23 12:04 Сейчас в теме
9. spacecraft 23.06.23 12:05 Сейчас в теме
(8) пример, на котором показывать где?
10. user654641_yaga_m 13 23.06.23 12:07 Сейчас в теме
(9)Как в ТЧ найти нужную колонку? Вопрос не праздный - получаю таблицу Товары с разных документов. В некоторых нет НДС - соответственно разный механизм обработки...
12. spacecraft 23.06.23 12:08 Сейчас в теме
13. user654641_yaga_m 13 23.06.23 12:10 Сейчас в теме
(4)Отвечай за "базар", а не отделывайся набором слов: покажи как "...Имена колонок можно получить у самой ТЧ"
15. spacecraft 23.06.23 12:11 Сейчас в теме
(13) не хами. Если не понятна эта фраза, то проблема не в этой фразе.
Ты передаешь что? ТЧ или таки ДанныеФормыКоллекция? Проверь тип данных, которые передаешь и попытайся понять разницу.
17. user654641_yaga_m 13 23.06.23 12:14 Сейчас в теме
(15)Простой пример: никуда ничего не передаю:

ТаблТоваров = Строчка.Документ.Товары;
			ПараметрыОтбора = Новый Структура;
			ПараметрыОтбора.Вставить("Номенклатура", Строчка.Номенклатура);
			СтрокаНомен = ТаблТоваров.НайтиСтроки(ПараметрыОтбора);
20. spacecraft 23.06.23 12:21 Сейчас в теме
(17)
ТЗ = ТаблТоваров.ВыгрузитьКолонки();
Колонки = ТЗ.Колонки;
Если Колонки.Найти("ИмяКолонки") = Неопределено Тогда
   // нет такой колонки
КонецЕсли;
23. user654641_yaga_m 13 23.06.23 12:40 Сейчас в теме
22. DBV 23.06.23 12:37 Сейчас в теме
(1) Как вариант воспользоваться БСП, есть метод в общем модуле ОбщегоНазначенияКлиентСервер.ЕстьСвойствоОбъекта
Вроде так называется

Там проверка без обращения к метаданным

Условно говоря создается структура с ключом имени вашей проверяемой колонки, заполняется уникальным идентификатором
После этого вызывается ЗаполнитьЗначенияСвойств
И проверка, что значение структуры совпадает с вышеуказанным идентификатором

Если не совпадает, значит заполнение прошло и данная колонка есть у строки
19. truba 23.06.23 12:20 Сейчас в теме
(17) Метаданные.НайтиПоТипу(ТипЗнч(СтрокаНомен[0])).Родитель().ТабличныеЧасти[ТипЗнч(СтрокаНомен[0].Имя].Реквизиты

писал на вскидку, но догадаешься

ПС. дофига ошибок, так лучше:
типЗначения = ТипЗнч(СтрокаНомен[0]);
Мт = Метаданные.НайтиПоТипу(типЗначения).Родитель();


КоллекцияКолонок = Мт.ТабличныеЧасти[Метаданные.НайтиПоТипу(типЗначения).Имя].Реквизиты;
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот