|
Как установить блокировку по полю документа? | ☑ | ||
---|---|---|---|---|
0
Лунтик
18.11.19
✎
16:51
|
Бухгалтерия предприятия, редакция 3.0 (3.0.73.38), 1С:Предприятие 8.3 (8.3.15.1489)
Конфигурация: Режим управления блокировкой данных =Управляемый, РежимСовместимости = 8,3,12 Объект: Режим управления блокировкой данных=Автоматический Как заблокировать несколько документов по полю? (чтобы не допустить создания еще одного документа с таким же входящим номером?) Нумератор не используется Ошибка при установке значения НачатьТранзакцию(); Блокировка = Новый БлокировкаДанных; БлокировкаДанных = Новый БлокировкаДанных(); ЭлементБлокировки = БлокировкаДанных.Добавить("Документ.СчетФактураПолученный"); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.УстановитьЗначение("НомерВходящегоДокумента","УТ-0000140"); <-- ошибка У пространства блокировок Документ.СчетФактураПолученный не существует поля с именем НомерВходящегоДокумента Но, такое поле у документа есть точно. |
|||
1
dezss
18.11.19
✎
16:55
|
Синтаксис:
УстановитьЗначение(<ПолеПространстваБлокировок>, <БлокируемоеЗначение>) Для пространств, указанных ниже поддерживается поле Ссылка, а также все поля, указанные в свойстве "Поля блокировки данных" данного объекта метаданных: Справочник.<имя>; Документ.<имя> ПланОбмена.<имя>; ПланСчетов.<имя>; БизнесПроцесс.<имя>; Задача.<имя>; ПланВидовРасчета.<имя>; ПланВидовХарактеристик.<имя>. Продам СП, дорого. И еще один момент. Блокировка блокирует именно данные в базе. Она не поможет, если Вы хотите заблокировать создание новых данных. |
|||
2
ptiz
18.11.19
✎
16:56
|
(0) Какое отношение имеет управляемая блокировка к "чтобы не допустить создания еще одного документа с таким же входящим номером"?
|
|||
3
dezss
18.11.19
✎
16:59
|
А тут нужно именно ограничение на создание документа с таким же входящим номером. Это необходимо решать на этапе ввода, проверке заполнения и/или записи документа.
|
|||
4
Капитан Джек Воробей
18.11.19
✎
17:13
|
(0) А контроль уникальности не катит?
|
|||
5
Лунтик
18.11.19
✎
21:19
|
(3) dezss, а при создании записей в регистре, тоже бесполезно блокировать измерение? Я имею в виду, что если заблокировать измерение №1 (скажем склад="Главный склад"), то останется возможность добавить запись с этим складом (скажем "Главный склад"+"товар")?
(4) контроль уникальности не прокатит, потому что уникальность должны отсекаться дубли не в Номере. Вообще, при создании документа сначала делается проверка на наличие дубля. Но в час пик где-то процентов 5 все-таки дублируются, т.е. два процесса делают эту проверку одновременно. Остается, наверное, только проверка после записи, но до завершения транзакции. Но тогда, наверное, оба документа будут откатываться - они же одновременно все делают, одновременно и получат информацию о наличии дубля. Или, наоборот, ни один из них не получит такой информации, потому как эта информация еще в незавершенной транзации. Что делать-то? Выносить этот входящий номер в отдельный регистр? |
|||
6
Сияющий в темноте
18.11.19
✎
22:52
|
для документа блокировка только по ссылке возможна,чтобы по номеру,его нужно добавлять в поля блокировки,и опять же,оно будет использоваться для поиска существующих.
вы можете заблокировать всю таблицу,тогда никто и ничего в ней создать не сможет,пока ваша транзакция не завершиться. |
|||
7
Лунтик
19.11.19
✎
08:11
|
Надо же! поля блокировки - это в метаданных объекта, а я упираюсь конструктор ищу!
По ним индекс, наверное, отдельный создается, да? И жаль, что в расширении они не переопределяются. Или в последних версия переопределяются? |
|||
8
Лунтик
19.11.19
✎
08:34
|
У меня не дает создать новый документ с таким же номером. Супер!
Как бы теперь в расширение это дело вогнать? Попробую создать пустой регистр и блокировать в нем поля, не создавая записей... Никто так не пробовал? |
|||
9
dka80
19.11.19
✎
09:45
|
(8) пиши в расширении вручную эти метаданные. Возможно, он даже ругнется при сохранении. Но в режиме Предприятие работать будет
|
|||
10
Лунтик
19.11.19
✎
10:48
|
(9) круто!! а как?
дСсылка.Метаданные().ПоляБлокировкиДанных имеет тип списокПолей, и у него нет метода Добавить или ты имел в виду что-то другое? |
|||
11
D_E_S_131
19.11.19
✎
12:01
|
Пока данные в базу не записаны, никак не узнаешь можно или нельзя вводить документ с таким значением поля "Номер входящий". Как и зачем вообще вводить в базу один и тот же документ в нескольких сеансах?
|
|||
12
Лунтик
19.11.19
✎
12:10
|
(11) несколько потоков загружают данные из другой системы.Если один и тот же главный документ является основанием для нескольких подчиненных документов, то это главный иногда (не всегда) прогружается больше одного раза. Похоже это происходит когда подчиненные грузятся в паралельных потоках.
|
|||
13
Cyberhawk
19.11.19
✎
12:19
|
Создавай предварительно (в отдельной транзакции) элемент справочника с номером-кандидатом, его и блокируй (от момента проверки до завершения транзакции записи)
|
|||
14
Cyberhawk
19.11.19
✎
12:20
|
+(13) Уникальность элементов справочника должна быть обезпечена само собою
|
|||
15
Cyberhawk
19.11.19
✎
12:23
|
Хотя можно и без записи в БД
|
|||
16
Лунтик
19.11.19
✎
12:24
|
(13) а после завершения стирать? т.е. сколько одновременно объектов грузится, столько и строчек в справочнике? потом они стираются и заново используются, да?
|
|||
17
Cyberhawk
19.11.19
✎
12:34
|
(16) "Стирать" можно только когда параллельная загрузка полностью завершится
|
|||
18
Cyberhawk
19.11.19
✎
12:39
|
Но вообще целевой алгоритм зависит от способа разрешения коллизии.
Если нужен незамедлительный отлуп и он никак не обыгрывается, то упр. блокировка не подходит, а подходит пессимистическая объектная, но в этом случае объект для блокирования должен быть заведомо присутствовать в БД. |
|||
19
Tonik992
19.11.19
✎
12:43
|
В свойствах объекта метаданных конфигурации (твой документ СчетФактураПолученный), на закладке "Прочее" есть поле "Поля блокировки".
Добавь туда "НомерВходящегоДокумента" |
|||
20
Лунтик
19.11.19
✎
12:44
|
(18) а почему не подходит-то?
нужно, чтобы просто не создавался документ, ну, может быть, логирование. Это отлуп? (19) конфигурацию вроде жалко, ищу пути через расширение |
|||
21
Лунтик
19.11.19
✎
12:46
|
"Ничто не ново под луной", http://catalog.mista.ru/public/1016138/
Почему вариант назван костыльным?? Это я что собираюсь костыль сделать? |
|||
22
D_E_S_131
19.11.19
✎
12:47
|
(12) Если это "загрузка в несколько потоков", то вопрос лежит в области "разделения" этих самых "потоков". Иначе как вообще загружать - заблокировал и данные просто не загрузились?
|
|||
23
Tonik992
19.11.19
✎
12:47
|
(20) Тогда ищите другие варианты, а не блокировка по полю
|
|||
24
Cyberhawk
19.11.19
✎
13:22
|
(20) Потому что ненужное ожидание (по умолчанию до 20 секунд) будет
|
|||
25
Лунтик
19.11.19
✎
14:04
|
(24) тогда получается блокировка в любом виде негодится...
тогда, действительно, создать элемент спец.справочника и заблокировать его для редактирования. А второй процесс, который попытается его же захватить, будет ждать ни теже 20 сек? |
|||
26
Cyberhawk
19.11.19
✎
14:14
|
(25) ЗаблокироватьДанныеДляРедактирования(МояСсылка) дает мгновенный отлуп, без ожидания.
И не рекомендую использовать Заблокировать(МойОбъект) - суть та же, но иногда работает с глюками. |
|||
27
Лунтик
19.11.19
✎
14:26
|
(26) Спасибо, мастер. Сколько жизни в каждом слове!!
|
|||
28
Лунтик
19.11.19
✎
14:54
|
(26) офигеть, как круто!! это ж можно в этом справочнике хранить дату/время сообщения и не подгружать устаревшие!!
Только придется хранить полный список. Это, наверное, сильно скажется на времени поиска по этому справочнику... |
|||
29
Лунтик
19.11.19
✎
15:23
|
Уважаемые, ну уж подскажите, пожалуйста, что такое завершение работы встроенного языка? Чем отличается п.1 от п.2 (про возврат управления понятно)
ЗаблокироватьДанныеДляРедактирования() устанавливает блокировку, которая снимается, в том числе. 1.при окончании работы встроенного языка (для режимов запуска "Тонкий клиент" и "Веб-клиент"; при возврате управления с сервера); 2.при завершении сеанса. |
|||
30
pechkin
19.11.19
✎
15:28
|
(29) 1 - это когда процдура закончилась
|
|||
31
Лунтик
19.11.19
✎
15:33
|
(30) т.е. если в процедуре есть ЗаблокироватьДанныеДляРедактирования(), то можно не разблокировать - либо конец процедуры будет, либо по ошибке вывалится, и объект не останется заблокированным,да?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |