Как правильно реализовать методики списания FIFO и LIFO в 1С?

База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как правильно реализовать методики списания FIFO и LIFO в 1С?

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

        Я хочу реализовать методику списания фифо и лифо. Правильно ли я написал код? То есть я могу менять фифо на лифо всего в 3 строчках? Как это нужно сделать на экзамене 1с:специалист?

        Если МетодСписания = Перечисления.МетодыСписания.ФИФО Тогда
        Запрос.Текст = СтрЗаменить(Запрос.Текст, «УБЫВ», «ВОЗР»);
        КонецЕсли;

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

          Да, сам принцип правильный: FIFO и LIFO отличаются порядком выбора партий. Но ваш код работает только при определенных условиях и сам по себе не реализует списание. Он лишь меняет порядок сортировки в тексте запроса.

          ## Какой порядок нужен

          — FIFO: сначала списываются самые старые партии.
          — LIFO: сначала списываются самые новые партии.

          Например:

          Это FIFO.

          Это LIFO.

          Если в исходном запросе стоит:

          то ваш код:

          действительно поменяет LIFO на FIFO.

          Но в текущем виде это не самый надежный вариант.

          ## Что не так с СтрЗаменить

          Ваш код заменит все вхождения УБЫВ в тексте запроса:

          Проблемы могут возникнуть, если:

          1. В запросе несколько сортировок, и не все они относятся к порядку списания.
          2. Один порядок должен быть по возрастанию, а другой по убыванию.
          3. В запросе появится другое поле, которое должно сортироваться независимо от FIFO или LIFO.
          4. Замена будет выполнена повторно.
          5. В тексте будут отличия в регистре или пробелах.
          6. Запрос будет изменен, а строка "УБЫВ" останется не во всех нужных местах.

          Для экзамена такой прием допустим, если он аккуратно реализован и очевиден проверяющему. Но надежнее явно формировать порядок.

          ## Вариант 1. Замена специального маркера

          Вместо замены всех слов УБЫВ лучше использовать уникальный маркер:

          Но обратите внимание: в тексте запроса до замены находится недопустимый для языка запросов маркер #ПОРЯДОК_СПИСАНИЯ#. Это нормально, если запрос выполняется только после замены.

          Можно использовать более нейтральный текстовый маркер:

          Затем:

          ## Вариант 2. Добавлять блок сортировки программно

          Более читаемый вариант:

          Но для экзамена я бы предпочел первый вариант с заранее подготовленным текстом запроса и заменой уникального маркера. Он быстрее пишется и при этом остается понятным.

          ## Важный момент: одного порядка недостаточно

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

          Например:

          В этом примере:

          — запрос получает только партии с положительным остатком;
          — сортировка определяет FIFO или LIFO;
          — цикл последовательно забирает количество из партий;
          — если количества в партии не хватает, переход выполняется к следующей партии;
          — если товара недостаточно, проведение запрещается.

          ## Как сделать надежный порядок партий

          Сортировать только по периоду недостаточно. У нескольких партий может быть одинаковый период. Поэтому нужен детерминированный порядок:

          Конкретный состав полей зависит от структуры регистра. Обычно порядок строят по:

          1. дате партии;
          2. регистратору;
          3. номеру строки документа;
          4. дополнительному идентификатору партии.

          Если партия определяется не датой документа, а отдельным реквизитом ДатаПартии, сортировать нужно именно по нему:

          ## Как это делать на экзамене «1С:Специалист»

          На экзамене не стоит писать два полностью одинаковых запроса для FIFO и LIFO. Правильная схема следующая.

          ### 1. В конфигурации создать метод списания

          Например:

          Метод можно хранить:

          — в константе;
          — в настройках учетной политики;
          — в реквизите организации;
          — в реквизите склада;
          — в реквизите документа, если метод выбирается для конкретного документа.

          ### 2. Получить метод до выполнения запроса

          или:

          ### 3. Подготовить направление сортировки

          ### 4. Подставить направление в запрос

          ### 5. Получить остатки в нужном порядке

          Использовать виртуальную таблицу остатков с параметрами отбора:

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

          ### 6. Циклом списать остаток

          Именно цикл по партиям является основой FIFO/LIFO. Порядок выборки только определяет, какая партия будет первой.

          ## Можно ли сказать, что FIFO меняется на LIFO в трех строках

          Да, если архитектура уже правильно построена, то переключение направления действительно может занимать примерно три строки:

          и одна строка замены:

          Но на экзамене оценивается не количество строк переключения, а вся реализация:

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

          Ваш подход можно использовать на экзамене. Я бы только заменил общее слово "УБЫВ" на уникальный маркер "НАПРАВЛЕНИЕ_СПИСАНИЯ" и добавил вторичную сортировку по регистратору или номеру строки. Тогда решение будет и коротким, и понятным проверяющему.

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