Имя: Пароль:
1C
1С v8
Помогите найти повторяющиеся множества
,
0 vmlspb
 
20.05.13
12:26
Добрый день

Вопрос в следующем...
Есть справочник Коробки с табличной частью Состав (Номенклатура, Количество).
Нужно запросом найти все группы справочников по повторяющимся табличным частям. Совпадение должно быть полным, порядок в самой табличной части может быть различным. Т.е. одна табличная полностью совпадает с другой по Номенклатура и Количество, если для какой-то коробки нет дублирующего состава, то все равно ее вывести
1 1Сергей
 
20.05.13
12:27
Запросом не взлетит, имхо
2 vmlspb
 
20.05.13
12:28
Коробок много, в цикле проверять пару не айс
3 NS
 
20.05.13
12:29
Посчитай хеш ключ каждой табличной части, найдя совпадающие - для контроля проверь и сами табличные части.
4 1Сергей
 
20.05.13
12:29
(3) +1 Только хотел про хэш сказать :)
5 NS
 
20.05.13
12:30
А там, еще если дубля нет, то вывести...
6 NS
 
20.05.13
12:30
А, там если дубля нет :)
7 vmlspb
 
20.05.13
12:30
мысль, только как это хэш составить?
8 vmlspb
 
20.05.13
12:31
отсортировать в самой таблице и приплюсовать код Номенклатуры+количество, например?
9 Fragster
 
гуру
20.05.13
12:36
сделаю запросом за 300 рублей
10 Fragster
 
гуру
20.05.13
12:36
только работать будет доооолго
11 NS
 
20.05.13
12:38
(8) Отксорить зобрист по коду, и добавить к этому суммарное количество.
12 Kookish
 
20.05.13
12:38
13 NS
 
20.05.13
12:39
А, XOR-а в 1С нет. Тогда сложить по модулю зобрист по коду.
И прибавить к нему суммарное количество.
14 1Сергей
 
20.05.13
12:40
(13)

Функция XORчисел(Число1, Число2)
   МладшийБит = 0;
   Если Число1%2 = Число2%2 тогда
       МладшийБит = 0;
   Иначе
       МладшийБит = 1;
   КонецЕсли;
   Если (Число1>1)ИЛИ(Число2>1) Тогда
       Возврат XORчисел(Цел(Число1/2), Цел(Число2/2))*2 + МладшийБит;
   Иначе
       Возврат МладшийБит;
   КонецЕсли;
КонецФункции
15 vmlspb
 
20.05.13
12:48
хэш в запросе можно сделать по ссылке и числу?
16 Aprobator
 
20.05.13
12:50
(8) создай тупо реквизит ключ данных ТЧ, который будет формироваться ПриЗаписи на основании данных ТЧ. И Потом уже запросом сверяй нет ли дублей этих ключей. С тем как этот ключ создать, репу, конечно, почесать придется.
17 vmlspb
 
20.05.13
12:51
(16) - не катит, так любой сможет, мне нужно без добавления реквизитов в справочник
18 kortun
 
20.05.13
12:54
(17) ну так создавай ключ в запросе и кидай во временную таблицу, а уже потом ищи что надо
19 vmlspb
 
20.05.13
12:54
(18) помогите его создать
20 NS
 
20.05.13
12:57
(14) Это медленно. Проще сложить по модулю (% Большое число)
21 kortun
 
20.05.13
12:57
(19) ну тот типа
Выбрать
   Состав.Ссылка КАК Коробка,
   Состав.Номенклатура.Наименование + Состов.Количество КАК Ключ
Из
   Справочник.Коробки.Состав КАК Состав
22 1Сергей
 
20.05.13
12:58
(21) а теперь для нескольких строк
23 kortun
 
20.05.13
13:01
(22) не понял, для каких нескольких строк?
тут как бы и так из табличной части выборка
24 MaxisUssr
 
20.05.13
13:02
(17)
в ПодпискеНаСобытие пиши в регистр.
25 vmlspb
 
20.05.13
13:03
(21) вы собираетесь сложить строку с числом в запросе? - ну-ну
26 1Сергей
 
20.05.13
13:04
(23) Нужно получить 1 ключ на всю ТЧ одного элемента
27 kortun
 
20.05.13
13:05
(25) ВЫРАЗИТЬ ничего не говорит?
я привел пример как создать ключ, а не конечный вариант запроса
28 vmlspb
 
20.05.13
13:05
(27) вы пробовали?
29 AlexTim03
 
20.05.13
13:06
(0) а что мешает запросом соединить табличные части сами на себя по полям "номенклатура", "количество" и
поставить условие

имеющие количество(различные Коробки) > 1

?
30 AlexTim03
 
20.05.13
13:07
Или же поставить условие на соединение, что коробка из левой таблицы не равна коробке из правой
31 vmlspb
 
20.05.13
13:07
(27) нельзя число преобразовать в строку функцией ВЫРАЗИТЬ()
32 kortun
 
20.05.13
13:10
33 kortun
 
20.05.13
13:11
(23) тут другой запрос надо, я писал запрос в ответ на (17)
34 NS
 
20.05.13
13:13
Нафига запросом? Собрать накладные в ТЗ, потом посчитать хеш по каждой накладной, отсортировать по Хешу, и в один проход найти одинаковые.
35 vmlspb
 
20.05.13
13:13
(34) тоже вариант, но хотелось бы все в одном запросе
36 NS
 
20.05.13
13:14
(35) Зачем в запросе?
Это всё-равно что нужно сложить, но я бы хотел делением...
37 vmlspb
 
20.05.13
13:16
(35) коробок очень много, перебор каждой и составление для ее таблицы хэш займет немалое время
38 vmlspb
 
20.05.13
13:17
(32) в компоновке да, но не в самом запросе
39 NS
 
20.05.13
13:17
Делаешь два массива zorb[товар] и zorb1[товар] (для количества). Заполняешь случайными целыми значениями (от нуля до 2^32-1).
И считаешь хеш функцию как Сумма(zorb+zorb1*количество)%2^32 например.
(37) Ты хочешь посчитать хеш по табличным частям не перебирая табличные части?
40 vmlspb
 
20.05.13
13:19
(39) я не хочу составлять хэш вообще, делать только сравнение в запросе
41 1Сергей
 
20.05.13
13:21
(40) даже если реализуешь, это будет не быстрее
42 Ненавижу 1С
 
гуру
20.05.13
13:26
(0) То есть если состав повторяется в нексольких коробках, то, считая это одним классом эквивалентности, вывести любого ОДНОГО его представителя, так?

Номенклатура в ТЧ одного элемента может дублироваться?
43 vmlspb
 
20.05.13
13:28
(42) нет
44 vmlspb
 
20.05.13
13:28
(42) насчет дублей строк
45 Ненавижу 1С
 
гуру
20.05.13
13:29
(44) а насчет первого вопроса?
46 NS
 
20.05.13
13:29
(40) Ты представляешь на сколько порядков это медленней?
47 azernot
 
20.05.13
13:31
Попробовал запросом (справочника Коробки нет, вместо него использовал Приходную накладную)

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

СГРУППИРОВАТЬ ПО
   ПриходнаяНакладнаяСостав.Ссылка,
   ПриходнаяНакладнаяСостав.Номенклатура

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   КоробкиСКоличествомСтрокТЧ.Коробка,
   ВЫБОР
       КОГДА КоробкиСКоличествомСтрокТЧ.КоличествоСтрокТЧ = ЕСТЬNULL(КоробкиСКоличествомСтрокДублей.КоличествоСтрокиИмеющихДубль, 0)
           ТОГДА КоробкиСКоличествомСтрокДублей.Дубль
       ИНАЧЕ NULL
   КОНЕЦ КАК Дубль
ИЗ
   (ВЫБРАТЬ
       СпрКоробки.Коробка КАК Коробка,
       СУММА(1) КАК КоличествоСтрокТЧ
   ИЗ
       СпрКоробки КАК СпрКоробки
   
   СГРУППИРОВАТЬ ПО
       СпрКоробки.Коробка) КАК КоробкиСКоличествомСтрокТЧ
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           СпрКоробки.Коробка КАК Коробка,
           СпрКоробкиДубль.Коробка КАК Дубль,
           СУММА(1) КАК КоличествоСтрокиИмеющихДубль
       ИЗ
           СпрКоробки КАК СпрКоробки
               ВНУТРЕННЕЕ СОЕДИНЕНИЕ СпрКоробки КАК СпрКоробкиДубль
               ПО СпрКоробки.Номенклатура = СпрКоробкиДубль.Номенклатура
                   И СпрКоробки.Количество = СпрКоробкиДубль.Количество
                   И СпрКоробки.Коробка <> СпрКоробкиДубль.Коробка
       
       СГРУППИРОВАТЬ ПО
           СпрКоробки.Коробка,
           СпрКоробкиДубль.Коробка) КАК КоробкиСКоличествомСтрокДублей
       ПО КоробкиСКоличествомСтрокТЧ.Коробка = КоробкиСКоличествомСтрокДублей.Коробка
