Имя: Пароль:
1C
1С v8
Вопрос по таблице значений
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) И тут тоже. но постановка задачи иная
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший