Партионный учет 1С

Партионный учет ТМЦ.

В программе ведется партионный учет ТМЦ. Расчет себестоимости может производиться по одному из выбранных методов: FIFO, LIFO или средневзвешенной себестоимости. Метод расчета себестоимости устанавливается для каждого собственного юридического лица.

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

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

При оформлении поступления ТМЦ, программа предоставляет возможность указания определенных характеристик приходуемой партии: номер ГТД (грузовой-таможенной декларации), страна происхождения, свойство (цвет, размер и т.д.), что в частности обеспечивает партионный учет в разрезе номеров (ГТД) и стран происхождения в случае учета импортных ТМЦ. При оформлении расхода ТМЦ (отпуска, перемещения, списания) предоставляется возможность выбора в документе конкретной партии списания.

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

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

Пример. На склад поступило 5 пар кроссовок черного цвета и 5 пар кроссовок белого цвета. При оформлении приходного документа в спецификацию необходимо ввести две различные записи — 5 пар кроссовок с значением свойства партии «черный цвет» и 5 пар кроссовок со значением свойства партии «белый цвет». В последующем при списании можно выбрать соответствующую партию и отгрузить, допустим, 3 пары кроссовок белого цвета и 2 пары кроссовок черного цвета.

Основные принципы партионного учета в 1С

Основные принципы партионного учета в 1С
Партионный учет предполагает то, что некоторый резерв поступает в виде отдельных партий.
То есть этот резерв является неоднородным, а состоит из разных партий, с разными свойствами.
Следовательно, при использовании ресурса недостаточно указания ресурса, нужно еще указания партии этого ресурса.
Самый простой пример — поступление товара.
Каждая партия одного и того же товара может различаться поставщиком, сроками хранения, ценой закупки, расходами по доставке и т.п.
При расходовании партионного ресурса возможны следующие модели указания партий:

  • Указание партии — непосредственно указывается используемая партия.
  • LIFO — определяются все оставшиеся партии, разделяется по дате прихода и используются в этом порядке.
  • FIFO — определяются все оставшиеся партии, разделяется по дате прихода и используются в этом порядке.
  • По среднему — партионный ресурс превращается в единый путем получение среднего некоторого свойства партии, например закупочной цены. Берется среднее значение этого свойства и при обороте ресурса указывается это свойство.

Примеры партионного учета
Основные нюансы партионного учета.
Пусть регистр партий у нас ведутся в разрезе: Товар, Партия = Количество Сумма
Пусть на остатках этого регистра имеются такие партии:

Коньяк Пнк-01 10шт 100р
Коньяк Пнк-02 50шт 600р
Коньяк Пнк-03 20шт 260р
Минералка Пнк-04 30шт 600р
Минералка Пнк-05 20шт 500р

Чем больше номер документа, тем позже он введен, тем больше его дата.
Рассмотрим списание 40 позиций коньяка и 30 позиций минералки для разных алгоритмов (FIFO, LIFO и по-среднему).

Списание по FIFO

Коньяк Пнк-01 10шт 100 (вся партия уходит)
Коньяк Пнк-02 30шт 600/50*30=360
Минералка Пнк-04 30шт 600 (вся партия уходит)

Списание по LIFO

Коньяк Пнк-02 20шт 600/50*20=240
Коньяк Пнк-03 20шт 260 (вся партия уходит)
Минералка Пнк-04 10шт 600/30*10=200
Минералка Пнк-05 20шт 500 (вся партия уходит)

Списание по среднему
При списании по-среднему может быть взят регистр такой же структуры, только поле Партия не заполняется, поэтому остатки по товарам будут свернуты:

Коньяк 80шт, (10*100)+(50*600)+(20*260)\80=452.5р
Минералка 50шт, (30*600)+(20*500)\50=440р
Соответственно при списании будет взята цена, равная сумме товара, деленного на его количество

Секрет партионного учета

На самом деле регистр партий может иметь примерно такую структуру:
Измерения(Слад, Партия)=>Ресурсы(Количество).
В действительности, если вести справочник партий, то не нужно хранить в регистре партий сумму, т.к. стоимость партии и цена партии будет храниться в справочнике партий. Алгоритмы упрощаются, так как все движения ведутся только в количественном выражении, стоимость добавляется только на этапе формирования отчетов (она берется из справочника партий).

Прежде всего, необходимо установить управляемую блокировку на данные. Делается это с той целью, чтобы защитить прочитанные данные от изменения другими пользователями. Делается это с помощью объекта «БлокировкаДанных» следующим программным кодом:

Блокировка = Новый БлокировкаДанных; ЭлементБлокировки = Блокировка.Добавить(«РегистрНакопления.ОстаткиНоменклатуры»); ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный; ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры; ЭлементБлокировки.ИспользоватьИзИсточникаДанных(«Номенклатура», «Номенклатура»); Блокировка.Заблокировать();

В качестве источника данных у нас будет использоваться табличная часть документа «СписокНоменклатуры».

Далее необходимо узнать, какой метод списания установлен для текущего периода:

МетодСписания = РегистрыСведений.МетодСписанияТоваров.ПолучитьПоследнее(Дата).МетодСписания; Если МетодСписания.Пустая()Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = «Не указан метод списания! Проведение не возможно»; Отказ = Истина; Возврат; КонецЕсли; Средняя = МетодСписания = Перечисления.УчетнаяПолитика.Средняя;

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

Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Продажи.Записывать=Истина; Движения.ОстаткиНоменклатуры.Записать(); Движения.Продажи.Записать(); Запрос = Новый Запрос(«ВЫБРАТЬ | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество, | СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма |ПОМЕСТИТЬ ВТ |ИЗ | Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры |ГДЕ | РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &amp;Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяНакладнаяСписокНоменклатуры.Номенклатура | |ИНДЕКСИРОВАТЬ ПО Номенклатура |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ.Номенклатура КАК Номенклатура, | ВТ.Количество КАК КоличествоВДокументе, | ВТ.Сумма КАК СуммаВДокументе, | ОстаткиНоменклатурыОстатки.Партия, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток, | ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстаток |ИЗ | ВТ КАК ВТ | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки( | &amp;МоментВремени, | Номенклатура В | (ВЫБРАТЬ | ВТ.Номенклатура | ИЗ | ВТ КАК ВТ)) КАК ОстаткиНоменклатурыОстатки | ПО ВТ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура | |УПОРЯДОЧИТЬ ПО | ОстаткиНоменклатурыОстатки.Партия.МоментВремени ВОЗР |ИТОГИ | МАКСИМУМ(КоличествоВДокументе), | МАКСИМУМ(СуммаВДокументе), | СУММА(КоличествоОстаток), | СУММА(СуммаОстаток) |ПО | Номенклатура»); Запрос.УстановитьПараметр(«МоментВремени», МоментВремени()); Запрос.УстановитьПараметр(«Ссылка»,Ссылка); Если МетодСписания = Перечисления.УчетнаяПолитика.ЛИФО Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, «ВОЗР», «УБЫВ»); // если лифо — сортируем по УБЫВанию КонецЕсли; ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл Если НЕ ВыборкаНоменклатура.Номенклатура.Услуга и ВыборкаНоменклатура.КоличествоОстаток < ВыборкаНоменклатура.КоличествоВДокументе Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = «Не хватает » + Строка(ВыборкаНоменклатура.КоличествоВДокументе — ВыборкаНоменклатура.КоличествоОстаток) + » единиц номенклатуры » + ВыборкаНоменклатура.Номенклатура + «. Проведение невозможно.»; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; Если Отказ Тогда Продолжить; КонецЕсли; ОсталосьСписать = ВыборкаНоменклатура.КоличествоВДокументе; ВыборкаДетЗаписи = ВыборкаНоменклатура.Выбрать(); Пока ВыборкаДетЗаписи.Следующий() И ОсталосьСписать <> 0 Цикл Если НЕ ВыборкаДетЗаписи.Номенклатура.Услуга Тогда КСписанию = Мин(ОсталосьСписать, ВыборкаДетЗаписи.КоличествоОстаток); Если Средняя Тогда СуммаСписания = ?(ВыборкаНоменклатура.КоличествоОстаток =КСписанию, ВыборкаНоменклатура.СуммаОстаток, ВыборкаНоменклатура.СуммаОстаток/ВыборкаНоменклатура.КоличествоОстаток * КСписанию); Иначе СуммаСписания = ?(ВыборкаДетЗаписи.КоличествоОстаток =КСписанию, ВыборкаДетЗаписи.СуммаОстаток, ВыборкаДетЗаписи.СуммаОстаток/ВыборкаДетЗаписи.КоличествоОстаток * КСписанию); КонецЕсли; НовоеДвижение = Движения.ОстаткиНоменклатуры.ДобавитьРасход(); НовоеДвижение.Период = Дата; НовоеДвижение.Регистратор = Ссылка; НовоеДвижение.Количество = КСписанию; НовоеДвижение.Номенклатура = ВыборкаДетЗаписи.Номенклатура; Если НЕ Средняя Тогда НовоеДвижение.Партия = ВыборкаДетЗаписи.Партия; КонецЕсли; НовоеДвижение.Сумма = СуммаСписания; КонецЕсли; НовоеДвижение = Движения.Продажи.Добавить(); НовоеДвижение.Активность = Истина; НовоеДвижение.Период = Дата; НовоеДвижение.Регистратор = Ссылка; НовоеДвижение.Номенклатура = ВыборкаДетЗаписи.Номенклатура; НовоеДвижение.Сумма = ВыборкаДетЗаписи.СуммаВДокументе; Если НовоеДвижение.Номенклатура.Услуга Тогда НовоеДвижение.Себестоимость = 0; НовоеДвижение.Количество = ВыборкаНоменклатура.КоличествоВДокументе; Иначе НовоеДвижение.Количество = КСписанию; НовоеДвижение.Себестоимость = СуммаСписания; ОсталосьСписать = ОсталосьСписать — КСписанию; КонецЕсли; КонецЦикла; КонецЦикла;

Тут необходимо отметить следующие моменты:

  1. В зависимости от метода списания мы меняем текст запроса с помощью следующей конструкции: Запрос.Текст = СтрЗаменить(Запрос.Текст, «ВОЗР», «УБЫВ»).
  2. Не забудьте проиндексировать поля временной таблицы, по которой будете соединять таблицы (ИНДЕКСИРОВАТЬ ПО Номенклатура).
  3. Не забудьте проверять значения в запросах на NULL с помощью конструкции ЕСТЬNULL. NULL может возникнуть при соединении с другими таблицами при отсутствии значения в присоединяемой таблице.
  4. Решение проблемы копеек: если количество списываемого товара по данной партии равно остатку под данной партии, то списать всю сумму. Это позволит избавиться от остатка от деления. В нашем примере: СуммаСписания = ?(ВыборкаНоменклатура.КоличествоОстаток = КСписанию, ВыборкаНоменклатура.СуммаОстаток, ВыборкаНоменклатура.СуммаОстаток/ВыборкаНоменклатура.КоличествоОстаток * КСписанию).
  5. Если не хватает какой-либо номенклатуры, мы устанавливаем параметр «Отказ» в значение «Истина», однако продолжаем движения по строкам документа, чтобы вывести все сообщения о нехватке товара.
  6. Количество товара проверяется только для товара, без учета услуг.
  7. В цикле мы списываем до тех пор, пока не погасили потребность из документа (ОсталосьСписать <> 0).
  8. Если списание производится «по средней», то НЕ указываем документ партии.
  9. Если списание производится «по средней», сумму необходимо брать из итоговой строки группировки.

Отчеты

С данной структурой регистров отчеты получаются элементарные:

Остатки товаров:

Продажи:

>Скачать решение задачи оперативного учета 1С специалист по платформе

Скачать вышеописанное решение Вы можете по .

Получаем данные о том, сколько списать нужно с конкретной партии

ВЫБРАТЬ Товар, Партия, МАКСИМУМ(КоличествоДокумента) КАК КоличествоДокумента, МАКСИМУМ(КоличествоПартии) КАК КоличествоПартии, СУММА(НакопительныйИтог) КАК НакопительныйИтог ИЗ Данные КАК Данные СГРУППИРОВАТЬ ПО Товар, Партия

Данные теперь сгруппированы, товары и партии уникальны.

И опять поместим результат во временную таблицу “Данные2” и очередным запросом рассчитаем сколько необходимо списать с конкретной партии:

ВЫБРАТЬ *, КоличествоДокумента — НакопительныйИтог КАК ОсталосьСписать ИЗ Данные2 КАК Данные

И последняя итерация: получим в условии сколько нужно списать с конкретной партии (ага, опять с временной таблицей):

ВЫБРАТЬ *, ВЫБОР КОГДА ОсталосьСписать < КоличествоПартии ТОГДА ОсталосьСписать ИНАЧЕ КоличествоПартии КОНЕЦ КАК Списать ИЗ Данные3 КАК Данные ГДЕ НакопительныйИтог < КоличествоДокумента

Дополнительное условие уберет “лишние” партии, списывать которые не нужно.

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

ВЫБРАТЬ Товар КАК Товар, СУММА(Количество) КАК Количество ПОМЕСТИТЬ ДокТЧ ИЗ Документ.РасходнаяНакладная.Товары ГДЕ Ссылка = &Ссылка СГРУППИРОВАТЬ ПО Товар ИНДЕКСИРОВАТЬ ПО Товар ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Товар КАК Товар, Партия, Партия.МоментВремени КАК МоментВремени, КоличествоОстаток, СтоимостьОстаток ПОМЕСТИТЬ Остатки ИЗ РегистрНакопления.ПартииТоваров.Остатки( , Товар В (ВЫБРАТЬ ДокТЧ.Товар ИЗ ДокТЧ КАК ДокТЧ)) КАК ПартииТоваровОстатки ИНДЕКСИРОВАТЬ ПО Товар ; ВЫБРАТЬ * ИЗ ДокТЧ КАК ДокТЧ ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Т1 ПО ДокТЧ.Товар = Т1.Товар ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Т2 ПО Т1.Товар = Т2.Товар И Т1.МоментВремени > Т2.МоментВремени ; ВЫБРАТЬ ДокТЧ.Товар, ДокТЧ.Количество КАК КоличествоДокумента, Т1.Партия, Т1.КоличествоОстаток КАК КоличествоПартии, ISNULL(Т2.КоличествоОстаток,0) КАК НакопительныйИтог ПОМЕСТИТЬ Данные ИЗ ДокТЧ КАК ДокТЧ ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Т1 ПО ДокТЧ.Товар = Т1.Товар ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Т2 ПО Т1.Товар = Т2.Товар И Т1.МоментВремени > Т2.МоментВремени ; ВЫБРАТЬ Товар, Партия, МАКСИМУМ(КоличествоДокумента) КАК КоличествоДокумента, МАКСИМУМ(КоличествоПартии) КАК КоличествоПартии, СУММА(НакопительныйИтог) КАК НакопительныйИтог ПОМЕСТИТЬ Данные2 ИЗ Данные КАК Данные СГРУППИРОВАТЬ ПО Товар, Партия ; ВЫБРАТЬ *, КоличествоДокумента — НакопительныйИтог КАК ОсталосьСписать ПОМЕСТИТЬ Данные3 ИЗ Данные2 КАК Данные ; ВЫБРАТЬ Товар, Партия, ВЫБОР КОГДА ОсталосьСписать < КоличествоПартии ТОГДА ОсталосьСписать ИНАЧЕ КоличествоПартии КОНЕЦ КАК Списать ИЗ Данные3 КАК Данные ГДЕ НакопительныйИтог < КоличествоДокумента

Вот и все.

В приведенном примере, естественно, мы не сможем продать ложки, их мало, нужно 100, и нож не продадим, его вообще в остатках нет. Но это отдельная история…

Оригинал статьи на моем сайте.

С уважением, Павел Чистов.

Крупнейшая региональная сеть среди 1С:Франчайзи

// //

Введение

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

  • Непосредственное указание партии — непосредственно указывается используемая партия.
  • FIFO — определяются все оставшиеся партии, сортируются по дате поступления и используются в этом порядке.
  • LIFO — определяются все оставшиеся партии, сортируются по дате поступления и используются в этом порядке.
  • По среднему — партионный ресурс превращается в однородный путем усреднения некоторого свойства партии, например закупочной цены. Берется среднее значение этого свойства и при использовании ресурса указывается это свойство.
  • Непосредственное указание партий не всегда подходит, т.к. часто по товару нельзя определить, из какой он партии. Иногда применяют пометку партии товара штрихкодом, но не всегда предприятие готово пойти на такие расходы времени и средств.
    В дальнейшем здесь будут написаны алгоритмы, использующиеся в 1С для различных методов использования партий.

    Оптимизация партионного учета

    В новом релизе конфигурации «Управление производственным предприятием 1.2» фирмы 1С применяется кэширование движений по партиям:
    «В данной конфигурации реализована новая модель проведения документов по партионному учету (реализовано частично, только для документов «Поступление товаров и услуг» и «Реализация товаров и услуг»). Основное ее отличие от ранее существовавшей — это отказ от многократного получения остатков партий из регистра накопления на каждый проводимый документ. Теперь однажды полученный остаток сохраняется в таблице значений, и в последующем берется уже из таблицы значений.
    Кроме того был изменен подход в проведении по партиям документов, осуществляющим движения в приход («Поступление товаров»). Если раньше движения по партионным регистрам формировались сразу же при проведении документа, то теперь они, как и у документа «Реализация товаров и услуг», формируются обработкой проведения по партиям. Процедура проведения по партиям как и раньше выполняется обработкой «Проведение по партиям», но только теперь основные ее действия вынесены на сервер, в модуль УправлениеЗапасамиПартионныйУчет (см. процедуру ПроведениеПоПартиямНаСервере()). В данной процедуре создается таблица значений ТаблицаОстатковПартийТоварыНаСкладах, со структурой, совпадающей с регистром накопления ПартииТоваровНаСкладах. Именно в этой таблице значений и будут хранится остатки по партиям. Для того, чтобы поиск требуемой партии в этой таблицы выполнялся быстро, у нее создается индекс по измерениям регистра накопления. Данная таблица передается параметром в процедуру проведения документа по партионному учету — ДвижениеПартийТоваров(). Данная процедура теперь формирует не только движения списания партий, но и также движения поступления партий.» Описание конфигурации УПП 1.2