Задача 5
Эта задача, как и предыдущие, во многом повторяет задачу 1, решение которой мы разбирали достаточно подробно. Поэтому сконцентрируем своё внимание на отличиях:
- Учётная политика может меняться каждый день;
- Изменение Учётной политики фиксируется соответствующим документом;
- "Считается, что документы задним числом не вводятся, но старые документы могут проводиться неоперативно".
- Это единственная задача, в которой упоминается метод списания по средней;
Пойдем от простого к сложному:
- Самый простой - первый пункт. Нужно просто установить периодичность регистра сведений содержащего хронологию изменений учётной политики в пределах дня и всё!
- С документом, фиксирующим её изменения вроде бы тоже всё просто. Нужно его создать, и назначить регистратором вышеупомянутого регистра, для чего сам регистр нужно будет сделать зависимым от регистратора. Но это кажущаяся простота, мы ещё вернёмся к этому пункту позже, когда станет понятен его истинный смысл.
- Дальше нас ждёт весьма презабавная формулировочка: "Считается...", - которая рождает вполне естественный вопрос: "В каком смысле считается? В смысле того, что если кто-то введёт документ задним числом, для нас это станет полной неожиданностью?". И знаете, если бы это была реальная работа, я бы обязательно задал этот вопрос! Но мы на экзамене и вопросы задают нам, а мы отвечаем на свой страх и риск. Поэтому, коль скоро формулировка туманная, каждый сам для себя делает выбор:
- Как эффективно запретить ввод документов задним числом мы расскажем вам в задаче 6, поскольку там формулировка более конкретная: "нельзя"! А Вы между тем сможете определиться, какое решение больше импонирует Вам лично.
- И, наконец, последний пункт - списание по средней!
Вот он-то как раз особенный и, с аналитической точки зрения, самый сложный. Дело в том, что списание по средней, это уже не партионный учет!!! При списании по средней вы уже не можете указать с какой именно партии вы списываете товар. Поскольку цена во всех партиях потенциально разная, и может нигде не совпадать со средней ценой. Получается, что как только вы перейдёте на списание по средней, весь ваш партионный учет будет нарушен! И обратно восстановить его уже не удастся.
Но не будем сокрушаться об этом - "заказчик всегда прав". Наша задача собственно только в том и состоит, чтобы даже в таких условиях программа работала устойчиво, как ни в чём ни бывало, и не выдавала сообщений о системных ошибках. Ибо, когда программа тупо сбоит, программист в любом случае виноват. Даже если сбой вызван "наведённой ошибкой" [Заказчика при составлении ТЗ].
Главное, что мы для себя определили: переключение на списание по средней и обратно, это фактически отключение и включение партионного учета. И мы должны сделать это аккуратно без далеко идущих последствий.
Фактически, в момент перехода на списание по средней нам нужно избавиться от информации о партиях, так как в противном случае у нас:
- либо будут зависать остатки по партиям, если мы просто не укажем партию в расходе;
- либо будет происходить рассогласование количества и стоимости, если мы будем списывать с конкретной партии, но по цене, отличающейся от цены прихода.
На экзамене за любую из этих ошибок мы можем потерять драгоценные 2 балла из 5.
Вот тут-то и возникает необходимость в документе, упомянутом в третьем пункте, который оформляется как раз в момент перехода. Именно при проведении этого документа мы можем избавиться от партий, попросту свернув их. Нам нужно будет списать остатки по всем партиям в расход, и вновь поставить их на приход, но уже без указания партии.
И впредь, до перехода на списание по ЛИФО или ФИФО, больше не указывать их.
Из этого последнего замечания вытекает ещё одна особенность проведения документов, на этот раз, касающаяся приходной накладной. Прежде чем её провести, нам нужно знать, должна ли она указываться в качестве партии или нет. А для этого прежде нужно прочитать текущее значение учетной политики.
На экзамене за любую из этих ошибок мы можем потерять драгоценные 2 балла из 5.
Вот тут-то и возникает необходимость в документе, упомянутом в третьем пункте, который оформляется как раз в момент перехода. Именно при проведении этого документа мы можем избавиться от партий, попросту свернув их. Нам нужно будет списать остатки по всем партиям в расход, и вновь поставить их на приход, но уже без указания партии.
И впредь, до перехода на списание по ЛИФО или ФИФО, больше не указывать их.
Из этого последнего замечания вытекает ещё одна особенность проведения документов, на этот раз, касающаяся приходной накладной. Прежде чем её провести, нам нужно знать, должна ли она указываться в качестве партии или нет. А для этого прежде нужно прочитать текущее значение учетной политики.
- Нам нужно создать документ, фиксирующий изменения учетной политики;
- При переходе на списание по средней этот документ должен сворачивать партии;
- Поэтому он будет регистратором не только в регистре сведений об учетной политике, но и в регистре накопления остатков номенклатуры;
- Соответственно в регистре сведений об учетной политике должна быть указана зависимость от регистратора;
- Кроме того, в этом регистре должна быть установлена периодичность в пределах дня;
- При списании по средней в движениях приходной накладной не следует указывать партию.
Вот в принципе и всё. Алгоритм проведения расходной накладной, и даже запрос, который он делает, не меняется. А о том, как запретить ввод документов задним числом мы расскажем в задаче 6.
Создаем регистр сведений МетодыСписанияСебестоимости, устанавливаем его Периодичность В пределах дня, Режим записи Подчинение регистратору. Добавим регистр в подсистему ОперативныйУчет, а на закладке «Данные» создадим ресурс Метод типа ПеречислениеСсылка.УчетнаяПолитика.
В этом преречислении уже имеются значения ЛИФО и ФИФО, нужно добавить ещё одно значение: ПоСредней.
Создаем документ ПриказОбУчетнойПолитике, добавляем его в подсистему ОперативныйУчет/Документы, на закладке «Данные» создаём реквизит МетодСписанияСебестоимости типа ПеречислениеСсылка.УчетнаяПолитика, а на закладке «Движения» укажем, что он является регистратором для регистров МетодыСписанияСебестоимости и ОстаткиНоменклатуры.
Переходим к описанию алгоритма проведения документа: прежде всего указываем, что все созданные нами движения нужно записывать, иначе весь наш труд пойдёт прахом.
Далее, сразу же стираем старую запись в регистре сведений, чтобы прочитать какой метод списания устанавливают другие документы. Если они устанавливают другой метод, то записываем свой. Если наш документ не изменяет метод списания, то в принципе можно ничего не делать.
Если наш документ изменяет прежний метод списания на метод списания ПоСредней, то приступаем к сворачиванию партий. Для этого прежде всего нужно прочитать все остатки по партиям на МоментВремени проведения документа. Прямо в запросе посчитаем суммарные остатки по каждой номенклатуре, чтобы не делать лишних движений.
Дальше, во вложенном цикле пускаем в расход остатки по партиям, во внешнем цикле приходуем суммарные остатки по номенклатуре без указания партии.
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.МетодыСписанияСебестоимости.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.МетодыСписанияСебестоимости.Записать();
Если МетодСписанияСебестоимости
<> РегистрыСведений.МетодыСписанияСебестоимости.ПолучитьПоследнее(Дата).Метод Тогда
// регистр МетодыСписанияСебестоимости
Движение = Движения.МетодыСписанияСебестоимости.Добавить();
Движение.Период = Дата;
Движение.Метод = МетодСписанияСебестоимости;
Если МетодСписанияСебестоимости = Перечисления.УчетнаяПолитика.ПоСредней Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
| ОстаткиНоменклатурыОстатки.Партия,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК СтоимостьОстаток
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(&МоментВремени, )
| КАК ОстаткиНоменклатурыОстатки
|
|ИТОГИ
| СУММА(КоличествоОстаток),
| СУММА(СтоимостьОстаток)
|ПО
| Номенклатура";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Движения.ОстаткиНоменклатуры.Записать();
ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНоменклатура.Следующий() Цикл
ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// регистр ОстаткиНоменклатуры Расход
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток;
Движение.Стоимость = ВыборкаДетальныеЗаписи.СтоимостьОстаток;
КонецЦикла;
// регистр ОстаткиНоменклатуры Приход
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
Движение.Количество = ВыборкаНоменклатура.КоличествоОстаток;
Движение.Стоимость = ВыборкаНоменклатура.СтоимостьОстаток;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедурыТеперь посмотрим какие дополнения нам нужно сделать в алгоритме проведения документа приходная накладная. Во-первых, в самое начало процедуры ОбработкаПроведения воткнём чтение и проверку наличия сведений о методе списания себестоимости.
Если таковых не имеется, отказываемся проводить документ и выходим из процедуры.
Метод = РегистрыСведений.МетодыСписанияСебестоимости.ПолучитьПоследнее(МоментВремени()).Метод;
Если Метод = Перечисления.УчетнаяПолитика.ПустаяСсылка() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Документ не может быть преведён, поскольку не определён метод списания себестоимости!";
Сообщение.Сообщить();
Отказ = Истина;
Возврат;
КонецЕсли;Теперь отыскиваем строку кода, в которой указывается партия и выполняем её только если метод списания не ПоСредней.
Если Не (Метод = Перечисления.УчетнаяПолитика.ПоСредней) Тогда
Движение.Партия = Ссылка;
КонецЕсли;