Имя: Пароль:
1C
1С v8
Комбинация номенклатуры в документах
0 PiNHeaD
 
11.07.16
16:05
Добрый день

Есть такая задача. Определить сколько раз встречается комбинации номенклатуры в документе определенного типа, за указанный период.

Например: Люди покупают болт и гайку. Так вот надо определить за этот месяц сколько раз покупали в одном заказе срезу и болт и гайку.

Вот думаю над запросом. Что то не выходит никак. Не наталкнете на мысль? Спасибо
1 4St
 
11.07.16
16:07
Надо изучать объект АнализДанных. В демо-конфигурации на ОФ присутствует.
2 FIXXXL
 
11.07.16
16:09
(0) строки дублируются?
тогда сначала группануть, потом через ВЫБОР КОГДА ТОГДА
присвой 1 болту и 1 гайке

группани по документу, отбери те, где >1
3 lodger
 
11.07.16
16:09
если срочно, я бы 2 шага в запросе сделяль.
сперва найти где есть номенклатура болт, потом среди них поискать номенклатуру гайка.
4 4St
 
11.07.16
16:10
Хотя можно и запросом.
В лоб: по табличным частям, с фильтром за период и по Номенклатура1 выбираем документ и цифру "1". Юнионом цепляем такой же запрос по Номенклатура2. Группируем по документу, выбираем те, у кого сумма по числовому полю больше 1.
Это в общих чертах.
5 PiNHeaD
 
11.07.16
16:16
Дело в том, что болт и гайка - это частный случай. Нужна матрица, где строки список номенклатуры и сверху список номенклатуры и на их пересечении количество документов, где они встречаются
6 lodger
 
11.07.16
16:19
интересно, а в скд можно загнать списки номенклатуры в строки и столбцы так, чтобы оно еще и работало?
7 PiNHeaD
 
11.07.16
16:20
(6) воот. Я тоже хотел этот отчет написать на СКД
8 PiNHeaD
 
11.07.16
16:21
У меня есть вариант загнать это в 2 набора данных и объединением по ссылка документа.
9 torgm
 
11.07.16
16:21
(5) составляешь таблицу номенклатуры с двумя колонками,  джоин табличную часть реализации
10 PiNHeaD
 
11.07.16
16:21
А потом подумал. что изначальным запросом быстрее бы вышло
11 Garykom
 
гуру
11.07.16
16:21
Таблицу умножения представляем? Вот и стройте на всю номенклатуру по горизонтали/вертикали и на пересечениях кол-во доков.
12 PiNHeaD
 
11.07.16
16:22
(9) "джоин" это что за зверь?
13 PiNHeaD
 
11.07.16
16:23
(11) Это бы кодом. Нарисовать я себе давно нарисовал
14 Garykom
 
гуру
11.07.16
16:24
Взять две произвольных номенклатуры и внутреннее соединение по докам где она есть = колво
15 Garykom
 
гуру
11.07.16
16:25
(14)+ Но "-" это запросы в цикле по сути
16 4St
 
11.07.16
16:25
(5) Тогда все-таки рекомендую обратиться к АнализДанных, поскольку для решения таких задач задумывался именно этот механизм. При большом ассортименте товара и/или количестве документов запрос имеет все шансы иногда класть сервера.
17 torgm
 
11.07.16
16:25
(12) соединение
18 4St
 
11.07.16
16:26
+(16) впрочем, это глубокое ИМХО.
19 Garykom
 
гуру
11.07.16
16:29
(18) не тока твое имхо
Пойти кодом от перебора всех доков и их ТЧ будет быстрее
И для всех пар сочетаний номенклатуры в ТЧ делать +1 в табличке
20 Garykom
 
гуру
11.07.16
16:31
(19) + гм нафуй массив обычное соответствие и составной ключ по паре номенклатуры
21 Garykom
 
гуру
11.07.16
16:33
(20)+ причем 2 ключевых списка один ключ-номер/ном1/ном2
второй просто ключ/кол-во
22 PiNHeaD
 
11.07.16
16:37
получается надо сделать перебор всех документов и сравнивать каждую ном с каждой номенклатурой. И рисовать динамический макет?

Мне аж страшно стало сколько времени он будет формироваться если период год задать)))
23 4St
 
11.07.16
16:48
(22) макет можно и не делать. В скд в группировках добавляешь таблицу вместо обычной группировки.  В колонках - номенклатура1, в строках - номенклатура2, ресурс - количество документов. Но ты прав насчёт времени выполнения.
24 rozer76
 
11.07.16
16:49
(22) извините, вы (1) смотрели ?
25 Garykom
 
гуру
11.07.16
16:49
(22) Не надо макет, пусть коды номенклатуры уникальные тогда строковое значение "Код1_Код2" будет уникальным.

Ну и при переборе ТЧ да двойной вложенный цикл по ней
Для Каждого ТекНом1 Из ТЧ Цикл
Для Каждого ТекНом2 Из Цикл
  Если ТекНом1.Номенклатура=ТекНом2.Номенклатура Тогда
   Продолжить;
  Иначе
   ТекКлюч = СокрЛП(ТекНом1.Номенклатура.Код)+"_"+СокрЛП(ТекНом2.Номенклатура.Код);
   СтарЗнач = Число(ДанныеСоотв.Получить(ТекКлюч));
   НовЗнач = СтарЗнач + 1;
   ДанныеСоотв.Вставить(ТекКлюч, НовЗнач);
  КонецЕсли;
КонецЦикла;
КонецЦикла;
26 Garykom
 
гуру
11.07.16
16:51
(23) (24) АнализДанных и СКД тоже можно но готов поспорить что будет дольше чем (25)
27 Garykom
 
гуру
11.07.16
16:53
(25)+ Единственная тонкость нужно будет сложить "Код1_Код2" с "Код2_Код1" ну или перед переборами ТЧ в доках сначала в ТЗ и сортировать по "Номенклатура.Код"
28 Garykom
 
гуру
11.07.16
16:55
(27)+ Хотя не, не нуна складывать или сортировать будет полная перекрестная заполнена как для Ном1+Ном2 так и для Ном2+Ном1 и можно любое из двух равных значений брать
29 Garykom
 
гуру
11.07.16
17:06
(25)+ Да замечание если нужны сочетания номенклатур в одном доке с самой собой (2 и более строки с одной номенклатурой в доке) то условие в начале переделать
30 PiNHeaD
 
11.07.16
17:09
АнализДанныхПоискАссоциаций - это же мой случай)))) Буду копать в эту сторону)))) СПАСИБО ВСЕМ!!!
31 Garykom
 
гуру
11.07.16
17:19
(30) Надеюсь поймешь что если сделать через (25) то оно будет "где угодно работать", даже там где нету OLAP и прочих анализов данных.
И умея это врукопашную разобраться и сделать через анализы или скд это меньше часа
32 Serg_1960
 
11.07.16
17:44
в УТ-11 нечто подобно нужное автору называется "Номенклатура, продаваемая совместно"
33 Serg_1960
 
11.07.16
17:49
Погуглил. Ссылка старая, но достаточно и этого(см. с 1:45)
https://www.youtube.com/watch?v=7Gpw4u6kVWo
34 Ildarovich
 
11.07.16
19:11
Вот тут http://catalog.mista.ru/public/336783/ есть пример запроса, который решает в точности эту задачу. Статья называется "Расчет хэш-функции в запросе".
35 PiNHeaD
 
12.07.16
10:37
Я посмотрел анализ данных. Он в принципе анализирует и выводит цифирьки. Но мне дико не нравиться, когда все происходит "за ширмой 1С". поэтому для себя напишу еще "врукопашную" как посоветовал (31) . Еще раз спасибо всем за помощь. Всем "жирных" клиентов и маленькой дебиторки))))
36 Ildarovich
 
12.07.16
11:58
(35) Мне непонятно почему вы не хотите использовать готовый запрос из примера 2 в ссылке в (34).
Там я решаю именно эту задачу.
Суть решения в том, что код каждой позиции номенклатуры из документа преобразуется в некоторое число (хэш). Хэши всей номенклатуры документа арифметически складываются. В результате образуется хэш набора - некоторое уникальное для каждого набора номенклатуры число. Оно не зависит от порядка номенклатуры из-за сложения.
Этот хэш дает возможность посчитать число документов отгрузки с одинаковым набором номенклатуры, выбрать самые популярные наборы и так далее.
Все делается быстро и исключительно запросом.
37 impulse9
 
12.07.16
12:19
ВЫБРАТЬ
    ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОбороты.Регистратор КАК Регистратор
ПОМЕСТИТЬ ТЧ
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ТЧ.Регистратор КАК Регистратор,
    ТЧ.Номенклатура КАК Номенклатура,
    ТЧ1.Номенклатура КАК Номенклатура1
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
    ТЧ КАК ТЧ
        ЛЕВОЕ СОЕДИНЕНИЕ ТЧ КАК ТЧ1
        ПО (ТЧ.Регистратор = ТЧ1.Регистратор
                И ТЧ.Номенклатура <> ТЧ1.Номенклатура)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВременнаяТаблица.Номенклатура КАК Номенклатура,
    ВременнаяТаблица.Номенклатура1 КАК Номенклатура1,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВременнаяТаблица.Регистратор) КАК Регистратор
ИЗ
    ВременнаяТаблица КАК ВременнаяТаблица

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица.Номенклатура,
    ВременнаяТаблица.Номенклатура1
38 impulse9
 
12.07.16
12:20
Можно по другому регистру, или с отбором вида документа, просто для примера привел
39 Garykom
 
гуру
12.07.16
13:12
(36) Интересное решение но это же обычные битовые маски и операции с ними.
Иначе называется симхеш (SimHash algorithm, introduced by Charikar and is patented by Google) http://matpalm.com/resemblance/simhash/ и используется для очень быстрого сравнения текстовых документов между собой на похожесть.
40 DomovoiNaStraze Pravo
 
12.07.16
13:22
В (2) все сказали, зачем изобретать велосипеды?
Интересно что сделал автор?
41 mistеr
 
12.07.16
13:37
(34) Здесь не точно такая же задача, как в твоем примере. Ты берешь полный состав документа, а ТС нужны часто встречающиеся *пары* позиций.
42 Ildarovich
 
12.07.16
15:09
(41) Для пар позиций изначально нет вообще никакой проблемы: достаточно соединить табличные части по ссылке на документ и посчитать сколько раз встретилась каждая пара. Это запрос с одним соединением и одной группировкой. Разве что на два не забыть поделить.
43 Ildarovich
 
12.07.16
15:12
+(42) да вот в (37) это решение, там не хватает деления на два и временная таблица не особо нужна.
44 PiNHeaD
 
12.07.16
15:43
(36) Из-за уважения я изучу Ваш мануал, просто сейчас он мне с трудом дается.

(40)Я впринципе получил данные из АнализДанных, но решил еще "врукопашную" перепахать используя пример (25)
45 PiNHeaD
 
12.07.16
16:16
(25) Не вариант. При выборке в год. У меня обработка выполняется уже 20 минут.
46 PiNHeaD
 
12.07.16
16:18
(42) Пробовал так. Не помогло.
47 DomovoiNaStraze Pravo
 
12.07.16
16:18
(45)Запрос быстрее циклов, даже не стоит пробовать циклами.
48 PiNHeaD
 
12.07.16
16:35
(37) Выдал какие то данные. Только вот что получилось. АнализДанных показал мне максимум 6 случаев совпадения. А запрос вывел огромную таблицу. Кому верить?
49 Garykom
 
гуру
12.07.16
16:39
(48) Проверь вручную но чую (37) косячит

(47) Давайте не будем сравнивать ж с пальцем, запрос берет данные из регистра оборотов а циклы из доков, натравить циклы на запрос с группировкой из оборотов и что будет?

Или попробуйте запросом по докам по ТЧ прогуляться а потом уже.

И еще а оно в равных условиях то запущено или запрос на сервере с sql сервером а циклы на клиенте с данными с того же сервера?
А нет желания на файловой запустить или хотя бы &НаСервере ?
50 PiNHeaD
 
12.07.16
16:44
(49) База файловая
51 Garykom
 
гуру
12.07.16
17:01
(50) А по сколько в среднем позиций номенклатуры в накладных? Большие накладные или маленькие?
52 DomovoiNaStraze Pravo
 
12.07.16
17:34
(49)Ну попробуй запросом обойти ТЧ доков и циклами.
53 Garykom
 
гуру
12.07.16
18:00
(52) http://catalog.mista.ru/public/158235/

Просто запросопейсатели не умеют "циклы писать"... в этом то и трабла офигенная
54 Garykom
 
гуру
12.07.16
18:03
(53)+ Трабла что если строчек в ТЧ доков очень дофига то вложенный цикл по ТЧ будет слегка тормозить и в этом случае как раз желателен метод "битовых масок" по 0 (отсутствие) и 1 (присутствие) для каждого вида номенклатуры в ТЧ дока.
55 Garykom
 
гуру
12.07.16
18:16
(54) А еще когда циклу двойную делаем никаких переборов самих ТЧ доков, сначала данные нужные из ТЧ дока в ТЗ и уже циклы по ТЗ!
56 DomovoiNaStraze Pravo
 
13.07.16
09:55
(53)Охохох... Сделайте задачу 2 способами и узнаете как оно в жизни.
57 Garykom
 
гуру
13.07.16
11:04
(56) могу тоже самое посоветовать
Моя подобное уже много раз делать разными способами и когда лучше запросами а когда нет
Параллельно в несколько потоков запросы точно лучше ))
58 PiNHeaD
 
13.07.16
11:05
(51) Накладные небольшие по 3-5 позиций.
(56) Я так и делаю. Даже тремя вариантами. Один запросом, один анализом данных и еще один циклами. И с секундомером сижу)))) Пока надо обиться что бы все 3 варианта выдавали один результат
59 PiNHeaD
 
13.07.16
11:07
(58) я имею ввиду что бы в отчете один и тот же результат был. а то у меня все три отчета 3 разных варианта показывают)))
60 DomovoiNaStraze Pravo
 
13.07.16
11:52
(57)В соседней ветке я уже увидел как вы пишите. Теперь понятно почему вы сделали склонение к циклам перед запросами в данной задаче. Вы лучше перепроверьте свои знания.
61 PiNHeaD
 
13.07.16
11:57
(57) Циклами моя задача очень долго выполняется((((
62 Ildarovich
 
13.07.16
12:18
(58) Запросом вот этим ВЫБРАТЬ 1 Позиция,  1 ЧленРяда
ПОМЕСТИТЬ СтепеннойРяд
ОБЪЕДИНИТЬ ВЫБРАТЬ  2, 31
ОБЪЕДИНИТЬ ВЫБРАТЬ  3, 961
ОБЪЕДИНИТЬ ВЫБРАТЬ  4, 29791
ОБЪЕДИНИТЬ ВЫБРАТЬ  5, 923521
ОБЪЕДИНИТЬ ВЫБРАТЬ  6, 28629151
ОБЪЕДИНИТЬ ВЫБРАТЬ  7, 887503681
ОБЪЕДИНИТЬ ВЫБРАТЬ  8, 1742810335
ОБЪЕДИНИТЬ ВЫБРАТЬ  9, 2487512833
ОБЪЕДИНИТЬ ВЫБРАТЬ 10, 4098453791
ОБЪЕДИНИТЬ ВЫБРАТЬ 11, 2498015937
;
ВЫБРАТЬ ПОДСТРОКА("0123456789", Позиция, 1) КАК Символ, Позиция КАК Код
ПОМЕСТИТЬ КодоваяТаблица
ИЗ СтепеннойРяд
ИНДЕКСИРОВАТЬ ПО Символ
;
ВЫБРАТЬ Ссылка, Номенклатура.Код КАК Аргумент
ПОМЕСТИТЬ ИсходныеДанные
ИЗ Документ.РеализацияТоваровУслуг.Товары
ГДЕ Ссылка.Организация = &Организация И Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
;
ВЫБРАТЬ Ссылка, ПОДСТРОКА(Аргумент, Позиция, 1) КАК СимволКода, ЧленРяда
ПОМЕСТИТЬ ОтдельныеСимволы
ИЗ ИсходныеДанные, СтепеннойРяд
;
ВЫБРАТЬ Ссылка, СУММА(ЧленРяда * Код) КАК Хэш
ПОМЕСТИТЬ ВыходныеДанные
ИЗ ОтдельныеСимволы ВНУТРЕННЕЕ СОЕДИНЕНИЕ КодоваяТаблица
ПО СимволКода = Символ И СимволКода ПОДОБНО Символ
СГРУППИРОВАТЬ ПО Ссылка
;
ВЫБРАТЬ Хэш, Количество(*) КАК Частота
ПОМЕСТИТЬ ХитовыеХэши
ИЗ ВыходныеДанные
СГРУППИРОВАТЬ ПО Хэш
УПОРЯДОЧИТЬ ПО Частота УБЫВ
;
ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура, Частота
ИЗ ХитовыеХэши
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыходныеДанные ПО ХитовыеХэши.Хэш = ВыходныеДанные.Хэш
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары ПО ВыходныеДанные.Ссылка = Товары.Ссылка
УПОРЯДОЧИТЬ ПО Частота УБЫВ
ИТОГИ ПО ХитовыеХэши.Хэш

или другим?
63 PiNHeaD
 
13.07.16
12:36
(62) Вот этим (37)
64 PiNHeaD
 
13.07.16
12:55
(62) Запрос пишет ошибку Неизвестный параметр "Подстрока"

ВЫБРАТЬ Ссылка, ПОДСТРОКА(Аргумент, Позиция, 1) КАК СимволКода, ЧленРяда
ПОМЕСТИТЬ ОтдельныеСимволы
ИЗ ИсходныеДанные, СтепеннойРяд
65 Ildarovich
 
13.07.16
13:08
(64) Очень странно. Только что проверил. У меня и в 8.2 УТ10.3 и в 8.3 БП3 работает вот в таком виде:ВЫБРАТЬ 1 Позиция,  1 ЧленРяда
ПОМЕСТИТЬ СтепеннойРяд
ОБЪЕДИНИТЬ ВЫБРАТЬ  2, 31
ОБЪЕДИНИТЬ ВЫБРАТЬ  3, 961
ОБЪЕДИНИТЬ ВЫБРАТЬ  4, 29791
ОБЪЕДИНИТЬ ВЫБРАТЬ  5, 923521
ОБЪЕДИНИТЬ ВЫБРАТЬ  6, 28629151
ОБЪЕДИНИТЬ ВЫБРАТЬ  7, 887503681
ОБЪЕДИНИТЬ ВЫБРАТЬ  8, 1742810335
ОБЪЕДИНИТЬ ВЫБРАТЬ  9, 2487512833
ОБЪЕДИНИТЬ ВЫБРАТЬ 10, 4098453791
ОБЪЕДИНИТЬ ВЫБРАТЬ 11, 2498015937
;
ВЫБРАТЬ ПОДСТРОКА("0123456789", Позиция, 1) КАК Символ, Позиция КАК Код
ПОМЕСТИТЬ КодоваяТаблица
ИЗ СтепеннойРяд
ИНДЕКСИРОВАТЬ ПО Символ
;
ВЫБРАТЬ Ссылка, Номенклатура.Код КАК Аргумент
ПОМЕСТИТЬ ИсходныеДанные
ИЗ Документ.РеализацияТоваровУслуг.Товары
ГДЕ Ссылка.Организация = &Организация И Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
;
ВЫБРАТЬ Ссылка, ПОДСТРОКА(Аргумент, Позиция, 1) КАК СимволКода, ЧленРяда
ПОМЕСТИТЬ ОтдельныеСимволы
ИЗ ИсходныеДанные, СтепеннойРяд
;
ВЫБРАТЬ Ссылка, СУММА(ЧленРяда * Код) КАК Хэш
ПОМЕСТИТЬ ВыходныеДанные
ИЗ ОтдельныеСимволы ВНУТРЕННЕЕ СОЕДИНЕНИЕ КодоваяТаблица
ПО СимволКода = Символ И СимволКода ПОДОБНО Символ
СГРУППИРОВАТЬ ПО Ссылка
;
ВЫБРАТЬ Хэш, Количество(*) КАК Частота
ПОМЕСТИТЬ ХитовыеХэши
ИЗ ВыходныеДанные
СГРУППИРОВАТЬ ПО Хэш
;
ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура, Частота
ИЗ ХитовыеХэши
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыходныеДанные ПО ХитовыеХэши.Хэш = ВыходныеДанные.Хэш
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары ПО ВыходныеДанные.Ссылка = Товары.Ссылка
УПОРЯДОЧИТЬ ПО Частота УБЫВ
ИТОГИ ПО ХитовыеХэши.Хэш
В (62) там УПОРЯДОЧИТЬ лишнее было (забыл стереть вместе с ПЕРВЫЕ 5), но ПОДСТРОКА - это функция языка запросов, как он ее параметром считает?
- В консоли запрос выполняете?
66 DrZombi
 
гуру
13.07.16
13:23
(0) Под комбинацией подразумевается полный состав номенклатуры по документу?
67 PiNHeaD
 
13.07.16
13:49
(66) Не по конкретному документу, а по всем документам за период анализа. Нужно понять сколько раз повторяется какая-либо комбинация номенклатуры.
68 PiNHeaD
 
13.07.16
13:50
(65) Да, в консоли)))
69 PiNHeaD
 
13.07.16
13:52
(65) Не в консоли тоже самое
70 Ildarovich
 
13.07.16
13:56
(68) Скажите на какой конфигурации, на какой платформе выполняете, скопируйте обратно сюда уже свой вариант запроса. Возможно, после обработки конструктором что-то вмешивается.
71 PiNHeaD
 
13.07.16
14:00
(65) код был числовым)))
72 Ildarovich
 
13.07.16
14:18
С числовым кодом все ГОРАЗДО проще, там многие преобразования не нужны. Достаточно хэш набора в документе получить запросом ВЫБРАТЬ Ссылка, СУММА(2498015937 * Номенклатура.Код) КАК Хэш ПОМЕСТИТЬ ВыходныеДанные ИЗ Документ.РеализацияТоваровУслуг.Товары СГРУППИРОВАТЬ ПО СсылкаЭто будет первый из оставшихся трех запросов. Еще нужно взять предпоследний и последний.
Вот так примерно:ВЫБРАТЬ Ссылка, СУММА(2498015937 * Номенклатура.Код) КАК Хэш
ПОМЕСТИТЬ ВыходныеДанные
ИЗ Документ.РеализацияТоваровУслуг.Товары СГРУППИРОВАТЬ ПО Ссылка
;
ВЫБРАТЬ Хэш, Количество(Ссылка) КАК Частота
ПОМЕСТИТЬ ХитовыеХэши
ИЗ ВыходныеДанные
СГРУППИРОВАТЬ ПО Хэш
;
ВЫБРАТЬ РАЗЛИЧНЫЕ Номенклатура, Частота
ИЗ ХитовыеХэши
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВыходныеДанные ПО ХитовыеХэши.Хэш = ВыходныеДанные.Хэш
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары ПО ВыходныеДанные.Ссылка = Товары.Ссылка
УПОРЯДОЧИТЬ ПО Частота УБЫВ
ИТОГИ ПО ХитовыеХэши.Хэш
73 PiNHeaD
 
13.07.16
14:47
(72) Спасибо. Но это тзапрос мне показывает сколько раз та или иная номенклатура появляется в документах. А меня интересует именно комбинация данных. То есть. покупают люди пюре с котлетой. Так вот сколько за период попалось в документах сразу и пюре и котлета.
74 KODin1C
 
13.07.16
14:54
(0) Тебе надо для конкретного значения "болт и гайка" или вообще найти наимболее часто встречающиеся соопутсвующие товары.
75 DomovoiNaStraze Pravo
 
13.07.16
14:56
(74)Ему надо конкретно, чтоб он задал параметры двух номенклатур и анализ выдал ответ. (хз правда сегодня может двух, завтра целого набора :) )
76 KODin1C
 
13.07.16
15:03
(75) Вроде все просто

ВЫБРАТЬ
    ВложенныйЗапрос.КоличествоДокументов
ИЗ
    (ВЫБРАТЬ
        СУММА(1) КАК КоличествоДокументов
    ИЗ
        (ВЫБРАТЬ
            РеализацияТоваровУслугТовары.Ссылка КАК Документ,
            СУММА(1) КАК КоличествоНоменклатурыИзСписка
        ИЗ
            Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ГДЕ
            РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачПер И &КонПер
            И РеализацияТоваровУслугТовары.Номенклатура В ИЕРАРХИИ(&спНоменклатурыБолтИГайка)
        
        СГРУППИРОВАТЬ ПО
            РеализацияТоваровУслугТовары.Ссылка) КАК ВложенныйЗапрос
    ГДЕ
        ВложенныйЗапрос.КоличествоНоменклатурыИзСписка = &РазмерСпискаНоменклатурыДляБолтаиГайкиРавноДвум) КАК ВложенныйЗапрос
77 KODin1C
 
13.07.16
15:04
(76) Раве что отработать вариант, что одна и та же номенклатура встречается два раза, тогда надо свернуть еще раз.
78 PiNHeaD
 
13.07.16
15:06
(74) мне надо найти всевозможные комбинации
79 DomovoiNaStraze Pravo
 
13.07.16
15:07
(78)Вы лучше уточните задачу) А лучше на примере с данными)
80 тарам пам пам
 
13.07.16
15:11
для 2-х номенклатур запрос простой:

ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Номенклатура,
    РеализацияТоваровУслугТовары1.Номенклатура КАК Номенклатура1,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Ссылка) КАК Количество
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары1
        ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслугТовары1.Ссылка

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслугТовары.Номенклатура,
    РеализацияТоваровУслугТовары1.Номенклатура
81 KODin1C
 
13.07.16
15:15
(78) Все возможные комбинации из 2х номеклатур или может и более?
82 Garykom
 
гуру
13.07.16
15:19
(61) сделай уже сначала запрос а потом уже циклы в памяти по результам запроса
83 Garykom
 
гуру
13.07.16
15:21
(80) ты главное не предлагай ТСу терь этот запрос в циклах по всем сочетаниям номенклатуры выполнять :)
84 PiNHeaD
 
13.07.16
15:22
Хорошо. постараюсь объяснить на примере.

У нас питаются люди. Делают заказ на кухню.
1 Заказ: Пюре+Котлета;
2 Заказ: Макароны+Курица;
3 Заказ: Пюре+Курица;
4 Заказ: Салат+Морс;
5 Заказ: Котлета+Пюре;
6 Заказ: Рис+Котлета;
7 Заказ: Салат+Макароны+Курица+морс.

Анализ:
Пюре+котлета - 2 документа;
Макароны+Курица - 2 документа.

Вывод:
С пюре чаще всего берут котлету, а с макаронами курицу
85 Garykom
 
гуру
13.07.16
15:24
(84) Анализ малополезный, нужно добавить суммы общие по заказам и средний чек.
86 PiNHeaD
 
13.07.16
15:26
(85) Пока потребность в этом отчете. Дальше будем расширять и всевозможные фильтры и смены и сезонность. да много чего. Надо модель заложить сначала)))
87 KODin1C
 
13.07.16
15:30
(84) Искать сочетания только из двух продуктов или более?
88 Garykom
 
гуру
13.07.16
15:30
(86) Смотри для решения задачи есть всего два варианта:
1. Берем по очереди все "пары номенклатуры" и считаем для каждой пары в сколько доках оно встретилось
3. Берем и перебираем все доки (не обязательно сами можно и из оборотного регистра по регистратору) и ТЧ в них. При этом составляем все "пары внутри дока" и для каждой пары ищем/пишем результат в один общий большой список результатов.
89 Garykom
 
гуру
13.07.16
15:31
(88) *3. то 2.
90 Это_mike
 
13.07.16
15:32
(85) а это уже работа для подсистемы аналитики, но не для обхода циклами
91 Garykom
 
гуру
13.07.16
15:32
(88)+ По сути если меню небольшое и сочетаний мало то вариант 1 обгонит вариант 2.
Но вариант 2 более универсальный в случае "большого меню" когда много возможных сочетаний.
92 Это_mike
 
13.07.16
15:33
(91) вариант 2 весгда обгонит
93 тарам пам пам
 
13.07.16
15:35
(83) Шта? Какие циклы вообще? Этот запрос уже все пары и выбирает, из него кросс-таблицу в СКД сделать - два действия (добавить отборы по дате и "проведен" и собственно настроить отчет).
94 Garykom
 
гуру
13.07.16
15:35
(90) Еще один забаненный )) проявился

Скажи что может подсистема аналитики и что нельзя сделать циклами причем с лучшим результатом по скорости/качеству? Время разработки пусть неучитываем ибо оно несравнимо мало со временем/частотой использования отчетов.

А вот иногда что можно кодом (циклами, запросами и т.д.) подсистема аналитики нифуя не могет ))
95 Garykom
 
гуру
13.07.16
15:36
(92) Даже в случае всего одного сочетания? Хахаха....
96 Это_mike
 
13.07.16
15:37
(95) да
97 Garykom
 
гуру
13.07.16
15:39
(96) Эээ. У нас в справочнике всего 2 номенклатуры.

И просто дофуя доков в которых может быть 1, 2 или обе вместе. А еще и кучу дублирующихся строк с одной номенклатурой в доках (кто запрещает то?).

В этом случае "перебирать документы" (по варианту 2) слегка смешно, когда единственное сочетание известно.
98 Garykom
 
гуру
13.07.16
15:45
(97)+ Гм вариант идеальный для (0) это завести себе бложек... тьфу т.е. отдельный регистрик и писать туда при пробитии/проведении все сочетания из текущего дока в +1, а при отмене проведения -1.

И будет Ном1, Ном2, Кол-во доков. Для перестановки номенклатуры только что придумать? Для исключения двойного вывода или требований сложения?

Хотя может быть интересно для анализа сначала берут "пюре" а потом "котлету" или наоборот думают про гарнир к "котлете"...
99 Garykom
 
гуру
13.07.16
15:53
и тишина... ))
100 DomovoiNaStraze Pravo
 
13.07.16
15:54
Ты всех сразил наповал)
101 KODin1C
 
13.07.16
15:54
Вариант для поиска сочетаний 2-х номенклатур:

ВЫБРАТЬ
    взДанные.Документ,
    взДанные.Номенклатура
ПОМЕСТИТЬ втДанные
ИЗ
    (ВЫБРАТЬ
        данные.Документ КАК Документ,
        данные.Номенклатура КАК Номенклатура
    ИЗ
        (ВЫБРАТЬ
            РеализацияТоваровУслугТовары.Ссылка КАК Документ,
            РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
        ИЗ
            Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
        ГДЕ
            РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачДата И &КонДата
        
        СГРУППИРОВАТЬ ПО
            РеализацияТоваровУслугТовары.Ссылка,
            РеализацияТоваровУслугТовары.Номенклатура) КАК данные
    
    СГРУППИРОВАТЬ ПО
        данные.Документ,
        данные.Номенклатура) КАК взДанные
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взВсяНоменклатура.Номенклатура
ПОМЕСТИТЬ втВсяНоменклатура
ИЗ
    (ВЫБРАТЬ
        втДанные.Номенклатура КАК Номенклатура
    ИЗ
        втДанные КАК втДанные
    
    СГРУППИРОВАТЬ ПО
        втДанные.Номенклатура) КАК взВсяНоменклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взВсеВариантыПар.Номенклатура,
    взВсеВариантыПар.Номенклатура1
ПОМЕСТИТЬ втВсеВариантыПар
ИЗ
    (ВЫБРАТЬ
        втВсяНоменклатура.Номенклатура КАК Номенклатура,
        втВсяНоменклатура1.Номенклатура КАК Номенклатура1
    ИЗ
        втВсяНоменклатура КАК втВсяНоменклатура
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ втВсяНоменклатура КАК втВсяНоменклатура1
            ПО втВсяНоменклатура.Номенклатура.Код > втВсяНоменклатура1.Номенклатура.Код) КАК взВсеВариантыПар
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    взРезультат.Номенклатура,
    взРезультат.Номенклатура1,
    взРезультат.КоличествоСовпадений
ИЗ
    (ВЫБРАТЬ
        ВложенныйЗапрос.Номенклатура КАК Номенклатура,
        ВложенныйЗапрос.Номенклатура1 КАК Номенклатура1,
        ВложенныйЗапрос.КоличествоСовпадений КАК КоличествоСовпадений
    ИЗ
        (ВЫБРАТЬ
            ВсеДокументыНоменклатуры.Номенклатура КАК Номенклатура,
            ВсеДокументыНоменклатуры.Номенклатура1 КАК Номенклатура1,
            СУММА(1) КАК КоличествоСовпадений
        ИЗ
            (ВЫБРАТЬ
                втВсеВариантыПар.Номенклатура КАК Номенклатура,
                втВсеВариантыПар.Номенклатура1 КАК Номенклатура1,
                втДанные.Документ КАК Документ
            ИЗ
                втВсеВариантыПар КАК втВсеВариантыПар
                    ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанные КАК втДанные
                    ПО втВсеВариантыПар.Номенклатура = втДанные.Номенклатура) КАК ВсеДокументыНоменклатуры
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                    втВсеВариантыПар.Номенклатура КАК Номенклатура,
                    втВсеВариантыПар.Номенклатура1 КАК Номенклатура1,
                    втДанные.Документ КАК Документ
                ИЗ
                    втВсеВариантыПар КАК втВсеВариантыПар
                        ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДанные КАК втДанные
                        ПО втВсеВариантыПар.Номенклатура1 = втДанные.Номенклатура) КАК ВсеДокументыНоменклатуры1
                ПО ВсеДокументыНоменклатуры.Номенклатура = ВсеДокументыНоменклатуры1.Номенклатура
                    И ВсеДокументыНоменклатуры.Номенклатура1 = ВсеДокументыНоменклатуры1.Номенклатура1
                    И ВсеДокументыНоменклатуры.Документ = ВсеДокументыНоменклатуры1.Документ
        
        СГРУППИРОВАТЬ ПО
            ВсеДокументыНоменклатуры.Номенклатура,
            ВсеДокументыНоменклатуры.Номенклатура1) КАК ВложенныйЗапрос) КАК взРезультат
102 DomovoiNaStraze Pravo
 
13.07.16
16:01
Еще денек покумекать и все будет нормально :) (извините что смеюсь)
103 DomovoiNaStraze Pravo
 
13.07.16
16:02
*(в смысле всем колхозом покумекать)
104 Это_mike
 
13.07.16
16:04
(97) а мы выберем все пары из документов, в которых они есть, запросом.
а крутить циклы... ну, это от альтернативщины...
105 ИС-2
 
naïve
13.07.16
16:09
(0) смотри анализ данных. Там есть такой пример
106 Garykom
 
гуру
13.07.16
16:12
(104) а что мои 2 варианта пофиг на реализацию же?
Неважно запросы или циклы
Вот третий вариант с регистром это тру путь правильного 1Сника и да он перебор документов но в онлайне заранее а не когда уже отчет нужен
107 PiNHeaD
 
13.07.16
16:20
Простите что долго отвечаю. просто вчитываюсь в каждый коммент)))
108 тарам пам пам
 
13.07.16
18:18
(106), угу, "тру" 1Сник - из-за элементарного отчета нужно городить регистр и перепроводить реализацию. А если манагер захочет комбинации длиной 3, еще один регистр добавлять и снова перепроводить реализацию?

(107) посмотри мой запрос в (80), он выводит ровно то, что ты описал в (5) и в (84)
109 Garykom
 
гуру
13.07.16
18:27
(108) >А если манагер захочет комбинации длиной 3, еще один регистр добавлять и снова перепроводить реализацию?

Заранее подумать и все комбинации сделать. Перепроводить ничего не надо, для новых само, адля старых достаточно написать немного кода по заполнению регистра.

Или запросописатели не умеют уже код писать?
110 тарам пам пам
 
13.07.16
18:46
(109) ок, допустим пришли у нас празднующие толпой и заказали сразу 20 позиций; допустим у нас 4 измерения в регистре. Записей в этот регистр пойдет 20! / (20 - 4)! = 20*19*18*17 = 116280. Насколько увеличится время проведения? И вся эта порнография из-за нежелания использовать запрос в 5 строк?
111 Garykom
 
гуру
13.07.16
18:53
(110) Гм, а как сумели стать программистом с такими знаниями математики? Поделитесь а аж завидно... учишь тут учишь а некоторые куяк-куяк и на ставку.

ЗЫ Регистр будет накопительный с 1 измерением и 1 ресурсом числовым целым. Записей в регистре при сочетаниях по 4 из 20 уже до этого есть/было просто дофига.
Время проведения увеличится, но останется в разумных пределах, толпы то редко так что ок.

А терь честно скажите что сможет отчетик запросом посчитать при таком количестве сочетаний и когда он помрет вместе с сервером?

ЗЗЫ А у нас с регистром все рабочее.
112 Garykom
 
гуру
13.07.16
18:58
(111)+ Но лучше фоновым этот регистр заполнять согласен
113 тарам пам пам
 
13.07.16
19:42
(111) Ох, какой же ты упертый.
Первое - намекать, что у меня ошибка в вычислениях и не говорить, в чем именно - некрасиво. Я не гордый и если действительно ошибся, то упираться не буду.

Второе - вразуми меня, мастер циклов, что именно ты собираешься писать в регистр с одним измерением и одним ресурсом, чтобы в итоге собрать отчет с комбинациями номенклатуры длиной 3? Вот прям пример для 4 позиций номенклатуры в реализации приведи.

Третье - для "отчетика" как раз 100-200 тыс строк - это не так много. И выполняется он раз в месяц, а не при каждом проведении документа.
114 DomovoiNaStraze Pravo
 
13.07.16
20:13
Парни давайте, вы уже на финишной прямой, осталось чуть-чуть докумекать)
115 Garykom
 
гуру
13.07.16
21:01
(113) 1. Число сочетаний (если порядок заказа позиций неважен) из 20 по 4 = 4845.
Вот число размещений (если нужен/важен порядок в котором выбирали/заказывали позиции) из 20 по 4 = 116280 это верно.
Но уточнить то забыли и хитрым образом взяли "большее число". Насколько понимаю ТС им пофиг на порядок хотя бы пары знать.

2. Писать можно или строку (составной код, хеш) или ссылку на объект с ТЧ, внутри которой список номенклатуры и даже с порядком если важно.

3. Снова хитрая математика )) теперь уже преуменьшаем, а реально при "вычислении запроса" внутри будут как бы не миллионы обрабатываемых строк.

И каким образом в запросе "размещения" в отличие от "сочетаний" находить я пока даже не представляю детально. Позиции присутствующие в документе в нужном порядке не обращая внимания или обращая на другие позиции в промежутках.
Тут кстати тоже интересно сочетания/размещения то нужны все рядом подряд или не обязательно рядом, главное в одном документе.
116 KODin1C
 
14.07.16
06:22
(108) > посмотри мой запрос в (80)

У тебя не учитывается несколько нюансов.

"Болт - Болт" - это не пара.

"Болт - Гайка" и "Гайка - Болт" - это одно и тоже, а тебя будут разными.

Стоит добавить условие как у меня: втВсяНоменклатура.Номенклатура.Код > втВсяНоменклатура1.Номенклатура.Код

И ты не учитываешь, что одну и ту же номенклатуру могут два раза в документе прописать.
117 тарам пам пам
 
14.07.16
07:59
(116) >"Болт - Болт" - это не пара.

>"Болт - Гайка" и "Гайка - Болт" - это одно и тоже, а тебя будут разными.

Это сделано намеренно. Просто попробуй свой запрос вывести в кросс-таблицу в отчете, как описано в (5).

Если убрать пары "Болт-Болт", то на пересечении "Болт-Болт" у тебя будет 0, у меня будет количество документов, где встречается "Болт". Потому что следующий вопрос менеджера будет вывести не абсолютное количество, а процент - т. е. в каком проценте случаев при заказе "Болт" заказывают "Гайка".

Если убрать пары "Болт-Гайка" и "Гайка-Болт", то в таблице числа будут "прыгать" - будет число на пересечении "Болт-Гайка", но не будет на пересечении "Гайка-Болт" (или наоборот).

> И ты не учитываешь, что одну и ту же номенклатуру могут два раза в документе прописать.

Учитываю, потому что берутся Количество(Различные Ссылка), а не просто Количество(Ссылка).
118 Лодырь
 
14.07.16
08:01
Везде свои велосипеды изобретают. Чем не устраивает http://v8.1c.ru/overview/Term_000000271.htm#02
119 тарам пам пам
 
14.07.16
09:36
(115) >1. Число сочетаний (если порядок заказа позиций неважен) из 20 по 4 = 4845.  
По поводу размещений вместо сочетаний - действительно, был не прав, потому как считал количество записей, необходимое для запроса, аналогичного в (80) и не учел, что порядок при хранении не важен. Почему запрос написал именно такой (без исключения пар с одинаковой номенклатурой и разным порядком) - ответил в (117).

>3. Снова хитрая математика )) теперь уже преуменьшаем, а реально при "вычислении запроса" внутри будут как бы не миллионы обрабатываемых строк.
Цитата из твоего сообщения: "толпы то редко так что ок".

>И каким образом в запросе "размещения" в отличие от "сочетаний" находить я пока даже не представляю детально.
Встречный вопрос - а как ты собрался избавляться от размещений при записи в регистр? Ну т. е. чтобы у тебя из одного документа не записалось "Гайка-Болт", а из другого "Болт-Гайка" (это приведет к распуханию таблицы итогов и к необходимости избавляться от таких пар в отчете, опять же).

Отвечу сам - здесь единственный выход - сортировать колонки (например, по ссылке), т. е. пару "Болт-Гайка" всегда писать именно в таком порядке. Собственно, в запросе для избавления от размещений используется тот же прием, разве что сортировать приходится "вручную" - через сравнение каждого элемента с соседними. Вот тебе пример запроса для комбинаций длины 3, например:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    РеализацияТоваровУслугТовары.Ссылка,
    РеализацияТоваровУслугТовары.Номенклатура
ПОМЕСТИТЬ Товары
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
    И РеализацияТоваровУслугТовары.Ссылка.Проведен
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Ссылка,
    ВЫБОР
        КОГДА Товары.Номенклатура < Товары1.Номенклатура
            ТОГДА Товары.Номенклатура
        ИНАЧЕ Товары1.Номенклатура
    КОНЕЦ КАК Номенклатура,
    ВЫБОР
        КОГДА Товары.Номенклатура > Товары1.Номенклатура
            ТОГДА Товары.Номенклатура
        ИНАЧЕ Товары1.Номенклатура
    КОНЕЦ КАК Номенклатура1
ПОМЕСТИТЬ Сочетания2
ИЗ
    Товары КАК Товары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Товары КАК Товары1
        ПО Товары.Ссылка = Товары1.Ссылка
            И Товары.Номенклатура <> Товары1.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сочетания2.Ссылка) КАК КоличествоДокументов,
    ВЫБОР
        КОГДА Товары.Номенклатура < Сочетания2.Номенклатура
            ТОГДА Товары.Номенклатура
        КОГДА Товары.Номенклатура > Сочетания2.Номенклатура
            ТОГДА Сочетания2.Номенклатура
        ИНАЧЕ Товары.Номенклатура
    КОНЕЦ КАК Номенклатура,
    ВЫБОР
        КОГДА Товары.Номенклатура < Сочетания2.Номенклатура
            ТОГДА Сочетания2.Номенклатура
        КОГДА Сочетания2.Номенклатура < Товары.Номенклатура
                И Товары.Номенклатура < Сочетания2.Номенклатура1
            ТОГДА Товары.Номенклатура
        КОГДА Сочетания2.Номенклатура1 < Товары.Номенклатура
            ТОГДА Сочетания2.Номенклатура1
        ИНАЧЕ Товары.Номенклатура
    КОНЕЦ КАК Номенклатура1,
    ВЫБОР
        КОГДА Товары.Номенклатура < Сочетания2.Номенклатура1
            ТОГДА Сочетания2.Номенклатура1
        ИНАЧЕ Товары.Номенклатура
    КОНЕЦ КАК Номенклатура2
ИЗ
    Товары КАК Товары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Сочетания2 КАК Сочетания2
        ПО Товары.Ссылка = Сочетания2.Ссылка
            И Товары.Номенклатура <> Сочетания2.Номенклатура
            И Товары.Номенклатура <> Сочетания2.Номенклатура1

СГРУППИРОВАТЬ ПО
    ВЫБОР
        КОГДА Товары.Номенклатура < Сочетания2.Номенклатура
            ТОГДА Товары.Номенклатура
        КОГДА Товары.Номенклатура > Сочетания2.Номенклатура
            ТОГДА Сочетания2.Номенклатура
        ИНАЧЕ Товары.Номенклатура
    КОНЕЦ,
    ВЫБОР
        КОГДА Товары.Номенклатура < Сочетания2.Номенклатура
            ТОГДА Сочетания2.Номенклатура
        КОГДА Сочетания2.Номенклатура < Товары.Номенклатура
                И Товары.Номенклатура < Сочетания2.Номенклатура1
            ТОГДА Товары.Номенклатура
        КОГДА Сочетания2.Номенклатура1 < Товары.Номенклатура
            ТОГДА Сочетания2.Номенклатура1
        ИНАЧЕ Товары.Номенклатура
    КОНЕЦ,
    ВЫБОР
        КОГДА Товары.Номенклатура < Сочетания2.Номенклатура1
            ТОГДА Сочетания2.Номенклатура1
        ИНАЧЕ Товары.Номенклатура
    КОНЕЦ
120 тарам пам пам
 
14.07.16
09:38
(118) Про анализ данных еще на первой странице сказали. Ну и как не поспорить, что лучше - велосипед с квадратными или с пятиугольными колесами :)
121 Лодырь
 
14.07.16
09:44
(120) Да я видел что упоминали, но так и не ответили, зачем его делать.
122 Лодырь
 
14.07.16
09:45
его  - это велосипед
123 Garykom
 
гуру
14.07.16
09:47
(119) >Встречный вопрос - а как ты собрался избавляться от размещений при записи в регистр? Ну т. е. чтобы у тебя из одного документа не записалось "Гайка-Болт", а из другого "Болт-Гайка" (это приведет к распуханию таблицы итогов и к необходимости избавляться от таких пар в отчете, опять же).

Что такое ХЕШ знаем?
Написал же:
"2. Писать можно или строку (составной код, хеш) или ссылку на объект с ТЧ, внутри которой список номенклатуры и даже с порядком если важно. Объект это например свой справочник с номенклатурой в ТЧ."

Для 20 номенклатур хеш будет длиной 20 бит (3 байта), для 100 номенклатур длиной 100 бит (13 байт).
Где каждый бит задает наличие/присутствие в наборе конкретной номенклатуры из пронумерованного списка. И пофиг на кол-во "сочетаний по" хоть 4 хоть 10.
Вот хеши для "размещений" они сложнее и в тоже время проще, просто составной код номенклатур в одну строку.
124 Garykom
 
гуру
14.07.16
09:49
(123)+ хеш функция = СокрЛП(Номенклатура1.Код)+"_"+СокрЛП(Номенклатура2.Код)+"_"+...
125 Garykom
 
гуру
14.07.16
09:50
Блин вот как кому то странно что я "хреново" знаю запросы, так и мне дико что "программист" не знает "алгоритмов".
126 PiNHeaD
 
14.07.16
15:01
Я все таки решил использовать Анализ данных. Все варианты хороши и имеют место быть.

Как у Яна Арлазорова. "Тебе как посчитать? Быстро или точно?
127 Korney1222
 
14.07.16
15:24
Здравствуйте все! Очень давно начал заниматься бухгалтерией и не знал многих ее тонкостей. Я сам учился только по интернету и не мог найти достойного материала по этой сфере. Искал я очень долго. И наконец нашел сайт который помогает мне работать.) Кому интересно вот он http://www.pro1c-msk.ru/
128 Garykom
 
гуру
14.07.16
15:35
(127) мдя
129 Garykom
 
гуру
14.07.16
15:36
(126) Пока скорости анализа данных будет хватать и его возможностей по анализу хватать то конечно его юзай )) сразу ответили же.

Все прочие методы это когда попросят "размещения" по 3 из 500 и т.д. и чтобы мгновенно отчет выдавал
130 тарам пам пам
 
14.07.16
19:32
(123) Все, надоело спорить, все равно доказать тебе ничего не смогу.
ИМХО, в итоге минусы решения с отдельным регистром (необходимость дорабатывать конфигурацию, увеличение размера базы, увеличение времени транзакции - либо необходимость в регл. задании, которое этот регистр будет заполнять => возможная некоторая неактуальность данных отчета) перевешивают его плюсы (более высокая скорость формирования отчета).

P. S. Ради интереса потестировал свой запрос на большом документе. Тестировал размещения длиной 3, формировал только временную таблицу без ее вывода (для вывода просто не хватало памяти на клиенте):
300 строк - на файловой базе 26с, на сервере 6с
400 строк - в файловой базе кончилась память (4Гб), на сервере 14с
500 строк - на сервере 30с
Запрос такой (он проще запроса в (119) - сортировать колонки вручную вообще не нужно, достаточно было правильно их соединить; сразу об этом я не подумал):

ВЫБРАТЬ РАЗЛИЧНЫЕ
    РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ Товары
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка = &Ссылка

ИНДЕКСИРОВАТЬ ПО
    Ссылка,
    Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Товары.Ссылка КАК Ссылка,
    Товары.Номенклатура КАК Номенклатура,
    Товары1.Номенклатура КАК Номенклатура1
ПОМЕСТИТЬ Длина2
ИЗ
    Товары КАК Товары
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Товары КАК Товары1
        ПО Товары.Ссылка = Товары1.Ссылка
            И Товары.Номенклатура < Товары1.Номенклатура

ИНДЕКСИРОВАТЬ ПО
    Ссылка,
    Номенклатура1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Длина2.Ссылка) КАК Ссылка,
    Длина2.Номенклатура КАК Номенклатура,
    Длина2.Номенклатура1 КАК Номенклатура1,
    Товары.Номенклатура КАК Номенклатура2
ПОМЕСТИТЬ Результат
ИЗ
    Длина2 КАК Длина2
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Товары КАК Товары
        ПО Длина2.Ссылка = Товары.Ссылка
            И Длина2.Номенклатура1 < Товары.Номенклатура

СГРУППИРОВАТЬ ПО
    Товары.Номенклатура,
    Длина2.Номенклатура1,
    Длина2.Номенклатура
Ошибка? Это не ошибка, это системная функция.