|   |   | 
| 
 | Неявные транзакции в 1с 8.2 вообще и в коде БСП в частности - как работает? | ☑ | ||
|---|---|---|---|---|
| 0
    
        Humandra 13.03.12✎ 20:13 | 
        Господа, а кто мне скажет, как работают неявные транзакции в 1с 8.2 вообще и в Библиотеке стандартных подсистемь в частности? 
  Согласно документации, вложенных транзакций 1С не поддерживает. Но как тогда можно объяснить такое: 1) Создаем элемент справочника (штатный "Пользователь" БСП) 2) В событии ПередЗаписьюНаСервере там одновременно создается ПользовательИБ (штатно, согласно коду БСП) 3) В событии ПриЗаписиНаСервере добавляю код записи некоей связанной с пользователем информации в свой регистр. 4) В коде записи в регистр на ПриЗаписи при определенных условиях присваиваю Отказ = Истина, т.е. вызывается исключение, и записи в регистр не происходит. Ожидаю, что также откатится запись пользователя и - внимание - запись пользователя ИБ. Что имеем в форме справочника? Ошибка записи в регистр, форма Пользователя не закрывается - и это правильно. Но после этого мы исправляем причину ошибки, и снова жмем Записать. И - получаем ошибку снова, только уже из-за того, что в базе уже есть пользователь ИБ. В результате пользователя в справочник мы записать уже не сможем. Но пользователь ИБ - уже есть! Как так? Я что-то в недоумении - а где же неявная транзакция тогда начинается и заканчивается? | |||
| 1
    
        Armando 13.03.12✎ 20:18 | 
        Читаем СП:
  Синтаксис: ПередЗаписьюНаСервере(<Отказ>, <ТекущийОбъект>, <ПараметрыЗаписи>) Описание: Вызывается перед записью объекта на сервере. Можно отменить запись. ВЫПОЛНЯЕТСЯ ВНЕ ТРАНЗАКЦИИ. | |||
| 2
    
        Feanor 13.03.12✎ 20:25 | 
        эх, не вышло интриги ((     | |||
| 3
    
        Humandra 13.03.12✎ 20:32 | 
        (2) Сейчас будет интрига :)))
  (1) Тут накладывается моя 5-летняя привычка работы с Oracle. Мое понимание транзакции пришло оттуда, и может быть не совсем соответствует 1С-кому, и в этом моя проблема? Вот мое понимание: 1) транзакция - это понятие работы с данными, и базами данных 2) она есть всегда, но может в частном случае быть равна одному единственному действию с базой данных. Т.е. - "update одну запись" = одна транзакция, "update другую запись" - другая транзакция. Или же - транзакцию начинают явно, указывая какие операторы входят в транзакцию. Что же тогда есть - выполняется вне транзакции, при условии, что: 1) вложенных транзакций в 1с не бывает 2) &НаКлиенте Процедура ПередЗаписью(Отказ) написано - Процедура-обработчик вызывается после начала транзакции записи, но до начала записи элемента справочника. Т.е. на момент клиентской ПередЗаписью - транзакция стартует! 3) ПередЗаписьюНаСервере идет после клиентского события (не ошибаюсь? по логике вроде так, но доки под рукой нет) 4) В ПередЗаписьюНаСервере уже нет транзакции (точнее, получается, что каждое действие - отдельная транзация) Получается, что ли, что транзакция в ПередЗаписью начинаяется, и сразу же заканчивается? Бред какой-то... | |||
| 4
    
        Humandra 13.03.12✎ 20:34 | 
        (3) Или подождите, может и не бред. Но так ли это? ПриЗаписи - отдельная транзация, заканчивается при окончании события?     | |||
| 5
    
        Humandra 13.03.12✎ 20:35 | 
        (4) читать как "ПЕРЕДЗаписью" - отдельная транзация...     | |||
| 6
    
        Humandra 13.03.12✎ 20:37 | 
        Я почему-то думала, что ВСЯ цепочка событий записи = одна транзация... Кажется доходит, что это не так... В задумчивости.     | |||
| 7
    
        Feanor 13.03.12✎ 20:37 | 
        (3) "написано - Процедура-обработчик вызывается после начала транзакции записи" не знаю, где это написано, но у меня написано другое:
  "Описание: Возникает на клиенте перед выполнением записи объекта из формы. Процедура-обработчик данного события вызывается перед вызовом процедуры-обработчика события ПередЗаписью объекта. " | |||
| 8
    
        Humandra 13.03.12✎ 20:39 | 
        (7) А! Все верно, вы правы. У меня СП подменили :)))) А если серьезно - не туда посмотрела, спутала с событием объекта.
  Все, тогда срастается. | |||
| 9
    
        Feanor 13.03.12✎ 20:39 | 
        (6) "о сколько нам открытий чудных готовит просвещенья дух" ))))     | |||
| 10
    
        Humandra 13.03.12✎ 20:40 | 
        (9) Ну, конечно серверных событий только. Это я сгоряча туда клиентские события записала :)     | |||
| 11
    
        Humandra 13.03.12✎ 20:40 | 
        Все, разобралась, спасибо.     | |||
| 12
    
        Feanor 13.03.12✎ 20:47 | 
        +1 караоке, не иначе ))     | |||
| 13
    
        Armando 13.03.12✎ 20:54 | 
        (6) Запись - это одна транзакция. И все серверные транзакционные события возникают в рамках этой одной транзакции.     | |||
| 14
    
        Humandra 13.03.12✎ 20:59 | 
        (13) Ага, поняла. Просто получается, что первое серверное событие - еще не транзакционное, вот тут и собака порылась с проблемой из (0).
  Я теперь только одного не понимаю. Какого черта разработчики БСП создают пользователя ИБ вне транзакции? Это как-то объяснимо, или просто косяк? | |||
| 15
    
        Armando 13.03.12✎ 21:12 | 
        Трудно сказать чем они руководствовались     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |