Имя: Пароль:
1C
1С v8
Откритикуйте меня (волнуюсь)
,
0 volfy
 
11.11.13
21:07
Получил я задание написать обработку которая будет искать документы по схожим строкам номенклатуры в табличных частях. Написал, через 30 минут отправлю (это тест собеседования) очень хочу чтобы откритиковали код. Высылаю ссылку https://www.dropbox.com/s/j62zyug9ea8dgz4/ПоискСхожихРеализацийПоТЧТовары.epf
1 volfy
 
11.11.13
21:08
Писал под УТ 10.3 (проверить можно в принципе на любой конфе с похожей структурой)
2 ДенисЧ
 
11.11.13
21:08
Обрбаботку не открывал, но говонокод, однозначно!
3 GROOVY
 
11.11.13
21:09
100 баксов. Кто меньше?
4 volfy
 
11.11.13
21:10
Это почему?) Объективнее пожалуйста)
5 volfy
 
11.11.13
21:11
Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
                          |    РеализацияТоваровУслугТовары.Номенклатура
                          |ПОМЕСТИТЬ ВТ_НоменклатураДокументаШапки
                          |ИЗ
                          |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                          |ГДЕ
                          |    РеализацияТоваровУслугТовары.Ссылка = &СсылкаШапки
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    РеализацияТоваровУслугТовары.Ссылка КАК Документ,
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) КАК ЧислоСовпадений
                          |ПОМЕСТИТЬ ВТ_ПоискСовпадений
                          |ИЗ
                          |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НоменклатураДокументаШапки КАК ВТ_НоменклатураДокументаШапки
                          |        ПО РеализацияТоваровУслугТовары.Номенклатура = ВТ_НоменклатураДокументаШапки.Номенклатура
                          |ГДЕ
                          |    РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    РеализацияТоваровУслугТовары.Ссылка
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    ВТ_ПоискСовпадений.Документ,
                          |    ВТ_ПоискСовпадений.ЧислоСовпадений
                          |ИЗ
                          |    ВТ_ПоискСовпадений КАК ВТ_ПоискСовпадений
                          |ГДЕ
                          |    НЕ ВТ_ПоискСовпадений.Документ = &СсылкаШапки
                          |    И ВТ_ПоискСовпадений.ЧислоСовпадений >= &МинимумСовпадений
                          |
                          |УПОРЯДОЧИТЬ ПО
                          |    ВТ_ПоискСовпадений.Документ.Дата");
    Запрос.УстановитьПараметр("МинимумСовпадений", МинимумСовпадений);
    Запрос.УстановитьПараметр("СсылкаШапки", Документ);
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНач);
    Запрос.УстановитьПараметр("ДатаОкончания", ?(ДатаКон = Дата('00010101000000'), КонецДня(ТекущаяДата()), КонецДня(ДатаКон)));
    ДокументыТЗ = Запрос.Выполнить().Выгрузить();
6 Learn_
 
11.11.13
21:12
(2) : ))
7 volfy
 
11.11.13
21:12
Вот весь код. Всё в одном запросе. Запрос исключает похожие в табличных частях номенклатуры (Когда в одной ТЧ используются одинаковые номенклатуры несколько раз)
8 volfy
 
11.11.13
21:13
ДенисЧ: <= Соизволь аргументировать грубиянчик )))
9 ivanovnm
 
11.11.13
21:13
(5) Даже не позорься.
10 ppdisk
 
11.11.13
21:14
(5) Запрос.УстановитьПараметр("ДатаОкончания", ?(ДатаКон = Дата('00010101000000'), КонецДня(ТекущаяДата()), КонецДня(ДатаКон)));

Это как раз так само и просится к топику про границу.
Документы в последней секунде дня не попадут в выборку.
11 volfy
 
11.11.13
21:14
НУ АРГУМЕНТЫ ГДЕ?)
12 ivanovnm
 
11.11.13
21:14
(5) Ты же потом еще туда пойдешь, не так ли. Как потом будешь людям в глаза смотреть?
13 volfy
 
11.11.13
21:14
(10) + мне ботинком в голову... согласен, сам дурак. =)
14 volfy
 
11.11.13
21:15
(12) - недочего докопаться?)
15 Explorer1c
 
11.11.13
21:16
(10) А как бы ты написал?
16 ivanovnm
 
11.11.13
21:16
(10) Когда включат rls - вылезет ошибка в самом интересном месте
17 ИсчадиеADO
 
11.11.13
21:16
(10) попадут!!!! Это не вирт.таблица остатков
18 volfy
 
11.11.13
21:17
=) Интересно вы подключились господа.
19 ivanovnm
 
11.11.13
21:17
А в УТ rls есть
20 volfy
 
11.11.13
21:18
Пусть будет граница, это же не ошибка и не ущерб производительности.
21 ppdisk
 
11.11.13
21:18
(15) Новый Граница(КонецДня(Дата),ВидГраницы.Включая)
(17) Ушёл тестить.
22 volfy
 
11.11.13
21:18
Можно оправдаться "Заплаткой" =) мол вдруг будешь в запросе табличку прикручивать из РН, а тут всё готово)
23 volfy
 
11.11.13
21:19
Меня интересует по звпросу. Кто то может его модифицировать и докапаться к его основному телу?
24 К_Дач
 
11.11.13
21:20
Что за параметр СсылкаШапки? Уж не в цикле ли по выборке из документов ты запрос делаешь?
25 ppdisk
 
11.11.13
21:20
(17) беда, попадают.
26 Галахад
 
гуру
11.11.13
21:21
Задание-то как звучит?
27 volfy
 
11.11.13
21:21
(24) боже упаси. Нет это документ с которым происходит сравнение, выборка через виртуальную таблицу, ни одного цикла.
28 ИсчадиеADO
 
11.11.13
21:22
(5) имхо, нормально, только последний запрос в пакете не нужен, бери ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) > &Параметр
29 volfy
 
11.11.13
21:22
Значение - Реализация товаров и услуг...
30 ivanovnm
 
11.11.13
21:22
Зачем тебе ВТ_НоменклатураДокументаШапки? лишний проход по таблице
31 ИсчадиеADO
 
11.11.13
21:22
(25) угумс
32 volfy
 
11.11.13
21:22
(30) Убирает дубликаты номенклатуры в ТЧ
33 К_Дач
 
11.11.13
21:23
Да, зачем выбирать в ВТ? Соедини выборку ТЧ с самой собой, лишний пакет в запросе
34 volfy
 
11.11.13
21:23
(33) Хороший совет =) Спасибо)
35 К_Дач
 
11.11.13
21:25
(32) сгруппировать по Док.Ссылка и по Док.Тч.Номенклатура для того чтобы убрать дубли
36 ИсчадиеADO
 
11.11.13
21:25
если уж оптимизировать на скорость, то "РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания " нужно убирать, т.к. это не явное левое соединение всех строк таблич.частей всех реализаций со всеми документами, а уж потом отбор. Нужно сначала в вт выбрать доки по дате в тч, а потом из таб.частей с внутренним соедиением с тч по ссылке
37 ivanovnm
 
11.11.13
21:25
(35) Ты понимаешь что он хотел сделать?!
38 ИсчадиеADO
 
11.11.13
21:26
(33) ну и где тут + в производительности?
39 К_Дач
 
11.11.13
21:27
(38) я имею ввиду выбрать ТЧ один раз в ВТ, а потом ВТ соединять саму с собой....
40 К_Дач
 
11.11.13
21:27
(36) согласен
41 bushd
 
11.11.13
21:29
перед смертью не надышишься, посылай... не смотрел
42 bushd
 
11.11.13
21:29
(0) Волнуешься явно рано... Ты еще ни одной копейки с них не получил...
43 К_Дач
 
11.11.13
21:30
(0) в падаваны берут?
44 volfy
 
11.11.13
21:31
Запрос = Новый Запрос("ВЫБРАТЬ
                          |    Товары_Выходная.Ссылка КАК Документ,
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Товары_Выходная.Номенклатура) КАК ЧислоСовпадений
                          |ИЗ
                          |    Документ.РеализацияТоваровУслуг.Товары КАК Товары_Выходная
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары_Исходная
                          |        ПО Товары_Выходная.Номенклатура = Товары_Исходная.Номенклатура
                          |ГДЕ
                          |    Товары_Выходная.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
                          |    И Товары_Исходная.Ссылка = &СсылкаШапки
                          |    И Товары_Выходная.Ссылка <> &СсылкаШапки
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    Товары_Выходная.Ссылка
                          |
                          |ИМЕЮЩИЕ
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Товары_Выходная.Номенклатура) >= &МинимумСовпадений");
45 volfy
 
11.11.13
21:32
Убрались виртуальные таблички. Надеюсь не накрутил лишнего?
46 volfy
 
11.11.13
21:32
Падаваны?) Это Кто?) (43)
47 volfy
 
11.11.13
21:33
Ребят вам смешно а я очкую =)
48 volfy
 
11.11.13
21:34
Работает самое главное )))
49 К_Дач
 
11.11.13
21:35
(44) пойдет. Только все равно к ТЧ документов два раза обращаешься, перечитай еще раз (39)

падаван = стажер
50 ivanovnm
 
11.11.13
21:35
(44) Еще хуже стало :(
51 volfy
 
11.11.13
21:41
Запрос = Новый Запрос("ВЫБРАТЬ
                          |    РеализацияТоваровУслугТовары.Ссылка,
                          |    РеализацияТоваровУслугТовары.Номенклатура
                          |ПОМЕСТИТЬ ВТ_ТЧ_Документов
                          |ИЗ
                          |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    РеализацияТоваровУслугТовары.Ссылка,
                          |    РеализацияТоваровУслугТовары.Номенклатура
                          |;
                          |
                          |////////////////////////////////////////////////////////////////////////////////
                          |ВЫБРАТЬ
                          |    Товары_Выходная.Ссылка КАК Документ,
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Товары_Выходная.Номенклатура) КАК ЧислоСовпадений
                          |ИЗ
                          |    ВТ_ТЧ_Документов КАК Товары_Выходная
                          |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ТЧ_Документов КАК Товары_Исходная
                          |        ПО Товары_Выходная.Номенклатура = Товары_Исходная.Номенклатура
                          |ГДЕ
                          |    Товары_Выходная.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
                          |    И Товары_Выходная.Ссылка <> &СсылкаШапки
                          |    И Товары_Исходная.Ссылка = &СсылкаШапки
                          |
                          |СГРУППИРОВАТЬ ПО
                          |    Товары_Выходная.Ссылка
                          |
                          |ИМЕЮЩИЕ
                          |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Товары_Выходная.Номенклатура) >= &МинимумСовпадений");
52 volfy
 
11.11.13
21:42
Гуру... простите бездаря... =( Я исправлюсь, клянусь!
53 volfy
 
11.11.13
21:43
(49) ...нет, уже фикс, причем очень привлекательный
54 volfy
 
11.11.13
21:43
....(49) поэтому и волнуюсь)
55 К_Дач
 
11.11.13
21:45
|ГДЕ
|    Товары_Выходная.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

перенеси в первую выборку.

Приучай себя в пакетах сразу выбрать все нужное в ВТ, не обращаясь лишний раз к базе, а потом уже крутить с ними
56 volfy
 
11.11.13
21:46
(55) верно... Что то я вообще...перенервничал... Москвичам (если примут) с получки по пиву дам =)
57 К_Дач
 
11.11.13
21:47
Рановато тебе в самостоятельное плавание, ИМХО. Ну или готовься пахать как Папа Карло
58 ИсчадиеADO
 
11.11.13
21:48
(52) я хоть и не гуру, но в (5) у тебя было лучше чем в (51). Не, ну ты сам представь себя на месте скуля. Или в 1ом случае тебе сказали выбрать из таблицы 20 строк. А потом из этой же таблицы сделать соединение с твоими 20ю.

или как в (51): выбрать 100500строки и потом их 100500 раз соединять с собой?

Ну пожалей скуль уже
59 volfy
 
11.11.13
21:51
(58) Сломал все стереотипы!!!!! Система сломана =)
60 ivanovnm
 
11.11.13
21:52
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    РеализацияТоваровУслугТовары.Ссылка КАК Документ,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) КАК ЧислоСовпадений
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Номенклатура В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                РеализацияТоваровУслугТовары.Номенклатура
            ИЗ
                Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары)
    И РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

СГРУППИРОВАТЬ ПО
    РеализацияТоваровУслугТовары.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) >= &МинимумСовпадений
61 К_Дач
 
11.11.13
21:52
(59) перепиши последний вариант с учетом (55) и отсылай. Я пью  кефир, есичо. Свежий.
62 volfy
 
11.11.13
21:53
Что происходит раньше, СОЕДИНЕНИЕ, или УСЛОВИЕ ГДЕ?
63 volfy
 
11.11.13
21:54
В зависимости от этого решится судьба (58) - ого
64 ИсчадиеADO
 
11.11.13
21:55
(62) соединение раньше
(63) )))
65 ИсчадиеADO
 
11.11.13
21:58
короче имхо оставь как в (5), но добавь слово разрешенные из (60).

Кста!!! На вашей ут-шечке для одноразового запуска по большому счету фиолетово, а жадность - это один из главных скиллов 1сника. Т.ч. фигня вопрос. Главное что б сам разобрался))
66 Славен
 
11.11.13
21:59
забавно если тот кто проверять будет сидит в этой ветке
67 К_Дач
 
11.11.13
22:00
Если только там не будут читать его код)) или уже не прочли
68 ivanovnm
 
11.11.13
22:01
фигня вопрос, главное чтобы объяснить смог. насобачится
69 ИсчадиеADO
 
11.11.13
22:01
(66) а чо такова? парень сам написал в (5)
70 ivanovnm
 
11.11.13
22:03
забыл во вложенном
где РеализацияТоваровУслугТовары.Ссылка = &Ссылка
71 volfy
 
11.11.13
22:05
после (64) вывод что код должен быть таким

Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
                      |    РеализацияТоваровУслугТовары.Номенклатура
                      |ПОМЕСТИТЬ ВТ_НоменклатураДокументаШапки
                      |ИЗ
                      |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                      |ГДЕ
                      |    РеализацияТоваровУслугТовары.Ссылка = &СсылкаШапки
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    РеализацияТоваровУслугТовары.Ссылка КАК Документ,
                      |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) КАК ЧислоСовпадений
                      |ИЗ
                      |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НоменклатураДокументаШапки КАК ВТ_НоменклатураДокументаШапки
                      |        ПО РеализацияТоваровУслугТовары.Номенклатура = ВТ_НоменклатураДокументаШапки.Номенклатура
                      |ГДЕ
                      |    РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
                      |    И НЕ РеализацияТоваровУслугТовары.Ссылка = &СсылкаШапки
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    РеализацияТоваровУслугТовары.Ссылка
                      |
                      |ИМЕЮЩИЕ
                      |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) >= &МинимумСовпадений");
72 volfy
 
11.11.13
22:06
Если соединение выполняется раньше то рациональнее к 5 строкам присоединять 10 000 .... а не 10 000 к 10 000 ... согласен
73 extrim-style
 
11.11.13
22:11
(0) 21.37 уплыли! всё, можешь расслабиться, теперь не так страшно) зато результат сразу знаешь)
74 volfy
 
11.11.13
22:11
ИсчадиеADO
       - не критикуют =) или надоело или согласны)
75 volfy
 
11.11.13
22:11
(73) не понял )
76 volfy
 
11.11.13
22:14
Всёёёёёёё.... Отправил короче... Психанул. =) Будь что будет.
77 volfy
 
11.11.13
22:14
Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ
                      |    РеализацияТоваровУслугТовары.Номенклатура
                      |ПОМЕСТИТЬ ВТ_НоменклатураДокументаШапки
                      |ИЗ
                      |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                      |ГДЕ
                      |    РеализацияТоваровУслугТовары.Ссылка = &СсылкаШапки
                      |;
                      |
                      |////////////////////////////////////////////////////////////////////////////////
                      |ВЫБРАТЬ
                      |    РеализацияТоваровУслугТовары.Ссылка КАК Документ,
                      |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) КАК ЧислоСовпадений
                      |ИЗ
                      |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_НоменклатураДокументаШапки КАК ВТ_НоменклатураДокументаШапки
                      |        ПО РеализацияТоваровУслугТовары.Номенклатура = ВТ_НоменклатураДокументаШапки.Номенклатура
                      |ГДЕ
                      |    РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
                      |    И НЕ РеализацияТоваровУслугТовары.Ссылка = &СсылкаШапки
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    РеализацияТоваровУслугТовары.Ссылка
                      |
                      |ИМЕЮЩИЕ
                      |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) >= &МинимумСовпадений");
    Запрос.УстановитьПараметр("МинимумСовпадений", МинимумСовпадений);
    Запрос.УстановитьПараметр("СсылкаШапки", Документ);
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНач);
    Запрос.УстановитьПараметр("ДатаОкончания", ?(ДатаКон = Дата('00010101000000'), КонецДня(ТекущаяДата()), КонецДня(ДатаКон)));
    ДокументыТЗ = Запрос.Выполнить().Выгрузить();
78 volfy
 
11.11.13
22:15
Всё выглядит вот так, кому то может быть и пригодится. Может найдут ошибки =) а если они и увидят это то не обидно =) ОПЫТ: - Любыми пулями, ценнее всего =) (смекалка везде приветствуется)
79 extrim-style
 
11.11.13
22:15
(76) только не говори, что я виноват)
80 volfy
 
11.11.13
22:16
(79) Ну теперь скажи что не так?)
81 volfy
 
11.11.13
22:17
Самое удивительное что после часа разборок, код сократился только на последнюю виртуальную таблицу ))
82 ИсчадиеADO
 
11.11.13
22:18
(76) выбрать разрешенные из (60) забыл. Это если применяется ограничение по записям на уровне прав. Т.е. часть расходников видны, часть нет
83 К_Дач
 
11.11.13
22:21
(77) не читаешь, что тебе говорят (((
84 volfy
 
11.11.13
22:23
Простите =((( Ну я добавлю при звонке... ну дя я лаааах.... Кознить себя - нельзя помиловать
85 volfy
 
11.11.13
22:23
а разрешенные - влияет только при включенном RLS ?
86 ИсчадиеADO
 
11.11.13
22:27
(85) читай справку

"разрешенные" грит системе, что если в результате запроса выберутся объекты, которые пользователю не должны быть видны, то они просто не включатся в результат запроса. Без разрешенные запрос вывалится с ошибкой
87 volfy
 
11.11.13
22:33
Понял)
88 ivanovnm
 
11.11.13
22:36
а зачем временные таблицы? SQL свои таблички и так кеширует
89 ivanovnm
 
11.11.13
22:36
ГДЕ в ПО засунь
90 Сниф
 
11.11.13
22:58
(46) подаван - вторая ступень ученика Волшебника
"– А много прихвостней становится подаванами?
– Примерно каждый третий.
– А подаванов приспешниками?
– Каждый седьмой. – Волшебник улыбнулся." (С) Сергей Лукьяненко "Недотепа"
91 volfy
 
11.11.13
22:58
(89) да верное замечание... секцию где - исходя из сегодняшнего опыта - следует использовать в КРААААЙНИХ случая и очень редко )
92 volfy
 
11.11.13
22:59
(90) =) Почитаю в дороге Лукьяненко ) зацепило
93 sanja26
 
11.11.13
23:41
(77) левое соединение быстрее отработает
94 Аденэсниг
 
11.11.13
23:44
(0) ну как отправил, чтос казали?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.