Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Загрузить файл в БД один и только один раз

Загрузить файл в БД один и только один раз
Я
   bolobol
 
08.11.19 - 14:54
Добрый день!!

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


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

Надо:

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

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

Пишу:

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

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

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

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

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