Имя: Пароль:
1C
 
У кого есть функция разложения массива на пачки размером по N?
0 Гений 1С
 
17.03.23
14:48
собственно
1 Гений 1С
 
17.03.23
14:48
Нашел такое v8: Работа с массивом но там функцию так и не родили.
2 Волшебник
 
17.03.23
14:51
Я решу эту задачку в 3 строки
3 Fish
 
17.03.23
14:51
(1) В смысле не родили? Там ответ в (1) дан.
4 vicof
 
17.03.23
14:52
Ждем гениального решения
5 bolobol
 
17.03.23
14:53
Да уж.. массив массивов не заполнить...
6 bolobol
 
17.03.23
14:54
Ты новичок, что ли? Лабу решаешь?
7 Garykom
 
17.03.23
14:56
(0) Запросом?
8 BeerHelpsMeWin
 
17.03.23
15:01
(7) Нет бы предложить микросервис на Го...
9 KJlag
 
17.03.23
15:02
до статьи на хабре еще далеко?
10 H A D G E H O G s
 
17.03.23
15:08
(0) Готов продать за 4500
11 ASU_Diamond
 
17.03.23
15:08
4499
12 bolobol
 
17.03.23
15:10
7500 но с гарантией!
13 Гений 1С
 
17.03.23
15:12
(6) у меня есть 500.000 позиций номенклатуры в результате запроса.
Хочу обрабатывать пачками по 2.000 позиций. Вопросы, юноша?
14 Гений 1С
 
17.03.23
15:13
(10) (11) (12) Отлично, а то я не знаю куда девать средства со счета ZLP
15 Fish
 
17.03.23
15:13
Похоже, Гений уже не тот. Раньше было бы "Мой Гений дарит вам...", а теперь лишь жалкое "Напишите за меня функцию разложения массива".
16 Fish
 
17.03.23
15:14
(13) А в чём проблема то? Не умеешь обрабатывать пачками по N штук?
17 CepeLLlka
 
17.03.23
15:14
18 lodger
 
17.03.23
15:15
(16) если бы умел - поста бы не было.
19 Гений 1С
 
17.03.23
15:17

(2) ну давай попробуем
Функция РазбитьМассивПоПачкам(М, РазмерПачки)
  ММ = Новый Массив();
  Р = Новый Массив(); ММ.Добавить(Р);
  Для Каждого Эл из М Цикл
    Р.Добавить(Эл);
    Если Р.Количество() = РазмерПачки Тогда
      Р = Новый Массив(); ММ.Добавить(Р);
    КонецЕсли;
  КонецЦикла;
  Возврат ММ;
КонецФункции
20 Гена
 
17.03.23
15:18
(2) в три строки не получится, ведь сначала надо ввести РазмерПодмассива, КоличествоПодмассивов как Целое от деления КоличествоИсходныхДанных на РазмерПодмассива... Потом цикл... строчек 20 не меньше
21 Гений 1С
 
17.03.23
15:19
(20) если рекурсивно. у меня нет остатка от деления.
22 bolobol
 
17.03.23
15:21
(13) Да, есть! Один. Какая связь результата запроса и массива подразумевается?
23 Гений 1С
 
17.03.23
15:22
(22) буду пачками обрабатывать номенклатур. каждый элемент массива - это пачка из 2000 позиций номенклатуры из исходного запроса.
24 bolobol
 
17.03.23
15:22
Так-то, обработка больших данных с обновлением информации для пользователя - в секундах измеряли всегда, а не в пачках по N... Чтобы и сервант не нагружать, и пользователь в теме был, да и прервать мог
25 Fish
 
17.03.23
15:23
(22) Гениальная! :)
26 KJlag
 
17.03.23
15:23
(15) "Мой гений позволяет вам.."?
27 vicof
 
17.03.23
15:24
(25) генитальная скорей
28 Fish
 
17.03.23
15:24
(23) Тут тебе массив на кучу массивов не нужно делить.
29 bolobol
 
17.03.23
15:24
(23) Ну так и пропихуй, раз так надо, по 2000 в массив
30 Fish
 
17.03.23
15:25
(23) Для этого тебе не надо массив на кучу массивов делить.
31 ASU_Diamond
 
17.03.23
15:25
(23) т.е. ты сначала результат запроса перекидываешь в массив, а потом обрабатываешь массив?
32 Гений 1С
 
17.03.23
15:25
(29) дык искал готовую функцию.
(31) ага.
33 ASU_Diamond
 
17.03.23
15:26
(32) а для чего тут вообще массив? Сразу обрабатывать результат запроса почему нельзя?
34 bolobol
 
17.03.23
15:27
(33) Гениальность - её проявить нужно, просто так её не видно!
35 mikecool
 
17.03.23
15:28
сегодня пятница и Серега! ))
36 Fish
 
17.03.23
15:28
(33) Я вот тоже после (13) не понял, зачем тут массив.
37 ASU_Diamond
 
17.03.23
15:29
(32) А сколько времени ты потратил на поиск функции? Только в этой теме 30 минут
38 VladZ
 
17.03.23
15:29
(0) АВТОНОМЕРЗАПИСИ() в запросе разделить на 2000 и взять целую часть. Вот и будет у тебя номер пакета в самом запросе.
39 mikecool
 
17.03.23
15:29
чего вы накинулись на автора? он  идет к успеху и ваяет чистый код!
40 BeerHelpsMeWin
 
17.03.23
15:31
(33) Может он получает удовольствие от одновременного хранения в памяти выборки запроса на 500к элементов, массива на 500к элементов и еще 250 массивов по 2к элементов?
41 НафНаф
 
17.03.23
15:31
Функция ПорционироватьКоллекцию(Коллекция,РазмерПорции) Экспорт

    Результат = Новый Массив;
    Счетчик = 0;
    Для каждого Эл Из Коллекция Цикл
        Если Счетчик%РазмерПорции=0 Тогда
            ТекПорция = Новый Массив;
            Результат.Добавить(ТекПорция);
        КонецЕсли;                        
        ТекПорция.Добавить(Эл);
        Счетчик = Счетчик+1;
    КонецЦикла;                
    Возврат Результат;

КонецФункции
42 Гений 1С
 
17.03.23
15:32
(36) ну вот я запускаю для 500.000 поиск ссылок. Виснет, сукко.
А для 2000 не виснет.
Вот я и хочу передавать массивом по 2000 по всей номенклатуре поиск ссылок.
Результат - список номенклатуры, которую можно удалить (нет критичных ссылок).
йо?
43 mistеr
 
17.03.23
15:32
(19) Я не понял, ты вот этот код у нас выпрашивал? Который написал спустя полчаса за 5 минут?
44 Гений 1С
 
17.03.23
15:32
(41) у Волшебника в три строчки вышло. Может он правда, не использовал переносы строки, ггг
45 Гений 1С
 
17.03.23
15:32
(43) да, лень думать было.
46 ASU_Diamond
 
17.03.23
15:34
(41) Все массивы будут пустыми
47 Конструктор1С
 
17.03.23
15:34
(45) у меня ощущение, что это девиз всей твоей жизни
48 bolobol
 
17.03.23
15:34
(46) Тоже так ожидаю, но это не точно
49 mistеr
 
17.03.23
15:35
(45) Молодец, настоящий 1С-ник. This is the way.
50 bolobol
 
17.03.23
15:35
Эти непрозрачные схемы со ссылками на объект, когда после = копия создаётся, а когда ссылка передаётся
51 Fish
 
17.03.23
15:38
(42) Пля, так речь про удаление помеченных? Так бы сразу и говорил. Вот, сразу нашлось готовое: https://infostart.ru/public/92372/
52 Гений 1С
 
17.03.23
15:41
(47) а чем плохо? Повторное использование кода - это хорошо. Особенно, если возведено в привчку.
53 mistеr
 
17.03.23
15:41
(46) Нет. Добавить() добавляет копию массива.
54 Гений 1С
 
17.03.23
15:42
(51) Мне готовое не подходит, звеняй. Эти объекты не помечены, надо сперва понять, нужно их оставлять или нет.
55 Гений 1С
 
17.03.23
15:43
(41) у меня проще, я вместо счетчика использую размер массива.
56 НафНаф
 
17.03.23
15:46
(46) (48) не будут уж поверьте, ну или проверьте
57 mistеr
 
17.03.23
15:47
(54) В ИР все сделано и учтено. Можешь любые объекты проверять и удалять. В т.ч. и результат запроса. И размер порции задается.

Но спорю на пиво, табе будет лень разобраться с ИР и потратишь еще день на г-кодинг.
58 НафНаф
 
17.03.23
15:47
(55) вообще пох, что ты там используешь
59 Гений 1С
 
17.03.23
15:48
(57) а там можно написать правила удаления объекта? например, если на него нет ссылок из документов за определенный период? И далее не удалять, а помечать на удаление, переименовывать с прфиксом Ъ и переностиь в архивную папку?
60 Fish
 
17.03.23
15:48
(54) В любом случае это проще сделать без разбиения массива.
61 Гений 1С
 
17.03.23
15:48
(57) да, ИР я пытался использовать неоднократно, но в итоге плюнул. Это для яйцеголовых 1сников, тем более на обычных формах.
62 Гений 1С
 
17.03.23
15:48
(60) как же? Расскажи
63 Fish
 
17.03.23
15:49
(59) "если на него нет ссылок из документов за определенный период" - Что за жесть про период? Т.е. если на объект есть ссылки в другом периоде, ты всё равно объект грохнешь? Да ты силён, как я погляжу :)))
64 НафНаф
 
17.03.23
15:50
65 Гений 1С
 
17.03.23
15:50
(63) ага, подчищаю базу после свертки. и я не грохну, а переименую и закину в архивную папку. Клиенту так удобнее.
66 Гений 1С
 
17.03.23
15:50
(64) ты бы еще Питон вспомнил, ггг
67 Fish
 
17.03.23
15:51
(62) Твоим первоначальным запросом.
68 НафНаф
 
17.03.23
15:56
(66) это просто говорит, о том, как многого нет в 1С
69 Гений 1С
 
17.03.23
15:57
(67) можно, но геморройно. Я люблю лаконичный код. Выгрузил в общий массив, разбил на коллекции и работаешь. Не надо чудить с выборками.
70 Гений 1С
 
17.03.23
15:57
(68) мне не мешает отсутствие пристутсвия.
71 sikuda
 
17.03.23
15:57
(64) Как же все-таки хорошо, что Гений 1С веселит нас в пятницу. Настроение поднимается....
val chunks = words.chunked(3)
72 Волшебник
 
17.03.23
15:58
(20) Я же не уточнял язык
73 Гений 1С
 
17.03.23
15:59
(72) пошли отмазы. хорошо, что мы не увидим эти три строчки.
74 Волшебник
 
17.03.23
16:04
вот решение на Python, как раз 3 строки

def func_chunks_generators(lst, n):
	for i in range(0, len(lst), n):
		yield lst[i : i + n]


https://egorovegor.ru/python-chunks/
75 Волшебник
 
17.03.23
16:04
(74) на входе
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 54, 3, 2, 2, 1],
4

на выходе
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 8, 7], [6, 54, 3, 2], [2, 1]]
76 Гений 1С
 
17.03.23
16:06
(74) ты меня разочаровал, я думал в питоне для разбивки массива на порции есть готовая функция.
77 Волшебник
 
17.03.23
16:07
(76) Это неспортивно
78 Гений 1С
 
17.03.23
16:07
(77) а при чем тут спорт? Я хотел сэкономить время и нервные клеточки.
79 Гений 1С
 
17.03.23
16:08
(74) ты списал отсюда: https://stackoverflow.com/questions/312443/how-do-i-split-a-list-into-equally-sized-chunks
def chunks(lst, n):
    """Yield successive n-sized chunks from lst."""
    for i in range(0, len(lst), n):
        yield lst[i:i + n]
80 Волшебник
 
17.03.23
16:08
(78) Тогда переходи на Kotlin как в (71)
81 НафНаф
 
17.03.23
16:08
(70) тебе и задницу снегом подтирать не мешает через дырявые штаны
82 Волшебник
 
17.03.23
16:09
(79) Я же дал ссылку, откуда я списал. Гений уже не тот...
83 Гена
 
17.03.23
16:10
Проба бухгалтерского пера (лет 8 не кодил), можете кидать камни )

КолвоПервДанных = 500000;
МассивПервДанных = Новый Массив(КолвоПервДанных);

МассивПодмассивов = Новый Массив;
РазмерПодмассива = 2000;
КолвоПодмассивов = Цел(КолвоПервДанных/РазмерПодмассива)

Для СчетчикПодмассивов = 1 По КолвоПодмассивов Цикл
    МассивПодмассивов.Вставить(СчетчикПодмассивов-1,Новый Массив);
    Для СчетчикЭл = 1 По РазмерПодмассива Цикл
        ИндексМассиваПервДанных = РазмерПодмассива*(СчетчикПодмассивов-1)+(СчетчикЭл-1);
        Если ИндексМассиваПервДанных < МассивПервДанных.Количество() Тогда
            МассивПодмассивов[СчетчикПодмассивов-1]
            .Вставить(СчетчикЭл-1,МассивПервДанных[ИндексМассиваПервДанных]);
        КонецЕсли;
    КонецЦикла;
КонецЦикла;
84 Гений 1С
 
17.03.23
16:11
(83) а зачем так сложно, если у меня проще?
85 Гений 1С
 
17.03.23
16:11
(82) прости, не заметил. тоды ладно.
86 Fish
 
17.03.23
16:12
(69) Не, ну если у тебя цель (40), тогда извиняй. Изобретай тормозной говнокод.
87 Fish
 
17.03.23
16:13
+(86) И, кстати, способ с запросом, который сразу выбирает тебе нужную порцию, ещё и гораздо лаконичнее, раз ты уж за лаконичность :)))
88 Гений 1С
 
17.03.23
16:15
(87) я за повторное применение кода. не, ну ежели ты напишешь функцию, куда передаешь запрос, а она нарезает его на кусочки, то окей.
Но в 1С нет аппликаторов, т.е. нельзя передать функцию параметром.
89 Гений 1С
 
17.03.23
16:16
то бишь я к тому, что если есть готовая выверенная функция разбивки на массивы, лучше использовать ее.
Чем заново бить запрос на кусочки.
90 Кирпич
 
17.03.23
16:18
вот так, наверное будет хорошо. памяти меньше сожрет. (не проверял. может и не работает)

    М = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |АВТОНОМЕРЗАПИСИ() КАК Номер,
    |Ссылка КАК Ссылка
    |ПОМЕСТИТЬ Т ИЗ Справочник.Номенклатура
    |ИНДЕКСИРОВАТЬ По Номер;");
    Запрос.МенеджерВременныхТаблиц = М;
    Запрос.Выполнить();
    
    Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 2000 ИЗ Т ГДЕ Номер > &Номер");
    Запрос.МенеджерВременныхТаблиц = М;
    Номер = 0;
    Пока Истина Цикл      
        Запрос.УстановитьПараметр("Номер", Номер);
        М = Запрос.Выполнить();
        Если М.Пустой() Тогда
            Прервать;
        КонецЕсли;
        Номер = Номер + 2000;
        М = М.Выгрузить().ВыгрузитьКолонку(0);
        ЧотаДелаюСМассивом(М);
    КонецЦикла;
91 mistеr
 
17.03.23
16:19
(88) Можно передать выборку и обойти ее. Но ты чего-то боишься работать с выборками...
92 Fish
 
17.03.23
16:20
(88) Не нужно нарезать запрос на куски. Что за бред?
93 НЕА123
 
17.03.23
16:21
(56)
смущает
ТекПорция = Новый Массив;
Результат.Добавить(ТекПорция);

поменять местами и счетчик с 1, ИМХО.
94 BeerHelpsMeWin
 
17.03.23
16:24
(90) Без УПОРЯДОЧИТЬ, наверно, не заработает?
95 Paradox
 
17.03.23
16:24
&НаКлиенте
Функция РазделитьМассивНаПорции(ИсходныйМассив, КоличествоЭлементовВПорции)

    //Разделим на порции общий массив
    МассивПорций = Новый Массив();
    НовыйМассивСЧастями = Новый Массив();
    
    Для Сч = 0 По ИсходныйМассив.ВГраница() Цикл
        
        Если МассивПорций.Количество() = КоличествоЭлементовВПорции Тогда
            НовыйМассивСЧастями.Добавить(МассивПорций);
            МассивПорций = Новый Массив();
        КонецЕсли;
        
        МассивПорций.Добавить(ИсходныйМассив[Сч]);
        
    КонецЦикла;
    
    Если МассивПорций.Количество() > 0  Тогда
        НовыйМассивСЧастями.Добавить(МассивПорций);
    КонецЕсли;
    
    Возврат НовыйМассивСЧастями;
    
КонецФункции //РазделитьМассивНаПорции
96 Кирпич
 
17.03.23
16:26
(94) не знаю. напиши как правильно, если знаешь. лень пробовать.
97 Paradox
 
17.03.23
16:27
на PHP вообще в одну строчку )))

$result = array_chunk($arr, 2);
98 НафНаф
 
17.03.23
16:30
(19) в конце может добавиться пустой массив, при общем количестве кратном размеру пачки, халтура
99 bolobol
 
17.03.23
16:30
(90) При повторном выполнении - данные базы уже изменятся и ты будешь пропускать элементы тысячами
100 bolobol
 
17.03.23
16:30
100!
101 Кирпич
 
17.03.23
16:30
+(96) переменную надо не М назвать, а то я менеджер таблиц затер :))
102 Гений 1С
 
17.03.23
16:32
(91) дело не в страхе, а в экономии мозга
103 Кирпич
 
17.03.23
16:33
(99) а с массивом я ничего прям не пропущю, ага :))
104 Гений 1С
 
17.03.23
16:34
(98) тогда Р = Неопределено и при достижении пачки сбрасывать Р в Неопределено
105 bolobol
 
17.03.23
16:34
(103) Ну, судя по Вашим способностям - Вы и в переменной пропустите))
106 Кирпич
 
17.03.23
16:35
(102) тебе точно надо мозг экономить. у тебя его мало
107 Гений 1С
 
17.03.23
16:35
Функция РазбитьМассивПоПачкам(М, РазмерПачки)
  ММ = Новый Массив();
  Р = Неопределено;
  Для Каждого Эл из М Цикл
    Если Р = Неопределено Тогда
      Р = Новый Массив(); ММ.Добавить(Р);
    КонецЕсли;
    Р.Добавить(Эл);
    Если Р.Количество() = РазмерПачки Тогда
      Р = Неопределено;
    КонецЕсли;
  КонецЦикла;
  Возврат ММ;
КонецФункции
108 Кирпич
 
17.03.23
16:37
(107) да убери уже не позорься. такое в 7 классе по информатике проходят
109 bolobol
 
17.03.23
16:37
Если, всё-таки, задача стоит в том, чтобы не брать много сразу элементов, то ВЫБРАТЬ ПЕРВЫЕ 2000 - обработать, выбрать следующие 2000, не выбирая те, что уже обработаны... И никакого огорода из копирований массивов не потребуется.
110 Гений 1С
 
17.03.23
16:37
Вариант для сишников:

Функция РазбитьМассивПоПачкам(М, РазмерПачки)
  Р = Новый Массив();
  Для Каждого Эл из М Цикл
    Если Р.Количество() = 0 ИЛИ Р[Р.Количество() - 1].Количество() = РазмерПачки Тогда
      Р.Добавить(Новый Массив());
    КонецЕсли;
    Р[Р.Количество() - 1].Добавить(Эл);
  КонецЦикла;
  Возврат Р;
КонецФункции
111 НафНаф
 
17.03.23
16:38
(107) запахло го*нокодом
112 Гений 1С
 
17.03.23
16:38
(109) да вы шьто?
113 Гений 1С
 
17.03.23
16:38
(111) сравни свою поделку и изящество в (110)
114 Кирпич
 
17.03.23
16:39
(109) массив нужен, чтобы его в функцию потом передать
115 bolobol
 
17.03.23
16:39
(113) Это не изящество - это говн@код! В чистом виде! Если так можно сказать про говн@код
116 НафНаф
 
