gifts2017

Поиск ссылок прямыми запросами для SQL версии.

Опубликовал Дмитрий Дрейцер (MadDAD) в раздел Администрирование - Поиск данных

Поиск ссылок стандартным методом довольно долгая процедура.
В этой обработке реализован обход метаданных для поиска реквизитов, которые могут содержать ссылку на искомый объект, составление и выполнение запросов по найденным таблицам.
Для работы необходима компонента 1С++.

Скачать файлы

Наименование Файл Версия Размер
Поиск Ссылок 158
.ert 102,00Kb
09.10.14
158
.ert 102,00Kb Бесплатно

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Михаил Ифконфиг (Утюг) 18.11.09 13:30
глРаспечататьТаблицу<<?>>(тзСсылок);
{C:\TEMP\ПОИСКССЫЛОК.ERT(361)}: Процедура не обнаружена (глРаспечататьТаблицу)
2. Борис Соколов (Boog) 18.11.09 15:36
глРаспечататьТаблицу<<?>>(тзСсылок);
{E:\!1C_BASE\EXTFORMS\1\POISKSSYLOK.ERT(361)}: Процедура не обнаружена (глРаспечататьТаблицу)
3. Борис Соколов (Boog) 18.11.09 15:39
Извиняюсь за дубль - не обновил страницу.
4. Борис Соколов (Boog) 18.11.09 16:56
Ошибка обработки запроса:

SELECT DISTINCT
:Объект As [Объект $Справочник.Контрагенты]
,Tab.DOCID As [Ссылка $Документ]
,'Субконто' As Реквизит
,'Проводка' As Метаданные
,J.IDDOCDEF AS Ссылка_вид
, CASE :Объект
When
Tab.DTSC0 then 'Дт1'
When
Tab.KTSC0 then 'Кт1'
When
Tab.DTSC1 then 'Дт1'
When
Tab.KTSC1 then 'Кт1'
When
Tab.DTSC2 then 'Дт2'
When
Tab.KTSC2 then 'Кт2'
When
Tab.DTSC3 then 'Дт3'
When
Tab.KTSC3 then 'Кт3'
END As Субконто
FROM
_1SENTRY As Tab
INNER JOIN _1sjourn J On J.IDDOC = Tab.DOCID
where (Tab.DTSC0 = :Объект And Tab.VDTSC0 in (450)) OR (Tab.KTSC0 = :Объект And Tab.VKTSC0 in (450))
OR (Tab.DTSC1 = :Объект And Tab.VDTSC1 in (450)) OR (Tab.KTSC1 = :Объект And Tab.VKTSC1 in (450))
OR (Tab.DTSC2 = :Объект And Tab.VDTSC2 in (450)) OR (Tab.KTSC2 = :Объект And Tab.VKTSC2 in (450))
OR (Tab.DTSC3 = :Объект And Tab.VDTSC3 in (450)) OR (Tab.KTSC3 = :Объект And Tab.VKTSC3 in (450))

State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'DTSC3'.
5. Дмитрий Дрейцер (MadDAD) 19.11.09 02:41
(1), (2). Прошу прощения не отвязал от конфгурации.
(3) - Максимально количество субконто не определялось, стояло 4 по умолчанию.

Добавил недостающую процедуру вывода таблицы значений - удобно, если не хочется делать печатную формую

Поправил определение количества субконто.
6. Борис Соколов (Boog) 19.11.09 10:34
В процедуре НайтиРеквизитыСсылок в цикле по субконто, нужно делать цикл от 1 по КолвоСубконто-1
и в ДопКолонке писать
When
Tab.DTSC"+Субконто+" then 'Дт"+(Субконто+1)+"'
When
Tab.KTSC"+Субконто+" then 'Кт"+(Субконто+1)+"'";

Тогда взлетит.
7. Дмитрий Дрейцер (MadDAD) 19.11.09 10:40
(6) Точно :) Затупил... Хотя у меня работает с таким запросом.
8. Борис Соколов (Boog) 19.11.09 10:47
А что в колонке Ссылка_вид?
Если ссылка найдена в движении регистра, то там какое-то число, в остальных строках там пусто.
9. Михаил Ифконфиг (Утюг) 19.11.09 10:48
1. Еще бы надо проверять наличие таблицы _1sentry и, в зависимости от ее наличия, обрабатывать или пропускать строки 317-340. В ТиС и ЗиК ее нет и получаем ошибку.
2. В _1sentry нумерация субконто начинается с ноля, т.е. при 3-х субконто поля будут называться DTSC0, DTSC1, DTSC2. А в обработке они начинаются с единицы, в связи с чем имеем ошибку - Недопустимое имя столбца "DTSC3". Соответственно, строку 330 надо изменить на
Для Субконто = 0 По КолвоСубконто-1 Цикл
10. Михаил Ифконфиг (Утюг) 19.11.09 10:50
О, пока разглядывал, тут уже написали. Но Boog (6) не до конца прав - см. мое (9), п.2.
11. Борис Соколов (Boog) 19.11.09 11:15
С проверкой на ведение бух. учета в базе вообще - согласен.
По поводу цикла от 0 по КолвоСубконто-1:
там перед циклом определяются DTSC0 и KTSC0. Отдельно. (и условия для них).
12. Дмитрий Дрейцер (MadDAD) 19.11.09 11:15
(10) В принципе то же самое, только у меня первые субконто задаются до цикла по остальным, тогда цикл с 1.

Добавил определение наличия таблицы, поправил максимально количество субконто, (6)поправил нумерацию субконто.

(8) Ссылка_вид содержит идентификатор вида документа для типизации документа в запросе. Если идет запрос по регистрам - в качестве сылки возвращается документ, который делал движения. В остальных случаях если ссылка не документ, то и вид документа не нужен, соответственно он пустой.
Это служебное поле, которое в принципе можно прятать.
13. Михаил Ифконфиг (Утюг) 19.11.09 11:40
(11) впопыхах не заметил
(12) угу, теперь летает
14. jj_mail (jj_mail) 20.11.09 13:00
Ошибка обработки запроса:

SELECT DISTINCT
:Объект As [Объект $Справочник.Фирмы]
,Tab.ID As [Ссылка $Справочник.Фирмы]
,'Родитель' As Реквизит
,'Справочник.Фирмы' As Метаданные

FROM
$Справочник.Фирмы As Tab

where Tab.PARENTID = :Объект

State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'PARENTID'.
--------------------------
Ошибка обработки запроса:

SELECT DISTINCT
:Объект As [Объект $Справочник.Фирмы]
,Tab.DOCID As [Ссылка $Документ]
,'Субконто' As Реквизит
,'Проводка' As Метаданные
,J.IDDOCDEF AS Ссылка_вид
, CASE :Объект
When
Tab.DTSC0 then 'Дт1'
When
Tab.KTSC0 then 'Кт1'
When
Tab.DTSC1 then 'Дт2'
When
Tab.KTSC1 then 'Кт2'
When
Tab.DTSC2 then 'Дт3'
When
Tab.KTSC2 then 'Кт3'
END As Субконто
FROM
_1SENTRY As Tab
INNER JOIN _1sjourn J On J.IDDOC = Tab.DOCID
where (Tab.DTSC0 = :Объект And Tab.VDTSC0 in ()) OR (Tab.KTSC0 = :Объект And Tab.VKTSC0 in ())
OR (Tab.DTSC1 = :Объект And Tab.VDTSC1 in ()) OR (Tab.KTSC1 = :Объект And Tab.VKTSC1 in ())
OR (Tab.DTSC2 = :Объект And Tab.VDTSC2 in ()) OR (Tab.KTSC2 = :Объект And Tab.VKTSC2 in ())

State 42000, native 102, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ')'.
15. Дмитрий Дрейцер (MadDAD) 27.11.09 11:49
(14)
Не был предусмотрен вариант справочников с одним уровнем.
Не был предусмотрен вариант остутствия объекта в видах субконто.
16. jj_mail (jj_mail) 27.11.09 12:34
Заголовок = глСтрРасставитьПробелы<<?>>(тз.ИмяКолонки(НомерКолонки));
{D:\ПОИСКССЫЛОК.ERT(33)}: Функция не обнаружена (глСтрРасставитьПробелы)
17. Дмитрий Дрейцер (MadDAD) 27.11.09 12:34
(16) Извиняюсь, выгрузил старую версию. Сейчас уже лежит новая.
18. Dmitry Afanasyev (afanasko) 23.12.09 17:06
18. Очень интересно сделано. Код понравился ))) +
19. Максим Рыбальченко (maxim_ro) 25.10.10 17:26
Как раз искал похожую обработку. Все вроде бы хорошо но два нюанса. Стандартная функция НайтиСсылки() в большинстве случаев работает у меня быстрее но если в этой обработке убираю лишние метаданные тогда она работает намного быстрее чем стандартный механизм. Но эта обработка не учитывает метаданные где есть реквизиты неопределенного типа!
20. Дмитрий Дрейцер (MadDAD) 26.10.10 02:39
Новая версия. Теперь учтены реквизиты неопределенного типа (Спасибо maxim_ro).
21. Дмитрий Дрейцер (MadDAD) 26.10.10 02:42
(19) Спасибо за указанный недочет. Для собственного пользования обработка давно уже доработана, здесь не обновил.

Самое большое время тратится на запрос по таблице проводок. Если эта таблица не интересует - можно смело закомментировать. Вообще обработка и создавалась для того чтобы можно было искать ссылки выборочно а не по всем метаданным.
22. ssv ssv (s_s_v) 29.10.10 11:15
Для реквизитов неопределенного типа в отчете для документа стоит

сзНеопределенных.Установить("Документ", "'A1'+");

т.е. в запросах получается типа того
where Tab.sp2265 = 'A1'+' 7K'+' 65GAE '

Провел трассировку стандартного метода НайтиСсылки() и там во временную табл. для документа передается 'O1', т.е. строка должна получиться вида
where Tab.sp2265 = 'О1'+' 7K'+' 65GAE '


Может подскажете как всетаки корректно определить правильное значение для документа или справочника.

23. Дмитрий Дрейцер (MadDAD) 29.10.10 11:45
(22) проверил сейчас. Действительно - верно 'О1'. Видимо при разработке недостаточно тестировал.

Версия обновлена.
24. ssv ssv (s_s_v) 29.10.10 12:00
Кстати я для справочника не проверял.

И еще меня это очень заинтересовало хочу доработать, а пока просто подкину идею по ускорению.
Если ищем ссылки на документ, то вероятность того, что на данный (искомый) документ встретятся ссылки в документах или на регистрах раньше самого документа чрезвычайно мала. А значит нет смысла проверять всю таблицу в запросе, а нужно отсекать по дате времени документа. Хотя не спорю могут быть специфичные ситуации, когда документ передвигают по датам и времени.

Но если добавить фильтры по времени, то на больших базах для документов поиск можно сократить в разы