Имя: Пароль:
1C
1С v8
insert в регистр сведений через ADODB
,
0 НеПридумалаНик
 
28.10.16
14:31
Добрый день,
Есть подписка на событие, а именно на открытие отчетов, где в обработчике: в рег.св.1 (непериодический, без регистраторов) пишется дата, имя отчета, пользователь. Сейчас в рег. более 60т. записей.
В принципе всё работало, до того момента, пока в один из отчетов, не добавилась работа с другим рег.св2 (непериодический, без регистраторов), который при открытии отчета читается/чистится, если необходимо, и при работе этого отчета пишется/читается.
Читается рег.св2 запросом ДЛЯ ИЗМЕНЕНИЯ. Пишется через СоздатьНаборЗаписей().
Начались конфликты блокировок (в базе одновременно присутствуют порядка 100 польз.).
Сейчас запись в рег.св1 отключена. Второй рег.св2 работает без проблем.
Но необходимо таки вернуть запись в рег.св1.

База серверная. Есть возможность insert-тить запись в рег.св1 непосредственно через ADODB, в той же обработке подписки на событие.
Вроде как локально работает.
Но что ожидать от этого решения в рабочих условиях? Насколько это правомерно?
Какие могут быть конфликты от такого:

Процедура ОткрытиеОтчетаОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт

Если Найти(Врег(СтрокаСоединенияИнформационнойБазы()), "FILE=") = 0 тогда
     SQL = ПроцПодключения();
     SQL.Execute("insert into [server].[basa].[dbo].[_InfoRg123] (...) values (...)");
     SQL.Close();
КонецЕсли;                  
    
КонецПроцедуры
1 LeReve
 
28.10.16
14:44
(0) >     SQL = ПроцПодключения();
Зачем функцию называть процедурой?
2 lubitelxml
 
28.10.16
14:46
Ну вообще политика 1с в версиях 8.х поменялась относительно прямой записи в БД, в отличие от 7.7. Но я бы все равно попробовал на тестовой и уже после этого делал вывод - взлетит или нет.
3 НеПридумалаНик
 
28.10.16
14:49
(1) потому что там там прописана логика на две попытки подключения, не получилось подключиться к одному серверу идем к другому... в общем, в данном случае, надо так))
4 MrStomak
 
28.10.16
14:51
(0) конфликты блокировок не так решаются.
И что это за подписка такая на открытие отчета?
5 MrStomak
 
28.10.16
14:53
(0) >>Читается рег.св2 запросом ДЛЯ ИЗМЕНЕНИЯ
На дворе 2016 год, конфигураций с режимом использования блокировок "Автоматический" сейчас хрен найдёшь.
6 НеПридумалаНик
 
28.10.16
14:53
(2) а как она поменялась? тестю я локально, в файловой базе, с условием >0
7 НеПридумалаНик
 
28.10.16
14:56
(4) как решаются? гуглила этот вопрос, но все равно не очень въезжаю, и не приветствуется менять всю конфу на другой уровень блокировок

подписка имеет обработчик, а обработчик - общий модуль ...
8 НеПридумалаНик
 
28.10.16
14:56
(5) так и есть, автоматический
9 НеПридумалаНик
 
28.10.16
14:57
вынуждена покинуть на время обсуждение, но я вернусь
10 Дык ё
 
28.10.16
15:00
(8) так жить нельзя :)
11 MrStomak
 
28.10.16
15:23
(7)
Для начала нужно объяснить, за каким хреном в отчете используются транзакции.
12 НеПридумалаНик
 
28.10.16
15:29
(11) я не могу это объяснить))) что вместо них использовать?
13 MrStomak
 
28.10.16
15:43
(12) Чтобы понять, что вместо них, нужно понять, для чего были нужны транзакции.
Явный вызов транзакции как бы подразумевает - пока я тут данные лопачу, все остальные ждите.
Другой отчет ожидаемо получает отлуп после 20 секунд ожидания.
Так и непонятно - а что такого там конкурентного пишется, что потребовались транзакции?
14 MrStomak
 
28.10.16
15:45
Предлагаемое решение через insert into как бы означает - а давайте писать вне транзакции.

Да давайте. Но зачем было использовать НачатьТранзакцию() вообще тогда?
15 LeReve
 
28.10.16
15:58
(12) например вообще не использовать транзакции в отчетах
16 НеПридумалаНик
 
28.10.16
16:07
(14) ну НачатьТранзакцию() нигде не используется, может фоново?! не знаю... пишется в оба регистра так

Набор = РегистрыСведений.РегСв.СоздатьНаборЗаписей();
Набор.Прочитать();
Запись = Набор.Добавить();
... //заносим значения
Набор.Записать();
17 НеПридумалаНик
 
28.10.16
16:08
(15) они и не используются...
18 MrStomak
 
28.10.16
16:10
(16) Описанная тобой конструкция ДЛЯ ИЗМЕНЕНИЯ не работает без транзакции, поэтому, если транзакции не используются, непонятно - зачем ее писать?

Сообщение возникает при записи в регистр №2? Как звучит сообщение - превышено время ожидание или взаимоблокировка?
19 НеПридумалаНик
 
28.10.16
16:10
(14) один в модулях встретилась НачатьТранзакцию() и та закомментирована
20 НеПридумалаНик
 
28.10.16
16:17
(18) откровенно говоря, ДЛЯ ИЗМЕНЕНИЯ добавила неосознанно
не помню текст ошибки, сейчас подниму журнал - посмотрю, но это не "превышение времени"
21 MrStomak
 
28.10.16
16:18
(19) От insert into ты чего ожидаешь? Думаешь, платформа как-то по другому записи пишет?

Если записывается очень большой набор и он долго пишется, то разбивай на маленькие наборы и "дозаписывай" через Записать(Ложь)
22 НеПридумалаНик
 
28.10.16
16:25
(21) ожидаю вставить запись в таблицу напрямую )))))
запись в каждый момент обращения одна
и она вставляется
но что будет, если все 100 пользователей ломанутся вставлять свои записи?
23 lubitelxml
 
28.10.16
16:33
(22) ну уж не все 100, обычно из 100 одновременно работающих что-то делают (непосредственно запись в БД) максимум 30... ИМХО
24 lubitelxml
 
28.10.16
16:33
(22) почитай про блокировки уже и сделай по-нормальному
25 MrStomak
 
28.10.16
17:01
(22) Да ничего не будет.
Вот ты собираешься писать Insert into, а откуда уверенность, что по ключу нет записи такой?
Нужно ведь, наверное, либо update делать, либо insert, в зависимости от состояния записи - есть она такая или нет?
То есть, получается, нужно искать будет эту запись сначала. А потом выполнять вставку, если записи нет. Причем транзакция поиска должна быть Serializable, чтобы гарантировать отсутствие этой записи после проверки, но до вставки.

Платформа то всё это делает, чтобы обеспечить надежную работу метода Записать()

Она также может не использовать serizlizable, если просто не будет давать писать указанный ключ в СУБД, если выполняется операция обновления регистра. Ведь если мы точно знаем, что вставки с этим ключом не будет - зачем весь регистр блокировать? Но это как раз и есть управляемый режим блокировок. Который ты использовать не хочешь, а искорежить базу прямыми инсертами тебе за радость.

Ну и другим программистам будет радость - не работают обработчики ПередЗаписью/ПриЗаписи регистра, не происходит регистрации в РИБ, нет записей в ЖР - сплошные радости.
26 НеПридумалаНик
 
28.10.16
21:25
(25) нет... чисто информационная таблица, кто (user), когда (datatime), какой отчет открыл, пофиг на ключ, в данном случае

Нет обработчиков ПередЗаписью/ПриЗаписи (кроме справочников и констант), ни одного документа нет. Чисто отчеты, которые тянут данные из других баз.
27 НеПридумалаНик
 
28.10.16
21:43
(24) читала... долго начала писать почему ничего не вычитала. Стерла - запуталась. Не понимаю я их в общем.
28 НеПридумалаНик
 
28.10.16
21:47
(24) цитата: "С независимым непереиодическим регистром сведений мне трудно представить пример необходимости наложения блокировки. " (из Регистр сведений и управляемые блокировки )

как раз мой случай... и тем не менее блокировка возникает
29 youalex
 
28.10.16
22:49
(28) структура регистра какая (измерения, ресурсы) ? Назначение регистра и полей?
30 НеПридумалаНик
 
28.10.16
23:01
(29) измерения:
датавремя,
объект (строка, имя объекта),
пользователь (строка, имя польз)

ресурсы:
Включен (число, всегда 1)

Назначение: сбор информации, кто (пользователь), когда (datatime), какой отчет (объект) открыл
31 НеПридумалаНик
 
28.10.16
23:05
(29) это был первый регистр, срабатывает в подписке
есть второй регистр, в отчете срабатывает

измерения:
дата создания (датавремя),
номер.док. (строка),
пользователь (строка)

ресурсы:
флаг (число, всегда 1) - на форме флаг включает
32 youalex
 
28.10.16
23:35
(30) возможно есть смысл убрать все эти поля из измерений - в  ресурсы(реквизиты). Измерение будет только одно - уид (строка(32 или 36)  или ссылка любого определенного типа, хоть Справочник.ВнешниеОтчетыИОбработки).
Т.е. в подписке будет что-то типа
НовыйУид = Справочники.ВнешниеОтчетыИОбработки.ПолучитьСсылку(Новый uuid());
НаборЗаписей.Отбор.уид.Установить(НовыйУид);

Очистку записей второго регистра - убрать. Это можно делать регламентным заданием, в нерабочее время.
33 MrStomak
 
28.10.16
23:36
(26) Записать(Ложь)
34 NcSteel
 
28.10.16
23:50
(0) Вон из профессии..
35 NcSteel
 
28.10.16
23:51
(34) + Посмотрел личку, Харьков... мда, вот и допрыгались.
36 НеПридумалаНик
 
29.10.16
00:07
(35) хотите политику обсудить? обновите в памяти правила ресурса и добро пожаловать в LIFE. Я здесь не за этим.
И не за тем, чтобы читать невоспитанный, высокомерный вздор (34) о том, где мое место
37 NcSteel
 
29.10.16
00:24
(36) Прикол в том, что вздор написан в 0.

А именно попытка забить гвоздь микроскопом.
38 НеПридумалаНик
 
29.10.16
00:28
(37) я очень рада, что три года назад вы, надеюсь, таки разобрались со своими блокировками тут v8: Подготовка к 1С специалисту и правильные блокировки по регистру бухгалтерии, как

не мешайте и мне разбираться со своими гвоздями и микроскопами, найдите объект для стёба в соседней теме
39 Кадош
 
29.10.16
00:36
вообще в (0) налицо нарушение лицензионного соглашения 1С. Куда смотрят модераторы, которые банят за всякую отвлеченную ерунду, я не понимаю
40 НеПридумалаНик
 
29.10.16
00:37
(33) в смысле Набор.Записать(Ложь) ?
Речь про это: "Ложь - записи будут дописаны к уже существующим в информационной базе записям" ?

попробую, спасибо
41 НеПридумалаНик
 
29.10.16
00:39
(39) не переживайте... возможно всё утрясется и я не пойду по такому радикальному пути
42 НеПридумалаНик
 
29.10.16
00:41
(39) потому и создала эту тему, поскольку не по себе от такого решения. А вообще конечно, грех великий, да чего уж там... инквизиторы обо мне плачут!
43 NcSteel
 
29.10.16
01:02
(38) Естественно, я же в этом специалист.
44 NcSteel
 
29.10.16
01:03
(43) А вообще советую все же почитать проф разработку ... + итс
45 youalex
 
29.10.16
01:08
(39) Вот это что ли?
"... не совершать и не допускать совершения третьими лицами следующих действий без специального письменного разрешения Правообладателя:
...вносить какие-либо изменения в ... содержимое баз данных и других наборов данных, в которых система хранит информацию"
46 НеПридумалаНик
 
29.10.16
01:11
(44) вы снова здесь!
вот спасибо, т.е. пока можно остаться в профессии?

Тут столько хороших специалистов, разъезжающих по темам на блатной козе, но мне повезло: третий день на форуме и только два таких проехались по моим темам. Вы и Кадош (забанили бедолагу). Убедительно попрошу, заходя на мои темы, припарковывать блатную козу на главной странице форума.
47 youalex
 
29.10.16
01:16
Кстати, говоря, вообще не обязательно эти логи писать в РС. Можно просто - в другую базу.  А отчет из сторонней базы можно построить и из 1С.
48 НеПридумалаНик
 
29.10.16
01:21
(47) сначала попробую (33), пожалуй
не получится - рассмотрю все остальные варианты
но в понедельник
49 trooba
 
29.10.16
01:24
(3) Не позорь седые кудри оракулов мисты.
50 НеПридумалаНик
 
29.10.16
01:26
(49) там-то что не так?
кстати... а вы блатную козу припарковали на главной странице форума? (46)
51 НеПридумалаНик
 
01.11.16
16:29
В завершение темы.
В данном случае, когда в РС пишется каждая сгенерированная запись через подписку (а уникальность вставляемых записей обеспечивает измерение Датавремя), вариант (33) особенно помог, спасибо MrStomak