Имя: Пароль:
1C
1C 7.7
v7: Не работает найти по реквизиту после прямой вставки данных
,
0 КонецЦикла
 
13.11.13
13:29
Точнее работает, но не для всех элементов о_О

Есть справочник, есть индексы (поля с сортировкой, отборами)
1С ищет так:
set rowcount 1 select * from SC1507(NOLOCK INDEX=VI1497) where SP1497='4016369666159' order by SP1497,ROW_ID set rowcount 0

Заполняю справочник нагло инсертом с предварительным делетом
Но по НЕКОТОРЫМ товарам поиск не работает
Запросом не из 1С ищет, конечно

Если установить сортировку по реквизиту в 1С - все ОК, "плохой" товар на своем месте

Копать индекс не могу при открытой форме - слетит 1С
Пересоздание после вставки не помогло.

Переделать на свои поиски?

Советы?

Спасипки
1 Ork
 
13.11.13
13:36
(0)
1. Переделать на работу с фоксовским драйвером.
2. При открытии файла ДБФ открывать СДХ.
Оно само обновит индексы.
2 КонецЦикла
 
13.11.13
13:37
Это СКЛ
3 КонецЦикла
 
13.11.13
13:37
Все, разобрался сцуко
4 КонецЦикла
 
13.11.13
13:38
Если Спр.НайтиПоРеквизиту("ШтрихКод", ШтрихКод,1) = 1 тогда
                      
        //АктивизироватьОбъект(Спр.ТекущийЭлемент());
        АктивизироватьОбъект(Спр);

        
    КонецЕсли;    

Спр.ТекущийЭлемент() - пустой был
5 Ёпрст
 
13.11.13
13:39
а какой поиск то перестал работать ?
6 Ёпрст
 
13.11.13
13:39
ааа...
7 КонецЦикла
 
13.11.13
13:39
у 1с курсоры с катушек съезжают при таком жестком подходе :)
8 Ёпрст
 
13.11.13
13:40
а смысл в делете записи ?
Лень update делать было ?..
9 Ёпрст
 
13.11.13
13:41
ты же с тем же id лепишь поди.. так ?
:)
10 КонецЦикла
 
13.11.13
13:42
апдейт нет смыла
ид леплю какие хочу, это же служебный спр-к
11 КонецЦикла
 
13.11.13
13:42
ид тот же :)
12 КонецЦикла
 
13.11.13
13:43
а... вот это интересно, но ведь индекс по row_id, а там автоинкремент
13 КонецЦикла
 
13.11.13
14:06
Походу ТекущийЭлемент() пустой из-за неправильно сформированных id. Я был настолько нагл, что id формировал инкрементом начиная с 1, в десятичной системе. Теперь начал нумеровать с 999 (чтобы четвертый знак не был нулевым, т.е. начиналось с 1000) и все взлетело.
14 КонецЦикла
 
13.11.13
14:09
Т.е. значение в строку внутр было для некоторых элементов " много пробелов    0239"
15 КонецЦикла
 
13.11.13
14:12
Спасибо Епрст за наводку :)
Спр-к переформировывается в среднем за 3 секунды, было чуть более минуты
16 КонецЦикла
 
13.11.13
14:43
Вообще тут можно несколько зайцев убить, т.к. появляется возможность управлять row_id и как надо упорядочить поиск штатными ср-вами. Например, при поиске по ШК будет выдаваться партия, поступившая первой.
17 Dolly_EV
 
14.11.13
04:24
Можно я тут спрошу? дабы не плодить... тоже про ШтрихКоды))
Вот такой запрос:
SELECT
--    тзОстОбороты.АртикулСМ
--    СпрТТ.ID AS [ТТочка $Справочник.ТоргТочки]
    тзТТ.ТекЭлемТТ AS [ТТочка $Справочник]
    ,MAX(тзТТ.ТекЭлемТТ) AS ТТочкаИсх
    ,MAX(тзОстОбороты.КодТТ) AS ТТочкаИзТЗ
    ,MAX(тзОстОбороты.АртикулСМ) AS АртикулСМ
    ,MAX(тзСМ_ШК.ШК) AS ШК
    ,СпрШК.PARENTEXT AS [Номенклатура $Справочник.Номенклатура]
    ,SUM(тзОстОбороты.ОстНач) AS ОстНач
    ,SUM(тзОстОбороты.Прих) AS Прих
    ,SUM(тзОстОбороты.Расх) AS Расх
    ,SUM(тзОстОбороты.ОстКон) AS ОстКон
