Имя: Пароль:
1C
1C 7.7
v7: Блокировка таблиц при проведении документа
0 1Сергей
 
21.02.14
22:38
Пишу прямой запрос без использования ВК, на ADODB. При проведении хочу получить остатки по всем материалам.

В EM скуля запрос отрабатывает меньше секунды, в 1С зависает и отваливается по таймауту через некоторое время.

Давно читал, что вроде, 1С блокирует таблицы регистров и прочие в момент проведения документа. Так ли это? В этом моя проблема? Можно ли это обойти не сильно изменяя конфигурацию и не используя ВК?


        ТекстЗапроса = "
        |SELECT
        |    RegistrDvizh.SP5224 AS Material
        |    ,RegistrDvizh.SP5228 AS Ordin
        |    ,RegistrDvizh.SP9839 AS Firma
        |    ,SUM(RegistrItogi.SP5233 + RegistrDvizh.SP5233) AS OstatokMateriala
        |    ,SUM(RegistrItogi.SP5231 + RegistrDvizh.SP5231) AS BazovStoimost
        |    ,SUM(RegistrItogi.SP5232 + RegistrDvizh.SP5232) AS ValutStoimost
        |FROM
        |    (SELECT
        |        RegistrDvizh.SP5224
        |        ,RegistrDvizh.SP5228
        |        ,RegistrDvizh.SP9839
        |        ,CASE RegistrDvizh.DEBKRED
        |            WHEN 1 THEN 0-RegistrDvizh.SP5231
        |            ELSE RegistrDvizh.SP5231
        |        END AS SP5231
        |        ,CASE RegistrDvizh.DEBKRED
        |            WHEN 1 THEN 0-RegistrDvizh.SP5232
        |            ELSE RegistrDvizh.SP5232
        |        END AS SP5232
        |        ,CASE RegistrDvizh.DEBKRED
        |            WHEN 1 THEN 0-RegistrDvizh.SP5233
        |            ELSE RegistrDvizh.SP5233
        |        END AS SP5233
        |    FROM
        |        RA5237 AS RegistrDvizh
        |        INNER JOIN
        |            _1SJOURN AS JOURNAL
        |        ON
        |            (JOURNAL.IDDOC = '"+ИДДока+"')
        |            AND RegistrDvizh.DATE_TIME_IDDOC < JOURNAL.DATE_TIME_IDDOC
        |    WHERE
        |        RegistrDvizh.DATE_TIME_IDDOC > '"+ДатаНачалаПериода+"'
        |        AND RegistrDvizh.SP5224 in ("+ИДыМатериалов+")
        |        AND RegistrDvizh.SP5227 = '"+ИДСклада+"'
        |    ) AS RegistrDvizh
        |    LEFT JOIN
        |        (SELECT
        |            SP5224
        |            ,SP5228
        |            ,SP9839
        |            ,SP5231
        |            ,SP5232
        |            ,SP5233
        |        FROM
        |            RG5237 AS RegistrItogi
        |        WHERE
        |            SP5224 in ("+ИДыМатериалов+")
        |            AND SP5227 = '"+ИДСклада+"'
        |            AND PERIOD = CAST('"+ДатаПредыдущегоПериода+"' AS DateTime)
        |        ) AS RegistrItogi
        |    ON RegistrItogi.SP5224 = RegistrDvizh.SP5224
        |        AND RegistrItogi.SP5228 = RegistrDvizh.SP5228
        |        AND RegistrItogi.SP9839 = RegistrDvizh.SP9839
        |GROUP BY
        |    RegistrDvizh.SP5224
        |    ,RegistrDvizh.SP5228
        |    ,RegistrDvizh.SP9839
        |    ";
1 КонецЦикла
 
21.02.14
22:42
Используй 1С++, все это в три строки с помощью ВТ делается, в конструкторе
2 Torquader
 
21.02.14
22:42
Я бы через ADO в таблицы 1С вообще бы не лазил, так как может получиться совсем не то, что хотят.
3 1Сергей
 
21.02.14
22:44
(2) В чем принципиальное отличие прямого запроса 1С++ от чистого АДО? Наличие метапарсера и виртуальных таблиц?
4 1Сергей
 
21.02.14
22:46
Мне одмин не дает права на регистрацию длл
5 Torquader
 
21.02.14
22:47
(3) В правильном доступе к структуре таблиц.
6 1Сергей
 
21.02.14
22:49
(5) сам понял что сказал? структура таблиц - это то, что описано в dds-файле
7 Torquader
 
21.02.14
22:51
(6) Индексы в 1С отличаются от того, что ожидает ADO, а без индексов - зачем вам вообще лезть в таблицы ?
8 Torquader
 
21.02.14
22:51
Потом, стандартный драйвер ADO вообще с dbf не всегда правильно работает.
9 1Сергей
 
21.02.14
22:53
мне дбф не надо.

Ну, ты прав, конечно - много эффективнее использовать 1с++. Но, нет такой возможности
10 Torquader
 
21.02.14
22:55
(9) Просто, Codebase который внутри 1С, не совсем правильно индексы строит, и если работать без него, то можно получить совсем не то.
Проще договорится про dll, особенно, если её только в папку с программой положить.
11 Torquader
 
21.02.14
22:56
Или вы в sql решили заглянуть ?
12 1Сергей
 
21.02.14
22:56
всё в SQL
никаких DBF
13 Torquader
 
21.02.14
22:57
В sql блокировки живут в отдельных файлах, но, если открывается транзакция, то можно с ней "столкнуться".
14 Мигало
 
21.02.14
23:19
(6) Дятил. В DD/DDS описываетсся структрура, для отладки.
Реквизиты, например, справочника:
МойНеимоверноБольшойНДС, Число, 19, 2
МойНеимоверноБольшойСумма, Число, 19, 2

Отобразяться как: (P)МойНеимоверноБоль ;)

Структура БД в клюшках это набор произвольных полей вида SPхххх и предопределенных ID, PARENTID, CODE, DESCR, ISFOLDER etc.
Как для DBF так и для "всё в SQL никаких DBF"
Тебе в (2,5) сказали - "в правильном доступе к структуре таблиц"
1С++ работает в контексте клюшек. ADO - сбоку от контекста клюшек.

Вот, мля, что за люди - на лобке первый волос пробился - а все в гуру метят.
15 1Сергей
 
21.02.14
23:28
(14) Ну, ответь, гуру, дятлу. Моя проблема в блокировках или нет?
16 КонецЦикла
 
21.02.14
23:30
(15) Убей админа и получи доступ к плюшкам.
17 КонецЦикла
 
21.02.14
23:31
Кстати последние релизы уже давно не требуют админских прав вроде бы и регистрации насильной. Но могу ошибаться... когда-то для этой цели юзал vk loader.
18 1Сергей
 
21.02.14
23:32
(16) Знаешь, на мисте первая часть постов в стиле "какой автор mooduck" и только потом идёт вторая часть - с правильным ответом.
Может перейдём ко второй части? :)
19 1Сергей
 
21.02.14
23:36
мне надо будет сделать так, чтобы я проводил документы прямым запросом, а все другие - как прежде. но, чтобы результат проведения был одинаков. реально?
20 Мигало
 
21.02.14
23:39
(15) Походу дела проблема в нежелании вникать в "первую часть" с правильным ответом.
Ты эксперимент ставил ?
Или, гладя на форум с глазами срущей собаки, готов постоянно вопрошать "Моя проблема в блокировках или нет?"
(19) Реально
21 Torquader
 
21.02.14
23:39
(19) Ну, если в этот момент никто в базу не лезет (что можно сделать через блокировки или транзакции), то можно попробовать.
Реально даже в момент проведения основные итоги по периоду пересчитать - только вопрос - нужно ли.
22 Torquader
 
21.02.14
23:41
Самый главный вопрос - зачем ?
23 Мигало
 
21.02.14
23:42
(22) Хочет партии раскидать прямым запросом, например
24 Torquader
 
21.02.14
23:42
(23) И думает, что от этого будет лучше ?
25 Z1
 
21.02.14
23:42
(0) Это можно сделать одной командой даже на стандартном языке запросов. но лучше так не делать.
а то получиться как в анекдоте

-"Вы можете печатать 1000 знаков в мигуту"
-"Могу, но такая фигня  получается"
26 1Сергей
 
21.02.14
23:42
(21) т.е. прямой запрос от 1С++ не делает блокировок? Чет, не пойму к чему эта оговорка "если в этот момент никто в базу не лезет "
27 Мигало
 
21.02.14
23:43
(24) Быстрее - точно.
28 Torquader
 
21.02.14
23:43
(26) 1С++ работает через тоже соединение.
Если открыть ещё одно, то можно через два соединения сделать блокировку самого себя.
29 Torquader
 
21.02.14
23:44
(26) Например, 1С установила блокировку элемента справочника, а мы в него пишем - блокировка, то в файле ставится.
30 1Сергей
 
21.02.14
23:44
(25) черный запрос отрабатывает долго. Точнее док проводится секунду, но большой период проводится довольно долго
31 1Сергей
 
21.02.14
23:45
(29) в каком файле? вроде, всё же в скуле блокируется?
32 Z1
 
21.02.14
23:46
(3)
>>>  чем принципиальное отличие прямого запроса 1С++ от чистого АДО?

Ни в чем. sql серверу все равно откуда пришел запрос.

просто с 1с++ гораздо удобней работать + за счет некоторых фишек 1с++ выполняется быстрее чем ado имеется ввиду обработка
результата запроса на самом клиенте
33 Мигало
 
21.02.14
23:47
Может если "док проводиться секунду" и "большой период проводиться долго" будем выставлять на проведение месяц, дожидаться пока проведется. Закрывать 1С, открывать по новой и проводить следующий период (ну работает она криво с памятью) ?
Таки не дешевле кнопки потоплать чем огород городить ?
34 Z1
 
21.02.14
23:48
(4) ну это наверное не лечиться. (как прог и админ должны делать общее дело)
пожешь показать ему пост 32 из этой ветки.
35 Torquader
 
21.02.14
23:49
(31) Открытые на редактирование элементы блокируются в файле.
36 1Сергей
 
21.02.14
23:50
(32) я так и думал, что на скорость это не влияет
37 1Сергей
 
21.02.14
23:51
И потом, на скорость ведь не влияет - монопольно я сижу или нет?
38 Torquader
 
21.02.14
23:52
(37) А что SQL про монопольность вообще знает ?
39 Torquader
 
21.02.14
23:54
Ладно - мне пора спать - удачи вам в ваших начинаниях.
Если всё делать аккуратно, то всё получится.
SQL - вещь очень хорошая.
40 Z1
 
21.02.14
23:55
(15) скорее всего твоя проблема в коде из (0)
что ты этим кодом хочешь получить
как бы первая мысль а может не нужны остатки по всем матерьялам а только тем что есть в документе и.т.д.
41 Мигало
 
21.02.14
23:55
(38) Singe user
42 1Сергей
 
21.02.14
23:56
(40) я туда и передаю только список материалов
43 1Сергей
 
22.02.14
00:00
(39) спасибо, тебе
44 Z1
 
22.02.14
00:01
(30) ответь на
select @@version

и вообще поподробней о размере базы железе сервера и его дисковой системе
45 1Сергей
 
22.02.14
00:05
(44) на моей машинке SQL2000

А на боевой вообще 7.0
Там одмин очень консервативный - "работает - не трожь!"
Вот оно и работает уже лет 10, не меньше.
Базёнка около 12 гиг. 8 филиалов. пользаков около сотни
46 1Сергей
 
22.02.14
00:05
нетленка
47 Z1
 
22.02.14
00:06
>>> (32) я так и думал, что на скорость это не влияет
на какую скорость
если речь идет о скорости выполнения запроса ms sql
сервером - то не влияет.

Если речь о том как отрабатывается результат запроса
в самом модкле проведения то код на 1с++ выполняется быстрее хотя бы за счет типизации и получение ее сразу а не по каждой записи отдельно.
48 1Сергей
 
22.02.14
00:06
вот, надо за 6 лет все доки провести
49 1Сергей
 
22.02.14
00:07
(47) это понятно
50 Ёпрст
 
гуру
22.02.14
00:10
(0)
1cpp не требует регистрации в реестре и наличие админских прав..
+ наличие типизации на выходе, тебе же, при запросе в адо нужно еще и результат потом типизировать самому..
51 Ёпрст
 
гуру
22.02.14
00:12
а при массовом перепроведении.. нужно глядеть в сторону реконект найтив или переход на 2005-2008 скуль
52 1Сергей
 
22.02.14
00:12
(50) Это я уже реализовал


Функция ПолучитьОбъектПоИД(Тип, ИД, ТипИД)
    
    СтрокаИД = Прав("          " + ТипИД, 10)
            + Прав("          " + _StrToId(Лев(ИД, 6)), 10)
            + Сред(ИД, 7);
    
    ВнутренняяСтрока = "{"""+Тип+""",""0"",""0"",""0"",""0"",""0"","""+СтрокаИД+"""}";
    Возврат ЗначениеИзСтрокиВнутр(ВнутренняяСтрока);
    
КонецФункции // ПолучитьОбъектПоИД


Там в доках 10-15 строк, не критично
53 Z1
 
22.02.14
00:13
(42) Извени я не внимательно прочитал твой запрос  в 0

Вот тебе и ответ процентов на 99 этот список матерьялов ты получаешь в модуле проведения получаешь этот список (ИДыМатериалов+ )  на языке 1с  и очень нерационально тратя время которое особо ценно именно в модуле проведения.
54 Ёпрст
 
гуру
22.02.14
00:15
а так.. хинты воткни в текст запроса.. не будет задержки
55 1Сергей
 
22.02.14
00:17
(54) это как?
56 Z1
 
22.02.14
00:18
(45) а в 0 о каком сервере мы говорим
в sql200извесная ошибка замедления массового проведения
есть ли ошибка в sql 7 даже не помню.
кстати в 1с++ для этой ситуации реализован reconect

интересно а твой админ ездит на каком нибудь газ-21
даже если и ездит газ-21 то все равно его никак нельзя сравнить с современными машинами
57 Ёпрст
 
гуру
22.02.14
00:18
(54) (nolock) воткни во from после алияса к каждой таблички
58 1Сергей
 
22.02.14
00:20
беда в том, что оно вообще не проводится. Всегда вылетает по таймауту.
59 Z1
 
22.02.14
00:20
(54) не поможет. точнее для запроса то поможет но в целом нет.
60 Z1
 
22.02.14
00:23
(58) поставь как говорит 57  вылетать не будет
но надо будет очень аккуратно писать запросы.
интересно а ты можешь ответить почему вылетает по таймауту
61 Ёпрст
 
гуру
22.02.14
00:30
(0)
и еще:

1.воткни в регистр галку быстрая обработка движения и выкини соединение с журналом
2. выкини все нелепые case из текста запроса.. они там не нужны, всё делается с помощью умножения..
62 1Сергей
 
22.02.14
00:32
(61) от джёрнала уже избавился, сейчас кейсы грохну, спасибо
63 1Сергей
 
22.02.14
00:33
АДОДБ числовые поля возвращает строками. Так и должно быть?
64 Ёпрст
 
гуру
22.02.14
00:33
3. запрос тоже какой-то бредовый.

нужно делать union all запроса к табличке итогов и таблички движений( если останки еще не на ТА ), но ни как это не левое соединение.. ты половину просто прое..л
65 Ёпрст
 
гуру
22.02.14
00:36
посмотри готовые запросы тут


http://script-coding.com/v77tables.html#3.4.2.2.
и тут
http://script-coding.com/Direct_queries.html#7.
66 Ёпрст
 
гуру
22.02.14
00:38
но учти, если делать через 1cpp, то там в виртуальной табличке итогов реализован более правильный вариант - расчет итогов в зависимости от даты - либо расчет от ТА, либо расчет от предыдущего итога, в зависимости от даты
67 Ёпрст
 
гуру
22.02.14
00:38
т.е, он тупо быстрее будет
:)
68 1Сергей
 
22.02.14
00:39
(65) спасибо
(66),(67) Это понятно
69 Ёпрст
 
гуру
22.02.14
00:48
+66 т.е остаток не на ТА получается либо "прибавлением" движений к предыдущему итогу, либо "отнятием" движений от итога на ТА, если дата ближе к концу периода.
70 1Сергей
 
22.02.14
00:55
переделал


                    ТекстЗапроса = "
                    |SELECT
                    |    Materiels.SP5224 AS Material
                    |    ,Materiels.SP5228 AS Ordin
                    |    ,Materiels.SP9839 AS Firma
                    |    ,SUM(Materiels.SP5233) AS OstatokMateriala
                    |    ,SUM(Materiels.SP5231) AS BazovStoimost
                    |    ,SUM(Materiels.SP5232) AS ValutStoimost
                    |FROM
                    |    (SELECT
                    |        RegistrDvizh.SP5224
                    |        ,RegistrDvizh.SP5228
                    |        ,RegistrDvizh.SP9839
                    |        ,RegistrDvizh.SP5231 * (1-RegistrDvizh.DEBKRED-RegistrDvizh.DEBKRED) AS SP5231
                    |        ,RegistrDvizh.SP5232 * (1-RegistrDvizh.DEBKRED-RegistrDvizh.DEBKRED) AS SP5232
                    |        ,RegistrDvizh.SP5233 * (1-RegistrDvizh.DEBKRED-RegistrDvizh.DEBKRED) AS SP5233
                    |    FROM
                    |        RA5237 AS RegistrDvizh (nolock)
                    |        INNER JOIN
                    |            (SELECT
                    |                DATE_TIME_IDDOC
                    |            FROM
                    |                RA5237 (nolock)
                    |            WHERE
                    |                IDDOC = '"+ИДДока+"'
                    |            GROUP BY
                    |                DATE_TIME_IDDOC
                    |            ) AS JOURNAL
                    |        ON
                    |            RegistrDvizh.DATE_TIME_IDDOC < JOURNAL.DATE_TIME_IDDOC
                    |    WHERE
                    |        RegistrDvizh.DATE_TIME_IDDOC > '"+ДатаНачалаПериода+"'
                    |        AND RegistrDvizh.SP5224 in ("+ИДыМатериалов+")
                    |        AND RegistrDvizh.SP5227 = '"+ИДСклада+"'
                    |    UNION ALL
                    |    SELECT
                    |        SP5224
                    |        ,SP5228
                    |        ,SP9839
                    |        ,SP5231
                    |        ,SP5232
                    |        ,SP5233
                    |    FROM
                    |        RG5237 AS RegistrItogi (nolock)
                    |    WHERE
                    |        SP5224 in ("+ИДыМатериалов+")
                    |        AND SP5227 = '"+ИДСклада+"'
                    |        AND PERIOD = CAST('"+ДатаПредыдущегоПериода+"' AS DateTime)
                    |    ) AS Materiels
                    |GROUP BY
                    |    Materiels.SP5224
                    |    ,Materiels.SP5228
                    |    ,Materiels.SP9839";



ругается

ТаблицаОстатковМатериалов.ОстатокМатериала = DBRecordSet.Fields("OstatokMateriala").Value;
____________________док___: Тип переменой не поддерживается
71 Ёпрст
 
гуру
22.02.14
01:05
в первом запросе, п..ц  же написан :)
72 Ёпрст
 
гуру
22.02.14
01:05
зачем тебе все движения регистра меньше позиции документа ???
:)
73 Ёпрст
 
гуру
22.02.14
01:07
ну и.. подзапрос там ни разу не нужен, там нужно просто передать позицию дока в запрос  и ограничить период 2-мя датами.. пред дата итога и позиция дока.. усё..
74 1Сергей
 
22.02.14
01:07
(72)

                    |    WHERE
                    |        RegistrDvizh.DATE_TIME_IDDOC > '"+ДатаНачалаПериода+"'
75 1Сергей
 
22.02.14
01:09
(73) а как переделать позицию дока в что-то подобное "200801149J9W9CFI92NUZ00"?
76 1Сергей
 
22.02.14
01:25
Всё заработало, спасибо Ёпрст !!!!
77 1Сергей
 
22.02.14
01:26
ну, и всем принявшим участие, тоже спасибо
78 Z1
 
22.02.14
09:32
(77)
Переделай  ado на 1c++
убери (nolock) хотя это и не очень принципиально именно здесь
сделай типизацию входных параметров sql запроса
и типизацию результирующего множества
получишь еще суммарный выигрыш этой сессии
процентов 15-20% ( а может и больше )
и  меньшую нагрузку на сам ms sql сервер ( за счет меньшего времени блокировки и за счет то что нет лишнего conecta).

ну и для 100 пользователей купите хороший сервер (само железо) и ms sql 2008 или sql 2012 ( ну и правильно все это настроить - судя по ветке как бы очень сомнительно что твой админ сможет все грамотно настроить)
как бы эти вложения очень быстро окупаются и обоснование покупки железа с sql2008 для руководсва очень понятны чем обоснование
того что переписал какой-то один мифический запрос на какой-то другой мифический запрос.
79 DrZombi
 
гуру
22.02.14
10:04
(0) Пиши всегда в запросах "NOLOCK"

Жесть. я бы тебя за такой запрос высек бы :)
Ты же своим запросом вообще захватываешь таблицу монопольно. :)
80 DrZombi
 
гуру
22.02.14
10:05
(78) Толку? Ты посмотри. Он обращается к журналу документа в монопольном режиме, без NOLOCK-а :)
81 Z1
 
22.02.14
10:31
(80) Правильных советов для (0) в ветке дано достаточно много.
Как (0) ими воспользуется или нет это его проблемы,
ну также кто-то другой может тоже для себя что либо полезное почерпнет из ветки.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.