Страницы статьи:
  • «
  • 1
  • »

Транзакции в 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



Комментарии

3 комментариев в “Что такое транзакция и для чего она нужна.”

  1. 3
    Влада пишет:

    Здравствуйте!у нас заблокировался контакт,и для того чтоб его разблокировать нужно было положить 100 рублей на определённый номер и ввести код транзакции.Подскажите пожалуйста где он находится,и не обман ли это! Заранее огромное спасибо!

  2. 2
    admin пишет:

    Ничего, когда привыкнешь к коду 1С – все вполне понятно, тем более все ра русском))) Кстати есть и латинский вариант встроенного языка 1С, например Если Тогда Иначе КонецЕсли – If Then Else EndIf.
    Как то видел как на 1с пишет программист Delphi. именно по английски – ему так понятнее.

    Насчет примера – я не знаю как точно работает банковская система – я прост опредположил. Наверняка там не 4 пункта, а больше и все возможные варианты отрабатываются…

  3. 1
    батон пишет:

    как ужасно все-такм читать код 1С – наверное буржуям также жутко читать код на «английских» языках программирования.

    зы, насчет примера. а если сбой произошел на 4ом этапе или позже, то как второй сервер откатит транзакцию? он же средства уже принял и (например) зачислил на счет клиента.

Выскажи свое мнение

Я не робот.Нажми обязательно