FROM
    vt_тзОстОбороты AS тзОстОбороты
LEFT JOIN vt_тзСМ_ШК AS тзСМ_ШК
ON тзОстОбороты.АртикулСМ = тзСМ_ШК.АртикулСМ
LEFT JOIN [Справочник.ШтрихКодСпр] AS СпрШК
ON RTRIM(тзСМ_ШК.ШК) = RTRIM(СпрШК.Штрихкод)
LEFT JOIN
    vt_MapTable_PrivozRefContractor AS тзТТ
ON RTRIM(тзОстОбороты.КодТТ) = RTRIM(тзТТ.КодТТ)
WHERE 1=1 AND 2=2
GROUP BY
    тзТТ.ТекЭлемТТ,СпрШК.PARENTEXT

Подбор индекса для таблицы SC51588:
    Ограничения:
    Найдено в кэше
    Индекс не выбран.
    Стоимость: 9986
Подбор индекса для таблицы SC51588:
    Ограничения:
    Найдено в кэше
    Индекс не выбран.
    Стоимость: 9986
Время подготовки запроса: 24 мс, время выполнения запроса: 254444 мс.
Время запроса: 4 мин, 14 с, 468 мс - это 1SQLite
на SQL - 200 мс.

Вопрос: почему 1SQlite не находит индекс для Справочник.ШтрихКодСпр по полю "Штрихкод"??
Отбор и сортировка на реквизите стоит.
18 Dolly_EV
 
14.11.13
10:42
ап
19 Ёпрст
 
14.11.13
10:43
(17) будь проще - укажи его явно в запросе.
20 Dolly_EV
 
14.11.13
10:44
(19) как?
21 Ёпрст
 
14.11.13
11:00
(20) через idx_....тут поля из твоего индекса
22 Dolly_EV
 
14.11.13
11:01
(21) можно по-подробнее? куда пихать idx_ ?
23 Ёпрст
 
14.11.13
11:08
в условие,
ЗЫ: индекс то какой хоть у таблички ?
24 Dolly_EV
 
14.11.13
11:23
(23)
# Name    |Descr                         |Type[A/S/U]|DBTableName|ReUsable  
T=SC51588 |Справочник ШтрихКодСпр        |A          |SC51588    |1        
#-----Fields-------
# Name      |Descr               |Type|Length|Precision
F=ID        |ID object           |C   |9     |0        
F=PARENTEXT |Parent in other tabl|C   |9     |0        
F=ISMARK    |Flag Object is Marke|C   |1     |0        
F=VERSTAMP  |Version stamp       |C   |6     |0        
F=SP51595   |(P)Штрихкод         |C   |13    |0        
F=SP51592   |(P)Ед               |C   |9     |0        
#----Indexes------
# Name     |Descr         |Unique|Indexed fields                                              |DBName    
I=IDD      |of ID         |0     |ID                                                          |IDD        
I=PCODE    |of PARENT     |0     |PARENTEXT                                                   |PCODE      
I=VI51595  |VI51595       |0     |SP51595(UPPER=128)                                          |VI51595    
I=VIP51595 |VIP51595      |0     |PARENTEXT,SP51595(UPPER=128)                                |VIP51595
25 Ёпрст
 
14.11.13
11:31
Не уверен  за синтаксис, так спробуй
(давно на клюшках ничего не писал)

ON RTRIM(тзСМ_ШК.ШК) = RTRIM(СпрШК.IDX_PARENTEXT_SP51595)
26 Ёпрст
 
14.11.13
11:33
только вон на счет тримов, не уверен, будет ли выбран VIP51595  в этом случае.
27 Dolly_EV
 
14.11.13
11:35
no such column: СпрШК.IDX_PARENTEXT_SP51595

и с тримами и без тримов
28 Dolly_EV
 
14.11.13
11:36
(25) где вообще про это почитать? (явное использование индекса в запросе)
29 Ёпрст
 
14.11.13
11:47
(28) сделай

select * from  [Справочник.ШтрихКодСпр]

посмотри, какое имя индекса тама
30 Dolly_EV
 
14.11.13
11:59
где и чем это сделать?
31 Ёпрст
 
14.11.13
12:24
да просто выполни запроос в консоли
32 Ёпрст
 
14.11.13
12:24
или выгрузи в тз и посмотри
33 spock
 
14.11.13
12:28
(13)Скорее всего эта классика у тебя есть, но вдруг поможет:

CREATE FUNCTION dbo.convert10to36(num int)
RETURNS varchar(99)
AS
BEGIN  
    DECLARE @r varchar(99)
    
    SET @r = ''
    WHILE num > 0
        SELECT @r = char(
            CASE
                WHEN num % 36 < 10
                    THEN num % 36 + ascii('0')
                ELSE num % 36 + ascii('A') - 10
            END
        ) + @r, num = num / 36
        
    RETURN @r
END
GO

CREATE FUNCTION dbo.convert36to10(input varchar(99))
RETURNS int
AS
BEGIN
    DECLARE temp as char(1)
    DECLARE @ret as int
    DECLARE degree as int
    DECLARE i as int
    DECLARE @charcode as int
    
    SET @ret = 0
    SET i = 0
    SET degree = 0
    
    WHILE (LEN(input) - i) > 0 BEGIN
        SET temp = UPPER(SUBSTRING(input, LEN(input) - i, 1))
        SET @charcode = ASCII(temp)
        
        IF ((@charcode > 57) and (@charcode < 65)) OR (@charcode < 48) OR (@charcode > 90) BEGIN
            SET i = i + 1
            CONTINUE
        END
        
        IF (@charcode < 58)
            SET @ret = @ret + (@charcode - 48) * (POWER(36, degree))
        ELSE IF (@charcode < 91)
            SET @ret = @ret + (10 + @charcode - 65) * (POWER(36, degree))
            
        SET i = i + 1
        SET degree = degree + 1
    END
    
    RETURN @ret
END
GO

CREATE FUNCTION dbo.IncID(input char(9), @step int = 1)
RETURNS char(9)
AS
BEGIN
    DECLARE @retid as char(9)
    DECLARE @uribid as char(3)
    DECLARE @dec as int
    
    IF input IS NULL
        SET @retid = '         '
        
    SET @uribid = RIGHT(input, 3)
    SET @dec = dbo.convert36to10(LEFT(input, 6))
    SET @retid = dbo.convert10to36(@dec + @step)
    SET @retid = RIGHT('         ' + RTRIM(@retid) + @uribid, 9)
    
    RETURN @retid
END
GO
34 spock
 
14.11.13
12:31
прикольно получилось


CREATE FUNCTION dbo.convert10to36(num int)
RETURNS varchar(99)
AS
BEGIN  
    DECLARE @r varchar(99)
    
    SET @r = ''
    WHILE num > 0
        SELECT @r = char(
            CASE
                WHEN num % 36 < 10
                    THEN num % 36 + ascii('0')
                ELSE num % 36 + ascii('A') - 10
            END
        ) + @r, num = num / 36
        
    RETURN @r
END
GO

CREATE FUNCTION dbo.convert36to10(input varchar(99))
RETURNS int
AS
BEGIN
    DECLARE temp as char(1)
    DECLARE @ret as int
    DECLARE degree as int
    DECLARE i as int
    DECLARE @charcode as int
    
    SET @ret = 0
    SET i = 0
    SET degree = 0
    
    WHILE (LEN(input) - i) > 0 BEGIN
        SET temp = UPPER(SUBSTRING(input, LEN(input) - i, 1))
        SET @charcode = ASCII(temp)
        
        IF ((@charcode > 57) and (@charcode < 65)) OR (@charcode < 48) OR (@charcode > 90) BEGIN
            SET i = i + 1
            CONTINUE
        END
        
        IF (@charcode < 58)
            SET @ret = @ret + (@charcode - 48) * (POWER(36, degree))
        ELSE IF (@charcode < 91)
            SET @ret = @ret + (10 + @charcode - 65) * (POWER(36, degree))
            
        SET i = i + 1
        SET degree = degree + 1
    END
    
    RETURN @ret
END
GO

CREATE FUNCTION dbo.IncID(input char(9), @step int = 1)
RETURNS char(9)
AS
BEGIN
    DECLARE @retid as char(9)
    DECLARE @uribid as char(3)
    DECLARE @dec as int
    
    IF input IS NULL
        SET @retid = '         '
        
    SET @uribid = RIGHT(input, 3)
    SET @dec = dbo.convert36to10(LEFT(input, 6))
    SET @retid = dbo.convert10to36(@dec + @step)
    SET @retid = RIGHT('         ' + RTRIM(@retid) + @uribid, 9)
    
    RETURN @retid
END
GO
35 КонецЦикла
 
14.11.13
12:35
(33) Спасибо, этим тоже занимался, но оно и так прекрасно работает, в десятичном виде :)
Если бы там инфа расползалась или хранилась долгое время... Это служебные данные и заполняются очень быстро