Имя: Пароль:
1C
1С v8
Запись в файл и запись в объект 1С в одной транзакции
0 vi0
 
30.04.14
19:04
Добрый вечер

Существует выгрузка работающая как
- выгружаются данные документов в файл
- в документах проставляется флаг выгруженности

Нужно встроится в эту тему, со своей выгрузкой.
Не обсуждая, что сделано это через ж, мне конкретно нужно организовать эти два действия в транзакции.

ВОПРОС:
Как реализовать в одной транзакции (или ее подобии) такие действия как запись в файл и запись в объект 1с ?
1 ДенисЧ
 
30.04.14
19:07
Если понимать под транзакцией то, что об этом думают нормаьные люди, то нет.
2 Torquader
 
30.04.14
19:09
Запись в файл никогда не идёт в транзакции - пишется всё, что пишется в данный момент. Транзакция вызывается только для обращения к базе данных.
3 ДенисЧ
 
30.04.14
19:11
(2) "Запись в файл никогда не идёт в транзакции"
Вот сейчас разработчики ntfs и ext3/4 поперхнулись и чуть не подавились...
4 vi0
 
30.04.14
19:11
Отличные советы
Только мне нужно вопрос решить)
5 ДенисЧ
 
30.04.14
19:12
(4) Осталось понять, что же тебе по факту нужно...
6 vi0
 
30.04.14
19:15
(5) нужно то, что дает транзакция, а именно уверенность, что:
- если есть файл, значит флажки проставлены
- если флажки проставлены, значит файл был создан
7 ДенисЧ
 
30.04.14
19:16
(6) ТОгда нет.
8 neo_matrix_123
 
30.04.14
19:17
(6) а альтернативный способ решения?
9 hhhh
 
30.04.14
19:20
(6) все равно ведь файл доступен из windows. Файл удалят, а флажок останется.
10 vi0
 
30.04.14
19:20
(8) например? чтобы очень аналогичный
кстати, попутно возник вопрос, как это 1с реализовала в плане обмена
11 shuhard
 
30.04.14
19:21
(6) а что мешает сканированть раз в минуту каталог с файлом и поднимать флажок ?
12 vi0
 
30.04.14
19:21
(9) теоритически да, но есть логи +файл дублируется в архив
13 hhhh
 
30.04.14
19:23
(12) тогда уж файлы хранить в базе и не париться.
14 vi0
 
30.04.14
19:23
(11) не, нужно разово все сделать
файл потом пойдет дальше по процессу
15 neo_matrix_123
 
30.04.14
19:24
(10) есть например отдельные протоколы, которые в 1С и ведутся. например выгрузка зарплатных ведомостей в банк.
у меня стоит нахлобучка в виде интелев - там есть встроенный механизм трансляции. и он тоже работает на внутренних РС - протоколах выгрузки. если выгрузили - флаг истина. если перепровели - модифицированность - флаг сбрасывается. это как примеры...
16 shuhard
 
30.04.14
19:24
(14) не верная постановка задача, нужно пройти по цепочке дальше
17 neo_matrix_123
 
30.04.14
19:26
(16) мастерски в нужное русло....
18 vi0
 
30.04.14
19:27
(15) замутить РС это более верно, но пока в существующих рамках пробую сделать
19 vi0
 
30.04.14
19:30
пока такая видится картинка приближенная:

НачатьТранзакцию

ЗаписьДокументов()

Если Файл.Записать() Тогда ЗафиксироватьТранзакцию Иначе ОтменитьТранзакцию()
20 Torquader
 
30.04.14
20:07
Вообще-то, пишем в файл с именем с добавкой .new, когда файл записали, то подтверждаем транзакцию и переименовываем файл (или наоборот), но переименование файла не разрушит его содержимое, в отличие от записи, а также никогда не будет недозаписанного файла.
Если же не переименовалось, то можно транзакцию откатывать - думаю, что откат транзакции при наличии файла - не очень смертельно.
21 vi0
 
30.04.14
20:14
(20) мысль интересная
22 Torquader
 
30.04.14
20:25
(21) Просто я так всегда делаю - файл создаётся со временным именем, а когда он уже готов - помещается на правильное место.
При этом, если файл с данными, то до момента замены может существовать прошлый файл - и нет момента, когда файл не записан до конца.
23 vi0
 
30.04.14
20:30
(22) "помещается на правильное место" - вот это не очень нравится
была такая мысль, но переименование видится надежнее
24 ДенисЧ
 
30.04.14
20:35
(22) (23) Переименование надёжней, когда оно файлово атомарно... Но не всегда такое возможно.
25 Torquader
 
30.04.14
20:37
(23) У меня сначала удаляется временный файл с префиксом .old, его содержимое или на ветер или в {Number}.history, потом основной файл переименовывается в .old, а файл .new переименовывается в основной.
P.S. в пределах диска перемещение и переименование файла - одинаковые операции и не приводят к копированию или перемещению данных файла.
26 Torquader
 
30.04.14
20:39
P.S. просто я писал базу на текстовых файлах - поэтому вопрос "обновления" данных с сохранением "полной" версии файла был очень важен.
27 vi0
 
30.04.14
20:40
(25) в моем случае дело будет происходить в кластере
и имя временного файла нужно будет делать средствами 1с
поэтому неизвестно на каком именно диске он появится
28 ДенисЧ
 
30.04.14
20:41
(25) В пределах логического тома, извините...
29 Torquader
 
30.04.14
20:42
(28) Ну да - логический диск - это и есть том.
30 Torquader
 
30.04.14
20:42
(27) Ну директория-то, в которой он должен появиться - известна ?
31 Torquader
 
30.04.14
20:44
Не забывайте, что при чтении, если мы хотим гарантированно читать файл, его или нужно открывать до дозаписи, чтобы никто с ним ничего не сделал или открывать монопольно.
Если файл читают только один раз, то есть можно "присвоить", то есть переименовать в какое-то другое имя, чтобы потом читать там - тогда будет гарантия, что сколько бы раз его не читали - он не поменяется.
32 ДенисЧ
 
30.04.14
20:44
(29) Диск != том %-))
33 vi0
 
30.04.14
20:45
(31) слог неосилил)
34 Torquader
 
30.04.14
20:46
(32) То, что в Windows-е называется диском - это именно том, хотя, можно подмонтировать другой диск, как папку.
35 vi0
 
30.04.14
20:46
(30) в целевом каталоге уже есть регламентированная структура, но этот момент тоже рассмотрю
36 Torquader
 
30.04.14
20:47
Вообще-то, если папка на томе "отражена" в другой физический диск, то все наши разговоры о перемещении в пределах тома оборачиваются копированием файла даже если для пользователя и программы это выглядит как перемещение файла из родительской папки в дочернюю.
37 su_mai
 
30.04.14
20:49
(3) Если понимать под транзакцией записи на диск запись в некий буфер, а уже потом запись содержимого буфера на диск, то может использовать временное хранилище. При установке флажков создаются файлы и помещаются во временное хранилище (их от туда никто не удалит). После, в обработчике какого-то события записываем данные на диск (уже физически)
38 ДенисЧ
 
30.04.14
20:56
(37) и при записи на диск ты имеешь фейл. А если понадеешься на атомарность - то ещё и эпический...
39 vi0
 
30.04.14
20:59
(24)
> Переименование надёжней, когда оно файлово атомарно.
т.е. переименование может быть выполнено частично?
40 ДенисЧ
 
30.04.14
21:00
(39) Да.
если идёт move d:\file.txt z:\file.txt
где z - сетевой диск
41 vi0
 
30.04.14
21:02
(40) не, я противопоставлял переименование перемещению
что переименование надежнее
42 vi0
 
30.04.14
21:02
покритикуйте, чем плох вариант в (19)
43 Torquader
 
30.04.14
21:05
(41) К сожалению, в системе нет отдельно переименования и отдельно перемещения - команда одна - поэтому, результат может быть странным.
Кроме того, в новом месте появляется файл, а он ещё не до записан - и всё, кто-то "съел" и "подавился".
(42) Ну, вполне себе терпимое решение.
Просто, если хочется сообщать о том, что файл уехал, и очищать ссылки на записанное в файл, то это лучше делать тогда, когда с той стороны получили ответ, что данные были получены.
44 vi0
 
30.04.14
21:08
(43) я так понимаю, что косяки переименования могут быть если не ntfs или тому подобное нетранзакционное
45 vi0
 
30.04.14
21:09
(43) ну это да, как работает план обмена
в простом варианте на нем и нужно делать
46 Torquader
 
30.04.14
21:10
(44) Если не в пределах одной папки - то независимо от системы. Если в одной папке, то только при отключении питания в момент записи.
Вообще-то, файл будут доставлять и читать - где гарантия, что он прочитается ?
Поэтому, лучше как в нормальном обмене - отправку подтверждать или для всех данных в пакете (как сделано в 1С) или по каждому объекту (если что-то могло не дойти).
47 Torquader
 
30.04.14
21:11
(45) Просто - боязнь, что файл не запишется, это не самое страшное - прекрасно записанный файл может не читаться на той стороне из-за того, что формат файла не совместим с базой.
(Например - в файле элемент, а в базе - группа).
48 vi0
 
30.04.14
21:13
(46) опять же, я не говорю про перемещение
49 vi0
 
30.04.14
21:14
(47) замечание хорошее, но в существующей дорабатываемой схеме не вариант сейчас перепиливать
50 Лаврентий Берия
 
30.04.14
21:17
(0) wiki:ACID
51 vi0
 
30.04.14
21:23
(13) обмен между разными базами
52 su_mai
 
30.04.14
21:26
(38) Ну транзакция может приводить и к фэйлу