Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Вопрос по таблице значений

Вопрос по таблице значений
Я
   asder117
 
01.08.18 - 18:45
Доброго времени суток. Есть 2 таблицы с двумя колонками.  Ка можно узнать сколько раз значения в таблице 2 входят в таблицу 1. И возможно ли это реализовать запросом.  Спасибо заранее
 
 
   Cyberhawk
 
1 - 01.08.18 - 18:49
Условия неточные
   Вафель
 
2 - 01.08.18 - 18:49
можно и запросом и без
   Cyberhawk
 
3 - 01.08.18 - 18:50
Таблица 1:
Вася 1
Петя 2
Ваня 3

Таблица 2
Петя 2
Петя 2
Петя 2
Ваня 1

Какой ответ по твоим условиям должен быть?
   asder117
 
4 - 01.08.18 - 18:57
(1) к примеру есть таблица1
(номенклатура1 - 3 ед.
Номенклатура2- 2 ед.
Номенклатура3- 2 ед.)
 есть вторая
Номенклатура1 - 6 ед.
Номенклатура2 - 2 ед.
Номенклатура3 - 4 ед.
Номенклатура4- 5 ед.
Вхождение 1во вторую 1
   xXeNoNx
 
5 - 01.08.18 - 18:58
Ответ - можно, остальное, я так понял, не важно
   asder117
 
6 - 01.08.18 - 18:59
(5) 0
   asder117
 
7 - 01.08.18 - 19:01
(5) как вопрос риторический
   xXeNoNx
 
8 - 01.08.18 - 19:05
(4) напиши итоговую таблицу, которая должна получиться
   Cyberhawk
 
9 - 01.08.18 - 19:20
(4) Так что с моим примером?
   Вик72
 
10 - 01.08.18 - 19:25
(0) и какая зарплата на этой вакансии?
 
 Рекламное место пустует
   tesseract
 
11 - 01.08.18 - 19:28
(0) Можно запросом. Можно перебором.

(10) Больше на собеседование похоже.
   asder117
 
12 - 01.08.18 - 19:41
(10) ответ 0 (10) не очень большая.вопрос просто для себя хочу понять как. (8) таблиц не должна получиться а должно получиться число вхождений в (4) ответ -1. (11) это было на собеседовании у моего знакомого.
   tesseract
 
13 - 01.08.18 - 21:10
(12) В любой книжке про язык запросов 1С все подробно разжевано. Если на такой простой вопрос не можешь ответ дать - ты не пройдешь собеседование.
   asder117
 
14 - 05.08.18 - 23:27
(11) перебором через найтистроку можно конечно...но долго....а вот про запрос....все перерыл...мачасть пересмотрел....не могу понять как это сделать...пробовал через временные таблицы  но полуить количество никак...поможайте понять плз. (13) вопрос простой но я встал в тупик
   NSSerg
 
15 - 05.08.18 - 23:34
алгоримически правильно задача решается чйерез О(N) при помощи hashmap/hashset
Запрос решит задачу хуже. Если без индексирования, то за О(N^2), если с индексированием, то за NlnN
   asder117
 
16 - 05.08.18 - 23:35
(15) Уважаемый а можно нормальным языком..как лучше
   NSSerg
 
17 - 05.08.18 - 23:38
В 1cv8 это соответствие.
цикл по строкам первой таблицы, и записать туда в ключ товар+количество. Потом по строкам второй таблицы, с проверкой наличия в соотвтествии.
   NSSerg
 
18 - 05.08.18 - 23:39
(16) Я вроде нормальным и написал.
   NSSerg
 
19 - 05.08.18 - 23:45
http://catalog.mista.ru/public/79285/
вот тут доказательство того что соответствие это hash таблица.
   NSSerg
 
20 - 05.08.18 - 23:45
   МихаилМ
 
21 - 05.08.18 - 23:46
скд справится с этой задачей
   NSSerg
 
22 - 05.08.18 - 23:47
(21) то есть скорость уже значения не имеет?
Прикинь, сколько времени скд будет сравнивать две тз по 10000 строк
   МихаилМ
 
23 - 05.08.18 - 23:51
(22)
если использовать в скд ВычислитьВыражениеСГруппировкойТаблицаЗначений

то ускорение будет минимум в 2 раза.
   H A D G E H O G s
 