17.03.23
16:39
(113) научись не экономить на буквах
117 Garykom
 
17.03.23
16:40
(113) извини но у тебя в (110) обычный говнокод в стиле 1С 7.7
118 Гений 1С
 
17.03.23
16:40
(114) Юноши обычно жизни не нюхавшие полны неоправданного энтузиазма
119 Гений 1С
 
17.03.23
16:40
(117) в стиле Си
120 Fish
 
17.03.23
16:40
(112) Да именно так. Элементарно просто :)))
121 bolobol
 
17.03.23
16:40
(118) Такое - лучше не нюхать, это да
122 Гений 1С
 
17.03.23
16:42
Хотя лучше переписать так:
Функция РазбитьМассивПоПачкам(М, РазмерПачки)
  Р = Новый Массив();
  Если М.Количество() <> 0 Тогда Р.Добавить(Новый Массив()); КонецЕсли;
  Для Каждого Эл из М Цикл
    Если Р[Р.Количество() - 1].Количество() = РазмерПачки Тогда
      Р.Добавить(Новый Массив());
    КонецЕсли;
    Р[Р.Количество() - 1].Добавить(Эл);
  КонецЦикла;
  Возврат Р;
КонецФункции
123 Fish
 
17.03.23
16:42
(114) По идее не нужен. Он же потом эти элементы обрабатывать хочет - какие-то удалять, какие-то метить, к каким-то префикс добавить, какие-то в отдельную папочку впихнуть. Хватит и условий.
124 Garykom
 
17.03.23
16:43
1. Результат запроса это не Массив а ТЗ
2. Раз ТЗ то добавляем колонку НомерПачки
3. В цикле заполняем НомерПачки, получаем КоличествоПачек
4. Используем
Пачка = ТЗ.Скопировать(Новый Структура("НомерПачки", НомерПачки))
для получения ТЗ нужной пачки
125 НафНаф
 
17.03.23
16:43
(122) остынь, сходи на улицу
126 bolobol
 
17.03.23
16:44
(123) Там в функцию НайтиСсылки массив нужен

(124) Гениально!!!
127 Fish
 
17.03.23
16:45
(126) Имеется ввиду, не нужен массив уже обработанных ссылок.
128 Гений 1С
 
17.03.23
16:46
(124) Сибирский лис! ... нет слов не бранных
129 Кирпич
 
17.03.23
16:49
(124) в (90) уже есть правильный ответ. А перебирать массивы в 500000 элементов в 1С - это дичь.
130 Лирик
 
17.03.23
16:52
Эх, пятница

Функция ПорционироватьКоллекцию(Коллекция, РазмерПорции) Экспорт

    Результат = Новый Массив;
      
    Для Сч = 0 По Коллекция.ВГраница() Цикл

        Если Сч%РазмерПорции = 0 Тогда
            Результат.Добавить(Новый Массив);
        КонецЕсли;                        
        
        Результат[Цел(Сч/РазмерПорции)].Добавить(Коллекция[Сч]);
        
    КонецЦикла;                
    
    Возврат Результат;

КонецФункции
131 Гений 1С
 
17.03.23
16:52
(129) это быстро, не поверишь
132 Garykom
 
17.03.23
16:52
(124)+ 3. Номер пачки можно заполнять или счетчиком + 1
или делением нацело

РазмерПачки = 1000;
КоличествоПачек = Цел(ТЗ.Количество / РазмерПачки) + 1;
Для ТекСтр Из ТЗ Цикл
   ТекСтр.НомерПачки = Цел(ТЗ.Индекс(ТекСтр ) / РазмерПачки) + 1;
КонецЦикла;
133 Fish
 
17.03.23
16:53
(130) "ПорционироватьКоллекцию" - лирично :)
134 Гений 1С
 
17.03.23
16:53
(130) это математический метод, мне не нравятся все эти деления, целые части и т.п
135 Garykom
 
17.03.23
16:54
(129) Через модификацию исходного запроса средствами СУБД это очень хорошее решение
136 Garykom
 
17.03.23
16:54
(134) Ты даже математику школьную уже забыл, да?
137 vovastar
 
17.03.23
16:54
(118) А ты до сих пор видимо нюхаешь.
138 Кирпич
 
17.03.23
16:55
(134) да всем похер, что тебе нравится. не для тебя писано, а для сообщества.
139 vovastar
 
17.03.23
16:55
Такое ощущение, что Сергей вышел в чат после обильного принятия.
140 Garykom
 
17.03.23
16:55
(130) тоже нормальный вариант
141 Гений 1С
 
17.03.23
16:56
(135) отнюдь. зачем трогать готовый рабочий запрос?
142 Гений 1С
 
17.03.23
16:56
(139) не, я сейчас делаю присед со штангой 85 кг, 6 подходов по 5 раз.
143 Garykom
 
17.03.23
16:56
(141) заверни его в ВТ и вперед
это стандартный способ работы в современных типовых конфах 1С
144 bolobol
 
17.03.23
16:57
(141) Результат запроса в принципе трогать незачем. 2000 раз Следующий - вот и готова порция
145 Лирик
 
17.03.23
16:57
(134) "Если Вам не нравятся собаки, то Вы просто не умеете их готовить".
Насколько я понял задача была разделить массив на массив массивов порционно с наименьшим количеством строк кода.
В 130 - максимум, что я смог выжать :)
146 bolobol
 
17.03.23
16:58
(145) Кстати - именно это в стиле Си, а не то что там выше Гений накодил...
147 Garykom
 
17.03.23
16:58
(144) а вот тех кто использует .Следующий пора уже того, на пенсию
есть же .Выгрузить() в ТЗ

сцуко поубивав бы кто в ТЗ не выгружает - отладка нормальная невозможна
148 Гений 1С
 
17.03.23
16:59
(143) сон разума плодит чудовищ. Видел я эти современные ВТ
149 Garykom
 
17.03.23
17:01
(147)+ а еще когда выборку из запроса как параметор передают в процедуру/функцию - это же ахтунг!!!
150 Кирпич
 
17.03.23
17:01
(147) говорят, что за ТЗ сейчас увольняют
151 bolobol
 
17.03.23
17:01
(149) Чой-та? Это ж экономия ресурсов невероятная!!
152 bolobol
 
17.03.23
17:02
(147) Обхода задуманного нет в ТЗ, Итоги, группировки... О чём Вы вообще?
153 Гений 1С
 
17.03.23
17:04
(150) отлично, в рядах фрилансеров будет больше вменяемых людей, которые знают, что стоимость разработки важнее мнимых правил оформления кода
154 Garykom
 
17.03.23
17:04
(150) Покажи код как ты проверишь что результат запроса только одна строка?
Без выгрузки в ТЗ!

Результат = Запрос.Выполнить().Выгрузить();
Если Результат.Колечество() = 0 Тогда
   Сообщить("=1");
ИначеЕсли Результат.Колечество() = 1 Тогда
   Сообщить("=1");
Иначе
   Сообщить(">1");
КонецЕсли;
155 Fish
 
17.03.23
17:04
(152) (151) Ну не умеет человек нормально работать с запросами, что ж поделать. Зато он умет ветку-ветку в Гите добавлять :)))
156 Гений 1С
 
17.03.23
17:04
(154) у резульатазапроса есть метод Пустой
157 Garykom
 
17.03.23
17:04
(152) Ты в курсе про?
ДеревоЗнач = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
158 Garykom
 
17.03.23
17:05
(155) ты не умничай, ты свой код без выгрузки в ТЗ покажи аналог (154)
159 Гений 1С
 
17.03.23
17:07
(158) для сравнения с нулем пустой. Далее делаешь выборку, а не выгрузку и все. о чем спич?
160 Гений 1С
 
17.03.23
17:07
РезультатЗапроса (QueryResult)
Пустой (IsEmpty)
Синтаксис:
Пустой()
Возвращаемое значение:
Тип: Булево.
Истина - нет ни одной записи; Ложь - в противном случае.
161 Garykom
 
17.03.23
17:08
(159) стандартная ситуация когда запросом ищем нечто в базе
и надо разные действия если не нашло совсем (ошибка плохо, не нашло)
когда нашло 1 (все отлично, работаем)
и когда нашло >1 (ошибка плохо, нашло много)
162 mikecool
 
17.03.23
17:09
(147) вон из профессии в ГО )
163 Fish
 
17.03.23
17:09
(158) В (154) какой-то тупой быдлокодерский ахтунг. Даже не знаю, зачем это может понадобиться.
164 Garykom
 
17.03.23
17:09
(160) а теперь добавь к (161) что тебе в ошибки надо вывести которые "много"
165 Fish
 
17.03.23
17:10
(161) Это делается сразу запросом, а не адским быдлокодом из (154) :))))
166 mikecool
 
17.03.23
17:10
(154) у выборки есть метод Количество()
167 Garykom
 
17.03.23
17:11
(163) для (161) - частая стандартная ситуация при любых загрузка-синхронизациях
когда по уид, коду, наименованию нашелся не один объект а не одного или много

и да часто видел когда берут первый попавшийся а потом фигеют от глюков
168 Гений 1С
 
17.03.23
17:11
(167) (166) отож, количество у Выборки
169 Fish
 
17.03.23
17:11
(166) Ну или через выборку.
170 Garykom
 
17.03.23
17:11
(166) в курсе
но тогда код превращается без выгрузки в ТЗ в нечто странное
171 Fish
 
17.03.23
17:12
(170) Нет, не превращается.
172 Garykom
 
17.03.23
17:12
да я знаю что промежуточная выгрузка в ТЗ жрет память и время
но экономит код и время при отладке/доработке
173 Garykom
 
17.03.23
17:12
(171) покажи?
174 mikecool
 
17.03.23
17:12
(170) ты о чем? Оо
175 Кирпич
 
17.03.23
17:13
(170) какие то вы с гением манерные. нравится... не нравится... странное...
176 Garykom
 
17.03.23
17:13
(174) покажи уже аналог кода (154) без ТЗ
177 Fish
 
17.03.23
17:13
(173) Что тебе показать? Как работать с выборкой? Сходи на курсы 1С, там тебя обучат, как правильно писать на 1С.
178 mikecool
 
17.03.23
17:14
Выборка = Запрос.Выполнить().Выбрать();
КолвоЗаписей = Выборка.Количество();
дальше продолжать?
179 Кирпич
 
17.03.23
17:14
(172) ты нормальный вабще? если у тебя в ТЗ упадет 500000 строк только ради того, чтобы ты проверил одна там запись или не одна :)))
180 Garykom
 
17.03.23
17:15
(175) да не нравится
когда в ERP УХ в отладчики в километрах кода по десяткам модулей ковыряешься

и когда у тебя .Выбрать() в одном модуле а .Следующий() разбросано по куче других...
181 mikecool
 
17.03.23
17:15
(179) на Го об этом не задумываются ))
182 Fish
 
17.03.23
17:15
(154) Кстати, несколько раз выполнять метод Количество() - это быдлокод :))
183 mikecool
 
17.03.23
17:15
(180) это только твои трудности )
184 mikecool
 
17.03.23
17:15
(182) для коллекции не принципиально, но считается да
185 Garykom
 
17.03.23
17:16
(179) если нужная обработка этих 500000 строк то один фиг их придется ксть в ТЗ или в другие структуры
и вот средствами платформы разом класть быстрей
186 Garykom
 
17.03.23
17:16
(185) *класть
187 mikecool
 
17.03.23
17:16
(180) а прикинь - еще НайтиСледующий и СледующийПоЗначениюПоля )))
188 mikecool
 
17.03.23
17:16
(185) зачем? обрабатывай последовательно
189 Garykom
 
17.03.23
17:17
(182) да обычно КоличествоРезультатов сначала делаю а уже затем по нему условие
190 Fish
 
17.03.23
17:17
(185) Зачем в ТЗ, если есть выборка? Ты правда не знаешь, как работать с выборкой, или придуриваешься?
191 magicSan
 
17.03.23
17:18
(110) причем тут сишники? это классика.
192 Garykom
 
17.03.23
17:19
(188) бывают разные ситуации
например надо отобрать из результата только которые
тогда код

ТЗ = Запрос.Выполнить().Выгрузить();
МассивСтрок = ТЗ.НайтиСтрок(Отбор);

намного логичней
193 lodger
 
17.03.23
17:19
(185) >>платформы разом класть быстрей
вот тут ты прав на все 100, потом говорят что сервер 1с обожрался памяти и исдох.
194 Garykom
 
17.03.23
17:20
(190) Покажи уже класс как работать с выборкой!!!
Ну напиши аналог (154)
195 Fish
 
17.03.23
17:21
(192) Бывают, не спорю. Есть отдельные ситуации, когда выгрузка результата в ТЗ будет оптимальнее. Но в (147) ты написал совсем другое ты написал, что ТЗ всегда надо использовать, а это бред.
196 lodger
 
17.03.23
17:21
(192) если у тебя разные отборы накладываются к одной такой выгрузке, то вроде и ладно.
но если ты это делаешь единожды, то не проще сразу уменьшить результирующий запрос оператором ГДЕ?
197 mikecool
 
17.03.23
17:21
(194) я тебе в (178) написал, чего еще надо?
198 Garykom
 
17.03.23
17:21
(195) для отладки ТЗ удобней
всегда можно ее целиком глянуть или выгрузить и покрутить
199 magicSan
 
17.03.23
17:22
(192) это глупо, тебе вернули данные которые ты очевидно будешь обрабатвать полностью - поэтому нужно упорядочить и последовательно а не через найтпистроки
200 Fish
 
17.03.23
17:23
(194) Я повторюсь: сходи уже на курсы по 1С. Думаю, курсы для новичков вполне подойдут, таким элементарным вещам, по-моему уже там учат.
А аналог (154) без ТЗ тебе уже написали, но ты, похоже, даже не понял этого :))))
201 Кирпич
 
17.03.23
17:23
(198) ну так и используй для отладки. только не забывай убирать
202 mikecool
 
17.03.23
17:23
(198) для отладки всегда можно рассчитать Выгрузить и посмотреть
203 Fish
 
17.03.23
17:23
(197) Видимо, не осилил :)))
204 Garykom
 
17.03.23
17:23
(197) 1. вопрос (194) был не к тебе а к Fish
2. Это не аналог а хрень
205 Fish
 
17.03.23
17:24
(202) Сейчас выяснится, что мастер веток-веток не умеет и отладчиком пользоваться :)))
206 lodger
 
17.03.23
17:24
(154) чем тебя так ломает работать с интерфейсом выборки? это тоже некая таблица, только в памяти сервака, и ты её не выгружаешь в ТЗ ещё раз на такой же размер памяти.

РезультатЗ = Запросище.Выполнить();
Если РезультатЗ.Пустой() Тогда
    Возврат "пусто"
Иначе
    ВыборкаЗ = РезультатЗ.Выбрать();
    Если ВыборкаЗ.Количество() = 1 Тогда
        Возврат "Тут 1 строка";
    Иначе
        Возврат "Тут много строк";
    КонецЕсли;    
КонецЕсли;
207 mikecool
 
17.03.23
17:24
(204) ты что то совсем гонишь )))
208 Garykom
 
17.03.23
17:24
(197) >я тебе в (178) написал, чего еще надо?

ты получение элементов покажи дальше ))
чтобы вывести в ошибку
209 Fish
 
17.03.23
17:25
(208) Ну вот тебе в (206) написали. Зачем там элементы получать?
210 Garykom
 
17.03.23
17:25
(206) а сами значения как получить и вывести?
211 Лирик
 
17.03.23
17:26
Кстати, вот вариант с запросом:

    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка,
    |    АВТОНОМЕРЗАПИСИ() КАК НомерЗаписи
    |ПОМЕСТИТЬ Таблица
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    Таблица.Ссылка,
    |    ЦЕЛ(Таблица.НомерЗаписи / &РазмерПорции) КАК ИндексПорции
    |ИЗ
    |    Таблица КАК Таблица";
212 mikecool
 
17.03.23
17:26
(208) каких элементов? Следующий() и в путь
или НайтиСледующий или СледующийПоЗначениюПоля
213 Fish
 
17.03.23
17:26
(210) Ты правда не знаешь? Охренеть :)))
214 mikecool
 
17.03.23
17:27
+212 НайтиСледующий и структуру принимает
215 Garykom
 
17.03.23
17:27
(213) знаю

и знаю что без ТЗ код превращается в нечто странное в этом случае
216 mikecool
 
17.03.23
17:27
(213) троллит наверное, жирный Гарик ))
217 Fish
 
17.03.23
17:27
(216) Да я тоже подозреваю, что троллит. :))
218 Кирпич
 
17.03.23
17:28
(213) в Go такого нету
219 bolobol
 
17.03.23
17:28
Полноценная пятничная ветка получилась)) Один массив массивов из запроса-запроса получить, второй что из запроса вообще ничего не получить...
220 Кирпич
 
17.03.23
17:28
(217) да бухой он. пятница же
221 Garykom
 
17.03.23
17:28
(216) покажи как в случае результат запроса >1 строки получить строки со 2 до последней без ТЗ
222 Fish
 
17.03.23
17:29
Хотя работа с выборкой - это тебе не пулл реквесты в бранчи коммитить  - тут хоть немного соображать надо :))))
223 bolobol
 
17.03.23
17:29
(221)
Если Следующий() Тогда одна строка
Если Следующий() - тогда тут много ещё строк
224 Garykom
 
17.03.23
17:29
(220) нет, просто заипался при отладке "типового" кода ERP УХ
225 Garykom
 
17.03.23
17:31
(224)+ например попробуйте (в ERP/КА/УТ11) в печформу УПД/УКД свою колонку добавить и заполнить ее данными из документа ))
226 Garykom
 
17.03.23
17:32
(222) >пулл реквесты в бранчи коммитить

ты в курсе что хрень написал?
227 Кирпич
 
17.03.23
17:32
(224) да брось ты. пускай 1С сама свой код отлаживает. Давай с гением массивы делить. Изящно и в стиле Си.
228 Garykom
 
17.03.23
17:32
(223) муахаха
229 Garykom
 
17.03.23
17:35
(227) я не думаю что много 1Сников сможет с лету разобраться в массивах, срезах и картах из Го
230 Кирпич
 
17.03.23
17:37
(229) Думаешь, что если ты с лёту не разобрался, то и другие не смогут? Тебя гений не укусил случайно?
231 mikecool
 
17.03.23
17:40
(229) я норм разобрался в объектах питона, причем слету )))
не суди по себе )))
232 mikecool
 
17.03.23
17:42
+231 вот чего я так и не понял в 2005, как в нет с делегатами работать ))
233 magicSan
 
17.03.23
17:42
(231) я тоже со второго раза осилил яндекс практикум за вечер, через месяц правда всё забыл. Ну задачи которые ставил под него решил.
234 Garykom
 
17.03.23
17:42
я всего то высказался о своем личном опыте кодинга на 1С
что через ТЗ получается намного проще, понятней и удобней в будущем при доработке и отладке
235 Garykom
 
17.03.23
17:43
(232) >как в нет с делегатами работать
это как ОписаниеОповещения в 1С
236 Garykom
 
17.03.23
17:45
(234)+ и признаю что иногда нет смысла делать через ТЗ
и можно банально обойти выборку запроса через Следующий()
237 mikecool
 
17.03.23
17:50
(235) да знаю подсознательно, но в том году мне кореш объяснял - я был не готов к этому знанию
238 Кирпич
 
17.03.23
17:55
(237) чо там понимать. ссылка на метод
239 Гена
 
17.03.23
17:55
В мужском споре важен каждый сантиметр
240 Кирпич
 
17.03.23
17:57
(239) побеждает тот, кто в конце заявит "А, вы про сантиметры? Я то в дюймах говорил."
241 Garykom
 
17.03.23
17:59
(240) эээ у меня в вершках
242 Garykom
 
17.03.23
18:01
(241)+ у меня сервер аж 6 вершков
243 bolobol
 
17.03.23
18:17
Самое главное - корешок, а не вершок
244 magicSan
 
17.03.23
19:26
(236) если это не тиражное решение то надо тз - там всё сильно быстрее будет чем ваши выборки.
245 novichok79
 
17.03.23
19:50
переходи на голанг, там можно одной строчкой порезать слайс.