|
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
|
док.скммавзаиморасчетов = док.итог("сумма")
Так писать нельзя Сумма взаиморасчетов выражается в валюте договора А сумма в тч документа - в валюте документа И эти две валюты в общем случае неодинаковы |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |