Имя: Пароль:
1C
1С v8
сравнение ТЧ
0 Серж1С
 
08.01.23
21:40
Есть ТЧ во вновь созданном документе. Нужно в запросе найти документы с точно таким же ТЧ!
1 RomanYS
 
08.01.23
21:59
порядок строк важен?
2 RomanYS
 
08.01.23
22:02
И прикладную задачу озвучь, если это не чисто учебная
3 Сергиус
 
08.01.23
22:56
(0)С точно такой же не найдешь..там поле Ссылка как минимум будет другое)
4 МихаилМ
 
08.01.23
22:57
5 МихаилМ
 
08.01.23
23:04
6 magicSan
 
09.01.23
08:02
(3) ну дак ссылки не равны равны записи из тч по полному, далее сворачиваешь по ссылке чтоб кол-во совпало.
7 Серж1С
 
09.01.23
08:37
(1) Да важен, в том - то и дело
8 magicSan
 
09.01.23
08:40
ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка.Дата > &Дата
;

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

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица.Ссылка
;

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

СГРУППИРОВАТЬ ПО
    ВременнаяТаблица.Ссылка,
    ВременнаяТаблица1.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    совпавшие.Ссылка КАК Ссылка,
    совпавшие.Ссылка1 КАК Ссылка1,
    совпавшие.Номенклатура КАК Номенклатура,
    совпавшие.Номенклатура1 КАК Номенклатура1,
    КолвоВДокументе1.колво КАК колво,
    КолвоВДокументе.колво КАК колво1
ИЗ
    совпавшие КАК совпавшие
        ЛЕВОЕ СОЕДИНЕНИЕ КолвоВДокументе КАК КолвоВДокументе
        ПО (совпавшие.Ссылка = КолвоВДокументе.Ссылка)
        ЛЕВОЕ СОЕДИНЕНИЕ КолвоВДокументе КАК КолвоВДокументе1
        ПО (совпавшие.Ссылка1 = КолвоВДокументе1.Ссылка)
ГДЕ
    КолвоВДокументе.колво = совпавшие.Номенклатура
            И КолвоВДокументе1.колво = совпавшие.Номенклатура
9 RomanYS
 
09.01.23
09:05
(8) какой-то нездоровый способ соединения таблиц:
ИЗ
    ВременнаяТаблица КАК ВременнаяТаблица,
    ВременнаяТаблица КАК ВременнаяТаблица1
ГДЕ
    ВременнаяТаблица.Ссылка <> ВременнаяТаблица1.Ссылка
    И ВременнаяТаблица.Номенклатура = ВременнаяТаблица1.Номенклатура
10 RomanYS
 
09.01.23
09:07
(7) если это для промышленной эксплуатации и нужно часто и быстро, то просто сохранять хэш от содержимого ТЧ в реквизите документа
11 magicSan
 
09.01.23
09:08
(9) предложи лучше
12 Серж1С
 
09.01.23
09:09
(10) нет, не для промышленной в том, то и дело
13 Kassern
 
09.01.23
09:11
(9) Ага, т.к. произойдет декартовое произведение 2х таблиц, если там 100500+ строк в каждой то будет весело. ГДЕ отработает лишь после соединения таблиц.
14 RomanYS
 
09.01.23
09:12
(11) это внутренним соединением делается: результат тоже но гораздо быстрее
15 RomanYS
 
09.01.23
09:21
(12) если чисто учебная, тогда идея в (8): соединить совпадающие строки и посчитать совпадения
16 Fedor-1971
 
09.01.23
09:22
(14) Внутреннее соединение не даст лишние строки в ТЧ другого документа
17 magicSan
 
09.01.23
09:24
(14) вот именно что соединятся будет ткже ирезультат будет такой же.

единсвенное сравнение на количество изначально можно добавить.
18 Kassern
 
09.01.23
09:25
(0) Можно что-то подобное сделать, если я правильно задачу понял.
ВЫБРАТЬ
    РеализацияТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
    РеализацияТоваровУслугТовары.КоличествоУпаковок КАК КоличествоУпаковок,
    РеализацияТоваровУслугТовары.Количество КАК Количество,
    РеализацияТоваровУслугТовары.Цена КАК Цена,
    РеализацияТоваровУслугТовары.Сумма КАК Сумма
ПОМЕСТИТЬ ТЧДок
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Ссылка = &Ссылка
;

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

СГРУППИРОВАТЬ ПО
    ТЧДок.НомерСтроки,
    ТЧДок.Номенклатура,
    ТЧДок.КоличествоУпаковок,
    ТЧДок.Количество,
    ТЧДок.Цена,
    ТЧДок.Сумма
19 Kassern
 
09.01.23
09:27
А вообще, лучше тогда хешировать ТЧ документов и хранить в отдельном регистре. Дальше простой запрос к этому регистру.
20 Kassern
 
09.01.23
09:28
Особенно актуально, если ТЧ совпадает у множества документов
21 Kassern
 
09.01.23
09:32
(18) Тут еще условие на количество строк нужно добавить.
22 DJ Anthon
 
09.01.23
09:36
(19) не забыв их отсортировать
23 RomanYS
 
09.01.23
09:37
(17) время будет сильно отличаться, в (13) правильно написано. При миллионе строк в исходной таблице твой запрос просто не вернёт результат никогда
24 magicSan
 
09.01.23
09:39
(18) к документу с одной строкой соединятся все у кого есть такая строка
25 RomanYS
 
09.01.23
09:39
(18) ты какую-то другую задачу решил: посчитал количество совпадающих документов для каждой строки))) Группировки должны быть наоборот по ссылке
26 Мимохожий Однако
 
09.01.23
09:40
(12) "Партизанен?" ))
Опиши задачу подробнее, если цель ответ , а не длина ветки
27 magicSan
 
09.01.23
09:40
(23) да этто я чот тупанул. Изначально хотел через свертку всё делать поэтому так вышло
28 Kassern
 
09.01.23
09:42
(24) (25) Я ж написал в (21)  что надо добавить. Тогда  выведутся все документы с таким же набором строк как в выбранном.
29 Kassern
 
09.01.23
09:43
Но по уму, если не разовая задача, тогда (19) как вариант.
30 RomanYS
 
09.01.23
09:45
(28) перечитай свой запрос, он даже ссылок на документы не возвращает. Что бы ты к нему не добавил))
31 magicSan
 
09.01.23
09:47
(29) нафиг он нужен если нагрузки нет? свой запрос у себя запусти - чушь полная
32 Kassern
 
09.01.23
09:47
(30) Ну уберите количество различные и будут ссылки на документы возвращаться)
33 Kassern
 
09.01.23
09:48
(31) О какой нагрузке речь? Запустил и он вернул все заказы с таким же ТЧ по ключевым полям.
34 Kassern
 
09.01.23
09:49
*реализации
35 RomanYS
 
09.01.23
09:49
(32) её мало убрать, её нужно перенести и группировки переделать
36 Kassern
 
09.01.23
09:51
(31) С чего вы взяли что нагрузки не будет у ТС? Судя по (0) он хочет искать по ВСЕМ документам в поисках такой же ТЧ. А теперь представьте, если это нужно делать регулярно?
37 magicSan
 
09.01.23
09:52
(36) а теперь представте если их 100 или 1000? вы на любой чих регистр создаете не нужный? Ладно бы ещё сказал доп реквизит не так позорно было бы
38 Серж1С
 
09.01.23
09:53
39 Kassern
 
09.01.23
09:58
(37) Вы понимаете, что в своем варианте предложили декартовое произведение таблиц? Вам это хоть о чем-то говорит? В цикле обойти документы и сравнить ТЧ будет быстрее чем, то что вы предложили. Еще что-то о позоре говорите.
"а теперь представте если их 100 или 1000" - хоть лям. Тут без разницы. Сравниваете хеш, если совпадает, значит ТЧ одинаковая.
"вы на любой чих регистр создаете не нужный" - если это требует задача. Но вы можете и дальше декартово соединять таблицы и загибать сервак.
"Ладно бы ещё сказал доп реквизит " - я предложил универсальный способ, где можно, время от времени, очищать этот регистр. С доп реквизитом такое не проканает и будет не удобно работать, если потребуется у множества видов документов ТЧ сравнивать.
40 magicSan
 
09.01.23
10:03
(38) мы тут нормальные задачи решаем там какойто детский лепет который рядом по интересу решения не лежал.

(39) поправили уже на внутренние соединение. обойди в цикле и сравни - тот же результат тока нагибать сервер 1с будешь. Скуль нормально отработал на 5000 что декартово что внутрнение результат до кэширования одинаковый - пойди проверь.
41 Kassern
 
09.01.23
10:08
(40) 5000 это же вообще пыль. Если речь идет о проверке всех доков за весь период, представьте сколько там может быть строк тч? У меня только за декабрь 20тыс строк в реализации.
42 Kassern
 
09.01.23
10:09
У ведь в заказах точно такая же ТЧ. А есть еще коммерческие предложения с такой же ТЧ и возвраты.
43 Said_We
 
09.01.23
10:17
(0)
1. Откуда взялись полные копии? Откуда берутся? Зачем их искать?
2. Документов много. Необходимо рассчитать условно CRC для каждого документа, куда включить: порядок строк, номенклатуру, суммы и т.д. Далее искать документы с одинаковым CRC.
44 Kassern
 
09.01.23
10:18
(43) Походу задача тестовая. ТС конкретики не говорит, лишь скидывает ссылку на такой же топик на инфостате.
45 Said_We
 
09.01.23
10:26
(44) Можно в два этапа. Сначала простой расчет условного CRC, а потом полноценно искать уже среди документов, у которых совпал CRC. :-)
Всех с новым годом!
46 magicSan
 
09.01.23
10:35
(41) изначально у автора эта пыль и есть, откуда домыслы про все документы вообще непонятно и нафига оно надо когда состав структуры тч заведомо разный.
47 Kassern
 
09.01.23
10:41
(46) Смысла нет спорить, ТС ушел с радаров, имхо тему можно закрывать.
48 NorthWind
 
09.01.23
10:49
(13) в этом запросе нет и не может быть декартова, КМК.
49 magicSan
 
09.01.23
10:49
(42) там разный состав ТЧ

(47) ну дак у него просто по списку пунктов найти такой же элемент в справочнике маршруты. Скукота
50 Said_We
 
09.01.23
11:20
(49) Неее. Почитал я на инфостарте что он пишет.
У него задача создать элементы справочника маршруты по уже созданным документам и их прописать в документы.
Только сформулировать задачу он не может, а следовательно и решить. Как только сам для себя сформулирует, тогда и решит.
51 Серж1С
 
09.01.23
15:09
Есть Справочник у него ТЧ (НомерСтроки, ссылка на др. справочник). Есть документ у него ТЧ (НомерСтроки, ссылка на др. справочник) ТЧ идентичны по составу порядок следования очень важен. Приформировании документа по этой ТЧ мне нужно найти справочник с таким же ТЧ с таким же порядком следования (47)
52 magicSan
 
09.01.23
15:13
(51) делаешь тз пунктов с нумерацией, кидаешь в запрос к своему справочнику у которого в запросе пронумеруешь тч.

Если массовая операция то выгржаешь спраочник с хэшированием и ищешь в этой тз, хэш своей тч
53 Серж1С
 
09.01.23
15:20
(52) Хорошо, как захешировать ТЧ и как хранить !??
54 RomanYS
 
09.01.23
15:24
(53) каким-либо образом сериализовать строку или даже просто сформировать текст-описание и посчитать от него хэш
55 RomanYS
 
09.01.23
15:24
(54) * не строку, а ТЧ конечно
56 Kassern
 
09.01.23
15:34
(53) Можете в json/xml выгрузить ТЧ. Либо во внутренний формат ЗначениеИзСтрокиВнутр (наверное). А потом это дело захешировать и хранить в какой-нибудь таблице связку док и хеш его ТЧ. При изменении ТЧ документа/справочника пересчитывать хеш.
57 lodger
 
09.01.23
15:48
(56) только не всё ТЧ, а ключевые колонки. чтобы не было ссылки на саму себя, например. или других ненужных в сравнении полей.
(53) хранить - в меру своей испорченности.
самый высоконагруженный и горячий вариант - РС, где единственным измерением будет хеш в 256(512?) символов :)
самый малоинвазивный приделать дополнительные сведения к типовому спр\доку.
58 Said_We
 
09.01.23
16:50
(53) Хранить проще в реквизите шапки самого объекта (ХЕШ_тчИмяТЧ) и перед записью объекта считать и помещать значение в этот реквизит.

Код примерно такой (на коленке писал - проверяй):

Хеш = Новый ХешированиеДанных(ХешФункция.MD5); // либо другой способ. Поиском "1с посчитать хеш" яндекс сразу выдал пример этот и через СОМ объект и с подвывертом и как угодно.
Хеш.Добавить(Функция_Серж1С_ИзТЧВСтроку(ТЧ)); // какая-то функция из ТЧ получающая некую строку.
ХЕШ_тчИмяТЧ = Хеш.ХешСумма;
59 magicSan
 
09.01.23
17:07
(53) ЗначениеВСтроку()
60 Серж1С
 
09.01.23
17:39
Хотелось бы в запросе реализовать, конечно!
61 Kassern
 
09.01.23
17:39
(60) Так у вас в запросе и будет реализация поиска. Вы сохранили хеш ТЧ, а дальше уже по текущему хешу ищите в запросе совпадения.
62 Серж1С
 
09.01.23
18:29
(61) Хеш - Двоичные данные! Как в запросе поиск? Хотелось бы чистый запрос без хеша ((
63 RomanYS
 
09.01.23
19:12
(62) Хеш это строка в данном случае, небольшая чтобы не хранить полное описание или сериализацию ТЧ.
64 magicSan
 
09.01.23
19:30
Этот человек не то что в 1С в принципе далек от программирования. А тут ещё оперативный, бухгалтерский учеты.

(62) тебе куда-то попроще надо
65 Остап Ибрагимович
 
10.01.23
04:25
О том, что можно программно прикрутить СКД с выводом в ТЗ, а в СКД можно использовать Экпорт-функции - не упоминать? Ну например программно скомпоновать СКД (изпользующую в вычисляемых полях экспорт-фунуцию, хэширующую или псевдо-хэширующую ТЧ объекта, ссылка на который и имя тч получены в параметре - главное чтобы в строку, которую можно сравнивать) и выполнить ее с выводом в ТЗ...
Или это получится слишком затратно?
Или просто не получится?
прим.: просто спросил! (с)
66 Мимохожий Однако
 
10.01.23
08:02
(0) Ну нашёл ты этот документ, а дальше что? С какой целью и на что влияет этот возможный дубль?
67 Kassern
 
10.01.23
09:30
(62) А если самому чуть чуть подумать?


Хеш = Новый ХешированиеДанных(ХешФункция.MD5);// либо другой способ. Поиском "1с посчитать хеш" яндекс сразу выдал пример этот и через СОМ объект и с подвывертом и как угодно.

ТЧСтрокой=ЗначениеВСтрокуВнутр(ВашаТЧ);

Хеш.Добавить(ТЧСтрокой);

НужнаяВамСтрока=Base64Строка(Хеш.ХешСумма);
68 Kassern
 
10.01.23
09:31
Можно наверное и без Base64Строка, просто в строку преобразовывать, она не такая уж огромная.
69 Kassern
 
10.01.23
09:36
(68) Например вот таким макаром - ПолучитьHexСтрокуИзДвоичныхДанных(ХешСумма);
70 Серж1С
 
10.01.23
09:41
(65) Как вариант,да! Спасибо