Бухгалтерия / Говнокод #13951 Ссылка на оригинал

0

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

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

Запостил: zfilin zfilin, (Updated )

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

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8