|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
1C 8.3 файловая версия. Есть запрос Код: plsql 1. 2. 3.
То есть, выходной набор отсортирован по полю ссылки. 1c (его движок БД) умеет однозначно сравнивать две ссылки между собой на больше меньше. Я сделал такой вывод на основание того, что порядок записей в выборке меняется строго на противоположный, если заменить asc на desc. Как известно, ссылка представляет собой 16-байтную структуру - так называемый Guid. Просьба помочь с решением 2 вопросов. 1. Какое правило использует 1С-движок для сравнения двух ссылок на больше\меньше при выполнении сортировки запроса? 2. Различается ли это правило для разных версий 1с (8.1, 8.2,8.3) или для разных, используемых ее БД (файловая, MS-SQL, Postgree) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2020, 16:21 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana 1. Какое правило использует 1С-движок для сравнения двух ссылок на больше\меньше при выполнении сортировки запроса? 2. Различается ли это правило для разных версий 1с (8.1, 8.2,8.3) или для разных, используемых ее БД (файловая, MS-SQL, Postgree) ? на это внятно смогут ответить только писатели движка. запрос субд можно трассировать + тип данных известен для пока в который уид кладется... а что там в файловой происходит даи вообще плохвая эта практика пытаться закладываться на последовательность гуидов даже в пределах одной таблицы. в общем случае они могут не представлять собой последовательность "по нарастающей" ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2020, 17:26 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana, 8.4.17.3. Правила сравнения значенийСсылочные типы и значения типа УникальныйИдентификатор сравниваются на основе своих значений. При этом гарантируется повторяемость результата сравнения только в рамках одной базы данных . ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2020, 18:33 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
МодальноеОкно, спасибо за участие. МодальноеОкно даи вообще плохвая эта практика пытаться закладываться на последовательность гуидов даже в пределах одной таблицы. в общем случае они могут не представлять собой последовательность "по нарастающей" Любая сортировка, если она использует инвариантную функцию сравнения, всегда дает последовательность "по нарастающей" или как минимум не убывающий (если сортируемые значения не уникальны) . Порядок рождения элементов не играет роли, естественно что новые элементы (гуиды) могут оказаться в любом месте выборки (вначале, в конце, в середини). Для сортировки уникальных значений важно лишь то, что если любых два элемента попали в выборку, то в независимости от всего остального, один всегда выше другого. И это неизменно для любой таблицы, любого запроса (без смены субд). Иначе это не сортировка, а генератор случайных чисел какой то. ;) Но вы правы в том, что вероятно в разных движках разные функции, и как именно работает MS SQL можно будет выяснить сделав прямые запросы и почитав документацию сравнения binary(16), а как работает файловый движок не ответит никто. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2020, 18:50 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
4d_monster , 8.4.17.3. Правила сравнения значенийСсылочные типы и значения типа УникальныйИдентификатор сравниваются на основе своих значений. При этом гарантируется повторяемость результата сравнения только в рамках одной базы данных . Спасибо. Вот меня в пределах одной базы данных полностью устраивает! Просто нужно знать как в пределах каждой из баз данных это гарантируется. То есть знaть правило сравнения для файловой, MSSql и Postgree. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2020, 18:53 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Скорее всего сравнивает именно по текстовой строке 36 символов. Запишите его в строку и сравните сортировку. Скорее всего совпадет ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2020, 19:28 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Программист 1с, это проверялось в первую очередь, к сожалению нет. Сравнивал так же побайтно в прямом и обратном порядке, тоже нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.01.2020, 22:40 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana это проверялось в первую очередь, к сожалению нет. Надеюсь, не надо напоминать, что представление GUID в 1С отличается от представления MSSQL перестановкой кусков? Если есть возможность, смотрите запрос к SQL, возможно, там тупо по 16-байтному значению сортируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 11:44 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
WildSery artemana это проверялось в первую очередь, к сожалению нет. Бралась строка, которую дает 1с по полю ссылки, и смотрелось расположены ли выходные данные запроса согласно правилу сортировке строк. Не соответствуют WildSery Надеюсь, не надо напоминать, что представление GUID в 1С отличается от представления MSSQL перестановкой кусков? MSSQL пока не занимаюсь. Но если текстовое представление GUID в 1С отличается от общепринятого, то конечно можно\нужно на это мне указать. См. Ниже. Если есть возможность, смотрите запрос к SQL, возможно, там тупо по 16-байтному значению сортируется. Мне вообще конечно надо разобраться со всеми движками 1С, но я сейчас разбираюсь с файловой версий, как наиболее сложной. Если по ней не будет решения, то наличие решения по SQL мне не нужно. Пойдем другим путем. Но пока не теряю надежды. Так вот, я беру строку, которую дает 1С по полю ссылки из запроса. Используя метод XMLString. Проверяю отсортирован ли запрос по этой строке, не отсортирован. Дальше я транслирую эту строку в 16 байтовое представление GUID (StringToGuid Delphi), и то же проверяю соответствует ли сортировка по байтному сравнению двух Guid. Не соответствует. В обратном порядке следования байте - не соответствует. По стандартному сравнению Guid исходя из структуры Код: pascal 1. 2. 3. 4.
то же не соответствует. Отсюда я делаю вывод. Либо 1с как то странно (по особому) формирует возвращаемый строкой Guid, и я при его обратном преобразование из строки через StringToGuid получаю не правильную последовательность байт, либо 1с использует какой то дьявольский collate для побайтного сравнения Guid в сортировках. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 13:53 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana Но если текстовое представление GUID в 1С отличается от общепринятого, то конечно можно\нужно на это мне указать да, там "триады" меняются местами. в инете функции валяются ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 13:55 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 13:56 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
МодальноеОкно, тепло! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 14:02 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Понял для себя правило сравнения 16 байтной структуры, полученной из 1С строки, с помощь стандартной трансляции (С#, delphi ) в Guid. Сравнивать по байтно в такой последовательности байт 6,7, 8,9,10,11,12,13,14,15, 4,5, 0,1,2,3 На моей небольшой демо базе (файловый движок) работает. Будут базы по больше и на других движках, проверю, отпишусь. Спасибо всем, особенно WildSery и МодальноеОкно! P.S. Подробно не разбирался, но подозреваю, что такой порядок байтов в сравнении позволяет 1с улучшить работу индексов, построенных для первичных ключей таблиц. Так как один из способов формирования нового Guid основан на использование текущего времени (как одной из компонент), то если в первую очередь использовать соответствующие сегменты Guid для сравнения, можно частично избавиться от случайного распределения значений ключей и получит нарастающие значения. Что при вставках большого кол-ва записей экономичнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 15:31 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana, а какую задачу вы решаете? просто ради интереса ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 15:43 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
МодальноеОкно, периодическая синхронизация двух наборов данных (источник -> приемник) алгоритмом сложностью N (однопроходный алгоритм без бинарного поиска). Источник - запрос из 1С, приемник таблица во внешней (не 1с) базе данных. Для реализации такого алгоритма необходимо иметь отсортированные данные из источника и применика. При условии, что эти отсортированные данные из источника и из приемника получены за счет навигации по подходящему индексу (без сортировки результата), такой алгоритм слияния самый экономичный. Что для моей задачи важно. Естественно, что функция сравнения должна работать одинаково. Вот тут и столкнулся с проблемой, БД приемника давала другой порядок записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2020, 16:03 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
А в наборе данных ведь Вам придется сравнивать и данные по этой 'ссылке'. А по Вашей сверке можно только узнать наличие объектов, но не различия реквизитов. Может правильнее в обоих базах записывать изменные или новые обьекты и потом уже только ими обмениваться? Приводить пример терабайтной базы, у которой изменилась 1 запись, надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2020, 22:08 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Программист 1с А в наборе данных ведь Вам придется сравнивать и данные по этой 'ссылке'. А по Вашей сверке можно только узнать наличие объектов, но не различия реквизитов. 1.Есть два одинаковых произвольных запроса с уникальной сортировкой (перечень полей, в том числе ссылки). 2.Один из базы источник (1С), другой из базы приемник (не 1С). 3.Открыли запросы. 4 Сравнили значения полей сортировки. 5.Если они равны, сравниваются все остальные поля запроса источника с полями запроса. Если они не равны, то выполняется изменение этой записи в базе приемнике. После чего переход на следующую запись и в запросе из базы источник и в запросе из базы приемник. На шаг 4. 6. Если поля сортировки из источника больше, то надо удалить запись в базе приемнике и в запросе из нее перейти на следующую запись. На шаг 4. 7. Если поля сортировки из источника меньше, то надо вставить запись из источника в базу приемник. А в запросе из базы источник перейти на следующую запись. На шаг 4. И так крутимся до момента, пока в обоих запросов не будет достигнут конец. Когда конца достигает лишь один из запросов, непосредственно сравнение полей сортировки (шаг 4) не далется, алгоритм идет во ветке, как будто поля сортировки закончившегося запроса имеют большие значения чем не закончившегося. Это упрощенный алгоритм используемой нами для синхронизации. Его сложность ~R*F, где R кол-во записей, а F количество полей. Реальный алгоритм, несколько сложней тем, что он допускает не уникальную сортировку наборов. Программист Может правильнее в обоих базах записывать изменные или новые обьекты и потом уже только ими обмениваться? Здесь речь идет об одностороннем обмене, то есть запись только в базу приемник. Но это пустяк. Важно то, что репликация (синхронизация) по приращениям, которую Вы предлагаете, конечно намного эффективнее, чем полная перечитка (описанная выше). Но она применима лишь в варианте, когда производиться передача в базу приемник таблиц, в том виде и в том составе, в котором они есть в базе источнике. Для этого в базе источнике обеспечивается логирование (журнал операций) этих таблиц, с помощью которого из нее вычитываются только новые и измененные записи. Эта схема мне известна, но она мне не подходит. Так как в моем случае синхронизации подвергаются результаты произвольного (написанного пользователем) сложного запроса, в котором потенциально есть join, в том числе (если это есть в 1с) с хранимыми процедурами и всякие другие SQL штуки. Это запрос некая выжимка нужных пользователю данных. Результат данного и любого запроса - это таблица, и вот эта таблица заливается в базу приемник, а потом синхронизируется, описанным выше алгоритмом. То есть на самом деле запросы не одинаковы по составу, из 1с берется сложный запрос. Например Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
А в базе приемнике этому запросу ставиться в соответствие таблица. Наприимер с именем Запрос1. Состав полей - все поля из запроса 1С. То есть для базы приемник открывается запрос Код: sql 1. 2. 3.
А дальше происходит то, что описано выше. Программа бежит по обоим запросам и выдает при необходимости в базу приемник команды update\insert\delete. Если бы мне в базе приемнике нужны были бы по отдельности таблицы РегистрНакопления.Продажи, РегистрНакопления.ПартииТоваровНаСкладах, Справочник.Номенклатура и т.д. то конечно нужно \ можно использовать репликацию по приращениям. Но они мне там не нужны, мне там нужен результат вот такого запроса. Передавать по приращениям отдельные таблицы, а потом все равно открывать запрос (уже только в базе примник), смысла нет. Да на 1 запрос будет меньше, но и репликация по приращением, в общем случае, не бесплатное удовольствие. Хотя, если весь проект, связанный с этой темой, взлетит, то может быть для 1с или других системе обеспечивающих репликацию по приращениям может быть и имеет смысл сделать опционально. Так как Вы уже второй программист 1с, который советует мне это сделать. Но пока хватит того что есть с головой. Программист 1с Приводить пример терабайтной базы, у которой изменилась 1 запись, надо? Та нет, во общем то понятно, что такое бывает. На это случай, пока, есть другие инструменты. Сюда кто то дочитал? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 14:30 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana, дочитал :) Да у Вас некий сложный запрос получения данных. Так кто запрещает хранить эти данные в регистре сведений 1с. Его этим же запросом и сравнивайте с этим регистром. И здесь замечательно получаются изменения, которые нужно перенести во внешнюю базу. После подтверждения обновления внешней базы, вносим эти изменения в регистр. Все быстро и автоматом. (Опционально медленное сравнение всего и вся с внешней базой, для поиска ошибок) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 15:11 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Программист 1с, респект! Теперь, мы можем только дискутировать в единственном вопросе, что же именно делать опционально. ;) Полную перегрузку\сверку или специальный регистр учета, который закачивать по приращению. Оба варианта рабочие, но второй специфичен (реализуем) только для 1С. А так как система, которую мы сейчас делаем, носит универсальный характер, то есть предназначена для закачки из различных SQL баз, потенциально могут быть и все, обсуждаемые на данном сайте, то естественно, мы, для начала, опираемся на универсальный рецепт, то есть на полную перезагрузку \ сверку. Проблемы известны, но и выигрыш есть: 1. Для внедрения нашей системы не надо выполнять никаких изменений в самой 1С. Настраивать специфический регистр учета, включать журналирование и т.п.. Соответственно он проще в эксплуатации. 2. Вариант полной перезагрузки самодостаточен. Варианту частичной перегрузки он все равно нужен опционально, для проверки правильности. 3. Ну и упомянутая ранее универсальность, годиться для всех баз в которых нет возможности обновиться по приращениям. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 18:41 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
А через внешние источники данных можно подключить и посмотреть Вашу базу? Если да - то вообще все просто тем же запросом и сравнить. Или считаем что нельзя? Внешний текстовый файл например :) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 20:45 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Программист 1с А через внешние источники данных можно подключить и посмотреть Вашу базу? Если да - то вообще все просто тем же запросом и сравнить. Или считаем что нельзя? Внешний текстовый файл например :) Да можно подключится к моей базе, но я не пойму зачем мне проводить сверку изнутри 1с. А если в качестве базы источника не 1с-база, а что то другое? Вы поймите, мы пишем BI-систему (аналог qlkickview , microsoft power bi и т п) Для любой такой системы нужна загрузка исходных данных в свое промежуточное хранилище (буква E в аббревиатуре ETL ) и дальнейшая синхронизация этого хранилища. В качестве исходной базы может выступать в принципе любая базай любой информационной системы. Поэтому один из главных принципов предъявляемых к загрузчику - это его универсальность ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2020, 22:47 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana, Тогда как вариант наоборот запросом из Вашей базы (если это возможно) к 1с (mssql например напрямую). А так сравнение 2 (больших) баз, отдельная тема. Хэши создаете и сравниваете. ps А Вы уверены что нужна универсальность? И бюджет у Вас как microsoft power bi? Я не против универсальности, но обычно задачи скатываются к частым решениям, а полное решение никому не нужно (сорри 0.1% нужно). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 14:40 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Программист 1с artemana, Тогда как вариант наоборот запросом из Вашей базы (если это возможно) к 1с (mssql например напрямую). А так сравнение 2 (больших) баз, отдельная тема. Хэши создаете и сравниваете. В том то и дело, что алгоритм который я Вам нарисовал, без всяких хэшей и прочего сравнивает быстрее некуда два больших набора данных, и записывает (вставляет, удаляет, изменяет ) данные в базу приемник. Поэтому открывать запрос из 1c к моей базе, или из моей базы к 1с, смысла нет никакого. Это только может усложнить реализацию из за относительной бедности языков 1С и T-SQL. Например, мы, в своей реализации этого алгоритма, разбиваем задачу на два потока, один сравнивает данные, другой записывает обнаруженные расхождения в базу приемник. Вы поймите, это линейный алгоритм, ту вообще нет поиска, только перебор записей. Быстрее невозможно, хоть с хешом хоть с чем. Выиграть можно только перейдя на синхронизацию по приращениям, но почему мы пока этого не делаем, мы уже обсудили. Была проблема с пониманием как нам надо представлять Guid из 1с в своей базе, чтобы последующая сортировка по нему совпадала, она, благодаря данному топику, успешно решена. Все остальное в общем то офтопик. Программист 1с ps А Вы уверены что нужна универсальность? На 120%. Программист 1с И бюджет у Вас как microsoft power bi? Нет, конечно. Но мы будем бороться. Надо же кому то сделать хорошую православную BI-систему? ;) Программист 1с Я не против универсальности, но обычно задачи скатываются к частым решениям, а полное решение никому не нужно (сорри 0.1% нужно). Здесь нет никаких сомнений. Нужно универсальное решение. Как и многие другие системы, наша развивается от частного решения к универсальному продукту. Этап частного решения пройден . Система успешно внедрена на 1 крупном предприятии и трех поменьше. Теперь хотелось бы сделать тиражируемый продукт, это на порядок или даже два сложнее. Но зато интересно. Может мы с Вами или с каким нибудь другим участником этого форума еще партнерами станем. Чем черт не шутит! ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2020, 17:54 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
artemana Может мы с Вами или с каким нибудь другим участником этого форума еще партнерами станем. Чем черт не шутит! ;) artemana В том то и дело, что алгоритм который я Вам нарисовал, без всяких хэшей и прочего сравнивает быстрее некуда два больших набора данных, и записывает (вставляет, удаляет, изменяет ) данные в базу приемник. Поэтому открывать запрос из 1c к моей базе, или из моей базы к 1с, смысла нет никакого. Это только может усложнить реализацию из за относительной бедности языков 1С и T-SQL. Например, мы, в своей реализации этого алгоритма, разбиваем задачу на два потока, один сравнивает данные, другой записывает обнаруженные расхождения в базу приемник. Есть 2 массива почти одинаковые (нужно найти различия). Дополнительное условие - каждый элемент массива содержит также массив "реквизитов". Если без дополнительного условия: Сортируем 2 массива и идем по 1 элементу сравнивая, пока не будут одинаковые. Чуть сложный алгоритм должен учитывать что при первом различии, нужно смотреть и в 1 и 2 массива следующие элементы, тк это может быть и пропуск и новый элемент. Или по другому будете? 1,2,3,4 1,2, ,4,5 Видим что нет элемента 3 и есть новый 5. Синхронизируемся Все ок, но проблема в элементе 2 первого массива и элементе 2 второго массива различаются подмассивы. Пусть реквизит "наименование" стал чуть другим. Как мы их сравниваем, и даже просто узнаем что что-то изменилось? Если также сравнивая по 1 элементу подмассива, то это очень долго. Вот здесь как раз и работает хэш. Сравниваем что есть 2 и 2 и сраниваем их хэши. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 19:06 |
|
Привило сравнение ссылок в запросе
|
|||
---|---|---|---|
#18+
Программист 1с Все ок, но проблема в элементе 2 первого массива и элементе 2 второго массива различаются подмассивы. Пусть реквизит "наименование" стал чуть другим. Как мы их сравниваем, и даже просто узнаем что что-то изменилось? Если также сравнивая по 1 элементу подмассива, то это очень долго. Это не долго. Сравнения полей одной записи - это алгоритм линейной сложности F. Где F количество полей. Ведь мы сравниваем 1 поле с первым, второе со вторым и так далее, пока не найдем хоть одно различие или не проверим все поля. Я уже писал, что общая сложность всего алгоритма N*F, и где N это количество уникальных id, а F это количество полей (размерность подмассива). Массивы мы не сортируем, а получаем в готовом отсортированном виде из СУБД с использованием индекса. Допустим есть массив 1 и массив 2, как в вашем примере, пусть они не отличаются. Размер каждого массива 100 млн. В каждом элементе подмассив (остальные реквизиты) размером 20. Значит сложность 100 000 000*20=2 000 000 000. Два миллиарда. Соотвественно все сравнение этим алгоритмом займет считанные секунды (гораздо больше уйдет времени на считывание таких объемов с базы источника и базы приемника. Программист 1с от здесь как раз и работает хэш. Сравниваем что есть 2 и 2 и сраниваем их хэши. Не беря во внимание, что хеш для записи из источника нужно еще посчитать (он ведь не известен), допустим хеш записи из первого массива совпал с хешом записи из второго массива и что дальше ? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2020, 23:29 |
|
|
start [/forum/topic.php?fid=28&msg=39919093&tid=1518218]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 240ms |
total: | 392ms |
0 / 0 |