Вход | Регистрация



Редактирование записей SQL из 1С

Редактирование записей SQL из 1С
Я
   yurii-syrkin
 
22.08.18 - 18:14
Всем здравствуйте. Скорее всего информации на эту тему много, но я ничего не нашёл применительно к моему случаю. Итак, необходимо в огромном количестве документов установить значение реквизита Подразделение. Силами 1С эта операция выполнялась неделю и завершилась процентов на 10. Решил попробовать напрямую в SQL. Подразделение это ссылка и на уровне SQL имеет тип массив. То есть просто текстовым запросом через UPDATE решить не получается, ну или я не понимаю как это сделать. Подскажите пожалуйста как это реализовать.
 
 
   Cyberhawk
 
1 - 22.08.18 - 18:35
Так тебе потом пади еще и в движениях документов надо подразделение будет добавить?
   Cyberhawk
 
2 - 22.08.18 - 18:35
А если нет, то что у тебя там 10 недель работает, не ясно. Кривизна рук скорее всего.
   Cyberhawk
 
3 - 22.08.18 - 18:36
Как устанавливешь рассказывай, и забудь про СКЛ
   Вафель
 
4 - 22.08.18 - 18:38
основная проблема в том что документы потом нужно перепровести. вот на это все время и уйдет все равно
   yurii-syrkin
 
5 - 22.08.18 - 18:39
Нет, в движениях пока ничего делать не надо. Просто документы разных типов. Каждого типа примерно от 100000 до 300000. Днём пользователи работают. Обработку приходится запускать по ночам
   Cyberhawk
 
6 - 22.08.18 - 18:47
Замер времени делал?
   Cyberhawk
 
7 - 22.08.18 - 18:47
И что там за база - биллинг что ли или консолидированная какая?
   yurii-syrkin
 
8 - 22.08.18 - 18:50
Да, консолидированная, по нескольким филиалам, самописная. Да замер делал, ничего особенно тормозящего нет, просто много документов.
   Cyberhawk
 
9 - 22.08.18 - 18:51
Показывай код тогда
   Cyberhawk
 
10 - 22.08.18 - 18:51
100 объектов в секунду в одном потоке можно писать в БД - факт
 
 Рекламное место пустует
   Вафель
 
11 - 22.08.18 - 18:55
чтоб апдейт сделать тебе нужно бинари предстваление гуида узнать.Его узнать можно в талице справочника подразделения
   МихаилМ
 
12 - 22.08.18 - 19:02
(0)
в какой субд у Вас есть тип массив ?
   yurii-syrkin
 
13 - 22.08.18 - 19:06
(11) Да, я этот бинари определяю запросом. В 1С он имеет тип COMSafeArry
   yurii-syrkin
 
14 - 22.08.18 - 19:06
СУБД MS SQL 2014
   ERWINS
 
15 - 22.08.18 - 19:08
сделай update
минут 10, не больше
   ERWINS
 
16 - 22.08.18 - 19:09
в 1с есть функция показывающая в как именуются поля
   yurii-syrkin
 
17 - 22.08.18 - 19:09
Код:
ТекстЗапроса = "USE [" + мИмяБазы + "]
                    |GO
                    |    
                    |UPDATE [dbo].[_" + СтрТаблицаОбъектов.ИмяТаблицыSQL + "]
                       |SET [_" + СтрТаблицаОбъектов.ИмяПоляSQL + "] = <_IDRRef, binary(16),>     
                    | WHERE <Условия поиска,,>
                    |GO"

Только непонятно что писать в условии и в SET.
В условии надо написать типа <> Справочник.ПодразделенияОрганизаций.ПустаяСсылка(), а в SET Справочник.ПодразделенияОрганизаций.НайтиПоКоду("0000005")
   yurii-syrkin
 
18 - 22.08.18 - 19:11
(15) Да это понятно, что быстро. Как быть с ссылочными типами?
   Cyberhawk
 
19 - 22.08.18 - 19:11
Да не, зачем ты код прямого запроса показываешь
Показывай код, который у тебя неделю работал
   yurii-syrkin
 
20 - 22.08.18 - 19:14
(19) Да что его показывать то
Для Каждого СтрТаблицаДокументов Из ТаблицаДокументов Цикл
   ДокументОбъект = СтрТаблицаДокументов.ДокументСсылка.ПолучитьОбъект();
   ДокументОбъект.Подразделение = Подразделение;
   ДокументОбъект.ОбменДанными.Загрузка = Истина;
   ДокументОбъект.Записать();
КонецЦикла;
   vitkhv
 
21 - 22.08.18 - 19:19
(13) COMsafearay это ты через ADO  получаешь, по умолчанию. А так там обычный bynary16 в апдейте будет так set fldxxxref = 0x0000000000000000
Здесь почитай там обсуждение и ссылки как с 1с таблицами и данными работать напрямую из mssql http://www.sql.ru/forum/1289996-a/dannye-1s
   nicxxx
 
22 - 22.08.18 - 19:19
ничего сложного
запускаешь обработку http://catalog.mista.ru/public/147147/
находишь имя таблицы справочника подразделений
делаешь запрос SELECT * FROM _ReferenceXXX WHERE _code = '0000005'
берешь из результата поле _IDRRef, помещаешь его в свой запрос в секцию SET
в секцию WHERE если надо условие, исключающее пустую ссылку, надо написать WHERE _fldXXX <> 0x00000000000000000000000000000000
здесь _fldXXX  - имя поля Подразделение в документе
   vitkhv
 
23 - 22.08.18 - 19:25
(22) мне кажется уж лучше сразу инструменты разработчика скачать, там все есть, чем эти отдельные обработки.
   yurii-syrkin
 
24 - 22.08.18 - 19:27
(22) Да просмотреть поля можно и без обработки. Также перебрал ПолучитьСтруктуруХраненияБазыДанных(). Вот получается Result.Fields("_IDRRef").Value в таблице подразделений возвращает COMSafeArry в отладчике. Когда на нем нажимаю F2 открывается массив из 16 элементов, каждый из которых число 2-3 знаков.
   yurii-syrkin
 
25 - 22.08.18 - 19:29
Как этот массив запросом UPDATE записать в строки таблиц документов? Имя таблиц документов и имя поля "Подразделение" на уровне SQL уже известны
   vitkhv
 
26 - 22.08.18 - 19:31
(25) это не массив, это ado массив возращает
   ebttlh
 
27 - 22.08.18 - 19:32
(0) не занимайся дичью. Разбей на несколько потоков и записывай в транзакции по 5000 элементов. Все на 1с ессно
   yurii-syrkin
 
28 - 22.08.18 - 19:34
(27) Да ляжет база. Она с одним то потоком кряхтит
   vitkhv
 
29 - 22.08.18 - 19:35
(25)Делаешь селект к справочнику подразделения, находишь idrref нужного подразделения, копирует его в буфер. И в апдейт в секцию set fldxxx =  0х0000000000000, вместо 0x000000000000 вставляешь значение из буфера. Запускаешь и радуешься.
   yurii-syrkin
 
30 - 22.08.18 - 19:36
Да и вообще, комрадам думаю интересно будет узнать как напрямую в SQL записывать ссылочные типы
   ebttlh
 
31 - 22.08.18 - 19:36
(28) апгрейдь железо
   ebttlh
 
32 - 22.08.18 - 19:37
(30) это долбоебизм и мне неинтересно
   vitkhv
 
33 - 22.08.18 - 19:38
(30) уже давно все пережевано,я ж тебе даже ссылку дал. А ты тут про какой-то простой апдейт
 
 
   vitkhv
 
34 - 22.08.18 - 19:39
(30) там по ссылке как idrref самому генерировать без 1с и чтоб 1с их хамала, без падения производительности.
   vitkhv
 
35 - 22.08.18 - 19:41
(30) я обмены пишу на уровне mssql между базами 1с. Сам на уровне mssql документы создаю в 1с. Уже на этом столько тумаков понабивал, что пипец
   ebttlh
 
