Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по использованию транзакций
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
kosalex
Попытка    
        //Создадим документ УстановкаЦенНоменклатуры++
        //ТипЦены = 000000001 (*Розничная)
        НачатьТранзакцию(); //НАЧАТЬ ТРАНЗАКЦИЮ
        ДокУстановкаЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
        ДокПустой = Истина;
        ДокУстановкаЦен.Дата = ТекущаяДата();
        ДокУстановкаЦен.УстановитьНовыйНомер();
        //
        СтрокаЦен = ДокУстановкаЦен.ТипыЦен.Добавить();
        ПоискТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000001");
        СтрокаЦен.ТипЦен = ПоискТипЦен;
        //Создадим документ УстановкаЦенНоменклатуры--
        
        //Переберем Таблицу с ценами
        //Проверим цену на товар++
        Если ТаблНовойИЗагруженнойНоменклатуры.Количество() > 0 Тогда
            ДокУстановкаЦен.Записать(РежимЗаписиДокумента.Запись,);
            
            Для Каждого СтрокаИзТаблицы Из ТаблНовойИЗагруженнойНоменклатуры Цикл
                ЦенаПоменялась = ПроверитьЦенуНаТовар(СтрокаИзТаблицы.Номенклатура.Ссылка,СтрокаИзТаблицы.ЦенаИзФайла);
                Если ЦенаПоменялась Тогда
                    ДокПустой = Ложь;
                                        
                    ДокУстановкаЦенОбъект = ДокУстановкаЦен.Ссылка.ПолучитьОбъект();
                    
                    СтрокаТовары = ДокУстановкаЦенОбъект.Товары.Добавить();
                    СтрокаТовары.Номенклатура = СтрокаИзТаблицы.Номенклатура.Ссылка;
                    СтрокаТовары.ТипЦен = ПоискТипЦен;
                    СтрокаТовары.Цена = Число(СтрокаИзТаблицы.ЦенаИзФайла);                                            
                    СтрокаТовары.Валюта = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000001").ВалютаЦены.Ссылка;
                    СтрокаТовары.ЕдиницаИзмерения = СтрокаИзТаблицы.Номенклатура.Ссылка.ЕдиницаХраненияОстатков.Ссылка;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
        //Проверим цену на товар--
        
        
        Если НЕ ДокПустой Тогда
            ДокУстановкаЦен.Записать(РежимЗаписиДокумента.Запись,);
            ЗафиксироватьТранзакцию();
            ФайлЛога.ДобавитьСтроку("Документ ""Установка цен номенклатур"" создан.");
        Иначе
            ДокУстановкаЦен = Неопределено;
        КонецЕсли;
        
        
    Исключение;
        ОтменитьТранзакцию();
        ФайлЛога.ДобавитьСтроку("Документ ""Установка цен номенклатур"" не создан.");
    КонецПопытки;



Интересует вопрос, про Транзацкии, правильно ли они расставлены, нужно ли писать ДокУстановкаЦен.Записать(РежимЗаписиДокумента.Запись,); , если используются транзакции в коде как у меня?


 ! 

Правила, пункт 4
 
Vofka
Объясните что вы хотите сделать и зачем, в данном случае, используете транзакцию?

ПС. У меня сложилось впечатление, что вы как-то не понимаете что такое транзакция.
kosalex
Цитата(Vofka @ 17.03.15, 22:13) необходимо зарегистрироваться для просмотра ссылки
Объясните что вы хотите сделать и зачем, в данном случае, используете транзакцию?

ПС. У меня сложилось впечатление, что вы как-то не понимаете что такое транзакция.



Транзакция - это те данные котороые запишуться в БД после ее завершения, если в процессе записи в транзакции происходит сбой, ничего в бд не пишется.

Мне нужно, если будут ошибки при записи документа или в процессе выполнения обработки, не записывать в базу и продолжать цикл обработки дальше.

Может так :
Попытка    
  //Создадим документ УстановкаЦенНоменклатуры++
        //ТипЦены = 000000001 (*Розничная)
        НачатьТранзакцию(); //НАЧАТЬ ТРАНЗАКЦИЮ
        ДокУстановкаЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
        ДокПустой = Истина;
        ДокУстановкаЦен.Дата = ТекущаяДата();
        ДокУстановкаЦен.УстановитьНовыйНомер();
        //
        СтрокаЦен = ДокУстановкаЦен.ТипыЦен.Добавить();
        ПоискТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000001");
        СтрокаЦен.ТипЦен = ПоискТипЦен;
        //Создадим документ УстановкаЦенНоменклатуры--
        
        //Переберем Таблицу с ценами
        //Проверим цену на товар++
        Если ТаблНовойИЗагруженнойНоменклатуры.Количество() > 0 Тогда
            Для Каждого СтрокаИзТаблицы Из ТаблНовойИЗагруженнойНоменклатуры Цикл
                ЦенаПоменялась = ПроверитьЦенуНаТовар(СтрокаИзТаблицы.Номенклатура.Ссылка,СтрокаИзТаблицы.ЦенаИзФайла);
                Если ЦенаПоменялась Тогда
                    ДокПустой = Ложь;


            ДокУстановкаЦен.Записать(РежимЗаписиДокумента.Запись,);
            
ЗафиксироватьТранзакцию();

                     НачатьТранзакцию();                
                    ДокУстановкаЦенОбъект = ДокУстановкаЦен.Ссылка.ПолучитьОбъект();
                    
                    СтрокаТовары = ДокУстановкаЦенОбъект.Товары.Добавить();
                    СтрокаТовары.Номенклатура = СтрокаИзТаблицы.Номенклатура.Ссылка;
                    СтрокаТовары.ТипЦен = ПоискТипЦен;
                    СтрокаТовары.Цена = Число(СтрокаИзТаблицы.ЦенаИзФайла);                                            
                    СтрокаТовары.Валюта = Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("000000001").ВалютаЦены.Ссылка;
                    СтрокаТовары.ЕдиницаИзмерения = СтрокаИзТаблицы.Номенклатура.Ссылка.ЕдиницаХраненияОстатков.Ссылка;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
        //Проверим цену на товар--
        
        
        Если НЕ ДокПустой Тогда
            ДокУстановкаЦен.Записать(РежимЗаписиДокумента.Запись,);
            ЗафиксироватьТранзакцию();
            ФайлЛога.ДобавитьСтроку("Документ ""Установка цен номенклатур"" создан.");
        Иначе
            ДокУстановкаЦен = Неопределено;
        КонецЕсли;
        
        
    Исключение;
        ОтменитьТранзакцию();
        ФайлЛога.ДобавитьСтроку("Документ ""Установка цен номенклатур"" не создан.");
    КонецПопытки;
Vofka
Опишите простыми словами зачем вы используете транзакции в данном сценарии.
kosalex
Цитата(Vofka @ 18.03.15, 9:29) необходимо зарегистрироваться для просмотра ссылки
Опишите простыми словами зачем вы используете транзакции в данном сценарии.



Транзакцию использую чтобы откатить запись документа в базу если возникло какое то исключение.
sava1
Здесь достаточно :
Попытка
Док.Записать
Исключение
// записать лог
КонецПопытки

Транзакцию надо было бы, если б документ писал в справочник / независимый регистр
Vofka
Если в момент записи произойдет исключение - то документ и так не запишется.
kosalex
Цитата(sava1 @ 18.03.15, 14:44) необходимо зарегистрироваться для просмотра ссылки
Здесь достаточно :
Попытка
Док.Записать
Исключение
// записать лог
КонецПопытки

Транзакцию надо было бы, если б документ писал в справочник / независимый регистр



а если у меня точно также с элементом справочника, нужно не записывать если ошибка.Транзакция тут тоже не нужна будет?
sava1
Может, проще в процедуре ПриЗаписи все организовать ?
kosalex
Цитата(sava1 @ 18.03.15, 15:29) необходимо зарегистрироваться для просмотра ссылки
Может, проще в процедуре ПриЗаписи все организовать ?



В процедура при записи у справочника? Нет нельзя, обработка должна все делать, ничего в модуль формы/объекта конфигурации не пишется.
Petre
Явная транзакция уместна для групповых манипуляций с данными (загрузка справочников / документов) и работает по принципу "все или ничего".
А здесь не вижу смысла.
sava1
1. ПриЗаписи у Документа.
2. Есть Подписки на события.
Если нужен алгоритм ВсеИлиНичего - используйте транзакцию.
kosalex
Цитата(sava1 @ 18.03.15, 15:46) необходимо зарегистрироваться для просмотра ссылки
1. ПриЗаписи у Документа.
2. Есть Подписки на события.
Если нужен алгоритм ВсеИлиНичего - используйте транзакцию.


Использую транзакцию smile.gif СПАСИБО!
Vofka
kosalex, а остальным проплюсовать не надо?
kosalex
Цитата(Vofka @ 18.03.15, 16:17) необходимо зарегистрироваться для просмотра ссылки
kosalex, а остальным проплюсовать не надо?



Вроде никого не прорпустил)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.