|   |   | 
| 
 | Запись в файл и запись в объект 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) Ну транзакция может приводить и к фэйлу     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |