Имя: Пароль:
1C
1C 7.7
v7: НачатьТранзакцию() и Попытка
,
0 Ogonechek
 
22.12.14
11:00
Конфигурация ТиС. Внешняя обработка. Она создает тройку документов Поступление, снятие резерва, реализация. Так вот. Часто возникает ситуация, что по компании остаток отрицательный, поэтому реализация не проводится. Сначала писала без НачатьТранзакцию(), а просто попытку с исключением (если документ не провелся). Работало потрясающе, только в этом случае проводились снятие резерва и поступление, а реализация, соответственно, не проводилась. А нужно, чтобы либо вся тройка создавалась без ошибок, либо выводились ошибки, но документы не записывались вообще. Часть кода:

            НачатьТранзакцию();

            Попытка      
                Если ДокПоступление.КоличествоСтрок() > 0 Тогда  
                    ДокПоступление.СуммаВзаиморасчетов = ДокПоступление.Итог("Сумма");    
                    ДокПоступление.Записать();
                    ДокПоступление.УстановитьВремя(0,0,0);
                    ДокПоступление.Провести();
                КонецЕсли;
                Если ДокСнятиеРезерва.КоличествоСтрок() > 0 Тогда      
                    ДокСнятиеРезерва.Записать();
                    ДокСнятиеРезерва.УстановитьВремя(0,0,0);
                    ДокСнятиеРезерва.Провести();    
                КонецЕсли;
                Если ДокРеализация.КоличествоСтрок() > 0 Тогда    
                    ДокРеализация.СуммаВзаиморасчетов = ДокРеализация.Итог("Сумма");
                    ДокРеализация.Записать();                          
                    ДокРеализация.УстановитьВремя(0,0,1);
                    ДокРеализация.Провести();                          
                КонецЕсли;      
                ЗафиксироватьТранзакцию();
            Исключение
                ОтменитьТранзакцию();
                Сообщить(ОписаниеОшибки());  
            КонецПопытки;
1 Ogonechek
 
22.12.14
11:01
Выдает такую ошибку:
Документ не проведен! :Реализация (розница) 0000005963 (01.12.14)
ОтменитьТранзакцию();
{C:\DOCUMENTS AND SETTINGS\ITMASTER\РАБОЧИЙ СТОЛ\ВОССТАНОВЛЕНИЕОСТАТКОВ.ERT(208)}: Транзакция не активна
2 Ogonechek
 
22.12.14
11:09
Т.е. сначала срабатывает Зафиксирвоать, а потом зачем-то идет в исключение что ли?
Пыталась делать через переменную типа

Успешно = 1;
НачатьТранзакцию();
Попытка
...
Исключение
Успешно = 0;
КонецПопытки;

Если успешно = 1 Тогда
ЗафиксироватьТранзакцию();
Иначе
ОтменитьТранзакцию();
КонецЕсли;

Но тогда он выдает
Документ не проведен! :Реализация (розница) 0000005960 (01.12.14)
ЗафиксироватьТранзакцию();
{C:\DOCUMENTS AND SETTINGS\ITMASTER\РАБОЧИЙ СТОЛ\ВОССТАНОВЛЕНИЕОСТАТКОВ.ERT(225)}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию
3 DrZombi
 
гуру
22.12.14
11:11
(1) Попробуй сперва вот так сделать:
...местами поменять сообщить...

Бывает, обычно для 100% работы, еще и "ОтменитьТранзакцию();" заключи в исключение. :)


Попытка
//Твой мусор проведения
            Исключение
               Сообщить(ОписаниеОшибки());  
               ОтменитьТранзакцию();
            КонецПопытки;
4 Локи-13
 
22.12.14
11:11
можно проверить на ТранзакцияАктивна()

скорее всего она отменяется в проведении документа
5 Локи-13
 
22.12.14
11:12
1С не поддерживает вложенные транзакции
6 vde69
 
22.12.14
11:12
во первых зачем ты все три документа делаешь одним временем?

у тебя из-за этого может не хватать остатков... делай разницу в 1 сек...
7 Cap_1977
 
22.12.14
11:15
(0) Если в теле операторов Начать/Отменить транзакцию хоть один из методов .Провести() обломается - обломается вся транзакция.
Я бы делал не так, а вот так:

.... <твой код>
ДокПоступление.Записать();

Если ДокПоступление.Провести() <> 1 Тогда // тут ловим отказ в проведении...
КонецЕсли;
8 Ogonechek
 
22.12.14
11:20
(6) Ну так я реализацию и делаю позже специально.
(3) Местами поменяла. Ошибка чуть-чуть изменилась

Документ не проведен! :Реализация (розница) 0000005963 (01.12.14)
Ошибка при выполнении процедуры ЗафиксироватьТранзакцию
ОтменитьТранзакцию();
{C:\DOCUMENTS AND SETTINGS\ITMASTER\РАБОЧИЙ СТОЛ\ВОССТАНОВЛЕНИЕОСТАТКОВ.ERT(209)}: Транзакция не активна (7) А как тогда я напишу в этом примере так, чтобы у меня вся тройка не записывалась?
9 Cap_1977
 
22.12.14
11:21
(8) Чем мешает непроведенный документ ? Итоги то он не двигает
10 Ogonechek
 
22.12.14
11:23
(9) Просто эта обработка будет запускаться за месяц, например. И эта тройка будет делаться по каждой фирме и складу. И если будет достаточно много документов, то это засорит базу, мне кажется.
11 vde69
 
22.12.14
11:25
>>>>И если будет достаточно много документов, то это засорит базу, мне кажется.

бред...

документ это отражение какого-то конкретного действия, если в документ запихнуть несколько разных действий - это уже бизнес процесс получится...
12 Ogonechek
 
22.12.14
11:26
Смысл обработки вообще в том, чтобы сделать "перемещение". У клиента в 1с две организации и идет контроль остатков по компании. Часто у них по 1ой организации есть, а по 2ой нет. Они продают в минус по той, что нет, а потом делается связка поступление-реализация. Списывается с одной организации, на другую. Попросили это автоматизировать.
Но появилась такая фишка, что они где-то запороли документы, например, в 2011 году. И перепроводить с того времени - это вообще не вариант. И бывает так, что есть минус по компании. Вот конкретно в такие моменты реализации и не проводятся
13 Ogonechek
 
22.12.14
11:28
И если они выбирают период например Месяц, то каждый день идет проверка на минусы и создается тройка документов.
14 Бубка Гоп
 
22.12.14
11:32
Может сначала стоит устанавливать время, а после уже записывать?
15 Локи-13
 
22.12.14
11:32
(8) почему мой вариант не был использован?
16 Ogonechek
 
22.12.14
11:36
(15) Потому что я  еще не нашла, где бы было написано как этим пользоваться. А если я просто пишу ТранзакцияАктивна(), то мне не дает сохранить, не знает, что за функция.
17 Cap_1977
 
22.12.14
11:39
(12) В таком случае имеет смысл подправить базу таким образом чтобы в регистры партий и остатков писалась пустая фирма.
Либо, выставить константу "Контроль отрицательных остатков" в "По компании".
18 Локи-13
 
22.12.14
11:39
(16) синтакс помощник отменили?

Глобальный контекст (Global context)
ТранзакцияАктивна (TransactionActive)
Синтаксис:

ТранзакцияАктивна()
Возвращаемое значение:

Тип: Булево.
Истина - в системе имеется активная транзакция, Ложь - в текущий момент в системе не имеется активных транзакций.
Описание:

Получить текущее состояние транзакции.

Доступность:

Сервер, толстый клиент, внешнее соединение.
19 Локи-13
 
22.12.14
11:40
для танкистов надо так

Исключение
Если  ТранзакцияАктивна() Тогда
  ОтменитьТранзакцию();
Конецесли;
Сообщить(ОписаниеОшибки());  
КонецПопытки;
20 Alexor
 
22.12.14
11:42
(19) в 7.7?
21 Ogonechek
 
22.12.14
11:43
(19) Вот не поверишь, но у меня нет такой функции. И насколько я уже поняла, ее в 7ке нет.
22 Cap_1977
 
22.12.14
11:43
Вот и выросло поколение снеговика ...
23 Локи-13
 
22.12.14
11:43
(21) а чорт... понедельник... извините, удаляюсь
24 Ogonechek
 
22.12.14
11:44
(17) Там и стоит контроль по компании. Фишка в чем. Если смотреть по отчетам, то ОстаткиТМЦ показывают минус, а ВедомостьПоПартиям не показывает минус. У них бардак в базе.
25 Бубка Гоп
 
22.12.14
11:47
(24)
Так может сначала запросиком проверять остатки, и если минус - вообще не пытаться проводить, не?
26 Cap_1977
 
22.12.14
11:48
(24) еСЛИ стоит метод учета "По компании" - то нельзя генерить отчеты в разрезе фирм, повылазиет всякого ... Модифицируй отчеты. Заблокируй доступ к выборру фирмы, юр лица и аналитики управленческой, и множественный фильтр не забудь.
27 Ogonechek
 
22.12.14
11:55
(25) Сейчас у меня запрос составлен так, что он просто проверяет минусы. Если есть, начинает создание документов. Первоначально, они мне сказали, что быть не может минуса по компании, ибо стоит контроль остатков. И всегда есть "плюсовое" количество по одной фирме, и отрицательное по другой. Как оказалось минус может быть.

Засунуть в тот запрос, что есть, общую проверку по компании я не могу (как минимум потому, что не сильна в запросах 7ки). Но тогда возникает вопрос, если я еще одним запросом буду проверять, есть ли минус по компании, то как сильно это отразится на времени выполнении обработки?
28 Бубка Гоп
 
22.12.14
11:57
(27)
ИМХО, по времени - выполнение запроса должно пройти в разы быстрее чем попытка проведения 3х документов (не говоря про их создание, запись и тд)
29 Ogonechek
 
22.12.14
11:59
(28) Логично) Буду пробовать сейчас тогда. Спасибо) Надеюсь, поможет)
30 Бубка Гоп
 
22.12.14
12:00
(28) + однако хорошо бы знать о каком количестве таких "троек" идет речь, и сколько из них - не могут быть проведены без доп шаманства
31 Tester
 
22.12.14
12:07
(0) Я бы обошелся без транзакции. Создаем и проводишь 3 документа. Потом проверяешь все ли созданы и проведены. Если нет, то удаляешь все 3 документа.
32 Бубка Гоп
 
22.12.14
12:10
(31)
вроде транзакция для этого и существует, разве нет?
33 Tester
 
22.12.14
12:18
(32) Но не в случае транзакции в транзакции, да и еще с попытками!
34 DrZombi
 
гуру
22.12.14
12:41
(10) Твои страхи беспочвенны. Базу Засорит твоя Обработка с Транзакцией. У 1С 7.7 эта команда "НачатьТранзакцию" блокирует всю БД, пока ты не вызовешь "ОтменитьТранзакцию" или "ЗафиксироватьТранзакцию".

Так же всю базу блокирует само проведение документа, или просто запись документа, т.к. Журнал у 7.7 Один для всех видов документов (Один физически, в виде таблицы) :)

У 7.7 так же нет вызова исключения, при не успешном проведении документа, так что лучше всегда проверять "ДокПоступление.Провести() <> 1" (Если 1 - Все ОК, если 0 - то все плохо и документ не перепровелся или не провелся.)

Так же стоит проверять, а не удален ли твой документ. Документ помеченный на удаление, нельзя провести :)
35 DrZombi
 
гуру
22.12.14
12:43
(27) Контроль то стоит только при проведении. А вот отмену промежуточных документов или редактирование документов Поставки. в БД никто особо не спешит реализовывать :)
36 DrZombi
 
гуру
22.12.14
12:45
(28) Только не в 1С 7.7. При определенном документо-обороте, обычные 1С-овские запросы (черные), попросту умирают :)
37 DrZombi
 
гуру
22.12.14
12:46
+(31) 100500. Так же я бы воткнул паузу на 5 сек, после 10-ти таких партий документов. (это в том случае, если проводятся в рабочем режиме)
38 Simod
 
22.12.14
13:00
В общем случае при формировании комплекта документов для возможности "отката" лучше использовать:

Попытка
    
    НачатьТранзакцию();
    
    // ...
    Док.Записать();
    
    //...
    
    Если Док.Провести() = 0 Тогда
        ОтменитьТранзакцию();
        Возврат;
    КонецЕсли;
    
    ЗафиксироватьТранзакцию();
    
Исключение
    Сообщить(ОписаниеОшибки());
    ОтменитьТранзакцию();
    
КонецПопытки;


Вызов исключения можно генерировать искусственно:

Попытка
    
    НачатьТранзакцию();
    
    Ошибка    = 0;
    
    // ...
    
    Ошибка    = 1;
    ВызватьОшибку    = 1 / 0;
    
    ЗафиксироватьТранзакцию();
    
Исключение
    Если Ошибка = 0 Тогда
        Сообщить(ОписаниеОшибки());
    КонецЕсли;
    ОтменитьТранзакцию();
    
КонецПопытки;


Еще лучше проверить остатки перед формированием комплекта документов.
39 Злопчинский
 
22.12.14
22:54
Нормально в транзакции отрабатывает создание и проведение группы документов и нормально откат до начального состояния происходит если не полвелос
Пишите просто аккуратно и все
40 Злопчинский
 
22.12.14
22:56
док.скммавзаиморасчетов = док.итог("сумма")
Так писать нельзя
Сумма взаиморасчетов выражается в валюте договора
А сумма в тч документа - в валюте документа
И эти две валюты в общем случае неодинаковы