48 Aprobator
 
20.05.13
13:31
(46) мы не ищем легких путей, мешает стена, так лбом ее бей!
49 azernot
 
20.05.13
13:33
+(47) Понятно, что ещё надо бы защитить запрос от дубляжа типа
А соответствует Б
Б соответствует А

но это надо смотреть по реальным данным. Например ставить условие А.Код>Б.Код
50 Ненавижу 1С
 
гуру
20.05.13
13:55
изврат конечно, но вроде то, что нужно:

ВЫБРАТЬ
   СчетНаОплатуПокупателюТовары.Ссылка КАК Ссылка,
   СчетНаОплатуПокупателюТовары1.Ссылка КАК Ссылка1
ПОМЕСТИТЬ Вложения
ИЗ
   Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплатуПокупателю.Товары КАК СчетНаОплатуПокупателюТовары1
       ПО СчетНаОплатуПокупателюТовары.Номенклатура = СчетНаОплатуПокупателюТовары1.Номенклатура
           И СчетНаОплатуПокупателюТовары.Количество = СчетНаОплатуПокупателюТовары1.Количество

СГРУППИРОВАТЬ ПО
   СчетНаОплатуПокупателюТовары.Ссылка,
   СчетНаОплатуПокупателюТовары1.Ссылка

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(СчетНаОплатуПокупателюТовары.Ссылка) = КОЛИЧЕСТВО(СчетНаОплатуПокупателюТовары1.Ссылка)

ИНДЕКСИРОВАТЬ ПО
   Ссылка,
   Ссылка1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   МИНИМУМ(Вложения.Ссылка1) КАК Ссылка1,
   КОЛИЧЕСТВО(Вложения.Ссылка1) КАК СсылкаК
ИЗ
   Вложения КАК Вложения
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Вложения КАК Вложения1
       ПО Вложения.Ссылка = Вложения1.Ссылка1
           И Вложения.Ссылка1 = Вложения1.Ссылка

СГРУППИРОВАТЬ ПО
   Вложения.Ссылка
51 MKZM
 
20.05.13
14:06
Хрен знает
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
                     |    ПоступлениеТоваровУслугТовары.Ссылка,
                     |    ПоступлениеТоваровУслугТовары.Номенклатура,
                     |    ПоступлениеТоваровУслугТовары1.Ссылка КАК Ссылка1,
                     |    ПоступлениеТоваровУслугТовары1.Номенклатура КАК Номенклатура1
                     |ПОМЕСТИТЬ Список
                     |ИЗ
                     |    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
                     |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары1
                     |        ПО ПоступлениеТоваровУслугТовары.Ссылка <> ПоступлениеТоваровУслугТовары1.Ссылка
                     |;
                     |
                     |////////////////////////////////////////////////////////////////////////////////
                     |ВЫБРАТЬ РАЗЛИЧНЫЕ
                     |    ВложенныйЗапрос.Ссылка
                     |ИЗ
                     |    (ВЫБРАТЬ
                     |        ВложенныйЗапрос.Ссылка КАК Ссылка
                     |    ИЗ
                     |        (ВЫБРАТЬ
                     |            Список.Ссылка КАК Ссылка
                     |        ИЗ
                     |            Список КАК Список
                     |        ГДЕ
                     |            НЕ(Список.Ссылка1 ЕСТЬ NULL
                     |                        ИЛИ Список.Номенклатура1 ЕСТЬ NULL )) КАК ВложенныйЗапрос
                     |    
                     |    СГРУППИРОВАТЬ ПО
                     |        ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос
                     |ГДЕ
                     |    НЕ ВложенныйЗапрос.Ссылка В
                     |                (ВЫБРАТЬ
                     |                    ВложенныйЗапрос.Ссылка КАК Ссылка
                     |                ИЗ
                     |                    (ВЫБРАТЬ
                     |                        Список.Ссылка КАК Ссылка
                     |                    ИЗ
                     |                        Список КАК Список
                     |                    ГДЕ
                     |                        (Список.Ссылка1 ЕСТЬ NULL
                     |                            ИЛИ Список.Номенклатура1 ЕСТЬ NULL )
                     |                    ) КАК ВложенныйЗапрос
                     |                СГРУППИРОВАТЬ ПО
                     |                                ВложенныйЗапрос.Ссылка)
                     |;
                     |
                     |////////////////////////////////////////////////////////////////////////////////
                     |УНИЧТОЖИТЬ Список"
52 vmlspb
 
20.05.13
14:29
Спасибо всем, решение найдено
53 vmlspb
 
20.05.13
14:29
ВЫБРАТЬ
   ЮнитыСостав.Ссылка КАК Коробка,
   ЮнитыСостав.Юнит КАК Кирпич,
   ЮнитыСостав.КоличествоЗаказано КАК Количество
ПОМЕСТИТЬ ТаблицаДанные
ИЗ
   Справочник.Юниты.Состав КАК ЮнитыСостав
ГДЕ
   (НЕ ЮнитыСостав.Ссылка.ПометкаУдаления)
   И ЮнитыСостав.Ссылка В
           (ВЫБРАТЬ
               ОтгрузкаКитайСостав.Коробка
           ИЗ
               Документ.ОтгрузкаКитай.Состав КАК ОтгрузкаКитайСостав
           ГДЕ
               ОтгрузкаКитайСостав.Ссылка.Проведен
               И ОтгрузкаКитайСостав.Коробка.Заказ.СборкаВКитае
               И ОтгрузкаКитайСостав.Ссылка.Контейнер В (&Контейнер))

ИНДЕКСИРОВАТЬ ПО
   Коробка,
   Кирпич,
   Количество
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаДанные.Коробка КАК Коробка,
   ТаблицаДанные2.Коробка КАК Коробка2,
   КОЛИЧЕСТВО(ТаблицаДанные.Кирпич) КАК КоличествоСтрок
ПОМЕСТИТЬ ТаблицаСовпадение
ИЗ
   ТаблицаДанные КАК ТаблицаДанные
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаДанные КАК ТаблицаДанные2
       ПО ТаблицаДанные.Кирпич = ТаблицаДанные2.Кирпич
           И ТаблицаДанные.Количество = ТаблицаДанные2.Количество

СГРУППИРОВАТЬ ПО
   ТаблицаДанные.Коробка,
   ТаблицаДанные2.Коробка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаДанные.Коробка КАК Коробка,
   КОЛИЧЕСТВО(ТаблицаДанные.Кирпич) КАК КоличествоСтрок
ПОМЕСТИТЬ ТаблицаОригиналКоличествоСтрок
ИЗ
   ТаблицаДанные КАК ТаблицаДанные

СГРУППИРОВАТЬ ПО
   ТаблицаДанные.Коробка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   МАКСИМУМ(ТаблицаСовпадение.Коробка) КАК Коробка,
   ТаблицаСовпадение.Коробка2 КАК Коробка2
ПОМЕСТИТЬ ТаблицаГруппа
ИЗ
   ТаблицаСовпадение КАК ТаблицаСовпадение
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОригиналКоличествоСтрок КАК ТаблицаОригиналКоличествоСтрок
       ПО ТаблицаСовпадение.Коробка = ТаблицаОригиналКоличествоСтрок.Коробка
           И ТаблицаСовпадение.КоличествоСтрок = ТаблицаОригиналКоличествоСтрок.КоличествоСтрок
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаОригиналКоличествоСтрок КАК ТаблицаОригиналКоличествоСтрок2
       ПО ТаблицаСовпадение.Коробка2 = ТаблицаОригиналКоличествоСтрок2.Коробка
           И ТаблицаСовпадение.КоличествоСтрок = ТаблицаОригиналКоличествоСтрок2.КоличествоСтрок

СГРУППИРОВАТЬ ПО
   ТаблицаСовпадение.Коробка2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ТаблицаГруппа.Коробка КАК Коробка,
   ТаблицаГруппа.Коробка2
ИЗ
   ТаблицаГруппа КАК ТаблицаГруппа
ИТОГИ ПО
   Коробка
54 mistеr
 
20.05.13
14:32
(53) >Документ.ОтгрузкаКитай
Жесть
55 Ненавижу 1С
 
гуру
20.05.13
14:34
(54) а также Справочник.Юниты
56 vmlspb
 
20.05.13
14:37
(53), (54) есть такое, и это только вершина айсберга