Имя: Пароль:
1C
1С v8
Интересно, как заполнить массив структурами?
,
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
Пока Выборка.Следующий() Цикл
НС = новый Структура(); //следующая строка сделает эту бессмысленой
НС = Выборка(); //это что за метод?
Массив.Добавить(НС);
КонецЦикла