24 - 05.08.18 - 23:58
(0) Если 2 таблицы - приблизительно одинаково велики - сравнениеслиянием, иначе - НайтиСтроки
   asder117
 
25 - 05.08.18 - 23:58
(18) (23) вообщем коллеги задача тестовая подкинули для развития...Сам блин написал конфигурацию по которой работает предприятие....а эту простоту (как говорят) решить не могу.
Задача в этом
Иногда директор объявляет мотивирующую акцию для менеджеров. Суть акции заключается в одновременной реализации набора колбас. Одновременная реализация оформляется одним документом Реализация товаров и услуг. Акция действует определенный период времени, потом набор меняется. Менеджер, продавший больше всех наборов за период, получает единовременную премию.

Например, объявлена акция: с 01.01.2016 по 10.01.2016 продажный набор включает:
Колбасу краковскую - 3 ед.
Колбасу московскую - 2 ед.
Колбасу вареную - 2 ед.

Менеджер "Иванов" продал контрагенту "Петров" 02.01.2016 (документ Реализация № И001):
Краковская - 6 ед.
Московская - 2 ед.
Вареная - 4 ед.
Зернистая - 5 ед.
Значит он продал один набор.

Требуется отчет о количестве проданных за указанный период наборов колбас по каждому менеджеру.
Набор указывается самим руководителем в форме отчета в виде таблицы со столбцами: Номенклатура, Количество.
спасибо заранее за толчок в нужное русло
   NSSerg
 
26 - 05.08.18 - 23:59
(23) В чем разница между О(N^2) и О(N)?
в первом случае для каждой строки из первой строки мы перебором смотрим есть ли такая-же строка во второй таблице, так отработает запрос. это для двух ТЗ по 10000 строк - 100000000 операций.
во втором, сначала проход по строкам первой таблицы с занесением в хеш-таблицу (соотвествие), это 10000 операций
потом проверка вхождения в соотвествия каждой строки из второй таблицы. в хеш-таблицы проверка вхождени это константа, то есть требует не 10000 операций ка проверка в массиве, проверка перебором, а одну операцию.
то есть второй метод потребует 20000 операций, возможно чуть более долгих. именно чуть, константно.
то есть разница в скорости в тысячи раз.
   H A D G E H O G s
 
27 - 06.08.18 - 00:03
(26) Хэш таблица имеет смысл, если на большую таблицу (по которой не строится хэш-таблица) будет наложен фильтр по индексу.
   H A D G E H O G s
 
28 - 06.08.18 - 00:05
(26) Ну, и, естественно, на большой таблице уже есть индекс.
   H A D G E H O G s
 
29 - 06.08.18 - 00:06
Я в 24 был не прав с НайтиСтроки, привык, что в статичных SQL таблицах уже есть индексы.
   МихаилМ
 
30 - 06.08.18 - 00:08
(26) если требуется сопоставить 2 тз по нескольким колонкам,
то для использования соответствия поля придется кодировать.
те потребуется дополнительные вычисления в зависимости от колва колонок.
   asder117
 
31 - 06.08.18 - 00:10
(24) Через НайтиСтроки с одной стороны это выход из положения если бы не надо было узнать количества наборов, а тут как раз это и надо. Один из вариантов который я вижу (может я не прав поправьте) это брать запросом таблицу продаж...потом построчно искать строки в таблице акций если найдено то целочисленно делить одно на другое (получим сколько наборов одного продукта продал. его заносить в максимум и так по всем...но чувствую не в те дебри лезу а все проще
   Garykom
 
32 - 06.08.18 - 00:11
Задача без полного перебора не решается.

Потому что может быть два набора
№1.
Краковская 2
Московская 2
Вареная 3

№2.
Краковская 2
Вареная 2

И вот как узнать сколько и каких наборов продал менагер? Если он продал:
Краковская 2
Московская 4
Вареная 4

Продал один набор №1 или два набора №2?
   Garykom
 
33 - 06.08.18 - 00:13
(32)+ Сорри набор №2
Московская 2
Вареная 2
 
 
   asder117
 
34 - 06.08.18 - 00:16
(32) т.е. как я понял запросом это не решить, только перебором. но куда и как заносить наборы и как их считать...вот вопрос
   МихаилМ
 
35 - 06.08.18 - 00:19
(34)
запросом можно решить.

только задача в (0) отличается от задачи в (25)
   NSSerg
 
36 - 06.08.18 - 00:20
(27) хеш это и есть разновидность индекса, быстрый индекс который позволяет добавлять и искать элемент за константу - О(1), но который не позволяет упорядочивать, что в этой задаче и не нужно.
При чем тут фильтр? Хеш всего лишь позволяет организовать поиск в N раз быстрее, чем классический поиск. Где N количество элементов в таблицах.
   Garykom
 
37 - 06.08.18 - 00:21
(34) Задай вопрос тому кто дал задачу что делать с пересечениями наборов и разными ответами.

Скажет брать самые большие наборы или наоборот самые маленькие.
Или ответит что наборы никогда не пересекаются.

Банальный цикл по наборам и определяем их содержание в продажах 0, 1, 2 или сколько раз для каждого набора.

Если затем последовательно вычитать наборы из продаж то получишь результат.
   asder117
 
38 - 06.08.18 - 00:21
(35) да задачу в (0) я писал "на коленке" пытался сам разобраться что к чему видно не судьба...а зпросом через что лучше?
   asder117
 
39 - 06.08.18 - 00:23
(37) запипикаешься одним словом
   Garykom
 
40 - 06.08.18 - 00:30
Если наборы не пересекаются то все довольно просто.
Делаем табличку из 4 колонок левым (слева наборы и подставляем из продаж) соединением двух таблиц:
№ набора, Номенклатура, КолвоВНаборе, КолвоПродано
Затем добавляем колонку КолвоНаборов = КолвоПродано/КолвоВНаборе

И банально выбираем наборы где КолвоНаборов >1 для всех строк набора
   Garykom
 
41 - 06.08.18 - 00:32
(40)+ Хм лучше сразу брать целое "КолвоНаборов", затем ищем минимум внутри "№ набора"
   NSSerg
 
42 - 06.08.18 - 00:34
(40) повторю вопрос, сколько потребуется операций для левого соединения двух таблиц без индексов по 10000 элементов каждая?
   Garykom
 
43 - 06.08.18 - 00:41
(42) Они выполнятся быстрее чем писать правильный алгоритм вместо тупых запросов ))

Тут в конце банальная группировка по "№ набора" с минимум("КолвоНаборов") - это и будет ответом искомым для каждого набора сколько раз он встречается.
   NSSerg
 
44 - 06.08.18 - 00:46
(43) правильный алгоритм это семь строк кода, которые писать больше 5 минут - позор, и более того этот код есть по ссылке в (19)
Этот код пишется быстрее запроса. Ну и самое главное - этот код это масштабируемое решение, когда у тебя таблицы станут большими он будет продолжать работать, в отличии от левого соединения, результата которого не дождешься на больших таблицах.
   NSSerg
 
45 - 06.08.18 - 00:51
(43) для тебя долго писать два цикла, в первом цикле из трех строки перебрать строки первой тз (для каждого из) и добавить в соответствие, а вторым циклом по строкам второй тз (для каждого из) проверить вхождение в соответствие? Ну и одна  строчка на объявление соответствия?
   Garykom
 
46 - 06.08.18 - 00:56
(45) Для меня нет, но спрашиваю в (0) не я.
   Влад_Савин
 
47 - 06.08.18 - 11:22
Код может и короче - но запрос работает быстрее.
Решается элементарно - внутреннее соединение обоих таблиц. И количество строк результата.

Даже если Таблица нестандартная (и уже получена)-  ну я бы сделал пакетный запрос - в макс случае пакет из трех, загрузить ТЗ1 во временную таблицу 1
загрузить ТЗ2 во временную таблицу 2
и как указал выше - их внутреннее соединение.
   Garykom
 
48 - 06.08.18 - 11:29
(47) Ну давай нарисуй запрос с внутренним соединением, чтоб не потерял номенклатуру из наборов ))
   NSSerg
 
49 - 06.08.18 - 11:32
(47) Запрос работает медленней!
 
 Рекламное место пустует
   NSSerg
 
50 - 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);
    Сообщить("Потрачено времени на проверку при помощи соответствия "+(КонечноеВремя-НачальноеВремя)+" мс.");
КонецПроцедуры
   NSSerg
 
51 - 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
Хотя нет тут же не товар, а строка. А вот посмотреть бы со ссылками реально евремя вополнения
   NSSerg
 
