Имя: Пароль:
1C
1С v8
Как создать новый массив со значениями без цикла
,
0 timeforlive
 
03.02.15
13:47
Всем привет!
Сразу с примера:

Процедура НоваяПроцедура()
    НовыйМассив = Новый Массив();
    НовыйМассив[1].Добавить("значение1");
КонецПроцедуры

Таким образом в 1С можно создать массив и добавлять в него значения, но это очень и очень не удобно, особенно, если нужно 1000 значений заполнить руками.

Кто-то предложет сделать следующим образом:
1. создать файл Excel, внести туда данные
2. создать обработку, которая считывала бы данные и результатом бы создавала корректные текст

Это конечно круто, но мне было проще сделать себе програмку в C#. Вот ссылка, если кому-то поможет (и не только по 1С):
https://yadi.sk/d/aB-KPzzAeSCDi

После обработки RenameText я для удобства использую программу Microsoft Excel с формулой:
="["&F1&"]"
где F1 - это число от 1 до n (т.е. индекс массива)

и программой SubLime:
1. скопировать текст
2. найти все TAB-отступы (Find All) - удалить их;
П.С. можно средней кнопкой мыши выделять по вертикали текст

Вот мой вопрос:
можно ли как в C# указать в 1С значения массива без метода Добавить(), пример из C#:
string[] str_ = {"знач1", "знач2", "знач3"};
1 Cube
 
03.02.15
13:50
(0) СП:

Массив (Array)
По количеству элементов

Синтаксис:
Новый Массив(<КоличествоЭлементов1>,...,<КоличествоЭлементовN>)

Параметры:
<КоличествоЭлементов1>,...,<КоличествоЭлементовN> (необязательный)

Тип: Число.
Каждый параметр определяет количество элементов массива в соответствующем измерении. Может задаваться неограниченное количество параметров. Если ни один параметр не указан, то создается одномерный массив с нулевым количеством элементов.

Описание:
Создает массив из указанного количества элементов. Если задано несколько параметров, то будет создан массив, элементами которого являются массивы (и т.д. в зависимости от количества параметров). Фактически конструктор позволяет создать массивы массивов, которые могут являться аналогом многомерного массива.

Пример:
// массив с 0 элементами
Массив1 = Новый Массив;

// массив из 10 элементов,
// каждый из которых является массивом из 2 элементов,
// каждый из которых является массивом из 4 элементов
Массив2 = Новый Массив(10,2,4);
2 ShoGUN
 
03.02.15
13:53
(0) Нет. Мне, правда странно, что "Добавить" не устраивает, т.к. цикл проще, чем формирование выражения инициализации...
3 ShoGUN
 
03.02.15
13:54
А вообще, столбец Excel - это COMSafeArray, с которым можно работать из 1С, в т.ч. и выгружать в массив 1С.
4 Rovan
 
гуру
03.02.15
13:54
(0) "можно ли как в C# указать в 1С значения массива без метода Добавить(), пример из C#: "
Если это строки, то в типовых конфах есть функция отвечающая за это что-то типа
масс= ИзСтрокиВМассив("Знач1,знач2,знач3");
***
Заполнить одним вызовом весь массив одним значением можно через Таблицу значений
ТЗ.ЗаполнитьЗначения(Значение, Колонка);
масс = ТЗ.ВыгрузитьКолонку(Колонка);
5 ShoGUN
 
03.02.15
13:55
http://infostart.ru/public/20090/ - пища для размышления. Всё делается проще.
6 nordbox
 
03.02.15
13:58
а почему именно массив а не ТЗ ??
7 ktvladimir
 
03.02.15
14:03
кури в строну ЗначениеИзСтрокиВнутр, ЗначениеВСтрокуВнутр, посмотри как выглядит массив в строковом представлении, на дальше сообразишь)
8 nordbox
 
03.02.15
14:10
(7) это кому?
9 FIXXXL
 
03.02.15
14:37
(0)

Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
    
    МассивСтрок = Новый Массив();
    Если Разделитель = " " Тогда
        Стр = СокрЛП(Стр);
        Пока Истина Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = СокрЛ(Сред(Стр,Поз));
        КонецЦикла;
    Иначе
        ДлинаРазделителя = СтрДлина(Разделитель);
        Пока Истина Цикл
            Поз = Найти(Стр,Разделитель);
            Если Поз=0 Тогда
                МассивСтрок.Добавить(Стр);
                Возврат МассивСтрок;
            КонецЕсли;
            МассивСтрок.Добавить(Лев(Стр,Поз-1));
            Стр = Сред(Стр,Поз+ДлинаРазделителя);
        КонецЦикла;
    КонецЕсли;
    
КонецФункции // глРазложить
10 ktvladimir
 
03.02.15
16:26
я к тому, что взять руками написать маленький массив преобразовать его в строку с помощью ЗначениеВСтрокуВнутр
увидеть что структура довольно простая и можно построить свою строку которую при помощи обратной функции ЗначениеИзСтрокиВнутр преобразовать в массив в
исходной строке разделители меняем с помощью  СтрЗаменить
11 Зеленый пень
 
03.02.15
16:32
Я один не вкурил, зачем такой велосипед автору?
12 ktvladimir
 
03.02.15
16:32
так к примеру массив из 3 букв А, Б И В выглядит как
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{3,
{"S","А"},
{"S","Б"},
{"S","В"}
}
}
пустой массив как
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{0}
}
итак разрядность получаем с помощью СтрЧислоВхождений

делаем замены разделителя небольшие преобразования и получаем строку нужного массива который получаем обратной функцией ЗначениеИзСтрокиВнутр
13 ktvladimir
 
03.02.15
16:33
как я понял есть строка данных разделенных неким разделитем, которую не обходимо загнать в массив для дальнейшей работы... может я и не прав)
14 ShoGUN
 
03.02.15
16:35
(12) Зачем? Зачем это нужно, когда (3)?
15 ShoGUN
 
03.02.15
16:35
+(14) Раз уж автор всё равно в эксель полез.
16 Krolik Bezobraznik
 
03.02.15
16:37
Автор знает толк в извращениях.
Автор, расскажи задачу то или это вопрос из серии "А что если жабе всунуть в задницу соломинку и надуть, поплывет она или нет?"
17 ktvladimir
 
03.02.15
16:47
Откель я знаю) может он откажется от экселя. случаи бывают разные. Он предложил свой вариант, я предложил свой. кстати довольно шустрый). Любые вариации интересны тем, что расширяют знания. я к примеру не знал про (3) Не сильный знаток экселя... каждый раз гуглю.... но всегда легко гуглить когда знаешь что искать, так что за 3 спасибо одназначно
18 ShoGUN
 
03.02.15
16:52
(17) В (5) Готовая функция, добавь в закладки.
19 ktvladimir
 
03.02.15
17:03
ну собственно из 3 это уже проглядывало) Все равно спасибо.
итак соединение с экселем уже не быстрая операция. Смотря какая частота нужна.. ну и в данном случае есть выгрузка в эксель. а бывает зачастую что выгрузка просто в текстовые файлы).
я же не знаю как изначально выглядит задача. Может есть некий транспортный файл, который ТС преобразовывает в csv и потом глядит в экселе). Идея (5) отлично, но не стоит зацикливаться одним экселем)
20 ktvladimir
 
03.02.15
17:06
про эксель. У Вас есть уже опят с такой функцией? как она ведет себя в случае с форматированием? те наличием объединенных ячеек? часто приходят сторонние прайсы в виде экселя где есть объединения ячеек в заголовках, названиях колонок итд
21 ShoGUN
 
03.02.15
17:07
(20) Нормально ведёт, при объединении ячеек значение будет в верхней левой, остальные будут показываться пустыми(как и при любом другом методе чтения, собственно).
22 ktvladimir
 
03.02.15
17:17
учту в след раз попробую предварительно грузануть в тз.
23 Classic
 
03.02.15
17:27
(20)
Эксель зло.
24 timeforlive
 
04.02.15
06:35
Вот вам задача, это не из серии (16).
Генерация названия.
Для того, чтобы создавались из определенных значений (а не из случайных букв \ символов), то нужно создать массив с этими значениями.
Так как значения уже есть, но не в корректном для 1С виде, то нужна была обработка.

Если появится необходимость, сделаю обработку для выгрузки из Ексель дынных методом:
- взять значение из ячейки
- поставить ДО или ПОСЛЕ свое значение
- следующая ячейка
...

(18) а я добавил, спасибо (5)
25 DrZombi
 
гуру
04.02.15
06:44
(24) >>>  поставить ДО или ПОСЛЕ свое значение

Поставь, кто мешает?
Но вот для чего лепить компот в (0) в замене текста кода.
Ну а коль ты так любишь допиливать Код и далее его выполнять. А не заполнять все нормально и сразу.

Вот:

Выполнить()

Выполнить (Execute)
Выполнить (Execute)
Синтаксис:
    Выполнить(<Строка>)

Параметры:
    <Строка>
    Строка, содержащая текст исполняемого кода.

Описание:
Позволяет выполнить фрагмент кода, который передается ему в качестве строкового значения.

Примечание:
В режиме запуска веб-клиент оператор не поддерживается и его вызов игнорируется.
26 DrZombi
 
гуру
04.02.15
06:44
+(25) Как пользоваться Выполнить, освоишь сам :)
27 timeforlive
 
04.02.15
07:57
Хм, интересно. Спасибо.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.