Добавить структуру в массив 1с

Обновлено: 07.07.2024

Добрый день. Подскажите, пожалуйста как можно записать структуру в массив и далее вытащить из массива нужный элемент из структуры?

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Запись данных в массив структуры
Здравствуйте. Создаю структуру и массив для неё в 14 ячеек: typedef struct sData < const.

Запись структуры в файл
имеется одномерный массив типа структуры base struct base < String name; String work; .

Запись в файл структуры
Есть структура Помогите реализовать запись в файл? Мой вариант не работает.

Все верно
кроме названия массива massiv_preassure и его типа (int вместо Complex)
вытаскивать из массива так -
Raali, да название массива случайно не правильно написал. А вот про тип можно поподробнее не совсем понял. И подскажите, пожалуйста, как потом обратиться к элементу структуры в массива? не совсем правда понятно зачем тебе 2D массив, ну да ладно

Raali, Я как раз дальше хочу добавить еще одну структуру в этот массив, но как мне быть ведь они будут конфликтовать и выдавать ошибку?

дак у тебя до сих пор остался int
плюс ко всему в массив вида [x][1] нельзя добавить два элемента во второй индекс так как их всего 1

Raali, извините, что совершаю глупые ошибки, но всё равно с массивом не понимаю. Если мы объявляем его как первая структура, то вторая начинается ругаться при записи в нее, то что она объявлена по другому. Не совсем понимаю еще

Complex и Write это 2 разных типа
Так нельзя, создавать массив из разных типов)


можно на крайняк 2 массива создать или еще одну структуру которая объединяет Complex и Write либо

вопрос скорее в том, что нужно этим добиться?
я подозреваю что ты не совсем понимаешь зачем ты добавил новый тип Write в программу вообще. Raali, так, вы спускаете меня на землю Тогда, подскажите, если это возможно переделать структуры, чтобы они были одного типа и их можно было записать в один массив?

Решение

смотри, есть int, есть float, у них разные цели, int хранит целые числа, float - c запятой. (по этому они называются по-разному)
Complex это тоже тип, он хранит какой то триплет (a,b,c)
какой смысл создавать новый тип Write?

Если его не было, то тогда пойдем дальше
есть struct Complex, нужно создать 2 его экземпляра точно так же как мы это делаем с простыми типами ( int a; )

Raali, ход мыслей вроде понятен. Мне нужно сделать две структуры одного типа и записывать их в массив (заполнить его), чтобы потом работать с массивом. Я понял, что нужно сделать структуры одного типа, но теперь мне не понятно, как мне обращаться к структуре первой и второй Т.е. получается как-то нужно задам им имена и обращаться к ним (впервые столкнулся со структурами)

Добавлено через 11 минут
Raali, Круто, сделал как вы сказали, теперь вроде всё пошло. Буду тестировать, смотреть. А еще вопрос, для обращения к какому либо элементу необходимо сделать так?

Приходится извращаться немного с УФ. Надо записи из БД записать в массив. Решил Запись запихать в структуру, а структуру в массив. Получилась интересная фигня, что в массиве хранится ссылка на структуру а не сама структура. И в массиве все значения заполнены последней записью из БД, т.е. ссылкой на структуру.
Вопрос: Как заполнить массив значениями записей из БД? Может как-то можно извратиться со структурой?

определяй структуру заново перед добавлением значений в структуру и помещением структуры в массив

(3) Думал над этим сейчас проверю. Есть еще одна мысля - это ЗначениеВСтрокуВнутр() :)

ЗначениеВСтрокуВнутр() - а эта функция только на сервере работает. Можно конечно попробовать но это изврат :(

Работает через ЗначениеВСтрокуВнутр(). Но скорость обработки падает раз в 5. При больших объемах этот очень критично.

(5) Врешь ведь.
(0) Давай задачу целиком, а то тут опять налицо изобретение велоката с квадратными колесами

(8) Ну почему врешь? :)
Попробуй заполнить массив структурами - точно говорю, результат интересный будет. По всякому попробуй.
А задача целиком - загрузка данных из Оракла, с возможностью во время загрузки выбирать соответствия для некоторых объектов.
Вообще вернулся к старому варианту решения задачи. Сделал Таблицу на форме и гружу сначала данные из Оракла туда, а потом уже обрабатываю в цикле.

(10) Я делал так 100500 раз, массив из структур, на каждой итерации новая структура. На платформе 8.2. В массив, естественно, передается указатель (но не ссылка, какая ссылка у структуры?), но он каждый раз новый получался при создании новой структуры.

(10) Ну и вышеприведенный код как бы символизирует что так и должно работать.

(0) Прочти хорошо правила работы с массивами и со структурами и не торопясь сделай. Если не получается - возьми отладчик, и проползи на пузе каждый шаг цикла, итерации две проследи в отладчике, наверняка найдешь ошибку.

(16) так и было, решил попробовать другой способ.
(15) Конечно же так и делал.
(14) Ну а как я по твоему видел, что в массиве все структуры пустые, когда делаешь через инициализацию структуры. Хотя думаю стоит еще раз попробовать что за фигня при записи структуры в массив. :(

(17) Да ты видимо в отладчике только итог посмотрел. А надо на каждом шаге смотреть значения всех переменных. Массив (длина его, да и на F2 посмотреть), текущая ячейка массива, переменная-структура, и что там у тебя еще есть?

Раз совсем ничего не понятно - делай так. Похоже, что ты еще ленишься, ибо не сказал нам - на каком шаге произошел космический глюк.
Мы бы тебе сразу подсказали.

(19) Какой ИТОГ? :))) Расскажу как происходит. Цикл, инициализируется структура, заполняется значениями из записи БД, Добавляется в массив. Все отлично, в массиве значения первой записи как надо. Переходим на вторую итерацию, после инициализации структуры в первой записи массива есть тип значения структура, но пустое.

Объекты типа массив в 1С 8.3 представляют собой совокупность упорядоченных значений любого типа, в том числе и типа «массив», что в свою очередь позволяет организовывать многомерные массивы. Идентификация значений осуществляется по индексам, нумерация которых начинается с «0».

Создание массива

Синтаксис:

Примеры:

Добавление элементов в массив

Примеры:


Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>



Получение значения элемента по индексу

Поиск в массиве 1С

Присвоение значений элементам массива

Примеры:

Как узнать количество элементов массива (размер массива)

Перебор массива 1С

Примеры:

Перебор всех элементов двумерного массива

Примеры:

Удаление элементов из массива

Примеры:

Как разложить строку в массив


Пример преобразования массива в список значений


Пример преобразования массива в таблицу значений


Сортировка массива 1С разными способами

Примеры:

Как свернуть массив в 1С

Пример:


Поддержите нас, расскажите друзьям!

СПРОСИТЕ в комментариях!

Услуги 1С

Наш канал на Youtube


При использовании данного сайта, вы подтверждаете свое согласие на использование файлов cookie в соответствии с настоящим уведомлением в отношении данного типа файлов. Если вы не согласны с тем, чтобы мы использовали данный тип файлов, то вы должны соответствующим образом установить настройки вашего браузера или не использовать сайт.

Отправляя любую форму на сайте, вы соглашаетесь с политикой конфиденциальности данного сайта.

Нужно было добится хранения по типу "Параметр - Значение" в массиве.
Пример реализации типа Record (Pascal) в массиве. Но, значения передаются в массив по ссылке (!), что значительно усложняло задачу.

В Итоге получется что массив[0].знач1 = 510 . Все элементы массива ссылаются на одну переменную.
Проблема была решены следующим образом.

Как ни сиранно, но обект структуры не уничтожился после завершения работы функции. И теперь доступен из другой процедуры.
А вот теперь вопрос! Как долго будут "жить" объекты структуры в массиве? Когда 1С уничтожает объекты?
Хочу услашать ваши мнения, критику и альтернативные решения. Спасибо за внимание. __________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Преобразование таблицы значений в массив структур
Не могли бы помочь с этим преобразованием. А то тз на клиент нельзя передать, а знающие люди.

Блочная сортировка структур (Отсортировать массив структур по фамилии)
Подскажите алгоритм блочной сортировки структур на языке С++. Мне нужно отсортировать массив.

Не уверен, что понял вопрос
Попытаюсь прояснить (может и ответить)
На сколько я знаю, 1С (по крайней мере 7.7) всегда передает в процедуры сам объект, а не ссылку
Соответственно, после вызова ПолучитьСтруктуруДопСправочника(мас); все данные записанные в мас будут доступны везде, где он объявлен, независимо от типа этой переменной

В принципе, это должно также работать в любом языке
По крайней мере будет верно для C++

А проблема кода

в том, что массив[0] хранит ссылку на объект, который затем изменяется
надо либо хранить объект, либо создавать новый объект каждый раз пред сохранением ссылки в очередной элемент массива Я с Вами полностью согласен - либо создавать новый объект каждый раз. Но вот нюанс - Время "жизни" переменной/объекта (Не глобальной) ограничевается функцией (В моём случае объект "структура") - покрайней мере так написанно во всех справочниках. Т.е. создал в функции, а пользоватся надо в другой процедуре. Если предположить что в выражении массив[0] = структ; производится именно копирование структуры, а сам структ в дальнейшем уничтожится то проблема решается сама собой.
Но в выражении массив[0] = структ; производится передачи ссылки на объект (Это уже проверенный вариант!) А это значит что, после завершения функции ПолучитьСтруктуруДопСправочника 1С может в любой момент сама уничтожить объект структ. Тогда я потеряю значения всех элементов массива!
Я перефразирую свой вопрос: Когда 1с уничтожает отработанные объекты?

Я перефразирую свой ответ

Я могу и ошибаться, но на 99% уверен, что 1С тоже уничтожает объекты по завершении функции
Но когда выполняется Буффер.Добавить(Новый Структура("Название, КодПоля", дПоля.POLE_NAZV, дПоля.POLE_KODP)), то в Буффер попадает не ссылка, а копия объекта и сия копия не будет уничтожена пока будет жить сам Буффер
В вашем конкретном примере - это везде где объявлен мас

Хотя, как я понял, ваш пример из 1С 8, с которой я не работал и лучше проверить на примере
В любом случае, я уверен, что 1С не уничтожает объекты в произвольный момент, и главное - это убедится, что вы храните копию объекта, а не ссылку на него

На сколько я знаю, 1С (по крайней мере 7.7) всегда передает в процедуры сам объект, а не ссылку Я тут намудрил, точнее говоря неверно использовал термины
Правильнее сказать, что 1С передает именно ссылку (а можно передать только значение, если на это указать) и при изменении переменной внутри процедуры или функции затем будет доступно ее новое значение

Я провёл эксперимен .

В результате получаю след

Это говорит о том, что м буффере хранится именно Ссылка на объект! Следовательно если добавлять елемент Новый структура() то в Буффере будут так же хранится ссылки! А то, что они доступны после завершения функции говорит о том, что объект не уничтожен (по крайней мере сразу). На Pascal такой фокус 100% не прокатит. В общем меня интересует как скопировать объект или узнать: кто, когда, и зачем его удалит.

Повторюсь. Может кто предложит своё решение.

Действительно загадочно
с одной стороны можно изменить на

И наверняка получится
111
222
333

А с другой, действительно непонятно сколько будут храниться объекты ссылки на которые записаны в Буффер
И лично я согласен, что это не вполне корректная ситуация

Но если предположить, что это не глюк, а так и задумано (в расчете на программеров, не изучавших паскаль, си и т.п., которые не очень парятся не счет ссылок и выделения/освобождения памяти), то объекты будут храниться столько же сколько и ссылки в Буффере

Только тогда непонятно, почему сразу не создавать копии, а хранить именно ссылки

f87, если не сложно (мне уже стало интересно) после вывода значений в цикле запишите в один из Элементов новое значение и выведите снова: измениться во всех или только в одном?


Как создать массив

Для создания массива в 1С используется ключевое слово Новый после которого указывается имя класса.

В переменной МассивЗначений будет находиться массив.

В конструкторе массива можно указать количество элементов:

МассивЗначений = Новый Массив ( 8 ) ; //в массиве 8 элементов

Сразу после создания все элементы массива будут равны Неопределено. При этом размер массива может быть изменен, при добавлении в него новых элементов.

Для добавления элементов используется метод Добавить:

Можно добавлять новые элементы в массив через метод Вставить, с указанием индекса, куда нужно вставить новый элемент. Если указать индекс больше чем количество элементов в массиве, то в массив будет добавлено нужное количество элементов со значением Неопределено:

//в массиве [Первый, Второй, Третий, Неопределено, Неопределено, Шестой]

Количество элементов в массиве

При добавлении каждого нового элемента в массив, количество элементов увеличивается на единицу. Получить общее количество элементов в массиве можно с помощью метода Количество:

Индекс массива

//будет ошибка Индекс находится за границами массива

Граница массива

Получить элемент массива

Получить элемент массива можно через квадратные скобки или методом Получить:

Перебор массива

С помощью цикла Для Каждого:

Через цикл Для Каждого нельзя изменить значения массива, меняться будет переменная ЭлементМассива.

Перебрать массив можно и через цикл Для. В этом случае через индекс можно изменять значения массива:

//метод ВГраница() возвращает максимальный индекс массива

Поиск в массиве

Для поиска значений в массиве предназначен метод Найти. Параметром нужно передать значение, которое нужно найти в массиве. А вернет метод индекс элемента в массиве, если он найден, и Неопределено, если такого значения нет в массиве. Нужно учитывать, что чем больше массив, тем медленнее будет выполняться поиск в нем, так как поиск в массиве выполняется перебором всех элементов.

Читайте также: