[РЕШЕНО] Транзакция при проведении

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем rosveta, 29 июн 2015.

  1. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    угу....в документе, порождающем операцию бух, желательно хранить ссылку, или как вариант соответствие в РС, чтобы не искать по строке или уникальной комбинации значений определенного набора реквизитов.

    Синхронное решение такой задачи в любом случае будет очень зыбким, ибо все дело в фиксации транзакции. Если что-то пойдет не так(транзакция не зафиксируется по каким-то причинам) - получим "битые ссылки" на объекты, а при многопользовательской работе с БД вероятность того, что что-то пойдет не так - очень высока.

    Поэтому решение этой задачи должно быть асинхронным: т.е. накопили некий пул проведенных документов, получили список и сформировали по этому списку другие документы. При пометке на удаление/удалении документов "Владельцев", подчиненные документы так же помечаются на удаление/удаляются.
    Последнее редактирование: 30 июн 2015
  2. TopicStarter Overlay
    rosveta
    Offline

    rosveta Опытный в 1С

    Регистрация:
    22 май 2015
    Сообщения:
    152
    Симпатии:
    7
    Баллы:
    29
    Всем большое спасибо за ответы. Свою задачу решила, написав, все-таки именно используя транзакцию, обработка проведения. Подписка будет отрабатывать так же, откатываю всю транзакцию. В итоге во общем все логично получилось, не провелся документ Отчет о розничных продажах, значит и нет бух операции. А в модуле я это стала делать, потому что в нужных мне процедурах уже сформированы необходимые таблицы. Возможно, это некорректно. А делать мне это пришлось из-за регистра ИП МПЗ, который постоянно расходится с бухгалтерским учетом.
  3. TopicStarter Overlay
    rosveta
    Offline

    rosveta Опытный в 1С

    Регистрация:
    22 май 2015
    Сообщения:
    152
    Симпатии:
    7
    Баллы:
    29
    Тут вся загвоздка в том, что пока у меня не будет введено операции Бух, сам отчет не проведется из-за остатков по ИП МПЗ, но это так.. уже детали. Просто в этой теме хотела выяснить, возможен ли частичный откат в транзакциях, но поняла, что нет.
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Возможен, если вы "вручную" откроете транзакцию.

    Код:
    НачатьТранзакцию(<РежимУправленияБлокировкойДанныx>);
    
    Действия по изменению/записи объектов в БД
    
    Если ЕстьОшибки Тогда
    ОтменитьТранзакцию();
    Иначе
    ЗафиксироватьТранзакцию();
    КонецЕсли;
    rosveta нравится это.
  5. TopicStarter Overlay
    rosveta
    Offline

    rosveta Опытный в 1С

    Регистрация:
    22 май 2015
    Сообщения:
    152
    Симпатии:
    7
    Баллы:
    29
    Я правильно поняла, что если ручная транзакция будет вложена еще в одну, то при отмене вышестоящей, она тоже отменится?
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    А вот это я уже не знаю (как-то не заморачивался этой проблемой), надо бы проверить.
  7. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Более того, если будет ошибка в нижестоящей транзакции, вышестоящая тоже вылетит с исключением. 1С не поддерживает вложенные транзакции.
    У вас выскочит ошибка типа "не удалось провести документ бла-бла-бла. В данной транзакции уже происходили ошибки".
    rosveta нравится это.
  8. TopicStarter Overlay
    rosveta
    Offline

    rosveta Опытный в 1С

    Регистрация:
    22 май 2015
    Сообщения:
    152
    Симпатии:
    7
    Баллы:
    29
    Спасибо. теперь работа транзакций стала более понятной.
  9. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Шурик ты не совсем прав, не всегда такое вылетает.

    Вот пример
    Код:
    НачатьТранзакцию()
       
        Попытка
            ЭтотОбъект.НесуществующийМетод();
            //такого метода у объекта нет
        Исключение
       
        КонецПопытки;
       
        Запрос=Новый Запрос;
       
        Запрос.Текст="";
        Результат=Запрос.Выполнить();
       
        СпрСсылка=Справочники.Организации.НайтиПоКоду("000001");
        СпрОб=СпрСсылка.ПолучитьОбъект();
        СпрОб.НаименованиеПолное="аааа";
        СпрОб.Записать();
       
        ЗафиксироватьТранзакцию();
    Тут код выполниться и транзакция завершиться успешно

    теперь возьмем
    ЭтотОбъект.НесуществующийМетод(); и поместим его в процедуру ПриЗаписи () Модуля справочники организации

    и вот такой код напишем
    Код:
    НачатьТранзакцию()
       
        Попытка
            СпрСсылка=Справочники.Организации.НайтиПоКоду("000001");
            СпрОб=СпрСсылка.ПолучитьОбъект();
            СпрОб.НаименованиеПолное="аааа";
            СпрОб.Записать(); //при записи там ошибка
        Исключение
       
        КонецПопытки;
       
        Запрос=Новый Запрос;
       
        Запрос.Текст="";
        Результат=Запрос.Выполнить();
       
        ЗафиксироватьТранзакцию();
    Так вот тут как раз вывалиться ошибка когда будет выполняться запрос, что в данной транзакции происходили ошибки т.к была она в неявной блокировке.
    rosveta нравится это.
  10. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Андрей, там дело в том что вызовом несуществующего метода объекта - на данные базы данных ты никак не влияешь.

    Я упростил твой пример:
    Код:
        
        НачатьТранзакцию();
       
        Попытка
            Док1 = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            Док1.МетодКоторогоНеСуществует();
            //Все будет ок, поскольку с данными базы данных мы ничего не делаем, и внешняя транзакция успешно зафиксируется, это ведь не ошибка при попытке внести какие-то изменения в базу данных. Данные базы данных мы вообще здесь не трогаем.
        Исключение
        КонецПопытки;
       
        Док2 = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
        Док2.Дата = ТекущаяДата();
        Док2.Записать();
           
        ЗафиксироватьТранзакцию();
    


    Код:
        
      НачатьТранзакцию();
       
       Попытка
         Док1 = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
         Док1.Записать(); 
        //А вот здесь внешняя транзакция не будет успешно завершена, поскольку мы попытались неудачно повлиять на данные базы данных (функция Записать()) 
       Исключение
       КонецПопытки;
       
       Док2 = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
       Док2.Дата = ТекущаяДата();
       Док2.Записать();
         
       ЗафиксироватьТранзакцию();
    
  11. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Этот пример того что даже если у тебя в транзакции есть Попытка исключения то не факт что транзакция выполниться.
    Что в первом что во втором случае обе ошибки возникают в Попытке исключения и по идее транзакция в любом случае должна завершиться

    как раз попытку для этого и написали но в одном случае отрабатывает в другом нет
    Т.е есть неявная блокировка. а она уже на уровне платформы

Поделиться этой страницей