|   |   | 
| 
 | v7: Знатокам 1с++ | ☑ | ||
|---|---|---|---|---|
| 0
    
        mishaPH 22.01.24✎ 18:55 | 
        В общем есть 7ка ТИС 9хх где есть спр Контрагенты и у него юрфизлицо типа"Справочник" без уточнения.
 И надо у этого юрфизлица получить ИНН. поскольку сделать join в лоб не выйдет т.к. справочник неизвестный, ломаю голову как это сделать. Запрос по заказам и надо получить ИНН юрфизлица. на форуме по 1с++ дали образец, но не работает. ругается. Вот запрос и вставка по рекомендации с форума. ругается, State 42000, native 195, message [Microsoft][ODBC SQL Server Driver][SQL Server]'length' is not a recognized built-in function name. если строку length закомментировать то State 42000, native 195, message [Microsoft][ODBC SQL Server Driver][SQL Server]'Substr' is not a recognized built-in function name. рс = СоздатьОбъект("ODBCRecordset"); ТекстЗапроса = " |SELECT ЗаявкаПокупателя.IDDOC [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя] | , Журнал.$ОбщийРеквизит.Автор [Автор $Справочник.Пользователи] | , $ЗаявкаПокупателя.Контрагент [Кон $Справочник.Контрагенты] | , $ЗаявкаПокупателя.ДатаОтгрузки Дата | , $ЗаявкаПокупателяСтроки.Номенклатура [Ном $Справочник.Номенклатура] | , $ЗаявкаПокупателяСтроки.Количество Количество | , Номенклатура.Code КодНом | , Контрагенты.Code КодКон | //| , Контрагенты.ЮрФизЛицо [ЮрФизЛицо $Справочник] //| , Контрагенты.ЮрФизЛицо AS ЮрФизЛицоСтрока //| ,$ВидСправочника36.ЮрЛица //| ,length($ВидСправочника36.ЮрЛица) | ,CASE | WHEN Substr(Контрагенты.ЮрФизЛицо, 1, 4) = $ВидСправочника36.ЮрЛица THEN 'ЮрЛица' | WHEN Substr(Контрагенты.ЮрФизЛицо, 1, 4) = $ВидСправочника36.ФизЛица THEN 'ФизЛица' | ELSE 'Не определен' | END AS Вид | ,COALESCE(СпрЮЛ.ЮрАдрес,СпрФЛ.ЮрАдрес, 'нет данных') AS Адрес | ,СпрЮЛ.ЮрАдрес AS АдресЮЛ | ,СпрФЛ.ЮрАдрес AS АдресФЛ |FROM _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ЗаявкаПокупателя AS ЗаявкаПокупателя With (NOLOCK) ON Журнал.IDDOC = ЗаявкаПокупателя.IDDOC | INNER JOIN $ДокументСтроки.ЗаявкаПокупателя AS ЗаявкаПокупателяСтроки With (NOLOCK) ON ЗаявкаПокупателя.IDDOC = ЗаявкаПокупателяСтроки.IDDOC | INNER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON Номенклатура.ID = $ЗаявкаПокупателяСтроки.Номенклатура | INNER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON Контрагенты.ID = $ЗаявкаПокупателя.Контрагент | | LEFT JOIN Справочник.ЮрЛица AS СпрЮЛ ON Substr(Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ЮрЛица AND СпрЮЛ.ID = Substr(Контрагенты.ЮрФизЛицо,5,9) | LEFT JOIN Справочник.ФизЛица AS СпрФЛ ON Substr(Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ФизЛица AND СпрФЛ.ID = substr(Контрагенты.ЮрФизЛицо,5,9) | |WHERE $ЗаявкаПокупателя.ДатаОтгрузки >:НачДата AND $ЗаявкаПокупателя.ДатаОтгрузки <:КонДата | AND Журнал.Closed & 1 = 1 |"; | |||
| 1
    
        mishaPH 22.01.24✎ 18:57 | 
        не инн а адрес получить пардон. Хотя и ИНН также как я понял     | |||
| 2
    
        Злопчинский 22.01.24✎ 21:42 | 
        инн и адреса - и в юр лицах и в физлицах - одинаковый по структуре и по ссылке из Контрагентов (если штатно). прямым запростом тупо объединить две выборки с одинаковыми полями в одну таблицу и тянуть из нее ИНН и адреса     | |||
| 3
    
        Злопчинский 22.01.24✎ 21:45 | 
        одинаково     
 | |||
| 4
    
        ADirks 23.01.24✎ 07:10 | 
        (0) я бы порекомендовал почитать документацию по тому диалекту SQL, который используется. Например, в MS SQL действительно нет функций length и substr, зато есть len и substring.     | |||
| 5
    
        АгентБезопасной Нацио 23.01.24✎ 08:23 | 
        (2) объединять нельзя, иды у разных справочников неуникальны.
 (0) база файловая или серверная? | |||
| 6
    
        ADirks 23.01.24✎ 08:32 | 
        (5) чё-ж нелзя то, вполне можно
 в индексы только не попадаем select ЮФЛ.ИНН, ЮФЛ.ЮрАдрес from ... left join ( select ($ВидСправочника36.ЮрЛица + ID) ид13, ИНН, ЮрАдрес from $Справочник.ЮрЛица union all select ($ВидСправочника36.ФизЛица + ID) ID, ИНН, ЮрАдрес from $Справочник.ФизЛица ) ЮФЛ ON ЮФЛ.ид13 = $Контрагенты.ЮрФизЛицо | |||
| 7
    
        mishaPH 23.01.24✎ 09:06 | 
        (5) скуль     | |||
| 8
    
        mishaPH 23.01.24✎ 09:07 | 
        (2) да дело не в этом. дело как в запрос корректно эту выборку поставить     | |||
| 9
    
        mishaPH 23.01.24✎ 09:09 | 
        (4) вот уже ближе. т.е. заменить и попробовать.     | |||
| 10
    
        mishaPH 23.01.24✎ 09:27 | 
        (4) большое спасибо
 переписал запрос немного еще изменил и все выводит рс = СоздатьОбъект("ODBCRecordset"); ТекстЗапроса = " |SELECT ЗаявкаПокупателя.IDDOC [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя] | , Журнал.$ОбщийРеквизит.Автор [Автор $Справочник.Пользователи] | , $ЗаявкаПокупателя.Контрагент [Кон $Справочник.Контрагенты] | , $ЗаявкаПокупателя.ДатаОтгрузки Дата | , $ЗаявкаПокупателяСтроки.Номенклатура [Ном $Справочник.Номенклатура] | , $ЗаявкаПокупателяСтроки.Количество Количество | , Номенклатура.Code КодНом | , Контрагенты.Code КодКон | | ,len($ВидСправочника36.ЮрЛица) | ,CASE | WHEN substring($Контрагенты.ЮрФизЛицо, 1, 4) = $ВидСправочника36.ЮрЛица THEN 'ЮрЛица' | WHEN substring($Контрагенты.ЮрФизЛицо, 1, 4) = $ВидСправочника36.ФизЛица THEN 'ФизЛица' | ELSE 'Не определен' | END AS Вид | ,COALESCE($СпрЮЛ.ЮрАдрес,$СпрФЛ.ЮрАдрес, 'нет данных') AS Адрес | ,$СпрЮЛ.ЮрАдрес AS АдресЮЛ | ,$СпрФЛ.ЮрАдрес AS АдресФЛ |FROM _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ЗаявкаПокупателя AS ЗаявкаПокупателя With (NOLOCK) ON Журнал.IDDOC = ЗаявкаПокупателя.IDDOC | INNER JOIN $ДокументСтроки.ЗаявкаПокупателя AS ЗаявкаПокупателяСтроки With (NOLOCK) ON ЗаявкаПокупателя.IDDOC = ЗаявкаПокупателяСтроки.IDDOC | INNER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON Номенклатура.ID = $ЗаявкаПокупателяСтроки.Номенклатура | INNER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON Контрагенты.ID = $ЗаявкаПокупателя.Контрагент | | LEFT JOIN $Справочник.ЮрЛица AS СпрЮЛ ON substring($Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ЮрЛица AND СпрЮЛ.ID = substring($Контрагенты.ЮрФизЛицо,5,9) | LEFT JOIN $Справочник.ФизЛица AS СпрФЛ ON substring($Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ФизЛица AND СпрФЛ.ID = substring($Контрагенты.ЮрФизЛицо,5,9) | |WHERE $ЗаявкаПокупателя.ДатаОтгрузки >:НачДата AND $ЗаявкаПокупателя.ДатаОтгрузки <:КонДата | AND Журнал.Closed & 1 = 1 |"; | |||
| 11
    
        mishaPH 23.01.24✎ 09:34 | 
        А точнее даже так. убрав все лишнее.
 ИНН тоже не проблема добавить рс = СоздатьОбъект("ODBCRecordset"); ТекстЗапроса = " |SELECT ЗаявкаПокупателя.IDDOC [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя] | , Журнал.$ОбщийРеквизит.Автор [Автор $Справочник.Пользователи] | , $ЗаявкаПокупателя.Контрагент [Кон $Справочник.Контрагенты] | , $ЗаявкаПокупателя.ДатаОтгрузки Дата | , $ЗаявкаПокупателяСтроки.Номенклатура [Ном $Справочник.Номенклатура] | , $ЗаявкаПокупателяСтроки.Количество Количество | , Номенклатура.Code КодНом | , Контрагенты.Code КодКон | | ,COALESCE($СпрЮЛ.ЮрАдрес,$СпрФЛ.ЮрАдрес, 'нет данных') AS Адрес |FROM _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ЗаявкаПокупателя AS ЗаявкаПокупателя With (NOLOCK) ON Журнал.IDDOC = ЗаявкаПокупателя.IDDOC | INNER JOIN $ДокументСтроки.ЗаявкаПокупателя AS ЗаявкаПокупателяСтроки With (NOLOCK) ON ЗаявкаПокупателя.IDDOC = ЗаявкаПокупателяСтроки.IDDOC | INNER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON Номенклатура.ID = $ЗаявкаПокупателяСтроки.Номенклатура | INNER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON Контрагенты.ID = $ЗаявкаПокупателя.Контрагент | | LEFT JOIN $Справочник.ЮрЛица AS СпрЮЛ ON substring($Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ЮрЛица AND СпрЮЛ.ID = substring($Контрагенты.ЮрФизЛицо,5,9) | LEFT JOIN $Справочник.ФизЛица AS СпрФЛ ON substring($Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ФизЛица AND СпрФЛ.ID = substring($Контрагенты.ЮрФизЛицо,5,9) | |WHERE $ЗаявкаПокупателя.ДатаОтгрузки >:НачДата AND $ЗаявкаПокупателя.ДатаОтгрузки <:КонДата | AND Журнал.Closed & 1 = 1 |"; | |||
| 12
    
        АгентБезопасной Нацио 23.01.24✎ 10:36 | 
        (6) по ид9 нельзя, по ид13 - конечно можно.     | |||
| 13
    
        Злопчинский 24.01.24✎ 08:26 | 
        (5) вытащить из одного справочника строку 
 получитьсписок контрагентов нужных (или всех) Контрагент.Физлица.ИНН и Конатрагент.Физлица.Адрес и аналогично для юрдица, объединить-то строки уже же можно вобщуютаблицу - будет select с полями инн и адрес... ? | |||
| 14
    
        Злопчинский 24.01.24✎ 08:28 | 
        ну типа как в(6) оказывается     | |||
| 15
    
        mishaPH 24.01.24✎ 08:58 | 
        (14) Вот эта конструкция проста, и добавление получения адреса никак на быстродействии даже не сказалась 
 рс = СоздатьОбъект("ODBCRecordset"); ТекстЗапроса = " |SELECT ЗаявкаПокупателя.IDDOC [ЗаявкаПокупателя $Документ.ЗаявкаПокупателя] | , Журнал.$ОбщийРеквизит.Автор [Автор $Справочник.Пользователи] | , $ЗаявкаПокупателя.Контрагент [Кон $Справочник.Контрагенты] | , $ЗаявкаПокупателя.ДатаОтгрузки as [Дата $Дата] | , Журнал.DATE_TIME_IDDOC as [ДатаДок $Дата] | , $ЗаявкаПокупателя.СуммаВзаиморасчетов СуммаЗаявкиИтог | , $ЗаявкаПокупателяСтроки.Номенклатура [Ном $Справочник.Номенклатура] | , $ЗаявкаПокупателяСтроки.Количество Количество | , RTRIM(Номенклатура.Code) КодНом | , RTRIM(Контрагенты.Code) КодКон | ,COALESCE($СпрЮЛ.ЮрАдрес,$СпрФЛ.ЮрАдрес, 'нет Адреса') AS ФактАдрес | |FROM _1SJOURN AS Журнал With (NOLOCK) | INNER JOIN $Документ.ЗаявкаПокупателя AS ЗаявкаПокупателя With (NOLOCK) ON Журнал.IDDOC = ЗаявкаПокупателя.IDDOC | INNER JOIN $ДокументСтроки.ЗаявкаПокупателя AS ЗаявкаПокупателяСтроки With (NOLOCK) ON ЗаявкаПокупателя.IDDOC = ЗаявкаПокупателяСтроки.IDDOC | INNER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON Номенклатура.ID = $ЗаявкаПокупателяСтроки.Номенклатура | INNER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON Контрагенты.ID = $ЗаявкаПокупателя.Контрагент | LEFT JOIN $Справочник.ЮрЛица AS СпрЮЛ ON substring($Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ЮрЛица AND СпрЮЛ.ID = substring($Контрагенты.ЮрФизЛицо,5,9) | LEFT JOIN $Справочник.ФизЛица AS СпрФЛ ON substring($Контрагенты.ЮрФизЛицо,1,4) = $ВидСправочника36.ФизЛица AND СпрФЛ.ID = substring($Контрагенты.ЮрФизЛицо,5,9) | |WHERE $ЗаявкаПокупателя.ДатаОтгрузки >:НачДата AND $ЗаявкаПокупателя.ДатаОтгрузки <:КонДата | AND Журнал.Closed & 1 = 1 |"; | |||
| 16
    
        mishaPH 24.01.24✎ 09:00 | 
        а блин в юрфиз джойны With (NOLOCK) не добавил. Все время про это забываю.     | |||
| 17
    
        АгентБезопасной Нацио 24.01.24✎ 10:20 | 
        (16) "With" можно опускать...     | |||
| 18
    
        trad 24.01.24✎ 11:30 | 
        если сервер 2005+ и хинтов более одного, то без with будет ошибка     | |||
| 19
    
        АгентБезопасной Нацио 24.01.24✎ 12:10 | 
        (18) спасибо, не знал...     | |||
| 20
    
        Djelf 24.01.24✎ 15:07 | 
        Я не понимаю, зачем вы все время используете INNER JOIN в тех случаях когда мы точно знаем что правое соединение всегда есть (за исключением битых ссылок).
 Я не спец по оптимизатору mssql, я спец по sqlite, но sqlite умеет перестраивать план запроса в таких случаях, mssql видимо тоже, т.е. иногда мы тянем всю таблицу правого джойна, а потом соединяем с некоторым штрафом. Это не всегда критично, обычно работает, но иногда бывает ой,все. Объясните: зачем тут INNER JOIN? Я не понимаю... | |||
| 21
    
        mishaPH 24.01.24✎ 15:07 | 
        (20) вы о запросе? в  INNER JOIN только то, что 100% есть в доках.     | |||
| 22
    
        Djelf 24.01.24✎ 15:16 | 
        (21) Если у тебя в реквизитах документов нет таких реквизитов, то у тебя база разрушена. Иначе это не имеет смысла в подобном запросе.
 INNER JOIN $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ON Номенклатура.ID = $ЗаявкаПокупателяСтроки.Номенклатура Мы точно знаем что Номенклатура есть, зачем INNER JOIN? LEFT JOIN будет быстрее. | |||
| 23
    
        mishaPH 24.01.24✎ 15:20 | 
        (22) не понял. что значит нет? 
 Да какая в принципе разница для этих ситуаций какой join | |||
| 24
    
        АгентБезопасной Нацио 24.01.24✎ 16:21 | 
        (23) разница в том, что упрощенно говоря после соединения для внутреннего соединения сервер должен просканироваль результат и отбросить все кортежи с присоединенным нулл-ом. Т.е. сделать дополнительную работу, потратить время. Т.е. левое будет просто быстрее.
 Но вообще, нужно смотреть на план запроса. | |||
| 25
    
        mishaPH 24.01.24✎ 17:06 | 
        (24) попробую.     | |||
| 26
    
        АгентБезопасной Нацио 24.01.24✎ 17:19 | 
        (25) скорее всего, на твоих объемах ты увидишь ускорение только в плане запроса, а практически - не заметишь. Хотя - кто знает...     | |||
| 27
    
        Djelf 24.01.24✎ 17:24 | 
        (26) Копейка рубль бережет.     | |||
| 28
    
        mishaPH 24.01.24✎ 17:26 | 
        (26) (27) в выборке 230000 записей итого. попробовал. разницы нет вообще. по моему даже немного медленнее     | |||
| 29
    
        Djelf 24.01.24✎ 21:20 | 
        (28) На sql все уже зекешировано в памяти, +- по скорости выполнения выловить сложно, тем более что нынче процессоры сами разгоняются и замедляютсяются по собственному желанию.
 На INNER JOIN против LEFT JOIN тратится не так чтобы невероятно больше ресурсов, но все равно тратится чуток больше. Можно не обращать внимания, а можно это учитывать при составлении запроса. Я предпочитаю не давать оптимизатору лишних шалостей, если я уверен что левое соединение однозначно, то использую только левое соединение, как самое примитивное. | |||
| 30
    
        mishaPH 24.01.24✎ 22:11 | 
        (29) согласен + когда массовая работа идет эти мелочи уже имеют значения     | |||
| 31
    
        Злопчинский 25.01.24✎ 00:01 | 
        Нескольо раз сталкивался, что для ТЗ конструкция ТЗ.ТекущаяКолонка() возвращает пустую строку, при этом колонка стопудово существует, и ошибка плавающая. Грешу что это так подкидывает ИТЗ, когда из ИТЗ выгружаются данные в ТЗ дл яотображения на форме (только не надо тут про поставщика данных, табличное поле итд ;-)     | |||
| 32
    
        trad 25.01.24✎ 06:21 | 
        (29) поддерживаю полностью
 В подобных запросах, как выше, нужно использовать left join | |||
| 33
    
        mishaPH 25.01.24✎ 07:40 | 
        (31) ИТЗ индексированная? классная вещь. Но натолкнулся на глюки. на больших массивах незаменима НО если много индексированных словил глюк, что система просто замирает после каких то операций пришлост обычную возвращать.     | |||
| 34
    
        Злопчинский 25.01.24✎ 08:24 | 
        (33) еще бы чтобы ИТЗ умела как-то напрямую результат черного запроса получать, ане через прокладку в виде обычной ТЗ     | |||
| 35
    
        trad 25.01.24✎ 08:30 | 
        (34) этого никогда не будет     | |||
| 36
    
        mishaPH 25.01.24✎ 08:45 | 
        (34) а нафига если это прямой успешно делает? 
 Я вот походу от черных вообще отказываюсь. когда отчет делавшийся 4 часа делается 15 минут - это привлекает | |||
| 37
    
        mishaPH 25.01.24✎ 08:46 | 
        запрос в (0) вообще не мой. Коллеге помог. У себя используем и покруче. Просто такого спр юрлиц нет вот и в тупик попал     | |||
| 38
    
        vladmenleo 25.01.24✎ 08:58 | 
        (34) ИТЗ и черный запрос. Забавная комбинация :) почему-бы на прямой переделать и никаких прокладок не надо     | |||
| 39
    
        mishaPH 25.01.24✎ 09:17 | 
        (38) да странно. если есть ИТЗ то значит 1с++ включен
 Но видимо есть куча отчетом в и т.п. куча тз и запросов. Я вот если уже есть на прямой не переписываю но ИТЗ добавляю | |||
| 40
    
        vladmenleo 25.01.24✎ 09:22 | 
        (39) Я наоборот, как встречаю какой-нибудь старый черный и приходит задание что-то исправить/доделать, так заодно на прямой переписываю     | |||
| 41
    
        АгентБезопасной Нацио 25.01.24✎ 09:32 | 
        (36) а если не секрет - что за _отчет_ делается 4 часа?
 пы.сы. я черные так и не освоил (ну, в таком качестве, как Ёпрст, например). | |||
| 42
    
        mishaPH 25.01.24✎ 09:35 | 
        (41) лучше не буду. наследие другого прога. сделано все что можно было сделать неоптимально.     | |||
| 43
    
        Андрей_Андреич naïve 25.01.24✎ 09:40 | 
        (42) Меня больше 15 минут на прямых запросах смущает. Миллионы строк?     | |||
| 44
    
        mishaPH 25.01.24✎ 09:52 | 
        (43) не. запрос делается секунды.
 там пришлось заменить на 4 запроса и далее логика раскручивается. | |||
| 45
    
        Андрей_Андреич naïve 25.01.24✎ 09:54 | 
        (44) Видать логика не самая логичная ... )))     | |||
| 46
    
        АгентБезопасной Нацио 25.01.24✎ 10:54 | 
        (44) но даже 14 минут постобработки данных - как-то смущают     | |||
| 47
    
        mishaPH 03.02.24✎ 17:26 | 
        Кстати коллеги. А не подскажите ли курсы по т-sql все таки как мне кажется всегда есть то, чего не знаешь. Чтобы понятно для чайника ну или тупого 1с ника.     | |||
| 48
    
        Ёпрст гуру 03.02.24✎ 21:58 | 
        (47) Ицик Бен-Ган Основы T-SQL. Купи/скачай книжку. Более чем достаточно.     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |