v7: НачатьТранзакцию() и Попытка #729371


#0 by Ogonechek
Конфигурация ТиС. Внешняя обработка. Она создает тройку документов Поступление, снятие резерва, реализация. Так вот. Часто возникает ситуация, что по компании остаток отрицательный, поэтому реализация не проводится. Сначала писала без НачатьТранзакцию, а просто попытку с исключением (если документ не провелся). Работало потрясающе, только в этом случае проводились снятие резерва и поступление, а реализация, соответственно, не проводилась. А нужно, чтобы либо вся тройка создавалась без ошибок, либо выводились ошибки, но документы не записывались вообще. Часть кода:             НачатьТранзакцию;
#1 by Ogonechek
Выдает такую ошибку: Документ не проведен! :Реализация (розница) 0000005963 (01.12.14) ОтменитьТранзакцию; {C:DOCUMENTS AND SETTINGSITMASTERРАБОЧИЙ СТОЛВОССТАНОВЛЕНИЕОСТАТКОВ.ERT}: Транзакция не активна
#2 by Ogonechek
Т.е. сначала срабатывает Зафиксирвоать, а потом зачем-то идет в исключение что ли? Пыталась делать через переменную типа Попытка ... Но тогда он выдает Документ не проведен! :Реализация (розница) 0000005960 (01.12.14) ЗафиксироватьТранзакцию; {C:DOCUMENTS AND SETTINGSITMASTERРАБОЧИЙ СТОЛВОССТАНОВЛЕНИЕОСТАТКОВ.ERT}: Ошибка при выполнении процедуры ЗафиксироватьТранзакцию
#3 by DrZombi
Попробуй сперва вот так сделать: ...местами поменять сообщить... Бывает, обычно для 100% работы, еще и "ОтменитьТранзакцию;" заключи в исключение. :) Попытка
#4 by Локи-13
можно проверить на ТранзакцияАктивна скорее всего она отменяется в проведении документа
#5 by Локи-13
1С не поддерживает вложенные транзакции
#6 by vde69
во первых зачем ты все три документа делаешь одним временем? у тебя из-за этого может не хватать остатков... делай разницу в 1 сек...
#7 by Cap_1977
Если в теле операторов Начать/Отменить транзакцию хоть один из методов .Провести обломается - обломается вся транзакция. Я бы делал не так, а вот так:
#8 by Ogonechek
Ну так я реализацию и делаю позже специально. Местами поменяла. Ошибка чуть-чуть изменилась Документ не проведен! :Реализация (розница) 0000005963 (01.12.14) Ошибка при выполнении процедуры ЗафиксироватьТранзакцию ОтменитьТранзакцию; {C:DOCUMENTS AND SETTINGSITMASTERРАБОЧИЙ СТОЛВОССТАНОВЛЕНИЕОСТАТКОВ.ERT}: Транзакция не активна А как тогда я напишу в этом примере так, чтобы у меня вся тройка не записывалась?
#9 by Cap_1977
Чем мешает непроведенный документ ? Итоги то он не двигает
#10 by Ogonechek
Просто эта обработка будет запускаться за месяц, например. И эта тройка будет делаться по каждой фирме и складу. И если будет достаточно много документов, то это засорит базу, мне кажется.
#11 by vde69
>>>>И если будет достаточно много документов, то это засорит базу, мне кажется. бред... документ это отражение какого-то конкретного действия, если в документ запихнуть несколько разных действий - это уже бизнес процесс получится...
#12 by Ogonechek
Смысл обработки вообще в том, чтобы сделать "перемещение". У клиента в 1с две организации и идет контроль остатков по компании. Часто у них по 1ой организации есть, а по 2ой нет. Они продают в минус по той, что нет, а потом делается связка поступление-реализация. Списывается с одной организации, на другую. Попросили это автоматизировать. Но появилась такая фишка, что они где-то запороли документы, например, в 2011 году. И перепроводить с того времени - это вообще не вариант. И бывает так, что есть минус по компании. Вот конкретно в такие моменты реализации и не проводятся
#13 by Ogonechek
И если они выбирают период например Месяц, то каждый день идет проверка на минусы и создается тройка документов.
#14 by Бубка Гоп
Может сначала стоит устанавливать время, а после уже записывать?
#15 by Локи-13
почему мой вариант не был использован?
#16 by Ogonechek
Потому что я  еще не нашла, где бы было написано как этим пользоваться. А если я просто пишу ТранзакцияАктивна, то мне не дает сохранить, не знает, что за функция.
#17 by Cap_1977
В таком случае имеет смысл подправить базу таким образом чтобы в регистры партий и остатков писалась пустая фирма. Либо, выставить константу "Контроль отрицательных остатков" в "По компании".
#18 by Локи-13
синтакс помощник отменили? Глобальный контекст (Global context) ТранзакцияАктивна (TransactionActive) Синтаксис: ТранзакцияАктивна Возвращаемое значение: Тип: Булево. Истина - в системе имеется активная транзакция, Ложь - в текущий момент в системе не имеется активных транзакций. Описание: Получить текущее состояние транзакции. Доступность: Сервер, толстый клиент, внешнее соединение.
#19 by Локи-13
для танкистов надо так Исключение
#20 by Alexor
в 7.7?
#21 by Ogonechek
Вот не поверишь, но у меня нет такой функции. И насколько я уже поняла, ее в 7ке нет.
#22 by Cap_1977
Вот и выросло поколение снеговика ...
#23 by Локи-13
а чорт... понедельник... извините, удаляюсь
#24 by Ogonechek
Там и стоит контроль по компании. Фишка в чем. Если смотреть по отчетам, то ОстаткиТМЦ показывают минус, а ВедомостьПоПартиям не показывает минус. У них бардак в базе.
#25 by Бубка Гоп
Так может сначала запросиком проверять остатки, и если минус - вообще не пытаться проводить, не?
#26 by Cap_1977
еСЛИ стоит метод учета "По компании" - то нельзя генерить отчеты в разрезе фирм, повылазиет всякого ... Модифицируй отчеты. Заблокируй доступ к выборру фирмы, юр лица и аналитики управленческой, и множественный фильтр не забудь.
#27 by Ogonechek
Сейчас у меня запрос составлен так, что он просто проверяет минусы. Если есть, начинает создание документов. Первоначально, они мне сказали, что быть не может минуса по компании, ибо стоит контроль остатков. И всегда есть "плюсовое" количество по одной фирме, и отрицательное по другой. Как оказалось минус может быть. Засунуть в тот запрос, что есть, общую проверку по компании я не могу (как минимум потому, что не сильна в запросах 7ки). Но тогда возникает вопрос, если я еще одним запросом буду проверять, есть ли минус по компании, то как сильно это отразится на времени выполнении обработки?
#28 by Бубка Гоп
ИМХО, по времени - выполнение запроса должно пройти в разы быстрее чем попытка проведения 3х документов (не говоря про их создание, запись и тд)
#29 by Ogonechek
Логично) Буду пробовать сейчас тогда. Спасибо) Надеюсь, поможет)
#30 by Бубка Гоп
+ однако хорошо бы знать о каком количестве таких "троек" идет речь, и сколько из них - не могут быть проведены без доп шаманства
#31 by Tester
Я бы обошелся без транзакции. Создаем и проводишь 3 документа. Потом проверяешь все ли созданы и проведены. Если нет, то удаляешь все 3 документа.
#32 by Бубка Гоп
вроде транзакция для этого и существует, разве нет?
#33 by Tester
Но не в случае транзакции в транзакции, да и еще с попытками!
#34 by DrZombi
Твои страхи беспочвенны. Базу Засорит твоя Обработка с Транзакцией. У 1С 7.7 эта команда "НачатьТранзакцию" блокирует всю БД, пока ты не вызовешь "ОтменитьТранзакцию" или "ЗафиксироватьТранзакцию". Так же всю базу блокирует само проведение документа, или просто запись документа, т.к. Журнал у 7.7 Один для всех видов документов (Один физически, в виде таблицы) :) У 7.7 так же нет вызова исключения, при не успешном проведении документа, так что лучше всегда проверять "ДокПоступление.Провести <> 1" (Если 1 - Все ОК, если 0 - то все плохо и документ не перепровелся или не провелся.) Так же стоит проверять, а не удален ли твой документ. Документ помеченный на удаление, нельзя провести :)
#35 by DrZombi
Контроль то стоит только при проведении. А вот отмену промежуточных документов или редактирование документов Поставки. в БД никто особо не спешит реализовывать :)
#36 by DrZombi
Только не в 1С 7.7. При определенном документо-обороте, обычные 1С-овские запросы (черные), попросту умирают :)
#37 by DrZombi
+ 100500. Так же я бы воткнул паузу на 5 сек, после 10-ти таких партий документов. (это в том случае, если проводятся в рабочем режиме)
#38 by Simod
В общем случае при формировании комплекта документов для возможности "отката" лучше использовать: Вызов исключения можно генерировать искусственно: Попытка      Еще лучше проверить остатки перед формированием комплекта документов.
#39 by Злопчинский
Нормально в транзакции отрабатывает создание и проведение группы документов и нормально откат до начального состояния происходит если не полвелос Пишите просто аккуратно и все
#40 by Злопчинский
док.скммавзаиморасчетов = док.итог("сумма") Так писать нельзя Сумма взаиморасчетов выражается в валюте договора А сумма в тч документа - в валюте документа И эти две валюты в общем случае неодинаковы
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С