Имя: Пароль:
1C
1С v8
Чем метод Записать() отличается от метода ЗафиксироватьТранзакцию()?
0 loonypy
 
01.03.12
09:56
Из чтения справки по обоим методам как-то не уловил разницы - и там, и там записывает изменения в базу.
1 Капитан О
 
01.03.12
09:57
зафиксируй транзакцию документу, скажем
2 vde69
 
01.03.12
09:58
офигеть!

я под столом....
3 vde69
 
01.03.12
10:00
записать - записывает данные (при этом не обязательно что данные останутся в базе)

зафиксироватьТранзакцию - сделать все предыдущие изменения актуальными
4 PuhUfa
 
01.03.12
10:00
(0) купи правильный СП от ...
5 Ненавижу 1С
 
гуру
01.03.12
10:00
в первом случае это примерно аналог INSERT/UPDATE, во втором фиксация транзакции
6 0xFFFFFF
 
01.03.12
10:01
... и главное ведь полосочка то уже не короткая :)
7 Reset
 
01.03.12
10:17
Понапридумывали синонимов для запутывания юных умов
8 Spieluhr
 
01.03.12
10:17
чем отличается железо от говядины?
9 Кириллка
 
01.03.12
10:19
метода ЗафиксироватьТранзакцию какого класса?
10 Heckfy
 
01.03.12
10:19
(8) Да ничем. Кило железа весит столько же сколько кило говядины.
11 loonypy
 
01.03.12
10:20
Что все так удивлены, будто у меня стаж лет 5, а я все еще таких вещей не знаю? Реального опыта у меня нет, только по Радченко (во франче с месяц "работаю" - итски развожу). Вот и пример из Радченко:
Товар = Справочники.Номенклатура.СоздатьЭлемент();
Товар.Наименование = "фыв";
.....
Товар.Записать(); //Почему не просто ЗафиксироватьТранзакцию()?

ps
>>... и главное ведь полосочка то уже не короткая :)
У меня все большое:)
12 Reset
 
01.03.12
10:21
(10) Нефига, кило говядины весить меньше будет, у ней объем при равной массе (1кг) больше, ее атмосферное давление сильнее выталикивает, поэтому вес меньше!
13 zladenuw
 
01.03.12
10:21
14 Wobland
 
01.03.12
10:22
(12) 510 постов - мало? ;)
что тяжелее?
15 Heckfy
 
01.03.12
10:22
(12) Ну это если кусок говядины попилить на мелкие, что бы площадь соприкосновения с воздухом стала больше, а изначально они равны будут.
16 Reset
 
01.03.12
10:23
(14) ыыы не видел той ветки, я только v8 читаю ))
17 zladenuw
 
01.03.12
10:23
(11)
НачатьТранзакцию (BeginTransaction)

Синтаксис:

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

Описание:

Открывает транзакцию. Транзакция предназначена для записи в информационную базу согласованных изменений. Все изменения, внесенные в информационную базу после начала транзакции, бу­дут затем либо целиком записаны, либо целиком отменены.

Пример:

// Увеличение закупочной цены на 5%
ВыборкаТоваров = Справочники. Номенклатура. Выбрать();
НачатьТранзакцию();
Пока ВыборкаТоваров.Следующий() Цикл
   ТоварОбъект = ВыборкаТоваров.ПолучитьОбъект();
   ЗакупочнаяЦена = ТоварОбъект.ЗакупочнаяЦена;
   Если ЗахупочнаяЦена <> 0 Тогда
       ТоварОбъект.ЗакупочнаяЦена = ЗакупочнаяЦена * 1.05;
       ТоварОбъект.Записать();
   КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцио();

См. также:

Глобальный контекст, метод ЗафиксироватьТранзакцию.

Глобальный контекст, метод ОтменитьТранзакцию.

ОтменитьТранзакцию (RollBackTransaction)

Синтаксис:

ОтменитьТранзакцию()

Описание:

Отменяет открытую ранее транзакцию. Все изменения, внесенные в информационную базу в процессе транзакции, будут отменены.

Пример:

Если ОбнаруженыОшибки Тогда
   ОтменитьТранзакцию();
КонецЕсли;
18 Spieluhr
 
01.03.12
10:24
(11) Узнайте сначала что такое транзакция, вопрос сам собой отпадет
19 Reset
 
01.03.12
10:25
(15) Не будем оффтопить в серьезной тематической ветке! хотя я остаюсь при своем мнении ;P
20 Maxus43
 
01.03.12
10:26
пятница уже? я что-то пропустил
21 Heckfy
 
01.03.12
10:26
(19) Согласен. Не будем грешить
22 Heckfy
 
01.03.12
10:26
+ (21) ЗЫ: Только я имел ввиду вес, а не массу.
23 D_Pavel
 
01.03.12
10:28
(15) Как не пили, обьем кусочков не изменится. Все равно говядина весит меньше.
24 loonypy
 
01.03.12
10:33
>>Узнайте сначала что такое транзакция, вопрос сам собой отпадет
Знаю, что такое: если не вся последовательность операций в транзакции выполнилась, то вся последовательность отменяется - в базу ничего не пишется.
В примере мы записываем в справочник Номенклатура новый элемент. Это либо один insert, либо несколько, если у элемента есть табличная часть. У Радченко во всех таких примерах пока ни разу не видел метода ЗафиксироватьТранзакцию() (пока до 16го задания дошел) - решил, что это делает метод Записать().
Получается у Радченко не совем точно и нужно всегда добавлять ЗафиксироватьТранзакцию() после внесения изменений?
25 D_Pavel
 
01.03.12
10:35
метод Записать() сам фиксирует транзакцию, если ты вручную не дал команду что транзакцию не нужно фиксировать автоматически методом НачатьТранзакцию()
26 D_Pavel
 
01.03.12
10:35
Если НачатьТранзакцию() нет, то ЗафиксироватьТранзакцию() не требуется.
27 Reset
 
01.03.12
10:35
(24) Не нужно. Не ты начинал - не тебе закрывать!
Нужно только если ты начал ее НачатьТранзакцию().
Можешь для упрощения рассматривать как некие логические скобки
28 Maxus43
 
01.03.12
10:36
(25) ты его запутаеш ещё сильнее. не надо смешивать Записать() и Транзакции, каша в голове будет
29 Reset
 
01.03.12
10:36
Занимательная транзактология на мисте
30 zak555
 
01.03.12
10:36
(24) так ты у него и не увидишь
31 D_Pavel
 
01.03.12
10:37
(28) Я так и подумал. Написал следом попроще!
32 loonypy
 
01.03.12
10:38
Получается это одно и тоже? Либо
Товар.Записать();
либо
НачатьТранакцию()
...
ЗафиксироватьТранзакцию()
33 Maxus43
 
01.03.12
10:38
(32) нееееееееееет
34 Reset
 
01.03.12
10:38
(32) Нет
35 Maxus43
 
01.03.12
10:39
Записать - метод ОБЪЕКТА. Начать-Зафиксировать - принимать или нет изменения над даныыми ИБ произошедшие в рамках данной транзакции
36 zak555
 
01.03.12
10:39
(32) наиши так

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

Товар.Записать();


ОтменитьТранку();
37 Reset
 
01.03.12
10:40
Вот архикривейший (не делай так;P) аналог

НачатьТранзакцию();
А=Создать();
А.Записать();
ОтменитьТранзакцию();

или

А=Создать();
А.Записать();
А.Удалить();
38 Ненавижу 1С
 
гуру
01.03.12
10:40
(0) почитай про транзакции
39 D_Pavel
 
01.03.12
10:40
(32) Получается это одно и тоже:

Либо

Товар.Записать();

либо

НачатьТранакцию()
Товар.Записать();
ЗафиксироватьТранзакцию()
40 D_Pavel
 
01.03.12
10:41
(37) Это не аналог!! ! ! В первом случае произойдет запись и удаление, во втором не происходит
41 Ненавижу 1С
 
гуру
01.03.12
10:41
(39) да, а вот это нет


Товар1.Записать();
Товар2.Записать();

или

НачатьТранзакцию();
Товар1.Записать();
Товар2.Записать();
ЗафиксироватьТранзакцию();
42 Reset
 
01.03.12
10:42
(40) Да ты чо)
43 Reset
 
01.03.12
10:42
(40) Не реагируй серьезно, пример шуточный. Написал же.
44 D_Pavel
 
01.03.12
10:42
(42) Именно так! Только наоборот, В первом случае НЕ произойдет запись и удаление, во втором происходит
45 Maxus43
 
01.03.12
10:43
(40) произойдёт запись таки, но потом и откат транзакции, это не удаление в привычном смысле но всё таки
46 Ненавижу 1С
 
гуру
01.03.12
10:44
(45) может не произойти ))
47 D_Pavel
 
01.03.12
10:44
(41) нет , а вот это да



Товар1.Записать();
Товар2.Записать();

или

НачатьТранзакцию();
Товар1.Записать();
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Товар2.Записать();
ЗафиксироватьТранзакцию();
48 Maxus43
 
01.03.12
10:45
(46) ну если при записи отказа не будет - таки запишется, в рамках данной транзакции и запросы к записаному элементу делать можно, чего нельзя делать к незаписанному
49 D_Pavel
 
01.03.12
10:46
И еще, самое главное! Чтобы НачатьТранзакцию() выделялось красным, нужно вконце ставить ";"

НачатьТранзакцию();
50 D_Pavel
 
01.03.12
10:46
НачатьТранзакцию();
НачатьТранзакцию();
51 Maxus43
 
01.03.12
10:47
бгг
52 D_Pavel
 
01.03.12
10:47
Ой. Даже синим не выделяется....
53 Maxus43
 
01.03.12
10:47
надо 5 и более строк помойму чтоб раскрас пошёл
54 D_Pavel
 
01.03.12
10:48
НачатьТранзакцию();
НачатьТранзакцию();
НачатьТранзакцию();
НачатьТранзакцию();
НачатьТранзакцию();
55 ptiz
 
01.03.12
10:48
Упрощенно:
Любое внесение изменений в базу данных - это транзакция.
Несколько изменений можно объединить в одну большую транзакцию.
Транзакции могут быть вложенными: внутри одной большой - несколько маленьких.
56 Reset
 
01.03.12
10:48
НачатьТразакцию()
57 Maxus43
 
01.03.12
10:48
(55) тока в 1с нет вложеных транзакций)
58 D_Pavel
 
01.03.12
10:49
А если так сделать, запишется или нет?

НачатьТранзакцию();
НачатьТранзакцию();
Док.Записать;
ЗафиксироватьТранзакцию();
ОтменитьТранзакцию();
59 Reset
 
01.03.12
10:49
(55) А большая внутри маленькой не может?
60 Maxus43
 
01.03.12
10:49
(57) + точнее отмена вложеной ведёт к отмене общей. ЕМНИП
61 Reset
 
01.03.12
10:49
+(57) По кр мере на логическом уровне)
62 D_Pavel
 
01.03.12
10:49
(60) Логично. Если это так
63 Maxus43
 
01.03.12
10:51
(62) не логично, может потребоваться именно вложенная транзакция в прямом смысле, без отмены общей
64 Федя Тяпкин
 
01.03.12
10:51
(11) месяц только во франче. забудь тогда просто конструкцию "ЗафиксироватьТранзакцию();" в ближайший год, она тебе точно не понадобится.
65 D_Pavel
 
01.03.12
10:52
(63) может. И это не доказывает что не логично.
66 D_Pavel
 
01.03.12
10:53
(63) не правильно прочитал (60). Всё правильно, это не логично
67 loonypy
 
01.03.12
10:57
>>месяц только во франче. забудь тогда просто конструкцию "ЗафиксироватьТранзакцию();" в ближайший год, она тебе точно не понадобится.
По хорошему мне сейчас СКД заняться надо, но раз тему начал, то нужно довести. А то через какое-то время опять с ней вылезу.

Что делает метод Записать();? Судя по обсуждению, его использование не гарантирует, что изменения запишутся в базу.
68 Ненавижу 1С
 
гуру
01.03.12
10:59
(58) имхо, нет
69 Reset
 
01.03.12
10:59
(67) В общем случае да. Но (64) прав - не забивай сейчас этим голову
70 Maxus43
 
01.03.12
10:59
(67) если не будет ошибок при записи - запишется
71 Reset
 
01.03.12
11:00
(58) (70) не запишется
72 Jaffar
 
01.03.12
11:00
(17) что есть "ЗафиксироватьТранзакцио();"? :-)
73 Reset
 
01.03.12
11:00
(70) Вложенности нет, но счетчик "начал" есть
74 Jaffar
 
01.03.12
11:01
(17) и что есть "ЗахупочнаяЦена"? :-)
75 Reset
 
01.03.12
11:01
грубая аналогия
Если
 Если
   Прервать <--- аналог отменить
 КонецЕсли; <--- аналпг зафиксировать
КонецЕсли;  <--- аналпг зафиксировать
76 Maxus43
 
01.03.12
11:02
(71)(73) при чем тут (70)?)
77 Reset
 
01.03.12
11:03
(76) НЕ при чем, я смотрел косо на номера постов, изв (
78 loonypy
 
01.03.12
11:08
То запишет, то не запишет. Черт, я думал вы тут в курсе. А еще стебаться стали в начале:) Когда мне необходимо будет писать код в блоке НачатьТранзакцию(); ... ЗафиксироватьТранзакцию(); а когда ограничиться одним Записать();?
79 loonypy
 
01.03.12
11:09
Кто в каких случаях как делает?
80 Reset
 
01.03.12
11:10
(78) Никогда не пиши.
Когда время придет, разберешься.
81 Reset
 
01.03.12
11:12
Стебаться начали, потому что вопрос, ну мягко говоря, странный. Чем стол от стула отлчиается, ведь ножки и там там.
82 Jaffar
 
01.03.12
11:12
(78) скажем так: метод Записать() служит для записи только одного объекта, а транзакционные скобки можно использовать для групповой записи (или отмены записи) нескольких объектов.
например, ты создаешь элемент справочника "Номенклатура" и его подчиненные единицы измерения. НачинаешьТранзакцию, потом каждую из них (и саму номенклатуру) ты Записываешь, и если все хорошо - ЗакрываешьТранзакцию (тогда у тебя есть гарантия, что записались ВСЕ объекты), а если где-то произошла ошибка - тогда ОтменяешьТранзакцию (тогда у тебя есть гарантия, что НИ ОДИН объект не записался).
83 Maxus43
 
01.03.12
11:13
(78) мы всё понимаем, внимательней прочитай что писали
84 Spieluhr
 
01.03.12
11:14
(79) Открой любую типовую конфигурацию и сделай глобальный поиск по тексту НачатьТранзакцию()
85 n koretsky
 
01.03.12
11:15
(0) тролль детектед?
86 Jaffar
 
01.03.12
11:16
кстати, Записать() - методы объектов (документа, элемента справочника), аналогичные методы - у наборов записей регистров, а НачатьТранзакцию()/ЗафиксироватьТранзакцию()/ОтменитьТранзакцию() - это методы глобального контекста, то есть им пофих, что записывать и отменять.
и да - ЗафиксироватьТранзакцию() или ОтменитьТранзакцию() не сработают без НачатьТранзакцию().
87 Reset
 
01.03.12
11:24
В качестве пятничного анонса:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   Сообщить(ТранзакцияАктивна());
   ОтменитьТранзакцию();
КонецПроцедуры

Почему сначала пишет "Истина", а потом происходит ошибка времени выполнения:

{Документ.ХХХ(nn)}: Ошибка при вызове метода контекста (ОтменитьТранзакцию)

по причине:
Транзакция не активна
88 Ненавижу 1С
 
гуру
01.03.12
11:25
вот проблема которая имеет место быть: транзакции живут только до завершения метода вызвавшего его
то есть нельзя по первой кнопке начать транзакцию, потом что то делать, а потом по другой кнопке зафиксировать
89 loonypy
 
01.03.12
11:25
>>мы всё понимаем, внимательней прочитай что писали

>>скажем так: метод Записать() служит для записи только одного объекта, а транзакционные скобки можно использовать для групповой записи (или отмены записи) нескольких объектов.

Записать() - insert\update на уровне одного объекта, но при создании нового элемента справочника (например) бывает нужно еще и связать его с другими объектами (справочниками\документами) по ссылке. Создание может быть выполнено, а связь по какой-либо причине нет. Чтобы такого не случилось, оборачиваем весь этот код (создание элемента, связь с другим элементом справочника\документа - несколько строк) транзакцией. Так?
90 Reset
 
01.03.12
11:26
(89) Примерно так.
91 Maxus43
 
01.03.12
11:27
(89) как вариант применения. сам метод ЗафиксироватьТранзакцию - фиксирует изменения, если Записать у объекта нет - нечего фиксировать
92 Maxus43
 
01.03.12
11:28
(88) и правильно. ибо накуа?
93 Reset
 
01.03.12
11:28
(89) Т.е. это делается дл того, что при записи гаранитированно и создавалась свять. Если это по какой-то причине не удалось, то и записть не долдна произойти.
94 loonypy
 
01.03.12
11:35
Мне похоже действительно рано за этот вопрос браться - мозг на 1с не перестроился еще.
Всем большое спасибо за терпеливые разъяснения.
95 Maxus43
 
01.03.12
11:37
(94) это не 1с, насколько помню ни в одном языке програмирования Транзакция не выполняет функцию записи. это из другой оперы вобще
96 loonypy
 
01.03.12
11:41
(95) Транзакция только подтверждает запись?
97 Maxus43
 
01.03.12
11:42
(96) да. подтверждает все изменения с данными в рамках транзакции
98 Reset
 
01.03.12
11:43
Или не подтверждает;) - это основная фича) чтобы можно было отменить
99 loonypy
 
01.03.12
11:44
Типа логического блока. Тогда все встало на свои места. Получается  Ненавижу 1С в самом начале ответил. Черт, не приятно, когда читаешь и не понимаешь.
Тогда все, тема исчерпана. Еще раз всем большое спасибо.
100 n koretsky
 
01.03.12
11:53
100!
101 Ненавижу 1С
 
гуру
01.03.12
12:39
(92) неправильно, ибо может быть так надо
102 Maxus43
 
01.03.12
12:51
(101) открывай офрму модально и делай на ней чонить в рамках транзакции
103 Ненавижу 1С
 
гуру
01.03.12
12:52
(102) я не спрашиваю как это сделать через задницу ))
104 Maxus43
 
01.03.12
12:54
(103) ну работать то будет же!) а открытую транзакцию оставлять когда юзер ушёл домой продолжать свой род - тоже не правильно