1. 1C / Говнокод #13951

    −167

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    Попытка
    	ДокументВозврата.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
    Исключение
    	Попытка
    		ДокументВозврата.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Неоперативный);
    	Исключение
    		Сообщить("Не удалось записать/провести документ возврата в ИБ " + ДокументВозврата, СтатусСообщения.ОченьВажное);
    	КонецПопытки;
    	ДокументВозврата.Записать(РежимЗаписиДокумента.Запись);
    КонецПопытки;

    Что делать, если не получилось провести документ? Правильно! Попробовать еще раз!
    А потом еще и записать.
    Для надежности.

    Запостил: zfilin, 15 Октября 2013

    Комментарии (22) RSS

    • Попытка
        Не Пытка
      А если серьезно - в 1с транзакции могут отваливаться по дедлоку?
      Ответить
      • И по дедлоку и просто по таймауту.
        А код - треш конечно.
        Ответить
    • [удалено]
      Ответить
    • Сначала пытаются провести документ оперативно. Если не получилось, неоперативно. Как последняя попытка - записать без проведения.
      Что не так?
      Ответить
      • В вашем комментарии все верно.
        Но к коду он отношения не имеет.
        Ответить
    • Можете привести правильный код для вышеописанной мной задачи?
      Ответить
      • На 1С? Ты смеешься?
        Ответить
        • По таблицам базы разбросать?
          Легко.
          1. Записать изменения в таблицу документов и таблицу табличных частей документов. Проверить по контрольным функциям, можно ли записать данные в таблицы регистров и сделать это, если контроль положительный при установленном параметре ОперативноеПроведение.
          2. В случае отказа в п.1, то же самое с параметром Неоперативное проведение.
          3. В случае отказа записи просто записать данные в таблицу документов и табличных частей документов.
          Ответить
      • Где ты писал про задачу?
        Ответить
        • Высоко высоко в горах...
          Ответить
        • Задача:
          Провести документ оперативно.
          Если не получилось, неоперативно.
          Как последняя попытка - записать без проведения.
          Ответить
          • Это сложно найти в самом коде, в месте где выдается сообщение?
            1С под боком нет.
            Ответить
            • В 1С есть встроенные жесткие ограничения на классы объектов, методы и свойства. транзакция записи/проведения откатывается если при окончании ее параметр Отказ = Истина. Параметр устанавливается программно.
              Если ошибка типа runtime, то общего обработчика нет, только так вот через попытку-исключение.
              Ответить
    • Хочу добавить, что 1С все-таки не язык программирования в классическом смысле, а язык программирования бизнес-логики, рассчитанный на быструю подстройку под изменяющиеся правила бизнеса. Все остальное здесь вторично. Потому и присутствует некоторая ущербность в реализации некоторых операций.
      Ответить
    • Все будет еще смешнее, если весь этот код выполняется в транзакции.
      Вложенные транзакции в 1С поддерживаются (а запись документа будет во вложенной транзакции), но при любой неудаче родительская транзакция помечается как бэдовая и любая попытка ее зафиксировать провалится. Так что смысла не будет иметь ни вложенная Попытка, ни запись просто без проведения.
      Ответить
      • Учитывая, что это код все-таки в продакшене - оно работает. а, следовательно, не в транзакции
        Ответить

    Добавить комментарий