55 - 06.08.18 - 12:44
(54) Никто не мешает вместо ссылки писать в хеш-таблицу (соответствие) GUID, код номенклатуры, или любое другое уникальное приведение к строке. Сложность алгоритма от этого не поменяется, как было О(N), так и останется, как было несколько секунд на ТЗ по 100,000 строк, так и останется.
   NSSerg
 
56 - 06.08.18 - 12:45
(54) А вот запросом, хоть строка, хоть ссылки, хоть число (во второй колонке в любом случае число по заданию) - это ну никак не несколько секунд.
   NSSerg
 
57 - 06.08.18 - 12:46
(52) Потому что соответствие - это хеш, сложность операций, время добавления и поиска не зависит от размера соответствия, а индекс логарифмический, чем больше ТЗ, тем медленней операции поиска и добавления.
   NSSerg
 
58 - 06.08.18 - 12:47
На индекс ТЗ будет медленней на порядок.
   Garykom
 
59 - 06.08.18 - 12:55
(50) Не подскажешь как этот алгоритм с его скоростью работы поможет для реальной задачки (25) ?
   NSSerg
 
60 - 06.08.18 - 13:41
(59) Никак. Этот алгоритм решает задачу (4)
   NSSerg
 
61 - 06.08.18 - 13:42
(59) Но в (50) Был ответ на пост, который ну никак не относился к задаче (25).
   ptiz
 
62 - 06.08.18 - 13:58
(57) Однако, на примере из (50) метод НайтиСтроки работает в 4 раза быстрее, чем через соответствие.
   Garykom
 
63 - 06.08.18 - 13:59
(61) Эээ подожди хочешь сказать что:
1. Получение данных из БД
2. Обработка

Быстрее чем просто выполнение запроса (внутреннее соединение) в БД?
   NSSerg
 
64 - 06.08.18 - 14:00
(62) Выложи код. Допиши его в обработку 50.
   NSSerg
 
65 - 06.08.18 - 14:01
(63) Я надеюсь ты понимаешь что такое сложность алгоритма?
Ты понимаешь разницу между 100,000 обращений к БД, и 100,000^2=10,000,000,000 внутренних сравнений значений в двух таблицах?
   NSSerg
 
66 - 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
   NSSerg
 
68 - 06.08.18 - 14:25
+ (66) Хорошо видно, что при увеличении и количества строк в ТЗ в два раза, скорость обработки падает в четыре раза. Это и есть О(N^2)
То есть при увеличении количества строк с 10000 до 100000, скорость обработки через найтистроки() вырастет в 100 раз.
И по времени это будет 600 секунд. Против 2 секунд через соответствие в (50)
(67) Если свернуть первую таблицу по двум колонкам, они ни капельки не изменится.
   Borteg
 
69 - 06.08.18 - 14:28
(66) ТЗ надо проиндексировать для такого поиска.
Ради интереса сейчас заморочусь, посмотрю что быстрее)
   palsergeich
 
70 - 06.08.18 - 14:31
Вы ща чуваку тестовую задачу так решите, что никто не поверит что это он сам сделал.
   NSSerg
 
71 - 06.08.18 - 14:34
(69) И индексированная ТЗ будет медленней, почему я объяснял чуть выше. В отличии от коснтатной скорости поиска в соответствии, в индексированной ТЗ ищет за логарифм. Поисков N, сложность NlnN (вместо N на соответствии), ну и сама индексация это NlnN операций.
   ptiz
 
72 - 06.08.18 - 14:53
(64)
Функция ПроверитьСовпаденияПриПомощиПоискаСтрок()

    КоличествоСовпадений=0;
    ТЗ1.Индексы.Добавить("Товар,Количество");
    Для каждого СтрокаТЗ Из ТЗ2 Цикл
        Отбор = Новый Структура("Товар,Количество", СтрокаТЗ.Товар, СтрокаТЗ.Количество);
        КоличествоСовпадений = КоличествоСовпадений + ТЗ1.НайтиСтроки(Отбор).Количество();
    КонецЦикла; 

    Возврат КоличествоСовпадений;
    
КонецФункции// ПроверитьСовпаденияПриПомощиПоискаСтрок()
   NSSerg
 
73 - 06.08.18 - 15:00
(72) Так это индексированная.
Да, почему-то чуть быстрее
N = 100 000 совпадений = 2
Потрачено времени на проверку при помощи соответствия 2 156 мс.
Потрачено времени на проверку при помощи поиска строк 1 719 мс.

Код чуть подправил, так как если в первой ТЗ встретилось два раза, то по смыслу в (5) должно посчитаться как одно совпадение.
Функция ПроверитьСовпаденияПриПомощиПоискаСтрок()
    КоличествоСовпадений=0;
    ТЗ1.Индексы.Добавить("Товар,Количество");
    Для каждого СтрокаТЗ Из ТЗ2 Цикл
        Отбор = Новый Структура("Товар,Количество", СтрокаТЗ.Товар, СтрокаТЗ.Количество);
        КоличествоСовпадений = КоличествоСовпадений + ?(ТЗ1.НайтиСтроки(Отбор).Количество()=0,0,1);
    КонецЦикла; 
    Возврат КоличествоСовпадений;
КонецФункции
   NSSerg
 
74 - 06.08.18 - 15:01
Есть вероятность что либо соответствие в новых релизах работает за логарифм, либо ускорили (уменьшили константу) в индексированной ТЗ.
   Вафель
 
75 - 06.08.18 - 15:02
(57) а что за алгоритм поиска по хэшу быстрее чем логарифмический (деление пополам) ?
   NSSerg
 
76 - 06.08.18 - 15:03
N = 1 000 совпадений = 2
Потрачено времени на проверку при помощи соответствия 31 мс.
Потрачено времени на проверку при помощи поиска строк 31 мс.
(75) Да, по хешу ищет за константу.
   NSSerg
 
77 - 06.08.18 - 15:04
Либо есть вероятность что у 1С соответствие это все-таки не хеш, либо что реализовано не очень хорошо при большом количестве записей в соответствии.
   Вафель
 
78 - 06.08.18 - 15:04
(76) Мне интересно какой алгоритм (название) ?
   NSSerg
 
79 - 06.08.18 - 15:05
(78) http://algolist.manual.ru/ds/s_has.php
Так и называется - хеш-таблица
   NSSerg
 
80 - 06.08.18 - 15:08
(78) создается массив, количество элементов зависит от количества значений в хеш таблице, адрес для каждого значения - это значение хеш-функции от значения по модулю количества элементов в массиве.
Вычисление хеш-функции константно, обращение по вычисленному адресу тоже константно. По адресу в общем случае хранятся списки элементов. Но размер массива выбирается таким, чтоб их там было мало.
   NSSerg
 
81 - 06.08.18 - 15:09
   ptiz
 
82 - 06.08.18 - 15:10
(73) .Индексы.Добавить() работает очень быстро, даже на миллионе строк. Зачем его избегать?
   NSSerg
 
83 - 06.08.18 - 15:14
(82) Я же сразу писал в ветке, что на неиндексированной ТЗ будет очень медленно. А на индексированной медленней (на порядок, в десять раз) так как само индексирование это NlnN операций, и поиск по каждой строке из второй ТЗ это lnN операций, в отличии от константы в hashMap/hashSet.
Но видимо всё уперлось в то что соответствие это либо не совсем hashMap, либо hashMap но с не очень хорошей реализацией, ну либо 100000 значений для хеш-таблицы в памяти это достаточно много, слишком много.
   NSSerg
 
84 - 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,КоличествоСовпадений);
    НачальноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Если ПроверитьСовпаденияПриПомощиПоискаСтрок()<>КоличествоСовпадений тогда
        сообщить("При проверке при помощи поиска строк произошла ошибка");
    КонецЕсли;    
    КонечноеВремя=ТекущаяУниверсальнаяДатаВМиллисекундах();
    Сообщить("Потрачено времени на проверку при помощи поиска строк "+(КонечноеВремя-НачальноеВремя)+" мс.");
КонецПроцедуры
   Garykom
 
85 - 06.08.18 - 15:36
(84) Мдя искать совпадения по числам (вместо строковых наименований номенклатуры) это конечно прикольно.

Еще засунуть эти числа в одну ТЗ с допколонкой =1, затем ТЗ.Свернуть("Количество", "ЧислоСовпадений") и выбрать >2
   NSSerg
 
86 - 06.08.18 - 15:59
(85) Это сделано чисто для теста соответствия, а не как практическое решение. Конечно же.
   asder117
 
87 - 06.08.18 - 20:20
(41) я про это тоже подумал...я уж думал перебором из 2-х  таблиц и максимум и минимум
   asder117
 
88 - 06.08.18 - 20:21
(40) акция или набор один на период
   asder117
 
