|
Вопрос по таблице значений | ☑ | ||
---|---|---|---|---|
0
asder117
01.08.18
✎
18:45
|
Доброго времени суток. Есть 2 таблицы с двумя колонками. Ка можно узнать сколько раз значения в таблице 2 входят в таблицу 1. И возможно ли это реализовать запросом. Спасибо заранее
|
|||
1
Cyberhawk
01.08.18
✎
18:49
|
Условия неточные
|
|||
2
Вафель
01.08.18
✎
18:49
|
можно и запросом и без
|
|||
3
Cyberhawk
01.08.18
✎
18:50
|
Таблица 1:
Вася 1 Петя 2 Ваня 3 Таблица 2 Петя 2 Петя 2 Петя 2 Ваня 1 Какой ответ по твоим условиям должен быть? |
|||
4
asder117
01.08.18
✎
18:57
|
(1) к примеру есть таблица1
(номенклатура1 - 3 ед. Номенклатура2- 2 ед. Номенклатура3- 2 ед.) есть вторая Номенклатура1 - 6 ед. Номенклатура2 - 2 ед. Номенклатура3 - 4 ед. Номенклатура4- 5 ед. Вхождение 1во вторую 1 |
|||
5
xXeNoNx
01.08.18
✎
18:58
|
Ответ - можно, остальное, я так понял, не важно
|
|||
6
asder117
01.08.18
✎
18:59
|
(5) 0
|
|||
7
asder117
01.08.18
✎
19:01
|
(5) как вопрос риторический
|
|||
8
xXeNoNx
01.08.18
✎
19:05
|
(4) напиши итоговую таблицу, которая должна получиться
|
|||
9
Cyberhawk
01.08.18
✎
19:20
|
(4) Так что с моим примером?
|
|||
10
Вик72
01.08.18
✎
19:25
|
(0) и какая зарплата на этой вакансии?
|
|||
11
tesseract
01.08.18
✎
19:28
|
(0) Можно запросом. Можно перебором.
(10) Больше на собеседование похоже. |
|||
12
asder117
01.08.18
✎
19:41
|
(10) ответ 0 (10) не очень большая.вопрос просто для себя хочу понять как. (8) таблиц не должна получиться а должно получиться число вхождений в (4) ответ -1. (11) это было на собеседовании у моего знакомого.
|
|||
13
tesseract
01.08.18
✎
21:10
|
(12) В любой книжке про язык запросов 1С все подробно разжевано. Если на такой простой вопрос не можешь ответ дать - ты не пройдешь собеседование.
|
|||
14
asder117
05.08.18
✎
23:27
|
(11) перебором через найтистроку можно конечно...но долго....а вот про запрос....все перерыл...мачасть пересмотрел....не могу понять как это сделать...пробовал через временные таблицы но полуить количество никак...поможайте понять плз. (13) вопрос простой но я встал в тупик
|
|||
15
NSSerg
05.08.18
✎
23:34
|
алгоримически правильно задача решается чйерез О(N) при помощи hashmap/hashset
Запрос решит задачу хуже. Если без индексирования, то за О(N^2), если с индексированием, то за NlnN |
|||
16
asder117
05.08.18
✎
23:35
|
(15) Уважаемый а можно нормальным языком..как лучше
|
|||
17
NSSerg
05.08.18
✎
23:38
|
В 1cv8 это соответствие.
цикл по строкам первой таблицы, и записать туда в ключ товар+количество. Потом по строкам второй таблицы, с проверкой наличия в соотвтествии. |
|||
18
NSSerg
05.08.18
✎
23:39
|
(16) Я вроде нормальным и написал.
|
|||
19
NSSerg
05.08.18
✎
23:45
|
http://catalog.mista.ru/public/79285/
вот тут доказательство того что соответствие это hash таблица. |
|||
20
NSSerg
05.08.18
✎
23:45
|
||||
21
МихаилМ
05.08.18
✎
23:46
|
скд справится с этой задачей
|
|||
22
NSSerg
05.08.18
✎
23:47
|
(21) то есть скорость уже значения не имеет?
Прикинь, сколько времени скд будет сравнивать две тз по 10000 строк |
|||
23
МихаилМ
05.08.18
✎
23:51
|
(22)
если использовать в скд ВычислитьВыражениеСГруппировкойТаблицаЗначений то ускорение будет минимум в 2 раза. |
|||
24
H A D G E H O G s
05.08.18
✎
23:58
|
(0) Если 2 таблицы - приблизительно одинаково велики - сравнениеслиянием, иначе - НайтиСтроки
|
|||
25
asder117
05.08.18
✎
23:58
|
(18) (23) вообщем коллеги задача тестовая подкинули для развития...Сам блин написал конфигурацию по которой работает предприятие....а эту простоту (как говорят) решить не могу.
Задача в этом Иногда директор объявляет мотивирующую акцию для менеджеров. Суть акции заключается в одновременной реализации набора колбас. Одновременная реализация оформляется одним документом Реализация товаров и услуг. Акция действует определенный период времени, потом набор меняется. Менеджер, продавший больше всех наборов за период, получает единовременную премию. Например, объявлена акция: с 01.01.2016 по 10.01.2016 продажный набор включает: Колбасу краковскую - 3 ед. Колбасу московскую - 2 ед. Колбасу вареную - 2 ед. Менеджер "Иванов" продал контрагенту "Петров" 02.01.2016 (документ Реализация № И001): Краковская - 6 ед. Московская - 2 ед. Вареная - 4 ед. Зернистая - 5 ед. Значит он продал один набор. Требуется отчет о количестве проданных за указанный период наборов колбас по каждому менеджеру. Набор указывается самим руководителем в форме отчета в виде таблицы со столбцами: Номенклатура, Количество. спасибо заранее за толчок в нужное русло |
|||
26
NSSerg
05.08.18
✎
23:59
|
(23) В чем разница между О(N^2) и О(N)?
в первом случае для каждой строки из первой строки мы перебором смотрим есть ли такая-же строка во второй таблице, так отработает запрос. это для двух ТЗ по 10000 строк - 100000000 операций. во втором, сначала проход по строкам первой таблицы с занесением в хеш-таблицу (соотвествие), это 10000 операций потом проверка вхождения в соотвествия каждой строки из второй таблицы. в хеш-таблицы проверка вхождени это константа, то есть требует не 10000 операций ка проверка в массиве, проверка перебором, а одну операцию. то есть второй метод потребует 20000 операций, возможно чуть более долгих. именно чуть, константно. то есть разница в скорости в тысячи раз. |
|||
27
H A D G E H O G s
06.08.18
✎
00:03
|
(26) Хэш таблица имеет смысл, если на большую таблицу (по которой не строится хэш-таблица) будет наложен фильтр по индексу.
|
|||
28
H A D G E H O G s
06.08.18
✎
00:05
|
(26) Ну, и, естественно, на большой таблице уже есть индекс.
|
|||
29
H A D G E H O G s
06.08.18
✎
00:06
|
Я в 24 был не прав с НайтиСтроки, привык, что в статичных SQL таблицах уже есть индексы.
|
|||
30
МихаилМ
06.08.18
✎
00:08
|
(26) если требуется сопоставить 2 тз по нескольким колонкам,
то для использования соответствия поля придется кодировать. те потребуется дополнительные вычисления в зависимости от колва колонок. |
|||
31
asder117
06.08.18
✎
00:10
|
(24) Через НайтиСтроки с одной стороны это выход из положения если бы не надо было узнать количества наборов, а тут как раз это и надо. Один из вариантов который я вижу (может я не прав поправьте) это брать запросом таблицу продаж...потом построчно искать строки в таблице акций если найдено то целочисленно делить одно на другое (получим сколько наборов одного продукта продал. его заносить в максимум и так по всем...но чувствую не в те дебри лезу а все проще
|
|||
32
Garykom
гуру
06.08.18
✎
00:11
|
Задача без полного перебора не решается.
Потому что может быть два набора №1. Краковская 2 Московская 2 Вареная 3 №2. Краковская 2 Вареная 2 И вот как узнать сколько и каких наборов продал менагер? Если он продал: Краковская 2 Московская 4 Вареная 4 Продал один набор №1 или два набора №2? |
|||
33
Garykom
гуру
06.08.18
✎
00:13
|
(32)+ Сорри набор №2
Московская 2 Вареная 2 |
|||
34
asder117
06.08.18
✎
00:16
|
(32) т.е. как я понял запросом это не решить, только перебором. но куда и как заносить наборы и как их считать...вот вопрос
|
|||
35
МихаилМ
06.08.18
✎
00:19
|
(34)
запросом можно решить. только задача в (0) отличается от задачи в (25) |
|||
36
NSSerg
06.08.18
✎
00:20
|
(27) хеш это и есть разновидность индекса, быстрый индекс который позволяет добавлять и искать элемент за константу - О(1), но который не позволяет упорядочивать, что в этой задаче и не нужно.
При чем тут фильтр? Хеш всего лишь позволяет организовать поиск в N раз быстрее, чем классический поиск. Где N количество элементов в таблицах. |
|||
37
Garykom
гуру
06.08.18
✎
00:21
|
(34) Задай вопрос тому кто дал задачу что делать с пересечениями наборов и разными ответами.
Скажет брать самые большие наборы или наоборот самые маленькие. Или ответит что наборы никогда не пересекаются. Банальный цикл по наборам и определяем их содержание в продажах 0, 1, 2 или сколько раз для каждого набора. Если затем последовательно вычитать наборы из продаж то получишь результат. |
|||
38
asder117
06.08.18
✎
00:21
|
(35) да задачу в (0) я писал "на коленке" пытался сам разобраться что к чему видно не судьба...а зпросом через что лучше?
|
|||
39
asder117
06.08.18
✎
00:23
|
(37) запипикаешься одним словом
|
|||
40
Garykom
гуру
06.08.18
✎
00:30
|
Если наборы не пересекаются то все довольно просто.
Делаем табличку из 4 колонок левым (слева наборы и подставляем из продаж) соединением двух таблиц: № набора, Номенклатура, КолвоВНаборе, КолвоПродано Затем добавляем колонку КолвоНаборов = КолвоПродано/КолвоВНаборе И банально выбираем наборы где КолвоНаборов >1 для всех строк набора |
|||
41
Garykom
гуру
06.08.18
✎
00:32
|
(40)+ Хм лучше сразу брать целое "КолвоНаборов", затем ищем минимум внутри "№ набора"
|
|||
42
NSSerg
06.08.18
✎
00:34
|
(40) повторю вопрос, сколько потребуется операций для левого соединения двух таблиц без индексов по 10000 элементов каждая?
|
|||
43
Garykom
гуру
06.08.18
✎
00:41
|
(42) Они выполнятся быстрее чем писать правильный алгоритм вместо тупых запросов ))
Тут в конце банальная группировка по "№ набора" с минимум("КолвоНаборов") - это и будет ответом искомым для каждого набора сколько раз он встречается. |
|||
44
NSSerg
06.08.18
✎
00:46
|
(43) правильный алгоритм это семь строк кода, которые писать больше 5 минут - позор, и более того этот код есть по ссылке в (19)
Этот код пишется быстрее запроса. Ну и самое главное - этот код это масштабируемое решение, когда у тебя таблицы станут большими он будет продолжать работать, в отличии от левого соединения, результата которого не дождешься на больших таблицах. |
|||
45
NSSerg
06.08.18
✎
00:51
|
(43) для тебя долго писать два цикла, в первом цикле из трех строки перебрать строки первой тз (для каждого из) и добавить в соответствие, а вторым циклом по строкам второй тз (для каждого из) проверить вхождение в соответствие? Ну и одна строчка на объявление соответствия?
|
|||
46
Garykom
гуру
06.08.18
✎
00:56
|
(45) Для меня нет, но спрашиваю в (0) не я.
|
|||
47
Влад_Савин
06.08.18
✎
11:22
|
Код может и короче - но запрос работает быстрее.
Решается элементарно - внутреннее соединение обоих таблиц. И количество строк результата. Даже если Таблица нестандартная (и уже получена)- ну я бы сделал пакетный запрос - в макс случае пакет из трех, загрузить ТЗ1 во временную таблицу 1 загрузить ТЗ2 во временную таблицу 2 и как указал выше - их внутреннее соединение. |
|||
48
Garykom
гуру
06.08.18
✎
11:29
|
(47) Ну давай нарисуй запрос с внутренним соединением, чтоб не потерял номенклатуру из наборов ))
|
|||
49
NSSerg
06.08.18
✎
11:32
|
(47) Запрос работает медленней!
|
|||
50
NSSerg
06.08.18
✎
12:08
|
(47) Допишите в процедуру свой метод и сравните.
Вот при помощи соответствия, на моей машине чуть дольше двух секунд, в каждой ТЗ по 100 000 строк. N = 100 000 Потрачено времени на проверку при помощи соответствия 2 297 мс. Перем ТЗ1,ТЗ2; Процедура СформироватьТаблицыЗначений(_КоличествоN,_КоличествоСовпадений) ТЗ1=новый ТаблицаЗначений; ТЗ1.Колонки.Добавить("Товар",,"Товар"); ТЗ1.Колонки.Добавить("Количество",,"Количество"); Для а=1 по _КоличествоN цикл стр=ТЗ1.Добавить(); стр.Товар="Номенклатура"+а; стр.Количество=а; КонецЦикла; ТЗ2=новый ТаблицаЗначений; ТЗ2.Колонки.Добавить("Товар",,"Товар"); ТЗ2.Колонки.Добавить("Количество",,"Количество"); Для а=_КоличествоN+1-_КоличествоСовпадений по _КоличествоN*2-_КоличествоСовпадений цикл стр=ТЗ2.Добавить(); стр.Товар="Номенклатура"+а; стр.Количество=а; КонецЦикла; КонецПроцедуры Функция ПроверитьСовпаденияПриПомощиСоотвествия() КоличествоСовпадений=0; hash=новый соответствие; Для каждого СтрокаТЗ1 Из ТЗ1 Цикл hash.Вставить(сокрлп(СтрокаТЗ1.Товар)+"#"+СтрокаТЗ1.Количество,1); КонецЦикла; Для каждого СтрокаТЗ2 Из ТЗ2 Цикл КоличествоСовпадений=КоличествоСовпадений+?(hash[сокрлп(СтрокаТЗ2.Товар)+"#"+СтрокаТЗ2.Количество]=Неопределено,0,1); КонецЦикла; Возврат КоличествоСовпадений; КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка) КоличествоN=100000; КоличествоСовпадений=2; СформироватьТаблицыЗначений(КоличествоN,КоличествоСовпадений); НачальноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах(); Если ПроверитьСовпаденияПриПомощиСоотвествия()<>КоличествоСовпадений тогда сообщить("При проверке при помощи соотвествия произошла ошибка"); КонецЕсли; КонечноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить("N = "+КоличествоN); Сообщить("Потрачено времени на проверку при помощи соответствия "+(КонечноеВремя-НачальноеВремя)+" мс."); КонецПроцедуры |
|||
51
NSSerg
06.08.18
✎
12:10
|
Для случая КоличествоСовпадений=КоличествоN
N = 100 000 Потрачено времени на проверку при помощи соответствия 3 110 мс. |
|||
52
Вафель
06.08.18
✎
12:22
|
(50) а почему уменно соответствие. а не через индекс тз?
|
|||
53
Вафель
06.08.18
✎
12:23
|
Хотя в (50) как минимум 2х100 000 запросов будет к бд ибо Строка(...)
|
|||
54
Вафель
06.08.18
✎
12:25
|
Хотя нет тут же не товар, а строка. А вот посмотреть бы со ссылками реально евремя вополнения
|
|||
55
NSSerg
06.08.18
✎
12:44
|
(54) Никто не мешает вместо ссылки писать в хеш-таблицу (соответствие) GUID, код номенклатуры, или любое другое уникальное приведение к строке. Сложность алгоритма от этого не поменяется, как было О(N), так и останется, как было несколько секунд на ТЗ по 100,000 строк, так и останется.
|
|||
56
NSSerg
06.08.18
✎
12:45
|
(54) А вот запросом, хоть строка, хоть ссылки, хоть число (во второй колонке в любом случае число по заданию) - это ну никак не несколько секунд.
|
|||
57
NSSerg
06.08.18
✎
12:46
|
(52) Потому что соответствие - это хеш, сложность операций, время добавления и поиска не зависит от размера соответствия, а индекс логарифмический, чем больше ТЗ, тем медленней операции поиска и добавления.
|
|||
58
NSSerg
06.08.18
✎
12:47
|
На индекс ТЗ будет медленней на порядок.
|
|||
59
Garykom
гуру
06.08.18
✎
12:55
|
(50) Не подскажешь как этот алгоритм с его скоростью работы поможет для реальной задачки (25) ?
|
|||
60
NSSerg
06.08.18
✎
13:41
|
(59) Никак. Этот алгоритм решает задачу (4)
|
|||
61
NSSerg
06.08.18
✎
13:42
|
(59) Но в (50) Был ответ на пост, который ну никак не относился к задаче (25).
|
|||
62
ptiz
06.08.18
✎
13:58
|
(57) Однако, на примере из (50) метод НайтиСтроки работает в 4 раза быстрее, чем через соответствие.
|
|||
63
Garykom
гуру
06.08.18
✎
13:59
|
(61) Эээ подожди хочешь сказать что:
1. Получение данных из БД 2. Обработка Быстрее чем просто выполнение запроса (внутреннее соединение) в БД? |
|||
64
NSSerg
06.08.18
✎
14:00
|
(62) Выложи код. Допиши его в обработку 50.
|
|||
65
NSSerg
06.08.18
✎
14:01
|
(63) Я надеюсь ты понимаешь что такое сложность алгоритма?
Ты понимаешь разницу между 100,000 обращений к БД, и 100,000^2=10,000,000,000 внутренних сравнений значений в двух таблицах? |
|||
66
NSSerg
06.08.18
✎
14:19
|
(62)
Для каждого стр Из ТЗ1 Цикл Отбор=Новый Структура(); Отбор.Вставить("Товар",стр.Товар); строки=ТЗ2.НайтиСтроки(Отбор); КонецЦикла; Ищу по одной колонке, не по двум. N = 10 000 Потрачено времени на проверку при помощи НайтиСтроки 6 031 мс. N = 20 000 Потрачено времени на проверку при помощи НайтиСтроки 25 969 мс. 100,000 я конечно запускать не буду. Не расскажите, какой код отработал быстрее чем (50) |
|||
67
Гад
06.08.18
✎
14:23
|
а че свернуть первуюю таблицу и потом найти и получить значение из пребора второй нельзя7
|
|||
68
NSSerg
06.08.18
✎
14:25
|
+ (66) Хорошо видно, что при увеличении и количества строк в ТЗ в два раза, скорость обработки падает в четыре раза. Это и есть О(N^2)
То есть при увеличении количества строк с 10000 до 100000, скорость обработки через найтистроки() вырастет в 100 раз. И по времени это будет 600 секунд. Против 2 секунд через соответствие в (50) (67) Если свернуть первую таблицу по двум колонкам, они ни капельки не изменится. |
|||
69
Borteg
06.08.18
✎
14:28
|
(66) ТЗ надо проиндексировать для такого поиска.
Ради интереса сейчас заморочусь, посмотрю что быстрее) |
|||
70
palsergeich
06.08.18
✎
14:31
|
Вы ща чуваку тестовую задачу так решите, что никто не поверит что это он сам сделал.
|
|||
71
NSSerg
06.08.18
✎
14:34
|
(69) И индексированная ТЗ будет медленней, почему я объяснял чуть выше. В отличии от коснтатной скорости поиска в соответствии, в индексированной ТЗ ищет за логарифм. Поисков N, сложность NlnN (вместо N на соответствии), ну и сама индексация это NlnN операций.
|
|||
72
ptiz
06.08.18
✎
14:53
|
(64)
Функция ПроверитьСовпаденияПриПомощиПоискаСтрок() КоличествоСовпадений=0; ТЗ1.Индексы.Добавить("Товар,Количество"); Для каждого СтрокаТЗ Из ТЗ2 Цикл Отбор = Новый Структура("Товар,Количество", СтрокаТЗ.Товар, СтрокаТЗ.Количество); КоличествоСовпадений = КоличествоСовпадений + ТЗ1.НайтиСтроки(Отбор).Количество(); КонецЦикла; Возврат КоличествоСовпадений; КонецФункции // ПроверитьСовпаденияПриПомощиПоискаСтрок() |
|||
73
NSSerg
06.08.18
✎
15:00
|
(72) Так это индексированная.
Да, почему-то чуть быстрее N = 100 000 совпадений = 2 Потрачено времени на проверку при помощи соответствия 2 156 мс. Потрачено времени на проверку при помощи поиска строк 1 719 мс. Код чуть подправил, так как если в первой ТЗ встретилось два раза, то по смыслу в (5) должно посчитаться как одно совпадение. Функция ПроверитьСовпаденияПриПомощиПоискаСтрок() КоличествоСовпадений=0; ТЗ1.Индексы.Добавить("Товар,Количество"); Для каждого СтрокаТЗ Из ТЗ2 Цикл Отбор = Новый Структура("Товар,Количество", СтрокаТЗ.Товар, СтрокаТЗ.Количество); КоличествоСовпадений = КоличествоСовпадений + ?(ТЗ1.НайтиСтроки(Отбор).Количество()=0,0,1); КонецЦикла; Возврат КоличествоСовпадений; КонецФункции |
|||
74
NSSerg
06.08.18
✎
15:01
|
Есть вероятность что либо соответствие в новых релизах работает за логарифм, либо ускорили (уменьшили константу) в индексированной ТЗ.
|
|||
75
Вафель
06.08.18
✎
15:02
|
(57) а что за алгоритм поиска по хэшу быстрее чем логарифмический (деление пополам) ?
|
|||
76
NSSerg
06.08.18
✎
15:03
|
N = 1 000 совпадений = 2
Потрачено времени на проверку при помощи соответствия 31 мс. Потрачено времени на проверку при помощи поиска строк 31 мс. (75) Да, по хешу ищет за константу. |
|||
77
NSSerg
06.08.18
✎
15:04
|
Либо есть вероятность что у 1С соответствие это все-таки не хеш, либо что реализовано не очень хорошо при большом количестве записей в соответствии.
|
|||
78
Вафель
06.08.18
✎
15:04
|
(76) Мне интересно какой алгоритм (название) ?
|
|||
79
NSSerg
06.08.18
✎
15:05
|
(78) http://algolist.manual.ru/ds/s_has.php
Так и называется - хеш-таблица |
|||
80
NSSerg
06.08.18
✎
15:08
|
(78) создается массив, количество элементов зависит от количества значений в хеш таблице, адрес для каждого значения - это значение хеш-функции от значения по модулю количества элементов в массиве.
Вычисление хеш-функции константно, обращение по вычисленному адресу тоже константно. По адресу в общем случае хранятся списки элементов. Но размер массива выбирается таким, чтоб их там было мало. |
|||
81
NSSerg
06.08.18
✎
15:09
|
||||
82
ptiz
06.08.18
✎
15:10
|
(73) .Индексы.Добавить() работает очень быстро, даже на миллионе строк. Зачем его избегать?
|
|||
83
NSSerg
06.08.18
✎
15:14
|
(82) Я же сразу писал в ветке, что на неиндексированной ТЗ будет очень медленно. А на индексированной медленней (на порядок, в десять раз) так как само индексирование это NlnN операций, и поиск по каждой строке из второй ТЗ это lnN операций, в отличии от константы в hashMap/hashSet.
Но видимо всё уперлось в то что соответствие это либо не совсем hashMap, либо hashMap но с не очень хорошей реализацией, ну либо 100000 значений для хеш-таблицы в памяти это достаточно много, слишком много. |
|||
84
NSSerg
06.08.18
✎
15:24
|
Вот с проверкой только по количеству
N = 100 000 совпадений = 2 Потрачено времени на проверку при помощи соответствия 546 мс. Потрачено времени на проверку при помощи поиска строк 1 359 мс. Перем ТЗ1,ТЗ2; Процедура СформироватьТаблицыЗначений(_КоличествоN,_КоличествоСовпадений) ТЗ1=новый ТаблицаЗначений; ТЗ1.Колонки.Добавить("Товар",,"Товар"); ТЗ1.Колонки.Добавить("Количество",,"Количество"); Для а=1 по _КоличествоN цикл стр=ТЗ1.Добавить(); стр.Товар="Номенклатура"+а; стр.Количество=а; КонецЦикла; ТЗ2=новый ТаблицаЗначений; ТЗ2.Колонки.Добавить("Товар",,"Товар"); ТЗ2.Колонки.Добавить("Количество",,"Количество"); Для а=_КоличествоN+1-_КоличествоСовпадений по _КоличествоN*2-_КоличествоСовпадений цикл стр=ТЗ2.Добавить(); стр.Товар="Номенклатура"+а; стр.Количество=а; КонецЦикла; КонецПроцедуры Функция ПроверитьСовпаденияПриПомощиПоискаСтрок() КоличествоСовпадений=0; ТЗ1.Индексы.Добавить("Количество"); Для каждого СтрокаТЗ Из ТЗ2 Цикл Отбор = Новый Структура("Количество", СтрокаТЗ.Количество); КоличествоСовпадений = КоличествоСовпадений + ?(ТЗ1.НайтиСтроки(Отбор).Количество()=0,0,1); КонецЦикла; Возврат КоличествоСовпадений; КонецФункции Функция ПроверитьСовпаденияПриПомощиСоотвествия() КоличествоСовпадений=0; hash=новый соответствие; Для каждого СтрокаТЗ1 Из ТЗ1 Цикл hash.Вставить(СтрокаТЗ1.Количество,1); КонецЦикла; Для каждого СтрокаТЗ2 Из ТЗ2 Цикл КоличествоСовпадений=КоличествоСовпадений+?(hash[СтрокаТЗ2.Количество]=Неопределено,0,1); КонецЦикла; Возврат КоличествоСовпадений; КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка) КоличествоN=100000; КоличествоСовпадений=2; СформироватьТаблицыЗначений(КоличествоN,КоличествоСовпадений); НачальноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах(); Если ПроверитьСовпаденияПриПомощиСоотвествия()<>КоличествоСовпадений тогда сообщить("При проверке при помощи соотвествия произошла ошибка"); КонецЕсли; КонечноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить("N = "+КоличествоN+" совпадений = "+КоличествоСовпадений); Сообщить("Потрачено времени на проверку при помощи соответствия "+(КонечноеВремя-НачальноеВремя)+" мс."); СформироватьТаблицыЗначений(КоличествоN,КоличествоСовпадений); НачальноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах(); Если ПроверитьСовпаденияПриПомощиПоискаСтрок()<>КоличествоСовпадений тогда сообщить("При проверке при помощи поиска строк произошла ошибка"); КонецЕсли; КонечноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить("Потрачено времени на проверку при помощи поиска строк "+(КонечноеВремя-НачальноеВремя)+" мс."); КонецПроцедуры |
|||
85
Garykom
гуру
06.08.18
✎
15:36
|
(84) Мдя искать совпадения по числам (вместо строковых наименований номенклатуры) это конечно прикольно.
Еще засунуть эти числа в одну ТЗ с допколонкой =1, затем ТЗ.Свернуть("Количество", "ЧислоСовпадений") и выбрать >2 |
|||
86
NSSerg
06.08.18
✎
15:59
|
(85) Это сделано чисто для теста соответствия, а не как практическое решение. Конечно же.
|
|||
87
asder117
06.08.18
✎
20:20
|
(41) я про это тоже подумал...я уж думал перебором из 2-х таблиц и максимум и минимум
|
|||
88
asder117
06.08.18
✎
20:21
|
(40) акция или набор один на период
|
|||
89
asder117
06.08.18
✎
20:27
|
(40) только номер набора откуда??? или присвоить номер по порядку...
ведь в задаче..."Набор указывается самим руководителем в форме отчета в виде таблицы со столбцами: Номенклатура, Количество." это получается к отчету надо добавлять еще одну форму которая будет открываться из формы отчета |
|||
90
mistеr
06.08.18
✎
21:54
|
Все обсуждают как быстрее с запросом или без, а решения с запросом что-то никто не дал.
ВЫБРАТЬ &Номенклатура1 КАК Номенклатура, &Количество1 КАК Количество ПОМЕСТИТЬ ВТНабор ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ &Номенклатура2, &Количество2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ &Номенклатура3, &Количество3 ; ////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПродажиНаборов.Ответственный, СУММА(ПродажиНаборов.КоличествоНаборов) КАК КоличествоНаборов ИЗ ( ВЫБРАТЬ ШапкаДокумента.Ссылка КАК Ссылка, ШапкаДокумента.Ответственный КАК Ответственный, МИНИМУМ(ЕСТЬNULL(СтрокиДокумента.Количество, 0) / СтрокиНабора.Количество) КАК КоличествоНаборов ИЗ ВТНабор КАК СтрокиНабора ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК ШапкаДокумента ПО (ИСТИНА) ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК СтрокиДокумента ПО (СтрокиДокумента.Ссылка = ШапкаДокумента.Ссылка) И (СтрокиДокумента.Номенклатура = СтрокиНабора.Номенклатура) ГДЕ ШапкаДокумента.Дата МЕЖДУ &НачалоПериода И &КонецПериода И ШапкаДокумента.Проведен СГРУППИРОВАТЬ ПО ШапкаДокумента.Ссылка, ШапкаДокумента.Ответственный ИМЕЮЩИЕ МИНИМУМ(ЕСТЬNULL(СтрокиДокумента.Количество, 0) / СтрокиНабора.Количество) > 0 ) КАК ПродажиНаборов СГРУППИРОВАТЬ ПО ПродажиНаборов.Ответственный УПОРЯДОЧИТЬ ПО КоличествоНаборов УБЫВ |
|||
91
mistеr
06.08.18
✎
21:56
|
Решения с ТЗ или соответствиями кажутся предпочтительными только до тех пор, пока весь оборот за период комфортно помещается в памяти. А на серьезных объемах тягаться с мощью SQL движка уже смешно.
|
|||
92
NSSerg
06.08.18
✎
21:58
|
(91) из условия - две тз.
не таблицы в БД, а именно две ТЗ, а они в любом случае в памяти. |
|||
93
mistеr
06.08.18
✎
22:09
|
(92) Настоящая задача в (25)
А так да, если все данные уже в памяти, глупо тащить их на скуль и обратно. |
|||
94
NSSerg
06.08.18
✎
22:18
|
(93) А эта задача еще тольком не обсуждалась.
Я могу рассказать свое семерочное решение, но не думаю что оно актуально. Задача ровно такая-же, нужна для расчета количества целых наборов (подарок дается за покупку набора), и ИМХО не хватает одного дополнительного условия - один товар в один момент времени может входить только в один набор. Иначе в нашем случае может не быть однозначного решения по подаркам. |
|||
95
asder117
06.08.18
✎
22:18
|
(91) это ладно в памяти...а тут ведь условие ""Набор указывается самим руководителем в форме отчета в виде таблицы со столбцами: Номенклатура, Количество." т.е. в бд ее нет.
|
|||
96
NSSerg
06.08.18
✎
22:19
|
(95) накладные в бд
|
|||
97
mistеr
06.08.18
✎
22:24
|
(95) Ну да, эту таблицу придется так или иначе передать в БД.
|
|||
98
mistеr
06.08.18
✎
22:28
|
(94) В (25) условие: в каждый период времени только один набор. Так что все ОК.
(95) Кстати, в реальности набор задается заранее и хранится, при грамотной реализации, в БД. Иначе это было бы жестоко по отношению к менеджерам. Типа "вы продавайте, продавайте; а за что бонус положен, я потом решу..." |
|||
99
asder117
07.08.18
✎
07:02
|
(94) с этим согласен. тогда перебор
|
|||
100
asder117
07.08.18
✎
07:03
|
(98) И тут тоже. но постановка задачи иная
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |