Имя: Пароль:
1C
1С v8
Версионирование или приветствую другие идеи
0 catena
 
20.02.12
18:49
Требуется помощь зала.

Задача такая:
Некоторая обработка периодически лопатит документы. В начале запросом отбираются необходимые данные, затем каждый документ обрабатывается отдельно в транзакции. В конце обработки каждого документа хотелось бы знать, не перепроводили ли его с момента получения данных (старта обработки).
Вариантов решения было опробовано несколько:
1. Управляемые блокировки. Слетают, заразы, при смене транзакции.
2. Отказаться от общего запроса и делать в транзакции для каждого регистратора отдельно, блокируя таблицы - не очень приятно.
3. Перед окончанием транзакции проверять версию объекта. В принципе, тут из всего версионирования нужен только момент последних изменений - до начала обработки или после. Вот тут проблема - версионирования в глаза не видела :) Стоит ли заморачиваться поиском механизма или дешевле сделать реквизит (ДатаПоследнегоИзменения)?
4.... Открыта для предложений.
1 pumbaEO
 
20.02.12
18:52
Просто знать?

Документ.Записать(режимЗаписи.Проведени);
НовыйЭлемент = ТаблицаВерсий.Добавить()
НоыйЭлемент.Версия = Документ.Версия;
НовыйЭлемент.Ссылка = Документ.Ссылка;
2 Maxus43
 
20.02.12
18:55
имхо если обработка так долго работает что кто-то успеет провести документ в процессе - надо менять алгоритм
3 Maxus43
 
20.02.12
19:01
и собственно пример ъотелось бы задачи увидеть... ну зачем?)
4 catena
 
20.02.12
19:01
(2)Один документ обрабатывает как правило быстро. А вот документов в выборке может быть много и с момента начала обработки последний в выборке могут успеть изменить.
5 catena
 
20.02.12
19:02
(3)Интеграция в другую базу.
6 pumbaEO
 
20.02.12
19:02
А что будешь делать если документ изменен окажется?
7 catena
 
20.02.12
19:06
(6)Откажу в интеграции до следующей выгрузки.
8 КМ155
 
20.02.12
19:08
(7) замутить план обмена уже предлагали ?
9 ZOMI
 
20.02.12
19:08
Для этих доков создать Последовательность //В начале обработке насильно на последний установить Границу // Как вариант // Не понятно что за 'интеграция'
10 kuromanlich
 
20.02.12
19:09
бери документы (запросом ли, перебором ли...), а данные из документа в момент обхода...

ну и (7) +1
11 catena
 
20.02.12
19:12
(8)Вторая база - не 1с.
(10)Это вариант 2. Тоже вариант, конечно :)
12 kosts
 
20.02.12
19:38
(0) Заблокировать все необходимые документы.
13 catena
 
20.02.12
19:52
(12)Блокировки действуют в рамках транзакции. Можно, конечно, блокировать каждый раз после смены транзакции, но мне не кажется этот вариант красивым.
14 Никола_
Питерский
 
20.02.12
20:10
(13) что такое смена транзакции ?
15 catena
 
20.02.12
20:14
(14)Зафиксировать/отменить - начать.
16 kosts
 
20.02.12
20:18
(13)
У меня блокировка не слетает, что не так делаю?...


Перем Мас;

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 5
                  |    ВводИндивидуальныхГрафиковРаботыОрганизации.Ссылка
                  |ИЗ
                  |    Документ.ВводИндивидуальныхГрафиковРаботыОрганизации КАК ВводИндивидуальныхГрафиковРаботыОрганизации
                  |
                  |УПОРЯДОЧИТЬ ПО
                  |    ВводИндивидуальныхГрафиковРаботыОрганизации.Дата УБЫВ"
   ;
   Запрос.УстановитьПараметр("", );
   Результат = Запрос.Выполнить();
   Выборка = Результат.Выбрать();
   
   Пока Выборка.Следующий() Цикл
       об = Выборка.Ссылка.ПолучитьОбъект();
       об.Заблокировать();
       Мас.Добавить(об);
   КонецЦикла;
   
   Для каждого об Из Мас Цикл
       НачатьТранзакцию();
       об.записать();
       ЗафиксироватьТранзакцию();
   КонецЦикла;
   
   // Неудачная попытка блокирования
   
   Выборка = Результат.Выбрать();
   
   Пока Выборка.Следующий() Цикл
       об = Выборка.Ссылка.ПолучитьОбъект();
       Попытка
           об.Заблокировать();
       Исключение
           Сообщить(ОписаниеОшибки());
       КонецПопытки;
   КонецЦикла;
   
КонецПроцедуры

Мас = Новый Массив;  
17 catena
 
20.02.12
20:22
(16)Даже если ОтменитьТранзакцию?
18 kosts
 
20.02.12
20:25
(17) "Ошибка блокировки объекта. Объект уже заблокирован:"
19 catena
 
20.02.12
20:27
(18)Странно, а почему тогда у меня слетают? схема та же...
20 kosts
 
20.02.12
20:30
(19) Объекты сохраняются в каких либо переменных?
21 catena
 
20.02.12
20:35
(20)Примерно как у тебя: блокирую и собираю в список значений. Все, потом ничего больше с ними не делаю - не пересохраняю, не изменяю.
22 kosts
 
20.02.12
20:53
(21) пробуй ТЗ или массив
23 catena
 
20.02.12
20:56
(22)Действительно есть разница? Попробую обязательно завтра :)
24 Лефмихалыч
 
20.02.12
21:03
Заблокировать() не предлагать?
25 catena
 
20.02.12
21:04
(24)Чукча писатель? :)