89 - 06.08.18 - 20:27
(40) только номер набора откуда??? или присвоить номер по порядку...
ведь в задаче..."Набор указывается самим руководителем в форме отчета в виде таблицы со столбцами: Номенклатура, Количество."
это получается к отчету надо добавлять еще одну форму которая будет открываться из формы отчета
   mistеr
 
90 - 06.08.18 - 21:54
Все обсуждают как быстрее с запросом или без, а решения с запросом что-то никто не дал.

    ВЫБРАТЬ &Номенклатура1 КАК Номенклатура, &Количество1 КАК Количество
ПОМЕСТИТЬ ВТНабор
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ &Номенклатура2, &Количество2
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ &Номенклатура3, &Количество3
;

//////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПродажиНаборов.Ответственный,
    СУММА(ПродажиНаборов.КоличествоНаборов) КАК КоличествоНаборов
ИЗ (
    ВЫБРАТЬ
        ШапкаДокумента.Ссылка КАК Ссылка,
        ШапкаДокумента.Ответственный КАК Ответственный,
        МИНИМУМ(ЕСТЬNULL(СтрокиДокумента.Количество, 0) / СтрокиНабора.Количество) КАК КоличествоНаборов
    ИЗ
        ВТНабор КАК СтрокиНабора
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК ШапкаДокумента
            ПО (ИСТИНА)
            ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК СтрокиДокумента
            ПО (СтрокиДокумента.Ссылка = ШапкаДокумента.Ссылка)
                И (СтрокиДокумента.Номенклатура = СтрокиНабора.Номенклатура)
    ГДЕ
        ШапкаДокумента.Дата МЕЖДУ &НачалоПериода И &КонецПериода
        И ШапкаДокумента.Проведен
    
    СГРУППИРОВАТЬ ПО
        ШапкаДокумента.Ссылка,
        ШапкаДокумента.Ответственный
    
    ИМЕЮЩИЕ
        МИНИМУМ(ЕСТЬNULL(СтрокиДокумента.Количество, 0) / СтрокиНабора.Количество) > 0
) КАК ПродажиНаборов

СГРУППИРОВАТЬ ПО
    ПродажиНаборов.Ответственный

УПОРЯДОЧИТЬ ПО
    КоличествоНаборов УБЫВ
   mistеr
 
91 - 06.08.18 - 21:56
Решения с ТЗ или соответствиями кажутся предпочтительными только до тех пор, пока весь оборот за период комфортно помещается в памяти. А на серьезных объемах тягаться с мощью SQL движка уже смешно.
   NSSerg
 
92 - 06.08.18 - 21:58
(91) из условия - две тз.
не таблицы в БД, а именно две ТЗ, а они в любом случае в памяти.
   mistеr
 
93 - 06.08.18 - 22:09
(92) Настоящая задача в (25)

А так да, если все данные уже в памяти, глупо тащить их на скуль и обратно.
   NSSerg
 
94 - 06.08.18 - 22:18
(93) А эта задача еще тольком не обсуждалась.
Я могу рассказать свое семерочное решение, но не думаю что оно актуально. Задача ровно такая-же, нужна для расчета количества целых наборов (подарок дается за покупку набора), и ИМХО не хватает одного дополнительного условия - один товар в один момент времени может входить только в один набор. Иначе в нашем случае может не быть однозначного решения по подаркам.
   asder117
 
95 - 06.08.18 - 22:18
(91) это ладно в памяти...а тут ведь условие ""Набор указывается самим руководителем в форме отчета в виде таблицы со столбцами: Номенклатура, Количество." т.е. в бд ее нет.
   NSSerg
 
96 - 06.08.18 - 22:19
(95) накладные в бд
   mistеr
 
97 - 06.08.18 - 22:24
(95) Ну да, эту таблицу придется так или иначе передать в БД.
   mistеr
 
98 - 06.08.18 - 22:28
(94) В (25) условие: в каждый период времени только один набор. Так что все ОК.

(95) Кстати, в реальности набор задается заранее и хранится, при грамотной реализации, в БД. Иначе это было бы жестоко по отношению к менеджерам. Типа "вы продавайте, продавайте; а за что бонус положен, я потом решу..."
   asder117
 
99 - 07.08.18 - 07:02
(94) с этим согласен. тогда перебор
   asder117
 
100 - 07.08.18 - 07:03
(98) И тут тоже. но постановка задачи иная


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует