1С:ПРЕДПРИЯТИЕ - Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие
ЯНГДЮМХЕ ДНЙСЛЕМРНБ НМКЮИМ
дНЙСЛЕМРШ Х АКЮМЙХ НМКЮИМ

нАЯКЕДНБЮРЭ

1С:ПРЕДПРИЯТИЕ - Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие

экономика



Отправить его в другом документе 1С:ПРЕДПРИЯТИЕ - Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие Hits:


ДРУГИЕ ДОКУМЕНТЫ

Анализ объема производства и продаж
1С:ПРЕДПРИЯТИЕ - Основы построения ╚Бухгалтерского учёта╩ в системе 1С:Предприятие
Значение экономики как науки и ее важнейшие школы
монополия
Эволюция монетаризма
Основные черты территориальной организации производительных сил
1С:ПРЕДПРИЯТИЕ - Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие
 

1С:ПРЕДПРИЯТИЕ - Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие

Регистры, используемые компонентой Оперативный учёт, предназначены для накопления и хранения информации о наличии и движении различных объектов учёта. Регистры оперируют понятиями ╚Измерение╩, ╚Ресурс╩, ╚Реквизит╩ и ╚Точка актуальности╩. Движения регистров записываются в ╚модуле документа╩ в предопределённой процедуре ОбработкаПроведения(). При записи движений регистров происходит накопление численных значений Ресурсов и записи значений Реквизитов в узлах некоторой многомерной таблицы, параметрическими & 313g62dd #1082;оординатами которой являются значения Измерений, причем соблюдается порядок вложенности Измерений.

В системе предусмотрено два типа регистров: оборотные регистры и регистры остатков. Для оборотных регистров характерен параметр ╚Периодичность╩, который задает период, для выбора итогов методом ИспользоватьПериод(). Для регистров остатков характерны типы движений ╚Приход╩ и ╚Расход╩, и параметр ╚Период актуальности╩, задающий период, в течение которого хранятся или восстанавливаются, для временного объекта, созданного методом СоздатьОбъект(), движения регистра. ╚Период актуальности╩ регистров остатков задается и редактируется, в отличие от оборотных регистров, в режиме ╚Предприятие╩, меню ╚Операции╩, пункт ╚Управление оперативными итогами...╩.



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

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


124_____ _______ ______ _______ 1С:Предприятие. Практика программирования на платформе V7

На платформе V7.7 предусмотрена ╚Быстрая обработка движений╩, позволяющая ускорить операции чтения из регистров - запросы, временные расчеты итогов, обход движений регистров, однако установка этого признака замедляет запись движений данного регистра.

Точка актуальности, последовательность документов

Точка Актуальности (ТА) ≈ это момент времени, определяемый позицией документа, на который системой по умолчанию выдаются значения остатков и итогов по регистрам, и периодические значения. Позиция документа формируется при его записи и представляет собой метку на оси времени. Если документ проводится после точки актуальности, и нет более поздних проведенных документов, то точка актуальности сдвигается на позицию этого документа. Система предполагает, что все документы оперативного учета вводятся последовательно, в хронологическом порядке.

Нарушение последовательности документов происходит из-за неправильногс вода хозяйственных операций. Если последовательность записи все; документов соответствовала фактической последовательности хозяйственных операций, то ввод Документа5, отражающего реальную хоз. операцию, которая была совершена, но не записана своевременно, не нарушит стройности учета Если же были и другие нарушения записи хоз. операций, например: некоторый приход был введен после того, как часть товаров из него была уже продана, то в промежутке между Документом 5 и ТА может быть обнаружен расходный документ, в котором недостаточно товаров для списания.

Для корректировки последовательности надо перепровести документы═ за период от введенного с нарушением последовательности документа до ТА:

Меню "Операции" - "Проведение документов".

Точка актуальности, период итогов

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


/X. Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие_________ 125

оборотного регистра. Имя таблицы (файла) остатков/оборотов имеет префикс RG***.dbf.

В журнале документов ТА отображается красной галочкой с подчеркиванием.

После ТА записи в регистрах недоступны ни для чтения, ни для записи. При попытке рассчитать регистры или провести документ после проведенных документов, расположенных после ТА (они помечены сиреневой галочкой в журнале документов), система выдаст сообщение: ╚Существуют более ранние проведенные документы::...╩.


126_____ _______ ______ _______ 1С:Предприятие. Практика программирования на платформе V7

Структура записей регистра

Записи накапливаемых значений ресурсов группируются по значениям измерений, причем существенен порядок измерений регистров, так как группировка значений ресурсов по второму измерению является вложенной в группировку по первому измерению. Другими & 313g62dd #1089;ловами, множество записей второго измерения является подмножеством множества записей первого измерения.

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

Создание регистра

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

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


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

Упражнение 23. Создадим Регистр остатков ╚Амортизация╩ с измерениями ╚Оборудование╩ типа Справочник.Оборудование и ╚Партия╩ типа документ.Приход, ресурсами ╚Количество╩ и ╚Стоимость╩ и движение Приход по каждой строке документа ╚Приход╩.

9.1. Запись движений по документу.

Упражнение 24. В документе ╚Приход╩ сформирйте записи движений по приходу в регистр ╚Амортизация╩ по каждой строке документа, привязывая НомерСтроки документа к каждому движению.

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

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


128_____ _______ ______ _______ 1С:Предприятие. Практика программирования на платформе V7

В модуле документа ╚Приход╩ алгоритм записи движений регистров можно создать с помощью конструктора движений регистров.

Выберем в конструкторе регистр, по которому будем создавать движения и тип движений по регистру остатков. Чтобы можно было из движения регистра спозиционироваться на строку документа, по значениям реквизитов документа которой были сделаны эти движения, установим признак ╚Привязывать строку╩.


IX Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие__________ 129

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




130_____ _______ ______ _______ 1С:Предприятие. Практика программирования на платформе V7

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

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

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

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

//}}ДВИЖЕНИЯ_РЕГИСТРОВ

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

Регистр.Амортизация.Партия = ТекущийДокумент();


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

Регистр.Амортизация.Количество = Количество * Единица.Коэффициент;

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

//}}ДВИЖЕНИЯ_РЕГИСТРОВ

// Запись истории периодического реквизита═ справочника

Если НовЦенаоОборудование.Цена.Получить(ТекущийДокумент()) Тогда

ПривязыватьСтроку(НомерСтроки);

УстановитьРеквизитСправочника(Оборудование,"Цена", НовЦена);

КонецЕсли;

// Запись истории периодического реквизита═ справочника

КонецЦикла;

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

В Предприятии посмотреть движения регистров можно в журнале документов через контекстное меню документа или меню Действия ≈ пункт Движения документа.

9.2. Временный расчет регистров

Рассмотрим, как можно получить из регистра остатков значения ресурсов на любой момент времени.


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



По структуре регистры остатков отличаются тем, что помимо таблицы остатков RG*.dbf (оборотов для оборотных регистров) формируют таблицу движений RA*.dbf , в которую записываются положительные или отрицательные значения приращений ресурсов и значения реквизитов регистра, причем, как мы уже отмечали, имеются два типа движений: "приход" и "расход". Записи движений регистров актуальны в течение определённого промежутка времени, называемого периодом актуальности итогов; возможные значения - месяц, пятнадцать дней, декада, пять дней. По умолчанию остатки, накопленные в ресурсах регистров, выдаются на точку актуальности - ТА. Если нужно получить остатки или итоги по регистру до ТА, то выполняется временный расчет регистров. Период актуальности итогов необходим для того, чтобы при каждом обращении к регистрам на момент до точки актуальности не вычислять значения остатков или итогов от начала работы предприятия по движениям. Для расчета остатков или итогов на любой момент времени берется остаток на начало периода и по движениям вычисляется остаток на данный момент времени.

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

Если НашаДата<ПолучитьДатуТА() Тогда

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

РассчитатьРегистрыНа(НашаДата);

КонецЕсли;

Метод ВременныйРасчет (<Флаг>) позволяет установить флаг участия регистра во временном расчете Возвращает текущее значение флага участия регистра во временном расчете. Значения параметра <флаг>: 1 - установить флаг участия регистра во временном расчете; 0 - сбросить флаг участия регистра во временном расчете (необязателен, по умолчанию - 1). Замечание: В один момент времени только по одному объекту регистров каждого вида могут участвовать во временном расчете.

Метод РассчитатьРегистрыНа (<ГраницаРасчета>,<ГрафаОтбора>) позволяет рассчитать все регистры с установленным флагом временного расчета на начало события, заданное границей расчета.



IX Основы построения ╚Оперативного учёта╩ в системе 1С:Предприятие__________ 133

9.3. Методы регистров


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

╗        Выборка движений регистров;

╗        Установка порядка выборки и фильтров:

Регистр.Амортизация.ОбратныйПорядок();

Регистр.Амортизация.УстановитьФильтр(ЗначениеОборудования);

Метод ОбратныйПорядок(<Режим>)позволяет установить порядок выборки движений документов. Возвращает:

1 - обратный порядок выборки документов,

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

<Режим> - число: 1 - выбирать движения документов в порядке убывания даты и времени;═ 0 -выбирать движения документов в порядке возрастания даты и времени, (по умолчанию - 1). Данный метод нельзя применять с методом ВыбратьДвиженияСОстатками. Метод можно использовать как процедуру и как функцию. Как функция метод возвращает значение, соответствующее порядку выборки до вызова.

Метод УстановитьЗначениеФильтра(<╚Идентиф╩>,<Значен>,<Вариант>) позволяет установить Фильтр по значению одного атрибута регистра, установить вариант отбора и принадлежность некоторому множеству значений <Идентиф> - идентификатор измерения или реквизита в кавычках. <3начен> - значение или список значений. <Вариант> - необязательный параметр. Число:

0 - не фильтровать;

1 - фильтровать по значению; . Значение по умолчанию

2 - искать вхождение. Для варианта "2":

- если параметр <3начен> - это группа справочника, то осуществляется проверка вхождения в

группу;

-═ если параметр <3начен> - это простой элемент справочника или другой тип значения, то

осуществляется просто фильтрация по значению;

-═ для списка значений осуществляется проверка вхождения в список; - если пустое значение

или пустой список значений, то условие не проверяется.

Метод УстановитьФильтр(<Измерение1>,<Измерение2>...,<Рекв1>,<Рекв2>) позволяет установить Фильтры по всем измерениям и реквизитам регистра. <Измерен1>,<Измерен2>... - значения измерений


134_____ _______ ______ _______ 1С:Предприятие. Практика программирования на платформе V7

регистра. Измерения могут задаваться с пропусками (неуказанное значение - просто запятая), фиксируются только указанные измерения. <Рекв1>,<Рекв2>... - необязательные параметры. Выражения со значениями реквизитов регистра. Заданные значения реквизитов будут влиять только на отбор движений регистра.

Обратите внимание на вариант 2 метода УстановитьЗначениеФильтра, благодаря которому этим методом можно установить фильтр на множество значений измерения или реквизита в отличие от метода УстановитьФильтр.

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

╗        Цикл выборки движений

Регистр. Амортизация . ВыбратьДвижения (ДатаНач, ДатаКон);

Пока Регистр.Амортизация.ПолучитьДвижение() =1 Цикл

ЗначениеПартии= Регистр.Амортизация.Партия;

// и прочие атрибуты регистра

КонецЦикла;

Метод ВыбратьДвижения(<ДатаНачала>,<ДатаКонца>,<ГрафаОтбора>) позволяет выбрать все движения регистра по датам в заданном интервале дат. <ДатаНачала> - дата, документ или позиция начала временного интервала выбора движений регистра; <ДатаКонца> - дата, документ или позиция конца временного интервала выбора движений регистра (если не указана или 0, то конец - ТА). <ГрафаОтбора> - необязательный параметр. Строковое выражение. Идентификатор графы отбора -установка использования определенной графы отбора. "*" - автоматический выбор графы отбора. Пустая строка - не использовать графу отбора. Если не указан - автоматический выбор графы отбора.

Движения можно выбрать также методами ВыбратьДвиженияДокумента(<Документ>) и ВыбратьДвиженияСОстатками(<ДатаКонца>, <ГрафаОтбора>).

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

╗        Выборка итогов ≈ ненулевых остатков ресурсов регистров.

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

Per.ВыбратьИтоги();

Пока Рег.ПолучитьИтог()=1 Цикл

ЗначениеПартии= Peг.Партия;

ЗначениеСтоимости= Peг.Стоимость;


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

//.........

КонецЦикла;

Перед вызовом метода ВыбратьИтоги() можно также установить фильтры и порядок выборки. Метод ВыбратьИтоги() можно использовать только для переменной определенной с помощью метода СоздатьОбъект.

На платформе V77 можно выгрузить итоги в таблицу значений.

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

Регистр.Амортизация.ВыгрузитьИтоги(ТабЗн) ;

Метод ВыгрузитьИтоги(<ТаблЗнач>,<ВклФильтр>,<Очищать>) позволяет выгрузить все итоги регистра с текущим фильтром в таблицу значений. <ТаблЗнач> - объект типа "ТаблицаЗначений", куда система выгрузит все итоги регистра, колонки таблицы создаются в соответствии с типами и идентификаторами атрибутов регистра. <ВклФильтр> - необязательный параметр. Число: 1 - в получаемую таблицу включаются измерения, закрепленные фильтром ; 0 - не включаются. Значение по умолчанию - 0. <Очищать> - необязательный параметр.Число:1 - перед выгрузкой таблица значений очищается;0 - не очищается.Значение по умолчанию -1.

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

Метод Свернуть(<ГруппКолонки>,<СуммКолонки>) позволяет свернуть таблицу значений по соответствующим значениям колонок, т.е. заменяет на одну строку все дублирующие (по значениям группировочных колонок) строки, суммируя значения по суммируемым колонкам. <ГруппКолонки> -группировочные колонки (номера или идентификаторы колонок через запятую), по которым группировать данные. <СуммКолонки> - суммируемые колонки (номера или идентификаторы колонок через запятую), по которым суммировать данные.



136_____ _______ ______ _______ 1С:Предприятие. Практика программирования на платформе V7

9.3.1. Методы регистров остатков

Метод ОстаткиПолучить() позволяет получить все ресурсы по регистру. Измерения записываются в атрибуты, полученные ресурсы считываются из атрибутов регистра. Метод используется только для регистров остатков.

Регистр.Амортизация.Оборудование= Оборудование; Регистр.Амортизация.ОстаткиПолучить(); ЗначениеСтоимости= Регистр.Амортизация.Стоимость;

Методы Остатки(<?>) и СводныеОстатки(<?>) также позволяют получить остатки по всем ресурсам регистра. Параметры: [<Значение измерения1>, <Значение измерения2>,...] . При вызове метода Остатки (<?>) необходимо указать значения всех измерений регистра. Для метода СводныеОстатки(<?>) можно указать значения только необходимых измерений, а остальные опустить, поставив соответствующие запятые.

Регистр. Амортизация.СводныеОстатки(ЗначениеОборудования,); ЗначениеСтоимости= Регистр.Амортизация.Стоимость; ЗначениеКолл_во= Регистр.Амортизация.Количество;



Методы Остаток(<?>, ╚╩) и СводныйОстаток(<?>, ╚╩) возвращают значение остатка заданного ресурса регистра. Параметры:[<3начение измерения1>, <Значение измерения2>,... , <Имя ресурса в кавычках>]. При вызове метода Остаток(<?>,╚╩) необходимо указать значения всех измерений регистра. Метод СводныйОстаток(<?>, ╚╩) возвращает значение сводного остатка заданного ресурса регистра по неполному списку значений измерений, как и метод СводныеОстатки(<?>).


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

ЗначениеСтоимости=

Регистр.Амортизация.СводныйОстаток(ЗначениеОборудования══ ,══ ,"Стоимость═ ");

ЗначениеКолл_во=

Регистр. Амортизация.СводныйОстаток(ЗначениеОборудования , , "Количество");

9.3.2. Методы оборотных регистров

Методы получения значений ресурсов оборотных регистров имеют списки параметров и назначения аналогичные соответствующим методам регистров остатков. Перед получением итогов необходимо указать за какой период надо получить значения ресурсов с помощью метода ИспользоватьПериод(<?>). Список параметров этого метода зависит от Периодичности оборотного регистра, которая задается при конфигурировании регистра. Для регистра с периодичностью Месяц и аналогичными атрибутами справедлива запись:

Регистр.Обортный.ИспользоватьПериод(2001,ЗначениеМесяца);

ЗначениеОборота=Регистр.Обортный.СводныйИтог(Зн_еИзмерения, "ИдентификаторРесурса");

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

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

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

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


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 Тогда

Прервать;

КонецЕсли;

КонецЦикла;

КонецЦикла;

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

9.5. Особенности временного расчета регистров оперативного учета

Если мы откроем форму объекта, например: отчета, который создает временный расчет по регистру ╚Амортизация╩, и, не закрывая эту форму, откроем документ ╚Амортизация╩, который тоже создает временный расчет по регистру ╚Амортизация╩, то, при неправильном конфигурировании,


/X. Основы построения ╚Оперативного учёта╩ в системе 1С:Предприягие__________ 145

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

Еще одну особенность временных расчетов следует учитывать при проведении документов. Если в алгоритме проведения документа анализируются остатки и выполняются движения регистра, то при использовании текущих итогов регистра после записи каждого движения итоги изменяются, чтобы поддерживать временный расчет регистров в актуальном состоянии необходимо использовать метод Актуальность() со значением параметра равным 1 - Актуальность( 1).

Упражнение 26. В Форме списка справочника ╚Оборудование╩ вывести текущие остатки по стоимости конкретного оборудования (элементу справочника) из регистра ╚Амортизация╩.

В ФормеСписка справочника ╚Оборудование╩, в табличной его части создадим реквизит типа текст с заголовком ╚Ост.╩, а в поле формула на закладке ╚Дополнительные╩ выше описанного реквизита введем соответствующее выражение. Напоминаю, что получить элемент по строке формы списка можно с помощью метода ТекущийЭлемент().

Упражнение 27. (Необязательное) В выше описанном поле показать остатки по элементам и суммарные остатки по группам справочника.

Метод ЭтоГруппаО для справочников возвращает флаг группы: 1 - если элемент является группой, 0 -если это обычный элемент.

Вопросы для самоконтроля

На какой момент времени возвращаются остатки по регистрам, если не задан временный расчет регистров?

Когда необходимо для получения остатков выполнить временный расчет регистров?

В каких текстовых модулях определен метод ИтогиАктуальны(). В чем отличия регистров остатков от оборотных регистров?


146_____ _______ ______ _______ 1С:Предприятие. Практика программирования на платформе V7

Что произойдет с базой данных, если изменить тип реквизита документа, участвующего в формировании аналитики по регистру?

Что произойдет с базой данных, если изменить тип измерения регистра? Назовите преимущества и недостатки партионного учета.