Уникальный идентификатор. Механизмы реализации.

Методы партионного учета.

Способы реализации.

Сферы использования.

 

Уникальный идентификатор. Механизмы реализации.

 

Потребность в использовании партионного учета возникает на предприятии, когда появляется необходимость либо группировать какие-либо товары по определенному признаку, либо делить какой-либо товар по определенному признаку. В обоих случаях выделяется основной товар, который в дальнейшем я буду называть просто товаром (например бутылка 0.5), и подчиненные к нему товары, которые в дальнейшем буду называть партиями товара (например бутылка 0.5, пришедшая на склад 9 мая; пришедшая 1 января и так далее). Признак, по которому разделяются партии, я буду называть уникальным идентификатором партии. В качестве уникального идентификатора может выступать дата прихода, приходный документ, цена поступления, цена отпускная, серия или код товара, цвет, размер или любая другая характеристика товара, по которой желательно выполнить разделение товара.

Для реализации партионного учета в информационной базе необходимо добавить дополнительное измерение в структуре, с помощью которого выполняется учет остатков (впрочем, неплохо было бы создать отдельную структуру – регистр, счет, дбф-файл и т.п – см. ниже). Выбор типа подобного измерения полностью зависит от программиста. Мне известны по крайней мере две возможности – уникальный идентификатор может быть непосредственно таким измерением. Это возможно, когда, например, уникальным идентификатором является приходный документ, дата прихода, цена прихода. Если же, например, уникальным идентификатором является комбинация серии товара и приходного документа, то подобный подход потребует создания нескольких дополнительных измерений. Следует учитывать, что чем больше измерений (индексированных полей), тем медленнее выполняется запись и чтение из базы данных, поэтому подобный подход может быть малоэффективным. В таком случае есть опять же два способа – создать функцию, которая может однозначно сопоставить некоторое число комбинации факторов и наоборот – функцию по числу определяющую нужную комбинацию. Например, в случае комбинации документа и серии товара можно написать функцию, составляющую примерно такое число: первые 7 символов – номер документа, следующие 4 символа – год (если нумерация документов уникальная в пределах года), следующие 6 символов – серия. Конкретное решение зависит уже от конкретной задачи. Подобный метод представляется лично мне ненаглядным и не вполне красивым.

Второй, более распространенный способ состоит в создании справочника партий. Измерение в структуре хранения остатков (партий) будет уже не уникальный идентификатор, а элемент справочника партий. Более красивый способ состоит в том, что этот справочник будет подчинен справочнику товаров или же просто связан с ним через реквизит типа справочник товаров, что в принципе то же самое. Однако наблюдал и другой способ, когда справочник партий не связан со справочником товаров. В справочнике партий уже можно завести практически произвольное количество реквизитов, характеризующих товар, или же реализовать метод, при котором пользователь сам будет заводить и выбирать нужные характеристики – то есть справочник характеристик, уже подчиненный справочнику партий. Если в таком справочнике характеристик завести реквизит типа виды характеристик, то пользователь, как говорилось, сам сможет заводить и вводить характеристики. Однако при переходе на справочник партий не следует забывать про необходимость наличия уникального идентификатора. Разумеется, если вы используете движок Xbase или другие подобные и можете выполнить отбор по нескольким индексированным полям, вас это не касается. Если же вы программист 1С 7.7, то вам придется создать реквизит, по которому можно будет однозначно определить комбинацию факторов, составляющих уникальный идентификатор партии и наоборот. Делается это вот для чего: при записи приходного документа необходимо проверить наличие в справочнике партии с таким же уникальным идентификатором и только при ее отсутствии создать новую партию. Возможен еще вариант, при котором пользователь будет сам в приходном документе выбирать, будет ли вновь пришедший товар относиться к новой партии или добавляться к уже существующей партии. Тогда ввод нового элемента в справочник партий выполняется в ручном режиме.

Возможно создание отдельных структур для хранения остатков по партиям и остатка по товарам. Существуют плюсы и минусы подобного разделения. Минус – двойной учет. Одна и та же информация (об остатках товара в организации) будет храниться у вас в двух местах и при не очень аккуратном подходе возможно их различие. Следует тщательно проверить программу на возможность выполнения только одного движения без другого. Например, если вы реализуете такой двойной учет в 1С 7.7 с использованием забалансового счета, то необходимо будет запретить ввод ручных операций или ограничить использование в ручных операциях счетов учета товаров. Каковы плюсы? Во-первых, если партионный учет не должен вестись в разрезе складов, а остатки ведутся в разрезе складов, то ограничится одной структурой уже вряд ли получится (в 1С 7.7 есть возможность отключить суммовой учет по одному из измерений на счете, оставив количественный по всем измерениям); во-вторых, существует вопрос быстродействия. Если пользователю не нужны остатки по отдельным партиям (скажем машина самостоятельно выполняет выбор партий по заданному программистом способу), но обязателен остаток по товару в общем, то скорость вычисления такого остатка по структуре партий и структуре остатков может различаться в десятки раз – в зависимости от конкретной базы, используемого движка и способа вычисления остатков. Например 1С 7.7 вычисляет остаток по списку значений много дольше, чем по отдельным значениям из этого списка.

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

 

Методы партионного учета.

 

Мне известно 5 методов партионного учета:

  1. По средней цене.

При использовании этого метода определяется общая сумма в денежном выражении данного товара на складе или на предприятии (в зависимости от типа учета по складам, то есть ведется ли партионный учет в разрезе складов или нет) на момент списания, определяется общее количество данного товара соответственно на складе или на предприятии на момент списания. Далее вычисляется средняя цена делением общей суммы на общее количество и по этой цене уже выполняется списание.

Хотелось бы отметить, что новички часто совершают ошибку: заводят реквизит Цена и сумму списания определяют умножением списываемого количества на эту цену. Данный способ годится в очень редких случаях и, даже если цена товара не меняется или при каждом новом приходе товара вводят новую карточку с новой ценой, возможно появление таких позиций, по которым останется лишь сумма без количества, что будет выглядеть не очень красиво. Например, приобретено 9 единиц товара по 1 копейке и фирма-поставщик предоставила скидку в 10% и сумма накладной – 8 копеек. Тогда цена единицы будет 0.888888888… При списании товара по единице и при использовании подобного ошибочного алгоритма получим, что списание пройдет 9 раз по 1 копейке, в результате количество 0, сумма -0.01.

  1. По средневзвешенной цене.

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

  1. Метод идентифицированной стоимости.

При использовании этого метода остаток определяется не для всего товара, а для конкретно идентифицированной партии этого товара, которая определяется человеком-оператором. Метод идентификации может быть различным (см. раздел про уникальный идентификатор). В остальном этот метод аналогичен методу расчета по средней цене.

  1. Метод FIFO (first in, first out – первый вошел, первый вышел).

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

При использовании данного метода строится таблица остатков данного товара на момент списания (для каждой партии – отдельная строка, содержащая ссылку на партию товара, количественный и суммовой остаток). Далее таблица сортируется по уникальному идентификатору, например по дате прихода или по позиции документа списания в общем списке документов. После этого таблица перебирается в цикле. В начале цикла вычисляется количество, которое будет списано на данной итерации, вычисляется как минимальное значение из текущего количества к списанию и количества в текущей строке таблицы. В конце цикла от текущего количества к списанию отнимается списанное в данной итерации количество. Цикл выполняется пока не закончится таблица или текущее количество к списанию не станет равным 0 (списали сколько нужно). Пример (общее количество товара к списанию – КСписанию, таблица – таблица значений  Остатки с полями День – дата прихода, Количество – количественный остаток партии, Сумма – суммовой остаток партии, ТекущееКоличество – количество, списываемое в текущей итерации, ТекущаяСумма – сумма, списываемая в текущей итерации):

//

Остаткиортировать(+День);

Остаткиыбратьстроки();

Пока ОстаткиолучитьСтроку()=1 Цикл

Если КСписанию=0 Тогда

            Прервать;

Конецесли;

            ТекущееКоличество=Мин(Остаткиоличество,КСписанию);

ТекущаяСумма=?(Остаткиоличество=0,0,ТекущееКоличество*Остатки.Сумма/ Остатки.Количество);

...<процесс списания >

КСписанию= КСписанию- ТекущееКоличество;

Конеццикла;

//

Таким образом, первой списывается сумма, пришедшая первой, что и определило название метода.

Хочется отметить, что метод FIFO не определяет порядок, в котором кладовщик будет выдавать товары со склада, а определяет себестоимость выданного товара. При этом стоимость того же товара, определенная, например, по методу идентифицированной стоимости, может быть совершенно другой. Или, как говорит шутка: «Если весь бензин сливают в одну бочку, то это не значит, что при списании по FIFO капли бензина, поступившей в бочку год назад, необходимо выловить именно ее и предоставить документы, что это именно та капля».

  1. Метод LIFO (last in, first out – последний вошел, первый вышел).

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

 

Способы реализации.

 

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

Первый способ состоит в использовании понятия «последовательность». Все документы, влияющие на правильность списания, то есть меняющие остатки по партиям (входящие в последовательность), выстраиваются по времени в порядке возрастания. Далее вводится понятие границы последовательности. Граница последовательности изменяется следующим образом: в момент записи движений документа, влияющего на последовательность, проверяется, является ли граница последовательности последним документом в системе (из входящих в последовательность) и будет ли новый документ располагаться на временной оси последним в системе. Если требование выполняется, то граница последовательности устанавливается на новый документ, если нет, то граница остается без изменений. Если же документ исправляется задним числом (то есть существуют более поздние записанные документы), то граница устанавливается на этот документ (разумеется, если граница была до этого момента дальше по временной оси, чем записываемый документ). Таким образом, если все документы вводятся в реальном времени без исправления задним числом, то граница всегда будет на последнем документе в системе. Если же документы начинают исправлять задним числом, то граница будет соответствовать тому времени, на которое остаткам еще можно полностью верить. Для расчета правильной себестоимости необходимо «восстановить последовательность», то есть пересчитать (перепровести) документы от границы последовательности до последнего документа в системе. После этого суммы списания вновь станут верны, а граница последовательности установится на последний документ в системе. В 1С 8.0 существует такое понятие у последовательности, как измерение. То есть при изменении конкретного приходного документа практически для вычисления правильной себестоимости необходимо перепровести не все последующие документы, а только те, в которых участвует тот товар, цена которого была изменена. Таким образом для каждого товара существует своя последовательность. Лично мне на сертификации пришлось решать задачу, в которой приходилось при перепроведении приходного документа выдавать список документов списания, суммы которых изменятся и перепроводить их (по возможности).

Второй способ состоит в создании дополнительного регламентного документа «ЗакрытиеПериода». При проведении это документ рассчитывает себестоимость по всем документам за месяц «скопом».

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

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

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

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

 

Сферы использования.

 

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

 

По материалам форумов:

Территория 1С

Волшебный форум

Одинэсия

Клуб любителей 1С

 

Особая благодарность pit’у за популяризацию вопроса партионного учета на вышеперечисленных форумах и, возможно, на других, мне неизвестных.

Hosted by uCoz