Имя: Пароль:
1C
1С v8
Загрузить файл в БД один и только один раз
,
0 bolobol
 
08.11.19
14:54
Добрый день!!

Подскажите-помогите...


Пользователь загружает файл в открытый (созданный) интерактивно Документ.ВхФайл, проверяет, при необходимости - сохраняет документ. Как только форма закрыта или Документ записан в БД - работа с файлом считается законченной.

Надо:

На время от нажатия кнопки Загрузить до записи или закрытия формы Документа - ставить блокировку записи/чтения Документа с реквизитом ИмяФайла = ИмяЗагружаемогоФайла.

Как это написать?

Пишу:

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки= Блокировка.Добавить();
ЭлементБлокировки.Область = "Документ.ВхФайл";
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.УстановитьЗначение("ИмяФайла", ИмяЗагружаемогоФайла);

Блокировка.Заблокировать();  // - не работает: Ошибка при вызове метода контекста (Заблокировать)

И что не так?
1 Cyberhawk
 
08.11.19
15:00
Нет транзакции - нет и упр. блокировки
2 bolobol
 
08.11.19
15:28
Добавил НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый); - та же фигня
В свойствах документа стоит Автоматический
В свойствах конфы - Управляемый

Что не так?
3 bolobol
 
08.11.19
15:28
ПоляБлокировкиДанных у документа - пусто
4 D_E_S_131
 
08.11.19
15:39
Если документ новый, то никто и не узнает, что уже кто-то пытается загрузить этот файл.
Нужен какой-то другой объект. Например РС, в котором измерение "Имя файла", а ресурс это Документ.ВхФайл.
Перед нажатием кнопки "Загрузить()" искать запись РС с именем файла. Если запись есть, то выполнять "ЗаблокироватьДанныеДляРедактирования()" по ключу записи. Если записи нет, то создавать и потом уже ее блокировать.
В метод "ЗаблокироватьДанныеДляРедактирования()" передается УИД формы и пока она открыта никто другой не получит доступ записи РС.
5 Cyberhawk
 
08.11.19
15:41
"ЗаблокироватьДанныеДляРедактирования" не защищает от программного изменения, если то программное изменение не пытается делать то же самое
6 bolobol
 
08.11.19
15:44
Если записать сам документ, то и регистр не нужен будет - по документу будет понятно, что это ИмяФайла обработано. А без записи, получается, никак?
7 bolobol
 
08.11.19
15:47
Надо переходить на ФуЗину - там это одной строчкой делается, говорят... Никто не видел, но говорят постоянно.
8 D_E_S_131
 
08.11.19
16:05
(5) Уверен?
9 МихаилМ
 
08.11.19
16:19
9 лет долбоибических воросов на этом форуме. а это шедевр -
Срочно! Сколько объём среднего арбуза в литрах?.
10 bolobol
 
08.11.19
16:33
(9) Не отчаивайтесь, и у вас когда-нибудь будут шедевры!
11 dezss
 
08.11.19
16:36
Погодь. Ты хочешь заблокировать данные, которых еще нет в базе?
12 Cyberhawk
 
08.11.19
16:38
(8) Ага
13 bolobol
 
08.11.19
16:38
(11) Или которые есть. Блокируются ведь не данные, а разрез данных, ну, или... блин, как правильно выразиться? Всё понимаю - сказать не могу))
14 dezss
 
08.11.19
16:50
(13) А вот ты уверен, что это так?
Чет мне кажется, что блокируются именно данные. Просто ты можешь задать какие конкретно строки таблицы блокировать.
15 bolobol
 
08.11.19
16:59
(14) Блин... теперь в этом не уверен, блокировка записей - логично выглядит... но смысла в подобной реализации - кот накакал, а в 1С и кот появился не так давно...
16 D_E_S_131
 
08.11.19
17:00
(11) Я потому и предложил доп.объект для контроля. И если надо будет менять программно, то перед записью в Попытке выполнять Заблокировать(), что бы проверить, а не загружает ли этот файл уже кто-нибудь.
17 dezss
 
08.11.19
17:02
(16) Дык оно и понятно, что тут по-другому никак.
18 bolobol
 
08.11.19
17:16
Да вот только записать в доп.объект - это целостность данных нужно контролировать, а это дополнительная сложность в, казалось бы, простой задаче. Проще обязательно записывать документ - так всё само работать будет, из коробки)
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан