|
Интересно, как заполнить массив структурами? | ☑ | ||
---|---|---|---|---|
0
uncknow
10.10.13
✎
10:48
|
Приходится извращаться немного с УФ. Надо записи из БД записать в массив. Решил Запись запихать в структуру, а структуру в массив. Получилась интересная фигня, что в массиве хранится ссылка на структуру а не сама структура. И в массиве все значения заполнены последней записью из БД, т.е. ссылкой на структуру.
Вопрос: Как заполнить массив значениями записей из БД? Может как-то можно извратиться со структурой? |
|||
1
eklmn
гуру
10.10.13
✎
10:56
|
так в массиве данныеБД или структуры?
|
|||
2
Нуф-Нуф
10.10.13
✎
10:58
|
определяй структуру заново перед добавлением значений в структуру и помещением структуры в массив
|
|||
3
Нуф-Нуф
10.10.13
✎
10:58
|
цикл
новый структура структура вставить массив добавить структура как-то так |
|||
4
uncknow
10.10.13
✎
11:00
|
(3) Думал над этим сейчас проверю. Есть еще одна мысля - это ЗначениеВСтрокуВнутр() :)
|
|||
5
uncknow
10.10.13
✎
11:03
|
(3) Не работает такой вариант
|
|||
6
uncknow
10.10.13
✎
11:05
|
ЗначениеВСтрокуВнутр() - а эта функция только на сервере работает. Можно конечно попробовать но это изврат :(
|
|||
7
uncknow
10.10.13
✎
11:18
|
Работает через ЗначениеВСтрокуВнутр(). Но скорость обработки падает раз в 5. При больших объемах этот очень критично.
|
|||
8
Defender aka LINN
10.10.13
✎
11:46
|
(5) Врешь ведь.
(0) Давай задачу целиком, а то тут опять налицо изобретение велоката с квадратными колесами |
|||
9
Serginio1
10.10.13
✎
12:05
|
В оБщегоНазначения есть такие функции
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт Массив = Новый Массив(); СтруктураСтрокой = ""; НужнаЗапятая = Ложь; Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл Если НужнаЗапятая Тогда СтруктураСтрокой = СтруктураСтрокой + ","; КонецЕсли; СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя; НужнаЗапятая = Истина; КонецЦикла; Для Каждого Строка Из ТаблицаЗначений Цикл НоваяСтрока = Новый Структура(СтруктураСтрокой); ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка); Массив.Добавить(НоваяСтрока); КонецЦикла; Возврат Массив; КонецФункции // Функция СтрокаТаблицыЗначенийВСтруктуру создает // структуру со свойствами, как колонки таблицы // значений передаваемой строки // и устанавливает этим свойствам значения // из строки таблицы значений // // Параметры: // СтрокаТаблицыЗначений - СтрокаТаблицыЗначений // // ВозвращаемоеЗначение: // Структура // Функция СтрокаТаблицыЗначенийВСтруктуру(СтрокаТаблицыЗначений) Экспорт Структура = Новый Структура; Для каждого Колонка Из СтрокаТаблицыЗначений.Владелец().Колонки Цикл Структура.Вставить(Колонка.Имя, СтрокаТаблицыЗначений[Колонка.Имя]); КонецЦикла; Возврат Структура; КонецФункции |
|||
10
uncknow
14.10.13
✎
10:11
|
(8) Ну почему врешь? :)
Попробуй заполнить массив структурами - точно говорю, результат интересный будет. По всякому попробуй. А задача целиком - загрузка данных из Оракла, с возможностью во время загрузки выбирать соответствия для некоторых объектов. Вообще вернулся к старому варианту решения задачи. Сделал Таблицу на форме и гружу сначала данные из Оракла туда, а потом уже обрабатываю в цикле. |
|||
11
MrStomak
14.10.13
✎
10:15
|
(10) Я делал так 100500 раз, массив из структур, на каждой итерации новая структура. На платформе 8.2. В массив, естественно, передается указатель (но не ссылка, какая ссылка у структуры?), но он каждый раз новый получался при создании новой структуры.
|
|||
12
MrStomak
14.10.13
✎
10:15
|
(10) Ну и вышеприведенный код как бы символизирует что так и должно работать...
|
|||
13
uncknow
14.10.13
✎
10:38
|
(12) А где делал? На клиенте или на сервере?
|
|||
14
Михаил 1С
14.10.13
✎
10:45
|
(0) Прочти хорошо правила работы с массивами и со структурами и не торопясь сделай. Если не получается - возьми отладчик, и проползи на пузе каждый шаг цикла, итерации две проследи в отладчике, наверняка найдешь ошибку.
|
|||
15
Dzenn
гуру
14.10.13
✎
10:51
|
Инициализируй структуру в цикле, Нафаня!
|
|||
16
Зойч
14.10.13
✎
10:53
|
создай тч на форме и не мучайся
|
|||
17
uncknow
14.10.13
✎
11:00
|
(16) так и было, решил попробовать другой способ.
(15) Конечно же так и делал. (14) Ну а как я по твоему видел, что в массиве все структуры пустые, когда делаешь через инициализацию структуры. Хотя думаю стоит еще раз попробовать что за фигня при записи структуры в массив. :( |
|||
18
Лефмихалыч
14.10.13
✎
11:01
|
(0) ты забыл написать, зачем ты это всё делаешь
|
|||
19
Михаил 1С
14.10.13
✎
11:17
|
(17) Да ты видимо в отладчике только итог посмотрел. А надо на каждом шаге смотреть значения всех переменных. Массив (длина его, да и на F2 посмотреть), текущая ячейка массива, переменная-структура, и что там у тебя еще есть?
Раз совсем ничего не понятно - делай так. Похоже, что ты еще ленишься, ибо не сказал нам - на каком шаге произошел космический глюк. Мы бы тебе сразу подсказали. |
|||
20
uncknow
14.10.13
✎
11:51
|
(19) Какой ИТОГ? :))) Расскажу как происходит. Цикл, инициализируется структура, заполняется значениями из записи БД, Добавляется в массив. Все отлично, в массиве значения первой записи как надо. Переходим на вторую итерацию, после инициализации структуры в первой записи массива есть тип значения структура, но пустое.
|
|||
21
uncknow
14.10.13
✎
11:51
|
(18) Смотри (10)
|
|||
22
uncknow
14.10.13
✎
11:52
|
(19) Если структуру не инициализировать, то во всем массиве значения последней структуру в него записанной
|
|||
23
User_Agronom
14.10.13
✎
11:54
|
(11) Да, в цикле заполнения должна стоять строка
НС = новый Структура. Сталкивался и уже удивлялся. Гуглил - чего-то народ пишет глюк платформы... |
|||
24
1Сергей
14.10.13
✎
11:55
|
(20) Структуру создавай внутри цикла, каждый раз новую и не люби людям моск
|
|||
25
uncknow
14.10.13
✎
11:59
|
(24) Еще раз говорю, у меня структура внутри цикла создается новая, вот так:
НС = новый Структура; |
|||
26
1Сергей
14.10.13
✎
12:00
|
(25) каковы ваши доказательства?
|
|||
27
Михаил 1С
14.10.13
✎
12:02
|
(25) Ты приведи КООД!
Но не весь-весь код программы, а те строки, которые относятся к делу, ну можешь чуть больше написать, но чуть. То есть - цикл напиши, инициализацию струкруты, как она заполняется, как заполняется элемент массива. Если у структуры 20 полей, покажи только как одно поле у нее заполняется. |
|||
28
Михаил 1С
14.10.13
✎
12:04
|
Есть подозрение на то, что ты в структуру присваиваешь ссылку, типа саму Выборка. А далее пишешь Выборка.Слудующий(), в итоге у всех элементов массива все одно и тоже.
|
|||
29
uncknow
14.10.13
✎
12:05
|
(26) (25)
На днях еще раз попоробую все это дело поднять. Там два варианта или глюк или я что-то недосмотрел :) Отчитаюсь о результатах ;) |
|||
30
Михаил 1С
14.10.13
✎
12:06
|
ты случаем не так делаешь?
Пока Выборка.Следующий() Цикл НС = новый Структура(); НС = Выборка(); эл = Массив.Добавить(); //присваиваешь элемент массива структуре КонецЦикла |
|||
31
uncknow
14.10.13
✎
16:00
|
Делаю вот так:
|
|||
32
Serginio1
14.10.13
✎
16:13
|
(31) Так НС у тебя получается Выборка.
Выгрузи в ТЗ и примени код из (9) |
|||
33
uncknow
14.10.13
✎
16:16
|
(32) Ну тут конечно же упрощено, не
НС = Выборка() , а НС = СокрЛП(RecordSet.Fields("ИННКонтрагента").Value) и тому подобное :)
А во вторых, какая нафиг ТЗ на клиенте? :) |
|||
34
Serginio1
14.10.13
✎
16:28
|
А какая выборка на клиенте?
|
|||
35
Serginio1
14.10.13
✎
16:30
|
Ты бы лучше код показал. А то телепатов здесь мало.
|
|||
36
Михаил 1С
15.10.13
✎
06:20
|
(33) "Ну тут конечно же упрощено"
Офигеть. Нет слов. Ты не знаешь синтаксис 1С, ведь ты упрощаешь с потерей смысла! Ты хочешь помощи в поиске ошибки, а приводишь не свой код. Так мы и занимаемся не тем. |
|||
37
Михаил 1С
15.10.13
✎
06:24
|
(33) Так у тебя значит
НС = новый Структура(); НС = СокрЛП(RecordSet.Fields("ИННКонтрагента").Value); Массив.Добавить(НС); Значит НС у тебя уже не структура, а строка. То есть у тебя так получится массив строк. А ты говоришь, что в массиве - структура, и в каждом элементе одно и тоже. Что-то ты опять упростил :) Упростил, с потерей смысла. В общем, соврал ты. |
|||
38
Михаил 1С
15.10.13
✎
06:26
|
Да еще у тебя работа с RecordSet и прочими барабанами. В этих дебрях можно легко ошибиться, а ты нам самого главного и не показываешь! Ну ты даешь!
Телепаты! - вы почему молчите и не приходите помогать автору статьи? |
|||
39
Ненавижу 1С
гуру
15.10.13
✎
06:30
|
Пока Выборка.Следующий() Цикл
НС = новый Структура(); //следующая строка сделает эту бессмысленой НС = Выборка(); //это что за метод? Массив.Добавить(НС); КонецЦикла |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |