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