Имя: Пароль:
1C
1С v8
Ошибка блокировки объекта. Объект уже заблокирован...
0 Crongwild
 
20.09.11
11:45
Есть в компании своя база на основе типовой ЗУП 2.5. В ней разработаны несколько документов, использующих механизм хранения файлов.
Механизм хранения файлов реализован следующим образом: есть регистр сведений "Депозитарий", имеющий ссылку на документ, к которому относится файл, ну и информацию по файлу.
Чтобы во всех документах было проще поддерживать данный механизм, добавлена обработка "Управление файлами". На форме документа есть реквизит с объектом данной обработки, на отдельной закладке выводится табличное поле с табличной частью данной обработки, при открытии формы документа производится считывание записей из регистра "Депозитарий". Ну и еще обработчики событий "ПриВыводеСтроки" и "ПриАктивизацииСтроки" для этого табличного поля, где просто идет работа с оформлением строки и т.д.

Если в двух сеансах открыть один документ, то все нормально, на чтение все работает. Но если переключиться в обоих сеансах на закладку с таблицей файлов, то первый переключившийся нормально все увидит, а у второго будет ошибка "Ошибка блокировки объекта. Объект уже заблокирован...".

Непонятно, что платформа хочет заблокировать, если просто производим чтение с регистра.
Платформа 8.2.13.219, клиент-серверная работа, толстый клиент (обычное приложение), форма обычная.
1 skunk
 
20.09.11
11:50
блокирует регистр "Депозитарий"
2 Crongwild
 
20.09.11
11:55
Забыл уточнить, кстати. Регистр сведений независимый. При открытии формы запросом с него получаются данные, при записи документа данные записываются в регистр.
Почему чтение блокирует записи регистра?
3 Crongwild
 
20.09.11
12:03
Как избавиться от этого, нет ни у кого мыслей?
4 Crongwild
 
20.09.11
12:13
ау...
5 ptiz
 
20.09.11
12:16
Нужен код - что проиходит при " если переключиться в обоих сеансах на закладку с таблицей файлов"
6 Crongwild
 
20.09.11
12:23
Код примерно такой...
На форме:

Процедура ФайлыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   
   ОбработкаОбъектУправлениеФайлами.ПриВыводеСтрокиФайлы(Элемент, ОформлениеСтроки, ДанныеСтроки);
   
КонецПроцедуры

Процедура ФайлыПриАктивизацииСтроки(Элемент)
   
   ОбработкаОбъектУправлениеФайлами.ОбновитьКартинку(ЭлементыФормы.ТекущаяКартинка, ЭлементыФормы.Файлы.ТекущиеДанные);
   
КонецПроцедуры


В обработке:

Функция ПолучитьФайлИзВременнойТаблицы(ИмяФайла)
   
   СтрокаФайла = ТаблицаФайлов.Найти(ИмяФайла, "ИмяФайла");
   Если СтрокаФайла = Неопределено Тогда
       СтрокаФайла = ТаблицаФайлов.Добавить();
       СтрокаФайла.ИмяФайла = ИмяФайла;
   КонецЕсли;
   
   Возврат СтрокаФайла.Значение;
   
КонецФункции

Процедура ПриВыводеСтрокиФайлы(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
   
   ОформлениеСтроки.Ячейки.Статус.ОтображатьТекст = Истина;
   
   Если Не ПолучитьФайлИзВременнойТаблицы(ДанныеСтроки.ИмяФайла) = Неопределено Тогда
       ОформлениеСтроки.Ячейки.Статус.Текст = "текст 1";
   Иначе
       ОформлениеСтроки.Ячейки.Статус.Текст = "текст 2";
   КонецЕсли;
   
КонецПроцедуры

Процедура ОбновитьКартинку(ЭлементКартинки, ДанныеСтроки) Экспорт
   
   ТекущаяКартинка = ПолучитьФайлИзВременнойТаблицы(ДанныеСтроки.ИмяФайла);
   
   Если ТекущаяКартинка = Неопределено Тогда
       ТекущаяКартинка = Новый Картинка();
   КонецЕсли;
   
   ЭлементКартинки.Картинка = ТекущаяКартинка;
   
КонецПроцедуры


ТаблицаФайлов - переменная обработки, заполняется в процедуре, вызываемой при открытии формы:

Процедура ПрочитатьЗаполнитьФайлы() Экспорт
   
   Запрос = Новый Запрос();
   Запрос.Текст =
   "ВЫБРАТЬ
   |    *
   |ИЗ
   |    РегистрСведений.ЗБ_Депозитарий КАК ЗБ_Депозитарий
   |ГДЕ
   |    ЗБ_Депозитарий.Документ = &Документ
   |    И ЗБ_Депозитарий.ТЧ = &ТЧ";
   
   Запрос.УстановитьПараметр("Документ", Документ);
   Запрос.УстановитьПараметр("ТЧ",       ТЧ);
   
   ТаблицаРезультат = Запрос.Выполнить().Выгрузить();
   Файлы.Загрузить(ТаблицаРезультат);
   
   // Заполним таблицу файлов
   Для Каждого ТекСтрока Из ТаблицаРезультат Цикл
       НоваяСтрока = ТаблицаФайлов.Добавить();
       НоваяСтрока.ИмяФайла = ТекСтрока.ИмяФайла;
       НоваяСтрока.Значение = ТекСтрока.ХранилищеФайла.Получить();
   КонецЦикла;
   
КонецПроцедуры
7 ptiz
 
20.09.11
12:29
А ведь точно. Такая же ситуация при открытии закладки "свойства" одного и того же контрагента разными юзерами в типовых.
8 ptiz
 
20.09.11
12:41
Если убрать галку "изменяет данные" с таб.поля, то проблема уйдет.
9 Crongwild
 
20.09.11
13:29
(8) Да, работает... Но все же хотелось бы отслеживать изменение данных, а то пользователь укажет файл, нажмет закрыть - и документ спокойно закроется.
Но спасибо за подсказку (7), буду анализировать.
10 ptiz
 
20.09.11
15:09
(9) Никуда изменения не денутся.
В обработчике "ПриИзменении" (при изменении поля в таб.части) как в типовой: Модифицированность = Истина