1С Предприятие. Практика программирования на платформе v7


Списание по партиям


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

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

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

138______________________ 1C:Предприятие. Практика программирования на платформе V7

•   приходными документами, когда каждая строка документа формирует

новую партию,

•   в зависимости от свойств объекта списания: например по сроку

реализации.

Порядок списания также может быть различный:

• по выбранной (в диалоге) партии,

•       по времени формирования партии — FIFO (первый пришел - первый

ушел), LIFO (последний пришел - первый ушел),



•   по размеру партии — по максимальному или минимальному остатку

партии и прочее.

В нашем примере мы рассмотрим списание по методам FIFO и LIFO.

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

Списание партии производится следующим образом:

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

IX. Основы построения «Оперативного учёта» в системе 1СПредприятие__________ 139

Проверим остаток по партии.

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




Перед завершением цикла, обязательно проверим - всё ли мы списали?





140______________________ 1C:Предприятие. Практика программирования на платформе V7

Так строится любой алгоритм списания по партии.

Упражнение 25. Предусмотрите в документе «Амортизация» выбор типа списания «По средней себестоимости», FIFO или LIFO типа перечисление. Предусмотрите ввод значения типа списания по умолчанию при создании нового документа.

Не забудьте создать и реквизит объекта (формата хранения), и соответствующий элемент формы.

Сформируем записи движений списания оборудования по партиям, в модуле документа «Амортизация», в регистр «Амортизация».

Установим флажок «Оперативный учет» в окне редактирования документа «Амортизация».

Войдем в модуль документа «Амортизация».

Чтобы документ можно было вводить задним числом с нарушением последовательности, создадим временный объект типа Регистр .Амортизация и рассчитаем его на текущий документ.

Партии запишем в таблицу значений.

Метод ИтогиАктуальны() возвращает флаг актуальности итогов: 1 - итоги актуальны, 0 - иначе. Метод доступен только в Модуле документа в предопределенной процедуре ОбработкаПроведения.

Рег=Создать0бъект("Регистр.Амортизация"); ТаблицаПартий=Создать0бъект("ТаблицаЗначений");

Если ИтогиАктуальны()=0 Тогда

IX. Основы построения «Оперативного учёта» в системе 1С:Предприятие_________ 141

Рег.ВременныйРасчет()   ; РассчитатьРегистрыНа(ТекущийДокумент());

КонецЕсли;

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

РазделительСтрок - символ перевода строки текста.

ВыбратьСтроки();

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

ВсегоСписать=Результат; // определим списываемое значение

Дефицит=Рег.СводныйОстаток(Оборудование,,"Стоимость")-ВсегоСписать;

Если Дефицит<0 Тогда

Предупреждение("Дефицит по оборудованию "+Оборудование+" = "+ Дефицит +РазделительСтрок+" Документ нельзя проводить!!");



// Отмена проведения документа

СтатусВозврата(0);

Возврат;

КонецЕсли;

КонецЦикла;

Сформируем партии оборудования. С помощью метода ВыбратьСтроку удобно просмотреть созданную таблицу значений.

Peг.УстановитьФильтр(Оборудование,);

Peг.ВыгрузитьИтоги(ТаблицаПартий,1,1);//Создали партии

оборудования    //ТаблицаПартий.ВыбратьСтроку(); //отладка

Партии отсортируем в зависимости от выбранного в документе типа списания.

Метод таблицы значений Сортировать(<Колонки>,<ДокумПоДате>) позволяет сортировать таблицу значений по колонкам.

<Колонки> - строковое выражение, которое определяет колонки, порядок и направление сортировки. Формат передаваемой строки - это разделенные запятыми номера или идентификаторы колонок со знаком направления сортировки ( "+"   - сортировать по возрастанию; "- " - сортировать по Убыванию; "*" - сортировать по внутреннему значению). Знак направления сортировки можно Указывать до или после обозначения колонки через пробел или без пробела. По умолчанию направление сортировки принимается по возрастанию. <ДокумПоДате> - необязательный параметр. Имеет смысл только в том случае, если значениями таблицы значений являются документы. В этом случае можно задавать сортировку документов по их хронологии. Число: 1 - сортировка по хронологии Документов; 0 - нет. Значение по умолчанию - 0.

Если ТипСписания=Перечисление.ТипыСписания.FIFO Тогда

142______________________ 1С:Предприятие. Практика программирования на платформе V7

ТаблицаПартий.Сортировать("Партия",1);

ИначеЕсли ТипСписания=Перечисление.ТипыСписания.LIFO Тогда

ТаблицаПартий.Сортировать("Партия -" ) ;

Иначе // по средней себестоимости

//Алгоритм списания по средней себестоимости

КонецЕсли;

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

// Списание по партиям

ТаблицаПартий.ВыбратьСтроки();

Пока ТаблицаПартий.ПолучитьСтроку()=1 Цикл

//Алгоритм списания по парииям



КонецЦикла;

В цикле выборки партий сформируем условие списание партии.

Если ТаблицаПартий.Стоимость<=ВсегоСписать Тогда

//Партию списываем целиком и уменьшим списываемое значение

Иначе

//С партии списываем списываемое значение целиком и обнуляем его

КонецЕсли;

//Поверяем: всё ли списали?

Если ВсегоСписать <=0 Тогда

Прервать;

КонецЕсли;

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

При списании по средней себестоимости:

Результат*Рег.СводныйОстаток(Оборудование,,"Количество")/ Peг.СводныйОстаток(Оборудование,,"Стоимость")

При списании по партии: если партию списываем целиком, то количество списываем из парии, иначе пересчитываем его через себестоимость

IX. Основы построения «Оперативного учёта» в системе 1С:Предприятие_________ 143

партии:

ВсегоСписать* ТаблицаПартий.Количество/ТаблицаПартий.Стоимость

Запишем движения по регистру Амортизация.

Процедура ОбработкаПроведения()

Рег=Создать0бъект("Регистр.Амортизация");

ТаблицаПартий=Создать0бъект("ТаблицаЗначений");

Если ИтогиАктуальны()=0 Тогда

Peг.ВременныйРасчет();

РассчитатьРегистрыНа(ТекущийДокумент());

КонецЕсли;

ВыбратьСтроки();

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

// Списание по Оперативному учету

ВсегоСписать=Результат; // определим списываемое значение

Дефицит=Рег.СводныйОстаток(Оборудование,,"Стоимость")-ВсегоСписать;

Если Дефицит<0 Тогда

Предупреждение("Дефицит по оборудованию "+Оборудование+" = "+ Дефицит +РазделительСтрок+" Документ нельзя проводить!!!");

// Отмена проведения документа СтатусВозврата(0) ;

Возврат;

КонецЕсли;

Регистр.Амортизация.Оборудование = Оборудование;

Регистр.Амортизация.ПривязыватьСтроку(НомерСтроки);

Peг.УстановитьФильтр(Оборудование,);

Peг.ВыгрузитьИтоги(ТаблицаПартий,1,1);//Создали партии оборудования   

//ТаблицаПартий.ВыбратьСтроку(); //отладка

Если ТипСписания=Перечисление.ТипыСписания.FIFО Тогда

ТаблицаПартий.Сортировать("Партия", 1);



ИначеЕсли ТипСписания=Перечисление.ТипыСписания.LIFO Тогда

ТаблицаПартий.Сортировать("Партия -") ;

Иначе // по средней себестоимости

// Алгоритм списания по средней себестоимости Регистр.Амортизация.Количество =

144______________________ 1С:Предприятие. Практика программирования на платформе V7

Результат*Рег.СводныйОстаток(Оборудование,,"Количество")/ Per.СводныйОстаток(Оборудование,,"Стоимость");

Регистр.Амортизация.Стоимость= Результат;

Регистр.Амортизация.ДвижениеРасходВыполнить();

Продолжить;

КонецЕсли;

// Списание по партиям ТаблицаПартий.ВыбратьСтроки();

Пока ТаблицаПартий.ПолучитьСтроку()=1 Цикл

Регистр.Амортизация.Партия = ТаблицаПартий.Партия;

Если ТаблицаПартий.Стоимость<=ВсегоСписать Тогда

//Партию списываем целиком и уменьшим списываемое значение

Регистр.Амортизация.Количество = ТаблицаПартий.Количество;

Регистр.Амортизация.Стоимость= ТаблицаПартий.Стоимость;

ВсегоСписать=ВсегоСписать-ТаблицаПартий.Стоимость;

Иначе

//С партии списываем списываемое значение целиком и обнуляем его

Регистр.Амортизация.Количество - ВсегоСписать* ТаблицаПартий.Количество/ТаблицаПартий.Стоимость;

Регистр.Амортизация.Стоимость = ВсегоСписать;

ВсегоСписать=0;

КонецЕсли;

Регистр.Амортизация.ДвижениеРасходВыполнить();

//Проверим: всё ли списали?

Если ВсегоСписать < = 0 Тогда

Прервать;

КонецЕсли;

КонецЦикла;

КонецЦикла;

КонецПроцедуры


Содержание раздела