2010
24
февраля
Что такое транзакция и для чего она нужна.
февраля 24, 2010 | Комментариев: 3
- «
- 1
- »
Транзакции в 1С
На днях ковырялся в базе, пользователи которой жаловались на проблему «Ожидание захвата таблицы Журналы для начала транзакции«. Конечно такая проблема возникает, когда документ долго проводится. Но в моем случае в обработку проведения была дописана
Некоторые начинающие программисты не понимают что такое транзакции и как ими пользоваться. Недавно ковырялся в чужом коде и увидел, что в обработке проведения добавлен код:
Если глПользователь.Полномочия.ПроведениеБезПроверок = 0 Тогда
КолДнейОтсрочки = Контрагент.ОсновнойДоговор.ГлубинаКредита;
ДатаПросрочки = ДатаДок – КолДнейОтсрочки;
Просрочка = ПросроченныйДолгКлиента(Контрагент,ДатаПросрочки);
Если Просрочка > 0 Тогда
Если Вопрос(»Просроченный долг клиента «+ Просрочка + » Продолжить проведение?»,4,0) = 7 Тогда
глНеПроводить(Контекст,»Документ «»"+ глНазваниеДокументаВЖурнале(Контекст)+»"» Просрочка»);
Возврат;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Авторские права на предоставленный материал принадлежат автору сайта http://extremallife.ru
Ключевой строкой здесь является:
Если Вопрос(»Просроченный долг клиента «+ Просрочка + » Продолжить проведение?»,4,0) = 7 Тогда
То есть при проведении документа на экран выскакивает вопрос и требует ответа оператора.
Дело в том, что при проведении документа блокируется доступ к записи в регистры. Делается это например для того, чтобы дважды не продать один и тот же товар (это как пример на пальцах). И пока у одного оператора висит этот вопрос никто не может провести документы, в строке состояния выводится Ожидание захвата таблицы Журналы для начала транзакции. Так вот, если оператор поставил документ на проведение и ушел курить, то в это время никто не может провести документы.
Что такое транзакция.
Вообще транзакция - это набор операций или действий, которые представляют собой, одну, неделимую операцию. Транзакция может быть либо выполнена в полном объеме, либо не выполнена вообще. Сделано это для сохранения логической целостности базы. Поясню на примере.
Чтоб было понятно отвлечемся от 1С и рассмотрим более понятный пример. Денежный банковский перевод. Сам перевод часто называют транзакцией. Сам я не знаю как работают банковские переводы, но подозреваю, что примерно состоят они из нескольких операций:
1. Первый сервер отправляет перевод.
2. Второй сервер получает перевод.
3. Второй сервер отправляет первому сообщение о получении перевода
4. Первый сервер получает сообщение о том. что второй принял перевод.
Все эти 4 пункта и составляют транзакцию. Если все прошло успешно, что транзакций проведена, если какой-то из пунктов, по любым причинам не выполнен, то транзакция не выполнена. То есть деньги либо переведены, либо нет.
В 1С примерно так же. Для реализации транзакций в 1С есть несколько процедур, а именно:
НачатьТранзакцию() - начало списка операций.
ЗафиксироватьТранзакцию() – Завершение списка операций. Все что содержится в теле НачатьТранзакцию() и ЗафиксироватьТранзакцию() будет сохранено.
Отменить Транзакцию() – Не сохранит то, что написано в НачатьТранзакцию(); …. ЗафиксироватьТранзакцию();
Для чего нужна транзакция.
Применяются эти процедуры, когда надо сделать несколько действий, но при каких-то исключительных случаях необходимо «откатить» выполняемые действия. Для примера не долго думая взял код из обработки ЗакрытиеКассовойСмены:
НачатьТранзакцию();
Если НЕ((ВыбКасса.РежимККМ = Перечисление.РежимыККМ.ФР) и (СписокЧеков.РазмерСписка() = 0)) Тогда
// Теперь создадим новый документ ОтчетККМ
ДокОКС = СоздатьОбъект(»Документ.ОтчетККМ»);
ДокОКС.Новый();
глЗаполнитьШапку(ДокОКС, 0);
ОткрыватьФорму = 1;
ДокОКС.ДатаДок = ВыбДата;
ДокОКС.Фирма = ВыбФирма;
ДокОКС.Склад = ВыбСклад;
ДокОКС.Валюта = глРубли;
Бла – бла – бла
Попытка
ДокЧеки.СделатьНеПроведенным();
Исключение
ОтменитьТранзакцию();
Предупреждение(ОписаниеОшибки());
Возврат;
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Ббла – бла – бла
ЗафиксироватьТранзакцию();
Бла-бла-бла
Ну вот как-то так )))
ЗЫ. Крайне не рекомендуется внетри тела транзакции применять операторы типа Вопрос(), Предупреждение(), которые ожидают решения оператора.
Страницы статьи:- «
- 1
- »
| В Мой Мир | В FaceBook |


июня 5, 2010 at 20:45
Здравствуйте!у нас заблокировался контакт,и для того чтоб его разблокировать нужно было положить 100 рублей на определённый номер и ввести код транзакции.Подскажите пожалуйста где он находится,и не обман ли это! Заранее огромное спасибо!
февраля 25, 2010 at 10:31
Ничего, когда привыкнешь к коду 1С – все вполне понятно, тем более все ра русском))) Кстати есть и латинский вариант встроенного языка 1С, например Если Тогда Иначе КонецЕсли – If Then Else EndIf.
Как то видел как на 1с пишет программист Delphi. именно по английски – ему так понятнее.
Насчет примера – я не знаю как точно работает банковская система – я прост опредположил. Наверняка там не 4 пункта, а больше и все возможные варианты отрабатываются…
февраля 25, 2010 at 10:15
как ужасно все-такм читать код 1С – наверное буржуям также жутко читать код на «английских» языках программирования.
зы, насчет примера. а если сбой произошел на 4ом этапе или позже, то как второй сервер откатит транзакцию? он же средства уже принял и (например) зачислил на счет клиента.