Как правильно обрабатывать «Ошибка 5. Движения добавляются даже после обнаружени

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как правильно обрабатывать «Ошибка 5. Движения добавляются даже после обнаружени

Просмотр 1 ветки ответов
  • Автор
    Записи
    • #38866
      Фото аватараOdineski
      Участник

        Разбираю «Ошибка 5. Движения добавляются даже после обнаружения нехватки других товаров» из твоего предыдущего сообщения.
        А если написать не
        Если Отказ Тогда
        Возврат;
        КонецЕсли;

        А написать
        Если Отказ Тогда
        Продолжить;
        КонецЕсли;

      • #38867
        bot_avaOdin — Одинэсник
        Участник

          Продолжить и Возврат работают по-разному.

          ## Если написать Возврат

          процедура проведения немедленно завершится.

          Если этот код находится после цикла проверки:

          то результат такой:

          1. Проверены все строки.
          2. Если хотя бы по одной строке нехватка, установлен Отказ = Истина.
          3. После завершения цикла процедура завершилась.
          4. Формирование движений не выполняется.

          Это правильный вариант, если проверка и формирование движений находятся в одной процедуре последовательно.

          ## Если написать Продолжить

          Продолжить не завершает процедуру. Он только пропускает текущую итерацию цикла и переходит к следующей строке.

          Например:

          Здесь получится следующая логика:

          То есть Продолжить пропустит только товар с нехваткой. Для следующих товаров цикл продолжится.

          ## Но при Отказ = Истина документ все равно не проведется

          В типовой процедуре проведения, если в конце остается:

          документ не должен быть проведен, а автоматически формируемые движения не должны попасть в регистр.

          Поэтому при таком коде:

          движения по товарам, которых хватает, будут добавлены в коллекцию Движения, но при отказе проведение всего документа будет отменено.

          Однако это не означает, что такой вариант лучше.

          ## В чем проблема подхода с Продолжить

          Проблема в том, что в коллекции движений уже появятся движения по части товаров, хотя весь документ в итоге будет отклонен.

          Получится промежуточное состояние:

          Платформа обычно не запишет эти движения при отказе, но сам алгоритм становится менее понятным. Если в процедуре есть явные вызовы:

          или другая дополнительная запись движений, можно получить нежелательные последствия.

          Главный принцип:

          > Сначала полностью проверить документ, и только если ошибок нет, формировать движения.

          ## Правильный вариант: два цикла

          Лучше разделить проверку остатков и формирование движений.

          ### Первый цикл, только проверка

          ### Если есть ошибка, завершить процедуру

          ### Второй цикл, только формирование движений

          Это наиболее прозрачная схема:

          ## Когда Продолжить действительно уместен

          Продолжить уместен, если вы сознательно хотите пропускать отдельные строки и обрабатывать остальные:

          Например:

          — пропустить пустую строку;
          — пропустить товар определенного вида;
          — не формировать движение по строкам, не участвующим в операции;
          — собрать ошибки по всем строкам и продолжить проверку.

          Но для контроля остатков расходной накладной обычно нужно не просто пропустить проблемную строку, а отменить проведение всего документа. Поэтому здесь лучше использовать не Продолжить вместо Возврат, а отдельный цикл проверки и затем:

          ## Вариант с одним циклом

          Если не хочется делать два цикла, можно проверять все строки, но движения не формировать сразу:

          Но после этого потребуется снова пройти результат запроса для формирования движений. Поэтому практически удобнее:

          и два прохода по таблице значений.

          ## Кратко по различиям

          означает:

          означает:

          В вашем случае:

          не прекращает обработку документа. Он позволяет продолжить цикл, и движения по следующим товарам будут добавляться.

          Для полного запрета проведения при нехватке хотя бы одного товара лучше использовать такую схему:

      Просмотр 1 ветки ответов
      • Для ответа в этой теме необходимо авторизоваться.
      База знаний 1С