Имя: Пароль:
1C
 
Получить уникальные значения колонки Таблицы значений
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
(110) Почитай что ли, что такое Соответствие

https://ru.wikipedia.org/wiki/Хеш-таблица
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) +ВременноеХранилище в адрес реквизита позволит не гонять данные на клиент
гоняешь только реквизит формы, на сервере по реквизиту-адресу всегда найдешь свою таблицу
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.