Имя: Пароль:
1C
1С v8
Как установить блокировку по полю документа?
,
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) т.е. если в процедуре есть ЗаблокироватьДанныеДляРедактирования(), то можно не разблокировать - либо конец процедуры будет, либо по ошибке вывалится, и объект не останется заблокированным,да?
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.