36 - 22.08.18 - 19:43
(35) сколько баз убил?
   yurii-syrkin
 
37 - 22.08.18 - 19:43
(35) Быстро получается?
   vitkhv
 
38 - 22.08.18 - 19:45
(36) нисколько.
(37) моментально. Там же в тесте и время показано инсертов.

Не я один такой, кто напрямую обмены на уровне nssqk пишет.
   vitkhv
 
39 - 22.08.18 - 19:46
(38) mssql грёбаный т9
   Cyberhawk
 
40 - 22.08.18 - 19:50
(20) Доп. свойства устанавливать еще надо, на которые завязаны, например, всякие подписки / обмены. Что за конфа-то?
   youalex
 
41 - 22.08.18 - 20:01
(0) >> Подразделение это ссылка и на уровне SQL имеет тип массив.

Это где такое есть,тип массив?
   vitkhv
 
42 - 22.08.18 - 20:03
(41) это ado так ему возвращает. Она по умолчанию бинарники в массивах возращает
   vitkhv
 
43 - 22.08.18 - 20:05
(40) ему ещё их надо будет в таблицу изменений прописать, как я понял из его кода, что бы по обмену ушло.
   youalex
 
44 - 22.08.18 - 20:27
Если коды (или наименования. или любое другое "родное" скулю поле) уникальны для подразделений, то можно не преобразовывать, как вариант сделать через переменные, типа:

declare @podr1 binary = (Select _idref from _RefПодразделения Where code ='001')

и дальше в апдейте использовать их.

но проще их тупо выдернуть селектом и тупо проставить литералами.
   nicxxx
 
45 - 22.08.18 - 20:38
(44) ему уже 2 раза об этом сказали. человек с 2009 года на форуме.....
   Cyberhawk
 
46 - 22.08.18 - 20:40
(43) Это можно, наверное, и потом сделать. По всем объектам, где подразделение заполнено )
   Franchiser
 
47 - 22.08.18 - 21:32
Проще ИР запустить, план запроса посмотреть
   vitkhv
 
48 - 22.08.18 - 21:33
(45) конечно если топикастер пошёл сложным путем с адо, а не тупо отрыл ssms и не сделал то, что ему советуют, то ему лучше с прямыми апдейтами не шутить.
   vitkhv
 
49 - 22.08.18 - 21:37
(46) можно и потом. Но если топикастер рассчитывает, что он адейтнит табличку заголовков документа и все дальше само как в 1С, то он глубоко ошибается. 1С не использует триггеры севера БД и все необходимые события обрабатывает сама.
 
 Рекламное место пустует
   Salimbek
 
50 - 22.08.18 - 22:26
(27) Поддерживаю.
(28) Ну конечно, ты же заставляешь систему записывать данные после каждого документа. А если по 5000 документов, которые будут заполнены в доли секунды, потом фиксируешь транзакцию, что займет пару секунд, т.к. и блокировка будет один раз наложена и писать будет сразу блок данных, что проще оптимизатору и диску. И в разные сессии лучше раскидать работу с разными типами документов, тогда не будет взаимных блокировок.
   Cyberhawk
 
51 - 22.08.18 - 22:42
"в разные сессии лучше раскидать работу с разными типами документов, тогда не будет взаимных блокировок" // Если документы не входят в последовательность, бгг
   vitkhv
 
52 - 22.08.18 - 22:44
(50)Даже если будет делать по 5000 в одной транзакции, сильно делу не поможет, такой уж mssql сервер. А если у автора ссд так вообще ни о чем.
   Salimbek
 
53 - 22.08.18 - 23:46
(52) Тестировал? Я вот, на файловой Рознице тестировал: без транзакции загрузка 70000 записей занимала минут 5-10, в транзакции - несколько секунд. Объемов как в (0) у меня нет, но что мешает автору потестить?
(51) Так ведь у него чистая запись без проведения вроде? Я предположил, что там только таблицы самих документов будут затрагиваться. Но спорить не буду, не проверял.
   nicxxx
 
54 - 23.08.18 - 01:06
(53) Написано же "mssql server". Причем тут твоя файловая розница? В серверной версии похрену, в транзакции на 5000 строк запись будет или по-одной.
   vitkhv
 
55 - 23.08.18 - 03:38
(54)так рождаются мифы )))
   vitkhv
 
56 - 23.08.18 - 03:43
(53) я все тестирую.
С таким поведением mssql столкнулся ещё во времена 77, когда на dbf в транзакции получали суперускорение, а на серверной версии ничего. Тогда же читал и объсняние этому феномену. С тех пор ничего не изменилось.
   Nikoss
 
57 - 23.08.18 - 06:18
(56) так и какое объяснение этому феномену?

И что вообще подразумевается под поднятием "записать в транзакции"? НачатьТранзакцию -> запись 5000 документов -> ЗафиксироватьТранзакцию?
   ADirks
 
58 - 23.08.18 - 06:50
(0) Берёшь Profiler, записываешь штатно 1 документ, смотришь на запросы, которые 1С шлёт. По образу и подобию пишешь апдейты.
   vitkhv
 
59 - 23.08.18 - 07:36
(57) что-то с эксклюзивностью доступа, если я правильно помню.
   vitkhv
 
60 - 23.08.18 - 07:38
(58) начнет 1С в тот момент config опрашивать ну и проапдейтит его автор гыгы
   vitkhv
 
61 - 23.08.18 - 07:51
(57) именно это и подразумевает.
   ADirks
 
62 - 23.08.18 - 08:19
(57) в DBF (в семёрке) так транзакционный механизм устроен. До завершения транзакции всё пишется в отдельные файлы, а при завершении пачкой вкидывается в основные файлы. И это драматически быстрее, чем обычный способ записи. Но опять же, надо без фанатизма, т.к. при большом размере транзакции эффект м.б. и обратным.

(60) да и ладно, мне не жалко
ещё есть прикольная шутка про rm -rf /
   vitkhv
 
63 - 23.08.18 - 08:35
(62) значит правильно помню. Фактически доступ эксклюзивный, на запись. Видимо и в файловой версии 1с 8 также.
   Salimbek
 
64 - 23.08.18 - 11:09
(62) А для mssql тоже подтверждаешь, что транзакции не ускоряют? Я вот (63)-му не верю, а тебе - верю.
   ebttlh
 
65 - 23.08.18 - 11:14
(64) Зачем кому-то верить, если можно самому проверить??? Записывать в транзакции порциями и многопоточная обработка это офиц. рекомендация 1С с ИТС, и она блеать работает! Ускоряет в неск. десятков раз. Вместо этого тут развели какую-то гомосятину.
   ebttlh
 
66 - 23.08.18 - 11:22
У автора железо дохлое, предлагать лечить это прямыми запросами это идиотизм.
   timurhv
 
67 - 23.08.18 - 11:26
(0) Вы делаете поиск и замену? Какое условие отбора документов по подразделениям?
(65) Во-первых, будут блокировки пользователям.
Во-вторых, SQL-запрос все-равно быстрее.
   rphosts
 
68 - 23.08.18 - 11:28
(0)>Подразделение это ссылка и на уровне SQL имеет тип массив.
Ссылка из 1С на сиквеле это никакой не массив

(8) Ну так запусти в 100500 нитей одновременно если как ты рассказываешь ни во что не упирается.
   rphosts
 
69 - 23.08.18 - 11:29
(60) ну если и на это нет знаний - лучше вообще не лезть в базу: база целее будет
   rsv
 
70 - 23.08.18 - 11:29
(0) ...если такой путь решения то откройте штатный sql ms и выполнитн update.Он не сложный.
   ebttlh
 
71 - 23.08.18 - 11:31
(67) Во-первых если документ не будет проводиться, то не будет никаких блокировок. Во-вторых 1С сама и отправляет этот самый SQL-запрос. Херню не несите.
   timurhv
 
72 - 23.08.18 - 11:39
(71) С первым утверждением согласен. Со вторым - нет, хотя бы потому что мы получаем объект и на практике разница будет заметна на больших объемах в х10-100 раз.
   nicxxx
 
73 - 23.08.18 - 11:41
(66) Как раз из-за дохлого железа прямыми запросами будет быстрее
   unregistered
 
74 - 23.08.18 - 11:49
Запустить фоновыми заданиями в несколько потоков порциями по 100 - 500 документов. И пусть себе шелестит потихонечку. Хоть всю неделю. В худшем случае пользователи чуть подвисать будут при работе в некоторых операциях.

Прямым запросом конечно будет быстрее, но делать следует осторожно, чтобы быть уверенным, что всё делается корректно - меняется нужное поле, на нужное значение и нет необходимости обновлять никакие связанные поля и таблицы (планы обменов, записи в регистрах, последовательностях и пр.).
   Жан Пердежон
 
75 - 23.08.18 - 11:53
(0) Что за конфа, и что за доки, если не секрет?
Смотрел какие доки и почему медленно пишутся, что у тебя происходит при записи? Может ещё что-то стоит добавить в ДопСвойства?
   Cyberhawk
 
76 - 23.08.18 - 11:57
(75) Повторюша
   vitkhv
 
77 - 23.08.18 - 11:58
(64) Так это для тебя предмет веры. Ну верь дальше. Я с верующими не спорю.
   vitkhv
 
78 - 23.08.18 - 11:59
(65) многопоточная обработка, естественно ускоряет. В одном потоке вы там хоть убейтесь, нифига не добъетесь.
   vitkhv
 
79 - 23.08.18 - 12:02
(65) У меня разузлование и расчет себестоимости в нескольких потоках идут. Так тут скорость прямо пропорционально зависит от количества ядер. Пока диски не станут затыкаться.
   Salimbek
 
80 - 23.08.18 - 12:16
(77) Ты чего докопался? Ну да, я тебе НЕ верю на 100%, и именно потому, что это НЕ предмет веры. А далее есть авторитет, и именно поэтому я твое мнение услышал и принял к сведению, но прошу подтверждения у более авторитетного человека. А Дрикса я еще по 1с++ знаю и потому его мнение для меня будет практически 100% достоверно. А твое я так НА ВЕРУ не приму, ты уж извини.
   vitkhv
 
81 - 23.08.18 - 12:47
(80)ну раз вы верите человеку так как пересекались на этом форуме по 1С++. То тогда уж зацените мои художества на ToySQL прародительнице 1С++ в части доступа к MSSQL http://www.sql.ru/forum/231377/sortirovka-v-zaprose-po-chislovomu-polu?hl=

с той поры много воды утекло.
   Borteg
 
82 - 23.08.18 - 12:56
(20) ни транзакции ни потоков на такую базу где 100-300к документов разных видов?
   Salimbek
 
83 - 23.08.18 - 13:09
(81) Опять логическая ошибка. Верю не потому, что "пересекались на этом форуме по 1С++", а по уровню продемонстрированных знаний.
На этом предлагаю закончить эту неблагодарную тему.
   ADirks
 
84 - 23.08.18 - 13:09
(64) Для SQL версии, насколько я помню, эффект был, когда остатки штатными запросами считались. Т.е. на клиенте кэшировались остатки по регистрам. А так используется транзакционный механизм MS SQL, и ему без разницы размер транзакции (лишь бы transaction log с tempdb не лопнули).
Поскольку в моих конфах практически нет штатных запросов, то я разницы не наблюдаю.

Ну и так уж доверяешь ты мне зря :)
Всё надо проверять.
   vitkhv
 
85 - 23.08.18 - 13:28
(84)да на 77 есть метод выборки из регистров не помню как называется, никакие прямые запросы не могли превзойти. Правда если на ТА. Если задним числом перепроводить, тогда все, только прямые запросы.
   vitkhv
 
86 - 23.08.18 - 13:35
(83) да только высказался ты прям по станиславскому.
(84) это называется "не сотвори себе кумира" или "доверяй но проверяй"


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует