Как структуру преобразовать в массив 1с
До появления управляемых форм при работе с данными, особенно в 1С 7.7, использовалась таблица значений. Как же сейчас использовать таблицу значений в тонком клиенте 1с.
Если почитать справку к объекту Таблица значений, то мы видим, что он доступен только для: Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер). Действительно в тонком клиенте его нельзя использовать т.к. клиентское приложение (в том числе и веб-клиент) о таком объекте не знают. Выходом из положения может послужить массив структур. Используя такое сочетание можно пользоваться данными как таблицей значений.
Кратко о массиве структур
Начнем со структуры. Структура это коллекция пар Ключ-Значение
если представить таблицу изображенную выше следующим образом: все ключи записать сверху, а значения под ними, то у нас получится строка похожая на строку таблицы значений
"НомерСтроки" | "Номенклатура" | "Цена" |
1 | Табурет | 25 |
Массив это коллекция содержащая значения подобно списку
Значение1 |
Значение2 |
Значение3 |
В нашем случае каждая строка массива будет содержать не просто значение, а структуру. Все структуры массива будут содержать одинаковые ключи
Структура1 |
Структура2 |
Структура3 |
Работа с массивом структур аналогична работе с таблицей значений
Пример функции преобразующей Таблицу значений в массив структур
Весь код функции исполняется на сервере, т.к. мы помним, что на клиенте нет такого объекта ТаблицаЗначений
В типовых конфигурациях такой функционал существует
В типовых конфигурациях в которых встроена БСП(Библиотека Стандартных Подсистем) в общем модуле "ОбщегоНазначения" есть функция "ТаблицаЗначенийВМассив", хотя возможно от версии БСП название метода и его расположение может быть другим
Таблица значений в массив структур без перебора коллекции колонок для каждой строки таблицы.
Да, как вариант собрать колонки таблицы значений в массив и через "СтрСоединить" закинуть их в строку. +
Открытие века. Просто прям без комментариев. интересно, теперь каждый новичок, открывший для себя нечто офигительное, что на самом деле сто лет как общеизвестно и относится к базовым навыкам, будет теперь радостно постить на ИС? Типа личный дневничок? Так, что ли? Вообще не понимаю, куда смотрят модераторы и какова ценность подобных, кхм, "публикаций".
(5)Скажи спасибо что я не сделал обработку за 1 стартмани, которую ты бы купил. На инфостарте сидят не только такие гуру 1с - как ты. Иначе бы от силы здесь было бы только 100 человек, среди которых ты бы и писал такие обработки.
Эта информация не несет никакой коммерческой цели - и если это пропустили модераторы, значит все соответствует правилам. А ты просто очередной нытик, который всем не доволен.
Давай на инфостарте оставим только супер разработки, и я уверен что посещаемость его в разу понизится, что не выгодно владельцам сайта. Как раз такие посты и несут большую часть трафика на сайт.
likov2001; lsnr; user717534; user785225; Santa1; KoC_one; Flok; ДимокШ; jaroslav.h; Anchoret; Ivanov_OM; pavlov_dv; 1serger; json; + 14 – 1 Ответить
(7) Давай тогда так. Инфостарт, по крайней мере когда я сюда пришёл, позиционировался как сообщество профессионалов. Которые делают серьёзные вещи и публикуют их. А не как песочница для начинающих ламеров и нубов, уронивших планку настолько ниже плинтуса, что 1С-ников за программистов не считают. Ты - именно такой "пионэр". Это не публикация, а детский восторг, что баночка с пюре открывается, если крышечку покрутить. И если ты не заметил, то моя претензия касалась позиционирования ИС в наше время, когда в погоне за "трафиком на сайт" сюда пришли те, для кого "Сообщить("Привет, мир");" уже открытие. А ты перешёл на личности. Следовательно, ты не просто начинающий ламер, а ещё и хамло.
altu71; Klainor; FatPanzer; ktb; ojiojiowka; AlexO; maksa2005; Anchoret; SerVer1C; BigB; ershuevD; wowik; oleganatolievich; + 13 – 5 Ответить
(8)Согласен - я нахамил тебе лично, сказав что ты "нытик"! Может быть я не прав. Именно так и делают, те, кто ноет что инфстарт уже не тот, а раньше было и лучше и т.д. Может это и так - но ныть об этом не стоит. Ничего от этого не изменится.
Но ты не далеко от меня ушел - если судишь о моих достижениях в 1с, только по одному посту. Это тоже говорит о недалеком твоем разуме.
Ну ладно, в любом случае не хотел тебя задеть. Хорошего дня!
(10) Принято. А насчёт "судишь" - каков наезд, такова ответка.
Достижения? Ну давай тогда, расскажи мне об особенностях работы "ЗаполнитьЗначенияСвойств", т.к. их дофига.
(12) Ну ты просто по одному моему посту решил, что я "ламер". Ладно то что я хам - это ты сделал правильный вывод. Теперь пытаешься мериться знаниями по особенностями процедур и функций? Я думал мы закрыли эту тему.
Это ни к чему не приведет, как минимум к хорошему.
(20) ну я сам тот ещё хам, не спорю, но. Я не "меряюсь", я предлагаю привнести полезность в эту, мягко говоря, не очень содержательную публикацию.
(21) Если честно я думал о том, что бы не включать комментарии при оформлении этой статьи - ну отхватила бы статья пару сотен минусов и все. Но комментарии оказывается крутая штука).
"Особенности - ЗаполнитьЗначенияСвойств" - уверен если сделать такую публикацию, то найдется так же пул людей, которые напишут что это очередной бред из БСП и будут предлогать внести полезность в неё).
(25) ну вот не надо про "бред из БСП", там в комментарии, процитированном коллегой из БСП, даже оговорено, чего НЕ стоит пихать в ЗаполнитьЗначенияСвойств. А вообще штука это неоднозначная, и многие юзают её, не вполне понимая подводные камни. Если бы у меня было время, написал бы. Как я тогда проспорил и вынужден был написать про баян-баянистый, про таблицу значений)))
(28) перестань комментарии свои "содержительные" писать и сможешь собрать время на статью по ЗаполнитьЗначенияСвойств. Как ты задолбал своим поносом. Вот же наглая самоуверенная сущность.
ахахаха!
модуль ОбщегоНазначения в ERP:
даже названия переменных те же.
Риник; e-9; fixin; ktb; Xershi; ojiojiowka; Albert_2008; BigB; ershuevD; wowik; 1serger; Yashazz; + 12 – Ответить
(11) плюс еще посмотри как красиво код написан?
Зачем было уродовать его заменой названий переменных?
Код 1С-центральной. а равно и Раруса, уже давно вызывает истерический смех. Они собственные стандарты даже близко не соблюдают.
А что касается публикации, то - не сочтите за наезд, но ещё в 20-лохматом году это было методической рекомендацией разработчикам, лежавшей на сайте ИТС. Так что как бы не припахали плагиат, часом)
(14) С чего все решили, что я выложил это как свою разработку).
Нигде об этом не сказано. В интернете везде лежит типовое решение через перебор колонок для каждой строки. Я решил выложить решение немного оптимальнее, которое нашел у себя в типовой конфигурации. Я уверен что наличие этого решения на этом сайта - увеличит грамотность интернет-населения по 1с.
Давайте, я изменю название функции и переменные, плюс поменяю местами их. Так всем будет лучше?:)
(16) Да с того, что это принцип публикации на ИС)))
не, ну если с позавчера разрешено постить куски кода типовых конфиг, или материалы ИТС, наплевав на авторские права 1С, то чур я первый, мне есть что выложить)
(18) ничего плохого в этом не вижу. За счет этого инфостарт и набирает популярность! И в выдаче в поисковиках их вес увеличивается. Для сайта одни плюсы!
(17) Да я тебе даже плюсану - если смогу это использовать в своих решениях.
Когда программисту нужно что-то сделать, то 90 процентов никогда не полезут смотреть ни типовые решения в конфигурациях, ни в БСП, ни в справку. Они идут в яндекс - и там первая ссылка это никогда не сайт итс с идеальным решением, а куча сайтов и форумов, в том числе которых инфостарт. И даже на нем, не всегда эстетичные решения предоставлены.
Кстати, все другие способы преобразовать таблицу в массив, не связанные с тупым циклом, оказались более времязатратными. В своё время делал xml-сериализацию с обработкой текста (и регулярками, и просто "СтрЗаменить", и через xslt), и увы, всё это думает дольше, иногда в разы дольше, нежели простой перебор по строкам. Печаль)
(15) xslt преобразования используются в типовых. прикольная тема.
кстати, как-то замерял скорость сериализации через значениевстрокувнутр, json, xml.
по скорости получилось
значениевстрокувнутр < json (несильный отрыв) < xml (отрыв почти в 1,5 раза)
(19) Да, да. Тоже играл с этим. Ничего хорошего не вышло. Обратная десериализация жрёт очень много времени.
(15) Если гнаться за быстродействием, то выгрузка ТЗ в Структуру массивов будет явно быстрее и меньше по объему.
Автор зарабатывает на комментариях ;) плюс ему в копилку)
(91) наиболее близкое к идеалу решение
П.С. вроде как кто-то из местных выяснил, что цикл, расположенный в одну строку, на больших объёмах даёт некоторое преимущество
(22) Это из тех дремучих времён, когда СтрСоединить ещё не было. БСП не всю актуализируют. А некоторые из неё выдирают, даже не подумав, и копипастят)
(24) Зря ты ввязался в эту тему с нравоучениями.
Каждый должен открыть свою Америку сам.
Все-таки ИС для тех, кого больше.
(37) да тоскливо стало просто.
Понимаешь, мы открывали свою америку сами, и не постили каждую открытую ерундовину на публичные ресурсы. Да и ресурсов таких было в разы меньше - Т1С, ИтЛанд, Миста, Кубань. Хотя на Мисте можно было задать совершенно ламерский вопрос и среди 10 наездов был один конструктивный ответ. А теперь всё превратилось в песочницу. Где можно вот так взять и запостить на уровне, далеком даже от девтрейна. И все будут радоваться.
(47) Это называется время. Мой дед говорил - вот раньше все познавали без ваших интернетов. Теперь вы говорите - вот раньше все познавали без всяких ерундовых постов и т.д. Через время я скажу - эх, грустно стало - вот раньше не было такого, что вставил флэшку в голову и все закачалось, все познавалось на форумах и т.д.
Эх, было же время. просто не надо об этом говорить везде, где тебе не нравится что-то, особенно если ничего не можешь изменить.
Кстати странно - я тут нашел очень много постов похожего содержания. Почему-то там не твоих недовольных комментов. Упустил что ли?
Эх, а еще молодежь пошла дерзкая, эх вот бы назад в "Т1С, ИтЛанд, Миста, Кубань. ". Эх, эх, эх.
Кстати странно - я тут нашел очень много постов похожего содержания. Почему-то там не твоих недовольных комментов. Упустил что ли?
Недовольные были всегда. Но не я.
Я -то считаю, что ИС на 95% - народный сайт , т.е непрофессиональный. Это его предназначение и стесняться тут нечего. Я недавно выступал на Митапе. И до меня дошло , что Доржи Цыденов , организуя региональные конференции ( митапы) , "идёт к нам , в народ". Превосходное стратегическое решение .
Конференции ИС относятся к конференциям 1С также , как народные , самодеятельные театры относятся к профессиональным.
(57) Я где-то что-то упустил. В своё время в декларации ИС было написано русским по белому: "сайт профессиональных разработчиков". И когда я в лохматом году пытался опубликовать нечто, содержавшее цитаты из СП и методичек, модераторы просто это не пропустили. Вообще. И фрагменты кода из типовой порезали.
Видимо, такая избирательная "народность", ага.
(26)не "на порядок", а в силу того, что СтрСоединить - сразу типизированные аргументы, а в обычной строке - 1С сначала их "разбирает" по типам.
Но в итоге все жутко тормозное хоть так хоть эдак.
Обработайте строчку в миллион символов, или около того (если 1С позволит запихать - в чем я сильно сомневаюсь).
Я вот наелся обработки текста в 1С достаточно, она с обычными то нетекстовыми данными работает через пень вокруг земного шара.
(70) Я тебе больше скажу, 1С и с двоичными до странного медленно работает. Казалось бы - два буфера слить, ан думает прям как над "Войной и миром".
(22)
Прошу прощения, а как получить массив Колонок из Таблица значений? Циклическое добавление название колонки в массив, а мотом передать его в функцию? Чем цикл создание строки сразу будет медленней создания нового массива?
А теперь по-серьёзке давайте. 1С, между прочим, имеет к ресурсу ИС некоторое отношение, поэтому беспредельничать не стоит. И модераторам тоже хорошо бы это помнить.
Есть такая вещь в модулях 1С, процитирую:
// Copyright © 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
И там есть моменты, касающиеся указания авторства, каковых я тут в явном виде не наблюдаю.
Не говоря уже о том, что публикация на ИС может приносить прибыль, и юридически всё это может трактоваться как попытка извлечения прибыли засчёт чужой интеллектуальной собственности.
(27) Правильно тебе написал автор, что ты нытик.
Ты можешь спорить или возмущаться, но это только только доказывает данный факт, нравится тебе это или нет.
Если сомневаешься, то можешь перечитать свои комментарии и посчитать процент нытья в них.
А потом сделать вывод.
Даже докопаться не можешь нормально.
Почитай что ты написал.
Attribution 4.0 International (CC BY 4.0)
Прочитай внимательно лицензию, прежде чем предъявлять претензии модераторам или кому-либо еще.
(34)Вы по вашей ссылке всю страницу то прочитайте, а не только первый абзац.
При обязательном соблюдении следующих условий:
«Attribution» («Атрибуция») — Вы должны обеспечить соответствующее указание авторства, предоставить ссылку на лицензию, и обозначить изменения, если таковые были сделаны. Вы можете это делать любым разумным способом, но не таким, который подразумевал бы, что лицензиар одобряет вас или ваш способ использования произведения.
(35) Ссылка на авторство предоставлена, ссылка на лицензию - нет.
Но ты для начала поди докажи, что данный код имеет отношение к той лицензии, которую предоставил этот "умник".
Просто попытка докопаться на ровном месте.
Там кстати есть еще замечание, дочитай до конца лицензию.
или если такое использование вами материала разрешено согласно применимому исключению или ограничению авторских прав
Корпорация Creative Commons ("Creative Commons") не является юридической фирмой, не оказывает юридических услуг или консультаций. Распространение публичных лицензий Creative Commons не порождает отношений, аналогичных отношениям между юристом и клиентом, или каких-либо иных отношений. Creative Commons предоставляет доступ к своим лицензиям и всей сопутствующей информации на основе принципа "как есть". Creative Commons не предоставляет каких-либо гарантий в отношении лицензий, любого материала, предоставляемого на условиях таких лицензий, или любой сопутствующей информации.
То есть получается, что в данном случае
Вы должны обеспечить соответствующее указание авторства, предоставить ссылку на лицензию, и обозначить изменения, если таковые были сделаны. Вы можете это делать любым разумным способом, но не таким, который подразумевал бы, что лицензиар одобряет вас или ваш способ использования произведения
Теперь внимательно читай в публикации
Это ссылка на авторство и лицензию.
Да она не прямая, косвенная.
Но в лицензии сказано, что можно ссылаться любым разумным образом.
То есть упомянутая тобой лицензия не нарушается.
Лицензиар может потребовать явного указания, но ты не лицензиар, а просто нытик, который ищет до чего докопаться.
Так что лучшим для тебя решением было не пытаться раздуть из мухи слона.
Тем более, что в вопросе ты не разбираешься.
Я не докапываюсь. Я просто не хочу, чтобы с ИС произошло то, что давеча имело место с nginx. Там тоже долгое время всем было благодушно пофигу.
(42) Инфостарт - это не то место, где сидит душевная компания разработчиков и за чашкой чая обсуждает свои супер разработки, до которым начинающим программистам расти и расти. В первую очередь - это серьезный проект, на котором люди зарабатывают деньги. Посещаемость данного ресурса и его стоимость (лично мое мнение) сильно зависит от таких вот простых публикаций, которым по твоему мнению здесь не место. Но владельцы сайта, в том числе и модераторы, считают иначе.
И Если ты видишь вектор развития этого ресурса в другом направлении - то самое время связаться с владельцами сайта и рассказать им свои идеи. Может после этого они заблокируют сотни "бесполезных" публикаций и гуру 1с достанут свои чашечки для чая, и все будет как в старые добрые времена.
(44) Название не понравилось. Решил с вот таким вот название здесь выложить.
Спасибо за конструктив. Хорошего дня.
Достаточно часто приходилось с сервера на клиент передавать данные из таблицы значений, но в голову не приходило гуглить, как это делать: однозначно в виде массива структур. Сначала писал сам, потом перешел на БСПшную функцию. Но чтобы в цикле по строкам каждый раз обходить циклом список колонок ТЗ. я хз, кому это могло в голову прийти.
З.Ы. ждем следующих статей)))
1) Как получить значения нескольких реквизитов объекта
2) Как сравнить Структуры с учетом вложенности
(50) ну у нас же импортозамещение идет, 1С становится все популярнее и растет число жаждущих получить вакансию 1Сника. И в этом направлении, и в традиционных языках программирования есть общая тенденция: народ жаждет уже готовое решение. И зачастую игнорируют готовые библиотеки. В данном конкретном случае вероятно кто-то где-то этот алгоритм нашел или на коленке написал, а радостный народ тут же растиражировал, не задумываясь: ну работает и ладно)
(53) Многое что есть на этом прекрасном сайте. Но это не говорит о том, что это нельзя выкладывать здесь. Или это какое-то негласное правило, о котором я не знаю?
Ну ладно согласен - твое мнение - это здесь не нужно , мое мнение - это здесь нужно . Каждый останется при своем мнении. Но итог один - эта публикация будет здесь, и возможно будет в выдаче поисковиков в топе. :) И на данной момент - плюсов больше, чем минусов)
(55) К вопросу о количестве плюсов, минусов, поощрении тупизма и прочая.
Одна гетера сказала Аристотелю: "вот ты годами учишь мальчишек, но стоит мне поманить их пальцем, и они побегут за мной, забыв тебя". Он ответил: "так ведь тебе проще - я веду их вверх, а ты вниз".
(60) Нифига тебя как сильно задело))) На самом деле я думал ты будешь умнее - и не полезешь во весь этот срач в переписке: но видимо ты так же не далеко ушел от меня. Приятно было пообщаться. Хорошего дня.
а БСП что - использует недокументированную СУБД для этих нужд? Или вы думаете, что БСП - она минимум на уровне API ОС работает? Или что она сама себе - СУБД внутри 1С?
(73) Это было к тому, что ключи структуры-элемента массива достаточно сформировать один раз перед началом циклом, а не при обработке каждой строки
(48) Ну на самом деле есть некоторые вещи, не обрабатываемые через "ЗаполнитьЗначенияСвойств". Она не падает и не ругается, просто игнорит. Вот их, родимых, приходится тягать напрямую. Это и com'ы, и внешние объекты, и в моксельных макетах бывает, и из xdto чужих сервисов кое-что, словом, есть. Но поскольку тут "народный сайт", а не для профи, то не будем углубляться)
Я обхожусь без Если
(62) Клеить строки - моветон
стрсоединить в 19 раз быстрее обычной конкатенации на больших объемах.
В конфе Бухгалтерии функция находится по адресу ОбщегоНазначения.ТаблицаЗначенийВМассив(ТаблицаЗначений). Это мало ли кому пригодится.
А с чего взяли, что "Преимущество очевидно."?
ЗаполнитьЗначенияСвойств - будут быстрее записи перебором?
А как тогда работают ЗаполнитьЗначенияСвойств? Используют средства какого-то СУБД что ли?
У 1С её же функции - работают примерно одинаково (плюс-минус зависит от типов данных), о чем речь в замене одних одноэсовых функций - на другие?
Ура! Вброс удался. Быстродействие таки немного есть, потому что структура колонок получается один раз в начале функции, а не каждый раз в цикле, как в типовой. Много дятлов, автору зачёт.
заполняется все равно в цикле. А что 1С даже свои колонки даже в своей базе - получает со скрипом (почему и беда если это в цикле), так это каждый раз удивляет разве что тебя.
(72) А как 1С будет кэшировать, если прямо в некоей итерации цикла по строкам вдруг бац - и добавится новая колонка? Поэтому да, со скрипом.
Для работы с случайными величинами на платформе 1С:Предприятие 8 предназначен генератор случайных чисел. Он позволяет получать псевдо-случайные числа (полученные искусственным путем) для дальнейшего использования в алгоритмах. Читать далее →
Как свернуть массив?
У этой задачи есть два варианта решения: Читать далее →
Как разложить строку в массив?
Есть несколько способов разложить строку в массив подстрок. Читать далее →
Как создавать двумерные и многомерные массивы?
Встроенный язык платформы 1С:Предприятие 8.3 позволяет создавать двумерные и многомерные массивы. По своей сути — это массивы массивов (ведь никто не запрещал задавать в качестве элементов массива другие массивы). Давайте на примерах разберемся, как создавать и работать с такими массивами. Читать далее →
Как создать массив структур?
Массив в 1С:Предприятие 8 позволяет хранить данные произвольного типа, а структуры — хранить и получать значения по именованным полям. Сочетание этих коллекций облегчает передачу массивов однотипных данных с клиента на сервер и обратно. Например, можно создать массив структур — массив, элементами которого является объект типа Структура. Читать далее →
Как скопировать массив в 1с?
Задача копирования массива на платформе 1С:Предприятие 8 — нетривиальная задача, т.к. отдельного соответствующего метода у массива нет. Читать далее →
Как загрузить массив в список значений?
Для загрузки элементов массива в список значений существует специальный метод объекта СписокЗначений.ЗагрузитьЗначения() Читать далее →
Как отсортировать массив в 1с?
Задача сортировки массива на платформе 1С:Предприятие 8 — нетривиальная задача, т.к. отдельного метода сортировки значений массива нет. Читать далее →
Как свернуть массив 1с в строку?
«Для чего это нужно?» — спросите Вы. Например, для представления значений массива в виде строковой последовательности для дальнейшей передачи в обмене, сохранения вариантов значений списка выбора и т.п.
Существует два основных способа свернуть массив значений в строку: Читать далее →
Приходится извращаться немного с УФ. Надо записи из БД записать в массив. Решил Запись запихать в структуру, а структуру в массив. Получилась интересная фигня, что в массиве хранится ссылка на структуру а не сама структура. И в массиве все значения заполнены последней записью из БД, т.е. ссылкой на структуру.
Вопрос: Как заполнить массив значениями записей из БД? Может как-то можно извратиться со структурой?
ЗначениеВСтрокуВнутр() - а эта функция только на сервере работает. Можно конечно попробовать но это изврат :(
Работает через ЗначениеВСтрокуВнутр(). Но скорость обработки падает раз в 5. При больших объемах этот очень критично.
(5) Врешь ведь.
(0) Давай задачу целиком, а то тут опять налицо изобретение велоката с квадратными колесами
(8) Ну почему врешь? :)
Попробуй заполнить массив структурами - точно говорю, результат интересный будет. По всякому попробуй.
А задача целиком - загрузка данных из Оракла, с возможностью во время загрузки выбирать соответствия для некоторых объектов.
Вообще вернулся к старому варианту решения задачи. Сделал Таблицу на форме и гружу сначала данные из Оракла туда, а потом уже обрабатываю в цикле.
(10) Я делал так 100500 раз, массив из структур, на каждой итерации новая структура. На платформе 8.2. В массив, естественно, передается указатель (но не ссылка, какая ссылка у структуры?), но он каждый раз новый получался при создании новой структуры.
(0) Прочти хорошо правила работы с массивами и со структурами и не торопясь сделай. Если не получается - возьми отладчик, и проползи на пузе каждый шаг цикла, итерации две проследи в отладчике, наверняка найдешь ошибку.
(16) так и было, решил попробовать другой способ.
(15) Конечно же так и делал.
(14) Ну а как я по твоему видел, что в массиве все структуры пустые, когда делаешь через инициализацию структуры. Хотя думаю стоит еще раз попробовать что за фигня при записи структуры в массив. :(
(17) Да ты видимо в отладчике только итог посмотрел. А надо на каждом шаге смотреть значения всех переменных. Массив (длина его, да и на F2 посмотреть), текущая ячейка массива, переменная-структура, и что там у тебя еще есть?
Раз совсем ничего не понятно - делай так. Похоже, что ты еще ленишься, ибо не сказал нам - на каком шаге произошел космический глюк.
Мы бы тебе сразу подсказали.
(19) Какой ИТОГ? :))) Расскажу как происходит. Цикл, инициализируется структура, заполняется значениями из записи БД, Добавляется в массив. Все отлично, в массиве значения первой записи как надо. Переходим на вторую итерацию, после инициализации структуры в первой записи массива есть тип значения структура, но пустое.
(19) Если структуру не инициализировать, то во всем массиве значения последней структуру в него записанной
Массив в 1С 8.3 - это набор значений, которые могут быть разных типов. Значения массива можно добавлять, получать, вставлять, удалять и очищать. Массивы бывают одномерными и двумерными. В 1С 8.3 используются для отборов или для сохранения списка значений, чтобы потом передать как параметр в функцию/процедуру.
Массив можно получить из списка значений с помощью метода ВыгрузитьЗначения() и из таблицы значений с помощью метода ВыгрузитьКолонку(). В виде массива также можно получить выделенные строки динамического списка. Можно создать массив и программно.
✔ Создание массива (определенного размера)
&НаКлиенте
Процедура СозданиеМассиваОпределенногоРазмера ( Команда )
// Массив состоит из 3-х элементов
МассивОпрРазмера = Новый Массив ( 3 );
// Определяем значения элементов
МассивОпрРазмера [ 0 ] = 3 ;
МассивОпрРазмера [ 1 ] = МассивОпрРазмера [ 0 ] * 2 ; // 6
МассивОпрРазмера [ 2 ] = МассивОпрРазмера [ 1 ] * 3 ; // 18
Для Каждого ЭлементМассива из МассивОпрРазмера Цикл
Сообщить ( ЭлементМассива ); // 3 6 18
КонецЦикла;
&НаКлиенте
Процедура СозданиеМассиваБезРазмера ( Команда )
// В массиве пока нет элементов
МассивБезРазмера = Новый Массив ;
// Добавляем последовательно 3 элемента
МассивБезРазмера . Добавить ( 20 ); // Массив: (20)
МассивБезРазмера . Добавить ( 40 ); // Массив: (20, 40)
МассивБезРазмера . Добавить ( 70 ); // Массив: (20, 40, 70)
Для Каждого ЭлементМассива из МассивБезРазмера Цикл
Сообщить ( ЭлементМассива ); // 20 40 70
КонецЦикла;
&НаКлиенте
Процедура СозданиеМассиваСЭлементамиРазныхТипов ( Команда )
Массив = Новый Массив ( 5 );
Массив [ 0 ] = "1Cnik.BY" ; // ("1Cnik.BY")
Массив [ 1 ] = 36 ; // ("1Cnik.BY", 36)
Массив [ 2 ] = "@" ; // ("1Cnik.BY", 36, "@")
Массив [ 3 ] = Формат ( 2007 , "ЧГ=0" ); // ("1Cnik.BY", 36, "@", 2007)
Массив [ 4 ] = Дата ( "20200330" ); // ("1Cnik.BY", 36, "@", 2007, 30.03.2020)
Для Каждого ЭлементМассива из Массив Цикл
Сообщить ( ЭлементМассива ); // 1Cnik.BY 36 @ 2007 30.03.2020
КонецЦикла;
&НаКлиенте
Процедура ОбходВсехЭлементовМассиваПоИндексу ( Команда )
// Инициализируем массив: (20, 40, 70)
МассивИндекс = Новый Массив ;
МассивИндекс . Добавить ( 20 );
МассивИндекс . Добавить ( 40 );
МассивИндекс . Добавить ( 70 );
// Цикл от первого (с индексом 0) до последнего элемента.
Для Индекс = 0 По МассивИндекс . Количество () - 1 Цикл
Сообщить ( МассивИндекс [ Индекс ]);
КонецЦикла;
&НаКлиенте
Процедура РаботаСМассивом ( Команда )
// Создание (инициализация) пустого массива
Массив = Новый Массив ;
// Вставка трёх элементов; каждый элемент вставляется в начало
Массив . Вставить ( 0 , "А" ); // (А)
Массив . Вставить ( 0 , "Б" ); // (Б, А)
Массив . Вставить ( 0 , "В" ); // (В, Б, А)
Массив . Вставить ( 0 , "Г" ); // (Г, В, Б, А)
// Определение последнего индекса
Сообщить ( Массив . ВГраница ()); // 3
// Перебор массива в цикле
Для Индекс = 0 по Массив . ВГраница () Цикл
Сообщить ( Массив [ Индекс ]); // Г В Б А
КонецЦикла;
// Находим индекс элемента
Индекс = Массив . Найти ( "А" ); // 1
// Удаляем элемент по найденному индексу
Массив . Удалить ( Индекс ); // Остаётся массив (Г, В, Б)
// Определение последнего индекса - теперь он уменьшился
Сообщить ( Массив . ВГраница ()); // 2
// Удаление всех элементов из массива
Массив . Очистить ();
&НаКлиенте
Функция ПередачаМассиваВКачествеПараметраФункции ( СсылкаНаМассив )
СсылкаНаМассив [ 0 ] = 50 ;
Возврат СсылкаНаМассив [ 0 ] * 5 ;
&НаКлиенте
Процедура ПередачаМассива ( Команда )
Массив = Новый Массив ( 1 ); // Инициализация массива из одного элемента
Массив [ 0 ] = 70 ; // Значение элемента до вызова функции = 70
// Передача массива в функцию для изменения
Сообщить ( ПередачаМассиваВКачествеПараметраФункции ( Массив )); // 250
// Значение первого элемента после функции изменилось
Сообщить ( Массив [ 0 ]); // 50
&НаКлиенте
Функция СозданиеМассива ()
Массив = Новый Массив ( 3 );
Массив [ 0 ] = "Добро" ;
Массив [ 1 ] = "пожаловать" ;
Массив [ 2 ] = "в Беларусь!" ;
&НаКлиенте
Процедура МассивВРезультатеВыполненияФункции ( Команда )
// Возврат массива из функции
МассивИзФункции = СозданиеМассива ();
&НаКлиенте
Процедура ПроверкаМассива ( СсылкаНаМассив )
Если СсылкаНаМассив <> Неопределено И СсылкаНаМассив . Количество () > 0 Тогда
Сообщить ( СсылкаНаМассив [ 0 ]);
КонецЕсли;
&НаКлиенте
Процедура ПередачаМассиваВКачествеПараметраПроцедуры ( Команда )
// Инициализация массива: (20, 40, 70)
Массив = Новый Массив ( 3 );
Массив [ 0 ] = 20 ;
Массив [ 1 ] = 40 ;
Массив [ 2 ] = 70 ;
// печать первого элемента, переданного массива
ПроверкаМассива ( Массив ); // 20
ПроверкаМассива (Неопределено); // пусто
ПроверкаМассива (Новый Массив ); // пусто
&НаКлиенте
Процедура РаботаСМногомернымМассивом ( Команда )
// ,<>,<>> ,<>,<>>
Массив = Новый Массив ( 2 , 3 ); // два столбца, три строки
// , , > ,<>,<>>
Массив [ 0 ][ 0 ] = "А" ;
Массив [ 0 ][ 1 ] = "Б" ;
Массив [ 0 ][ 2 ] = "В" ;
// , , > , , >
Массив [ 1 ][ 0 ] = "1" ;
Массив [ 1 ][ 1 ] = "2" ;
Массив [ 1 ][ 2 ] = "3" ;
// Обход элементов многомерного массива через простой цикл
Для Каждого СтрокаМассива Из Массив Цикл
Для Каждого ЭлементМассива Из СтрокаМассива Цикл
Сообщить ( ЭлементМассива );
КонецЦикла;
КонецЦикла;
// Обход элементов многомерного массива через индекс
Для ИндексСтрока = 0 По Массив . Количество () - 1 Цикл
Для ИндексСтолбец = 0 По Массив [ ИндексСтрока ]. Количество () - 1 Цикл
Сообщить ( Массив [ ИндексСтрока ][ ИндексСтолбец ]);
КонецЦикла;
КонецЦикла;
Читайте также: