Открыть сервис

FIFO

FIFO (акроним от англ. First In, First Out — «первым пришёл — первым ушёл») — это метод организации и манипулирования данными, при котором первый поступивший элемент обрабатывается или обслуживается в первую очередь. FIFO является базовым принципом построения очередей (queue) — одной из фундаментальных структур данных в информатике и теории массового обслуживания. В более широком смысле термин применяется в бухгалтерском учёте для обозначения метода списания товарно-материальных ценностей, а также в логистике и управлении запасами.

История и происхождение

Принцип «первым пришёл — первым обслужен» является одним из древнейших организационных правил человеческого общества. В неформальном виде он существовал задолго до появления термина: в очередях за товарами, в порядке приёма пациентов, в работе конвейерных линий. Формализация FIFO как алгоритма произошла в середине XX века с развитием теории очередей (А. К. Эрланг, 1909—1917) и компьютерных наук. В 1940—1950-х годах, при создании первых электронных вычислительных машин (например, EDVAC и UNIVAC), возникла необходимость в структурах данных для временного хранения последовательно поступающих команд и данных. Именно тогда очередь FIFO стала стандартной абстракцией.

В бухгалтерском учёте метод FIFO был впервые кодифицирован в США в 1930-х годах как один из допустимых способов оценки запасов, а впоследствии закреплён в международных стандартах финансовой отчётности (МСФО) и российских ПБУ.

FIFO в информатике

Определение и структура

В программировании FIFO — это абстрактный тип данных (АТД) «очередь», поддерживающий две основные операции:

Дополнительно часто реализуются операции peek (просмотр первого элемента без удаления) и isEmpty (проверка пустоты очереди). В отличие от стека (LIFO), где последний добавленный элемент удаляется первым, в очереди FIFO порядок выхода строго соответствует порядку входа.

Реализации

Очередь FIFO может быть реализована несколькими способами:

  • На основе массива (кольцевой буфер): используется фиксированный массив с двумя указателями (head и tail). При заполнении массива указатель tail «заворачивается» в начало, что позволяет эффективно использовать память. Недостаток — ограниченный размер.
  • На основе связного списка: каждый элемент хранит ссылку на следующий. Добавление и удаление выполняются за O(1), но требуется дополнительная память под указатели.
  • На основе двух стеков: классический трюк для языков, где нет встроенной очереди (например, в функциональных языках). Один стек служит для добавления, другой — для удаления, с перекладыванием элементов при опустошении второго.

Примеры использования

Ограничения

FIFO не учитывает приоритеты задач. Если в системе есть срочные и несрочные процессы, строгий FIFO может привести к тому, что важная задача будет ждать завершения длительной, но неважной. Для решения этой проблемы применяются очереди с приоритетами (priority queue) или многоуровневые очереди обратной связи (MLFQ).

FIFO в бухгалтерском учёте

Метод FIFO (ФИФО) — способ оценки себестоимости материально-производственных запасов (МПЗ) при их выбытии (продаже, передаче в производство). Согласно этому методу, запасы, поступившие первыми, списываются первыми. Оценка остатка на конец периода производится по стоимости последних по времени приобретений.

Принцип расчёта

Предположим, компания купила три партии товара:

  • 10 единиц по 100 руб.;
  • 20 единиц по 110 руб.;
  • 15 единиц по 120 руб.

При продаже 25 единиц по методу FIFO сначала спишутся 10 единиц из первой партии (по 100 руб.) и 15 единиц из второй (по 110 руб.). Себестоимость продажи составит: 10×100 + 15×110 = 2650 руб. Остаток: 5 единиц из второй партии (по 110 руб.) и 15 единиц из третьей (по 120 руб.) — итого 20 единиц на сумму 2350 руб.

Преимущества и недостатки

  • Преимущества: в условиях инфляции FIFO даёт более низкую себестоимость и, следовательно, более высокую прибыль по сравнению с методом LIFO (Last In, First Out), который в России запрещён с 2008 года. Оценка остатков близка к текущим рыночным ценам.
  • Недостатки: при росте цен компания платит больше налога на прибыль, так как прибыль оказывается завышенной. Кроме того, метод требует ведения партионного учёта, что усложняет учёт при большом ассортименте.

В российском бухгалтерском учёте метод FIFO применяется в соответствии с ПБУ 5/01 «Учёт материально-производственных запасов» и ФСБУ 5/2019. В международной практике (МСФО (IAS) 2) FIFO является одним из двух разрешённых методов (наряду со средневзвешенной стоимостью).

FIFO в логистике и управлении запасами

В складской логистике принцип FIFO означает, что товары, поступившие на склад раньше, должны отгружаться раньше. Это особенно важно для скоропортящихся продуктов (продукты питания, лекарства, химикаты с ограниченным сроком годности). Для реализации FIFO на складе применяются специальные системы хранения:

  • Проходные стеллажи (drive-through): загрузка с одной стороны, выгрузка с другой.
  • Стеллажи гравитационного типа (flow rack): паллеты скатываются по наклонным рельсам от зоны приёмки к зоне отгрузки.
  • Автоматизированные системы с адресным хранением и WMS (Warehouse Management System), которая программно управляет очередностью отгрузки.

Несоблюдение FIFO приводит к порче товаров, образованию неликвидов и финансовым потерям. В розничной торговле принцип FIFO часто реализуется через маркировку товаров датами и размещение новых партий «за» старыми (правило «первым пришёл — первым ушёл» на полке).

FIFO в электронике и телекоммуникациях

В цифровой схемотехнике FIFO — это специализированная микросхема или блок (hardware FIFO), реализующий очередь на аппаратном уровне. Такие устройства используются для согласования скорости передачи данных между двумя системами (буферизация). Например, в UART-контроллерах FIFO глубиной 16 байт позволяет процессору обрабатывать данные блоками, а не каждый байт по отдельности, снижая нагрузку на прерывания.

В сетях передачи данных FIFO применяется в коммутаторах и маршрутизаторах для временного хранения пакетов. Однако в современных сетях часто используются более сложные алгоритмы (например, WFQ — Weighted Fair Queuing), чтобы избежать проблем с задержками для чувствительного трафика (VoIP, видеоконференции).

Критика и альтернативы

Основной недостаток FIFO — отсутствие приоритизации. В операционных системах это решается введением приоритетов (приоритетная очередь) или алгоритмов, учитывающих время ожидания (например, Round Robin). В бухгалтерском учёте критика FIFO связана с тем, что в период высокой инфляции он завышает прибыль, что может вводить в заблуждение инвесторов. Альтернативой является метод средневзвешенной стоимости, который сглаживает колебания цен.

В логистике для товаров с длительным сроком хранения или без срока годности (например, металл, строительные материалы) FIFO может быть необязательным, и применяется метод LIFO или FEFO (First Expiry, First Out — «первым истекает срок — первым уходит»).

Интересные факты

  • В некоторых операционных системах (например, ранних версиях UNIX) планировщик процессов использовал простой FIFO, что приводило к «зависанию» системы при длительном выполнении одного процесса.
  • В математике очередь FIFO является примером дисциплины обслуживания, при которой среднее время ожидания в стационарном режиме для системы M/M/1 вычисляется по формуле Поллачека — Хинчина.
  • В психологии и социологии принцип FIFO иногда критикуют как несправедливый: например, в здравоохранении пациенты с более тяжёлыми состояниями должны обслуживаться вне очереди (триаж), а не по времени прихода.

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы». — 4-е изд. — СПб.: Питер, 2015.
  • Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. «Алгоритмы: построение и анализ». — 3-е изд. — М.: Вильямс, 2013.
  • Положение по бухгалтерскому учёту «Учёт материально-производственных запасов» (ПБУ 5/01), утверждённое Приказом Минфина РФ от 09.06.2001 № 44н.
  • Международный стандарт финансовой отчётности (IAS) 2 «Запасы».
  • Гнеденко Б. В., Коваленко И. Н. «Введение в теорию массового обслуживания». — М.: Наука, 1987.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →