|
Получить уникальные значения колонки Таблицы значений | ☑ | ||
---|---|---|---|---|
0
Maniac
27.03.17
✎
13:57
|
Интересный вопрос))
Как получить все уникальные значения в определенной колонке - не выгружая и не свертывая ТЗ |
|||
37
Nuobu
27.03.17
✎
14:39
|
(36) Без перебора строк - никак.
|
|||
38
Вафель
27.03.17
✎
14:39
|
(36) делай в момент, для кэша юзай соотвествие
|
|||
39
Maniac
27.03.17
✎
14:40
|
(34) неверный параметр - это при передаче в запрос ТЧ без предварительной выгрузки
|
|||
40
Nuobu
27.03.17
✎
14:40
|
(36) Можешь добавить внизу формы прогресс бар. Это ускорит работу в разы!
|
|||
41
Злопчинский
27.03.17
✎
14:40
|
(37) ..внезапно, да? ;-)
|
|||
42
1dvd
27.03.17
✎
14:40
|
(36) надо об этом позаботиться в момент заполнения этих 650 кСтрок
|
|||
43
Вафель
27.03.17
✎
14:40
|
Контрагент = Кэш[Текст];
Если Контрагент = Неопределено Тогда Контрагент = НайтиКонтрагента(Текст); Кэш.Вставить(Текст, Контрагент); КонецЕсли |
|||
44
Maniac
27.03.17
✎
14:41
|
(37) сейчас используется цикл по этой короткой таблице а в цкиел обращение к ТЧ с методом НайтиСтроки с отбором по определенному соответствию
И там перебор строк Надо от этого уйти |
|||
45
Maniac
27.03.17
✎
14:43
|
(43) как вариант.
|
|||
46
Nuobu
27.03.17
✎
14:44
|
(44) Уходи.
|
|||
47
Вафель
27.03.17
✎
14:44
|
(45) единственный вариант
|
|||
48
1dvd
27.03.17
✎
14:44
|
(23) так и напрашивается левое соединение
|
|||
49
Вафель
27.03.17
✎
14:45
|
(48) нет смысла ибо сами изначальные данные вне реляционой базы
|
|||
50
Maniac
27.03.17
✎
14:45
|
1) выгружаю конкретную колонку
2) свертка - получаю уникальный список 3) нахожу ссылки 4) делаю перебор уникального списка 5) в цикле обращаюсь к главной ТЗ с методом найти по уникальному значению 6) дополняю все строки. С кешем 4-5-6 все равно останутся как ни крути. Единственное что он заменит это 1-2 И неизвестно будет ли это лучше. ЧЕм выгрузить колонку и свернуть ее |
|||
51
Maniac
27.03.17
✎
14:47
|
(48) плохо. придется для запроса выгружать еще раз всю таблицу, соединять, и потом еще и циклом снова вс строки перебирать.
|
|||
52
Вафель
27.03.17
✎
14:47
|
(50) так нужно делатьв момент загрузки тз, а не после
|
|||
53
Вафель
27.03.17
✎
14:47
|
почему именно после делаешь?
|
|||
54
Nuobu
27.03.17
✎
14:47
|
(50) Выгружай все колонки и ищи сразу всё.
|
|||
55
Вафель
27.03.17
✎
14:48
|
есть еще вариант: строки не обрабатывать, а обрабатывать их только в момент записи в бд
|
|||
56
Zhuravlik
27.03.17
✎
14:49
|
(9)(33)(34) Извиняюсь, пропустил "не выгружая ее во временную таблицу"...
|
|||
57
НеБорис Нуралиев
27.03.17
✎
14:50
|
(23) Странное желание.
Надеюсь автор понимает, что любой обход таблицы - это цикл? Платформа при выгрузке, загрузке, свертке и прочих операциях с ТЗ тоже пользуется циклами (сюрприз, да?). Только делает это на более низком уровне абстракции. Поэтому, если хочешь без циклов, делай все нужные действия во время добавления строк. |
|||
58
Maniac
27.03.17
✎
14:51
|
(52) в цикле 650 тысяч строк? Что то мне подсказывает что это не вариант.
К тому же я описал - на примере производителей. Чел грузит таблицу - и каждый раз могут быть произвидители которых нет в базе вообще. Но он загрузил таблицу и есть поля быз ссылок. Он создает новых - и теперь их надо вернуть в строки ссылками. Этот список "изменяющийся каждый раз" - завтра появятся строки с новым производителем - неведомым на момент загрузки ТЗ |
|||
59
Nuobu
27.03.17
✎
14:52
|
(58) Та не парься ты так. Видали и побольше таблицы.
|
|||
60
Maniac
27.03.17
✎
14:52
|
Ладно короче (2) самое оптимальное.
|
|||
61
Вафель
27.03.17
✎
14:53
|
(58) переходи на внешние источники данных.
типа mysql какой. Скорость работы может существенно повыситься |
|||
62
Злопчинский
27.03.17
✎
14:53
|
(47) внезапно этот вариант маня стал искать в 2017г, в то время как другие его юзают годами и десятилетиями
|
|||
63
Мимохожий Однако
27.03.17
✎
14:53
|
(58) достаточно по мере добавления новых поставщиков собирать их в массив или список и проверять в этом списке
|
|||
64
Maniac
27.03.17
✎
14:53
|
плохо что в запрос нельзя ТЧ впихнуть без выгрузки.
|
|||
65
Nuobu
27.03.17
✎
14:54
|
(63) Достаточно это делать вообще молча, не о чем юзера не уведомляя.
|
|||
66
Вафель
27.03.17
✎
14:54
|
(61) + сможешь динамические списки заюзать
|
|||
67
Maniac
27.03.17
✎
14:54
|
(62) варианты уже реализованы. Ноя за платформой не всегда слежу - может там появилось что то уникальное)
Было бы супер просто чтобы был метод Таблиц значений с тем чтобы в колонке значение заменить другим значением. Вот это было бы круто |
|||
68
Maniac
27.03.17
✎
14:55
|
Хотя бы это. Уже было бы просто супер
|
|||
69
Злопчинский
27.03.17
✎
14:55
|
(60) Свертка м.б. очень небыстрым действием... очень...
при загрузке в базу работай по кэшу. |
|||
70
1dvd
27.03.17
✎
14:55
|
(64) можно, если это ТЧ сохраненного объекта БД
|
|||
71
Злопчинский
27.03.17
✎
14:56
|
(67) мини-база в памяти. и апдейт. ничего лучше скульного подхода вряд ли придумать...
??? |
|||
72
Maniac
27.03.17
✎
15:01
|
Хотя да кеш в моем случае подходит на ура.
Делаю |
|||
73
dezss
27.03.17
✎
15:02
|
(63) + в этом массиве (или лучше тз) хранить ссылки на строки, где надо будет их подставить.
Вот кстати неплохой, ИМХО, вариант. Не надо будет заново список перелопачивать. Все ссылки уже есть в маленькой ТЗ (она маленькая, потому что там только те, которых сразу не нашли) |
|||
74
1dvd
27.03.17
✎
15:02
|
уговорили-таки. И как Маня свои миллионы заработал...
|
|||
75
FIXXXL
27.03.17
✎
15:03
|
(67) ЗагрузитьКолонку()
|
|||
76
FIXXXL
27.03.17
✎
15:04
|
(74) на пользователях, которые код не читают :)
|
|||
77
Вафель
27.03.17
✎
15:05
|
(74) чтоб продавать не нужно иметь совершенный продукт
|
|||
78
Maniac
27.03.17
✎
15:07
|
(73) эээ стоп. А если из 650 - в 600 строках производители которые есть в базе. Но их же надо найти.
При этом не дать в каждой строке поиск ссылки. Не вариант. Надо весь списоку уникальных выгрузить несмотря на то есть или нет. Чтобы те что есть отработали только 1 раз |
|||
79
Вафель
27.03.17
✎
15:08
|
(78) как твои поделки вообще ворочаются, если ты элементарных вещей не знаешь?
|
|||
80
dezss
27.03.17
✎
15:09
|
(78) 2 списка.
Один из тех, кто нашелся (соответствие). Второй из тех, кто не нашелся (их заведем потом и подставим в строки, которые сохранили). Тут надо будет опять таки либо кэш, либо свернуть. |
|||
81
Maniac
27.03.17
✎
15:10
|
Я занимаюсь оптимизацией)))
Сейчас 10к строк отрабатывается за 5 секунд))) - это вообще все на свете что у меня впихнуто. От начала загрузки тз - то всей синхронизации всего что только там есть и запись в базу Но я хочу ЕЩЕ БЫСТРЕЕ))) |
|||
82
dezss
27.03.17
✎
15:11
|
(80) но во втором лучше свернуть, чтоб заново их не перебирать все...хотя можно попробовать и то и другое и посмотреть на скорость...
|
|||
83
Serginio1
27.03.17
✎
15:11
|
||||
84
FIXXXL
27.03.17
✎
15:18
|
Мань, а почитай про ПовторноеИспользование
или у тебя весь код в обработке? |
|||
85
Бертыш
27.03.17
✎
15:36
|
(67) Обрабатывай в тексте. В тексте то можно, но выгружать загружать надо в строку
|
|||
86
Бертыш
27.03.17
✎
15:41
|
+85 Как на 7.7 заменяли все значения в ТЗ по одной колонке
|
|||
87
Бертыш
27.03.17
✎
15:52
|
ЗначениеВСтрокуВнутр
ОбработалТекст с заменой ЗначениеИзСтрокиВнутр И всё. Вот только таблица у Вас сильно большая |
|||
88
Бертыш
27.03.17
✎
16:09
|
Можно таблицу во внешнем файле готовить под ЗначениеИзФайла
|
|||
89
Бертыш
27.03.17
✎
16:18
|
таблицу значений
|
|||
90
Maniac
27.03.17
✎
16:22
|
КОроче говоря попробовал Соответствия - рулят!!!!!
|
|||
91
Maniac
27.03.17
✎
16:22
|
просто офигенно рулят!!!!
|
|||
92
Злопчинский
27.03.17
✎
16:24
|
(78) поздравляем с охренительным прогрессом!
|
|||
93
Злопчинский
27.03.17
✎
16:25
|
(91) я счастлив за тебя.
|
|||
94
Maniac
27.03.17
✎
16:47
|
Соответствия.Вставить - само все проверяет. не надо ничего искать и тп.
Если нет добавлет, если есть заменяет. Оставляет список только уникальных И всего одна строка кода |
|||
95
Maniac
27.03.17
✎
16:48
|
И также потом там ссылки вставляю в значение - и когда надо запихнуть просто Получить - по ключу который текст - и ссылка запихивается.
|
|||
96
Злопчинский
27.03.17
✎
16:49
|
(95) главное - не впихивай невпи><yемое!
|
|||
98
Волшебник
модератор
27.03.17
✎
17:56
|
(90) ждём новую версию Мегапрайса
|
|||
99
Maniac
28.03.17
✎
01:43
|
В общем суперски решилась проблема.
Создал массив соответствий по куче колонок. В них при заполнении таблицы впихиваются все уникальные записи) Создал регистр специальный. Хранения соответствий одним махом. Так как например у нас самая многократно встречаемая задача когда производители (самое большое количество элементов) а также иерархические парйсы с группами - по этим элементам идет несоответствие. Те то что в прайсе у поставщика свои группы - у клиента могут быть свои - называтся по другому и так далее. Поэтому для уникальных значений люди хранят соответсвия. В общем потом махом все соответсвия проверяются на существующие элементы или из регистра соответвий. Универсально. И потом одним махом в таблице заменяю на ссылки. Работает чудесно. |
|||
100
Злопчинский
28.03.17
✎
03:14
|
(99) и по какому поводу радость? По тому, что дошёл до идеи хранения соответствий?
|
|||
101
Serginio1
28.03.17
✎
14:19
|
Да уж. Хэш таблицы, Dictionary типа B+ деревьев давно используются в любых языках. Структура это аналог Хэш таблицы
https://ru.wikipedia.org/wiki/Хеш-таблица |
|||
102
Maniac
28.03.17
✎
14:44
|
(101) аналог не аналог. почти тот же список значений.
Только удобно что не надо искать значение чтобы проверить его наличие и добавить в случае его нет. Одна строчка кода - это супер. И получение по ключу супер. Просто удобно в рамках 1С |
|||
103
Maniac
28.03.17
✎
23:35
|
Народ ситуация - есть колонка со смешанными типами.
Для строк с разными типами - сами типы определены но значения пустые ссылки. Например в одной строке - типа валюта с пустой В друго справочник производители с пустой ссылкой. Как условие на пустую ссылку проверку сделать. но чтобы не пришлось перечислять тип |
|||
104
Maniac
28.03.17
✎
23:36
|
не могу впоймать пустые значени. ЗначениеЗаполнить не помогает.
А мне надо если - там пустая ссылка любого типа справочника - ставить галку Даже 0 почему то считает заполненностью |
|||
105
Сергиус
28.03.17
✎
23:53
|
(103) .Пустая()
|
|||
106
1dvd
29.03.17
✎
07:15
|
(103) Справочники.ТипВсеСсылки()
|
|||
107
mistеr
29.03.17
✎
08:30
|
(101) Не путай Структуру и Соответствие. В структуре никакими хэшами не пахнет.
|
|||
108
mistеr
29.03.17
✎
08:32
|
(104) >ЗначениеЗаполнить не помогает.
Что-то не верится. Показывай код. |
|||
109
FIXXXL
29.03.17
✎
09:29
|
ЗначениеЗаполнено()
|
|||
110
dezss
29.03.17
✎
10:32
|
(94) Но ведь само соответствие не индексировано.
Не лучше ли вместо соответствия создать индексированную ТЗ и уже в нее пихать то, что надо. К тому же, индекс можно строить и по нескольким колонкам сразу. Да, тут будет не одна строка кода, но поиск значения будет значительно быстрей при большом количестве строк. |
|||
111
mistеr
29.03.17
✎
11:45
|
||||
112
Волшебник
модератор
29.03.17
✎
11:46
|
(110) соответствие индексировано для ключей примитивного типа
|
|||
113
dezss
29.03.17
✎
12:17
|
(112) о как...спасибо, не знал...
|
|||
114
mistеr
29.03.17
✎
12:28
|
(112) А для других - нет? Источник?
|
|||
115
Волшебник
модератор
29.03.17
✎
12:39
|
(114) А для других нет. Ссылки тоже индексируются. Поверьте мне на слово.
|
|||
116
mistеr
29.03.17
✎
12:43
|
(115) Про ссылки верю, хоть это и не примитивный тип.
Не знаю, можно ли применять термин "индексируются" к хеш-таблице. |
|||
117
dezss
29.03.17
✎
12:47
|
(116) Ну в той ссылке, что ты предоставил этот термин применяется:
"Это связано с тем, что при достижении некоторого значения коэффициента заполнения необходимо осуществлять перестройку индекса хеш-таблицы: увеличить значение размера массива H и заново добавить в пустую хеш-таблицу все пары." |
|||
118
Serginio1
29.03.17
✎
13:23
|
(117) Понятие индексируются относятся к упорядочиванию.
В Хэш таблице нет возможности поиска на больше и или меньше, только точное соответствие. Понятие индекс в Хэш таблице это позиция в таблице. При этом от вариантов Хэш таблицы, коллизии сохраняются в виде списков либо прямо в таблице либо ввиде выделения памяти отдельно от таблицы. |
|||
119
Serginio1
29.03.17
✎
13:25
|
Позиция рассчитывается как
ХэшКод % размерТаблицы а размерТаблицы подбирается под простое число для уменьшения коллизий |
|||
120
dezss
29.03.17
✎
14:20
|
(119) А я правильно понимаю, что благодаря использованию Хэш-кода размер ключа не ограничен, как, например, он ограничен при построении индекса таблицы?
|
|||
121
Serginio1
29.03.17
✎
14:57
|
(120) Хэш как правило инт 4 байта.
При этом могут быть разные значения с одинаковым хэш кодом. При нахождении нужного хэша нужно сравнить и значения. Но хэш таблица в отличие от Б+ деревьев должна вся реструктуризироваться при полном заполнении таблицы. |
|||
122
dezss
29.03.17
✎
15:21
|
(121) Ну это же и есть те самые коллизии, которые решаются на уровне платформы. Так что можно юзать. Спасибо.
|
|||
123
mistеr
30.03.17
✎
18:51
|
(0) Маня, будь мужиком, нарисуй нормальную стрелочку в своей рекламе. И шрифты вырвиглазные поменяй. И цвета.
|
|||
124
Maniac
30.03.17
✎
19:43
|
(123) ок ок)
я не художник. В продолжении темы вопрос Имеем обьект обработки. В ней к примеру 3 ТЗ с данными. Вызывается некая серверная процедура в которую надо передать только данные одной таблицы. Проблема в следующем - На клиенте кнопка. в ней вызов идет процедуры с диррективой НаСервере - а значит херачутся все данные всего обьекта на сервер. Как ограничить) |
|||
125
DrShad
30.03.17
✎
20:01
|
На сервере без контекста
|
|||
126
Maniac
30.03.17
✎
20:15
|
(125) она не позволяет вызывать процедуры зашитые в модуле
|
|||
127
Maniac
30.03.17
✎
21:04
|
Мне надо как то вызывать процедуры модуля без передачи всех данных объекта на сервер.
Я бы сказал мне надо все вплоть до наоборот - с сервера получать данные - при этом используя процедуры модуля |
|||
128
Vlad_69
30.03.17
✎
21:10
|
(124) ПоместитьВоВременноеХранилище/ПолучитьИзВременногоХранилища никак не поможет?
|
|||
129
roman52
30.03.17
✎
21:23
|
(127) это все равно, что гланды доставать через ноздрю
передавай исходный файл на сервер (128), и на сервере уже изгаляйся как хочешь |
|||
130
Vlad_69
30.03.17
✎
21:33
|
Была как-то у меня задачка по импорту данных из сторонней базы. Совсем сторонней, аж на Sybase 9 версии. И была там пара таблиц где-то под 400 тыс.записей каждая. Сразу в базу 1С их писать смысла не было, надо было по по определенным отборам показать пользователю, а он уж решал - "эту группу записей мы импортируем, а эту нет". Причем помнится, что была еще заморочка, что получать частями не выходило, потому как критерии отбора можно было получить, только прочитав таблицу целиком. И где эти 400 тыс держать? На сервере-то они во временные ТЗ запихивались, а как на клиента тащить, бо помрет же с натуги болезный :) ? Да и ни в какую ТЧ не засунешь. Выкрутился так:
ИмпортируемаяТаблицаАдрес = ПоместитьВоВременноеХранилище(SybaseTable1,ЭтаФорма.УникальныйИдентификатор); (где ИмпортируемаяТаблицаАдрес - реквизит формы обработки, SybaseTable1 - временная ТЗ). А потом при повторном вызове серверной процедуры: SybaseTable1 = ПолучитьИзВременногоХранилища(ИмпортируемаяТаблицаАдрес); |
|||
131
Maniac
30.03.17
✎
22:34
|
(128) оно не дает вызывать процедуры модуля.
Да это подходит если с клиента передать на сервер. Но у меня например вообще все данные в обработке изначально на сервере всегда; И я бы не хотел их передавать на клиент. Или передавать но частично. |
|||
132
Maniac
30.03.17
✎
22:37
|
(130) тут ситуация такая обработка сделана под фоновые задания.
ПОэтому в модуле содержится вся фигня по заполнению и обработке, Но также эта обработка и в визуальном режиме работает Соответственно мне надо много процедур брать из модуля. Мне было бы достаточно чтобы они вызывались интерактивно - но все данные оставались на сервере, А я мог на клиент брать только чатисные какие то данные. Или просто на клиенте чел жмет кнопку - вызывается процедура модуля которая те данные что на сервере = фигачит куда надо. Короче управление с клиента теми данными что есть в обработке на сервере. |
|||
133
Maniac
30.03.17
✎
22:40
|
Короче ладно фиг с ним с усложнениями.
Просто достаточно чтобы на клиенте можно было вызвать процедуру модуля без перегрузки данных БезКОнтекста не получается брать процедуры модуля - даже если бы они вообще ничерта не делали |
|||
134
Maniac
30.03.17
✎
22:45
|
короче забейте голова не варит
|
|||
135
FIXXXL
31.03.17
✎
08:58
|
(133) если процедуры модуля (мы же про модуль объекта?) не используют данных формы, попробуй на каждый вызов процедур
Обр = Обработки.МойМегаБакс.Создать(); Обр.ЭкспортнаяПроцедураМодуля(); |
|||
136
FIXXXL
31.03.17
✎
09:02
|
(135) +ВременноеХранилище в адрес реквизита позволит не гонять данные на клиент
гоняешь только реквизит формы, на сервере по реквизиту-адресу всегда найдешь свою таблицу |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |