Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Вопрос по использованию транзакций          
kosalex Подменю пользователя
сообщение 17.03.15, 20:33
Сообщение #1

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

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



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


 ! 

Правила, пункт 4
 


Сообщение отредактировал Vofka - 17.03.15, 22:04

Vofka Подменю пользователя
сообщение 17.03.15, 22:13
Сообщение #2

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

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

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

kosalex Подменю пользователя
сообщение 17.03.15, 23:03
Сообщение #3

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

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

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



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

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

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


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

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

Vofka Подменю пользователя
сообщение 18.03.15, 9:29
Сообщение #4

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Опишите простыми словами зачем вы используете транзакции в данном сценарии.

kosalex Подменю пользователя
сообщение 18.03.15, 14:02
Сообщение #5

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(Vofka @ 18.03.15, 9:29) *
Опишите простыми словами зачем вы используете транзакции в данном сценарии.



Транзакцию использую чтобы откатить запись документа в базу если возникло какое то исключение.

sava1 Подменю пользователя
сообщение 18.03.15, 14:44
Сообщение #6

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

Здесь достаточно :
Попытка
Док.Записать
Исключение
// записать лог
КонецПопытки

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

Спасибо сказали: kosalex,

Vofka Подменю пользователя
сообщение 18.03.15, 14:45
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

Если в момент записи произойдет исключение - то документ и так не запишется.

Спасибо сказали: kosalex,

kosalex Подменю пользователя
сообщение 18.03.15, 15:11
Сообщение #8

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(sava1 @ 18.03.15, 14:44) *
Здесь достаточно :
Попытка
Док.Записать
Исключение
// записать лог
КонецПопытки

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



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

sava1 Подменю пользователя
сообщение 18.03.15, 15:29
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

Может, проще в процедуре ПриЗаписи все организовать ?

kosalex Подменю пользователя
сообщение 18.03.15, 15:40
Сообщение #10

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(sava1 @ 18.03.15, 15:29) *
Может, проще в процедуре ПриЗаписи все организовать ?



В процедура при записи у справочника? Нет нельзя, обработка должна все делать, ничего в модуль формы/объекта конфигурации не пишется.

Petre Подменю пользователя
сообщение 18.03.15, 15:43
Сообщение #11

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2903
Из: Київ, Україна
Спасибо сказали: 1144 раз
Рейтинг: 1225

Явная транзакция уместна для групповых манипуляций с данными (загрузка справочников / документов) и работает по принципу "все или ничего".
А здесь не вижу смысла.


Signature
Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Спасибо сказали: kosalex,

sava1 Подменю пользователя
сообщение 18.03.15, 15:46
Сообщение #12

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2684
Из: Проскуров
Спасибо сказали: 678 раз
Рейтинг: 656.7

1. ПриЗаписи у Документа.
2. Есть Подписки на события.
Если нужен алгоритм ВсеИлиНичего - используйте транзакцию.

Спасибо сказали: kosalex,

kosalex Подменю пользователя
сообщение 18.03.15, 16:10
Сообщение #13

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(sava1 @ 18.03.15, 15:46) *
1. ПриЗаписи у Документа.
2. Есть Подписки на события.
Если нужен алгоритм ВсеИлиНичего - используйте транзакцию.


Использую транзакцию smile.gif СПАСИБО!

Vofka Подменю пользователя
сообщение 18.03.15, 16:17
Сообщение #14

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13948
Из: Киев
Спасибо сказали: 4514 раз
Рейтинг: 3635.6

kosalex, а остальным проплюсовать не надо?

kosalex Подменю пользователя
сообщение 18.03.15, 19:08
Сообщение #15

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(Vofka @ 18.03.15, 16:17) *
kosalex, а остальным проплюсовать не надо?



Вроде никого не прорпустил)

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 29.03.24, 8:11
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!