Продвинутый курс. Занятие №13
Третье занятие 2-го блока продвинутого курса по программированию.
Необходимо изучить следующие главы текущего блока.
Глава 8. Расчет стоимости.
Глава 9. Кейсы.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.
Задание выполнено.
Стоимостной учет ведется по среднескользящей оценке. Списание себестоимости осуществляется специальной обработкой, которая “допроводит” документы реализации по регистру учета. Список документов, по которым необходимо сформировать движения, получаем с помощью последовательности. При удачном списании себестоимости по документу перемещается граница последовательности.
Задание выполнено. Новый регистр накопления “”Стоимость товаров”, измерение Номенклатура, ресурсы – Количество, Сумма. Стоимость рассчитывается по среднескользящей в подписке на событие ПередЗаписью регистра “Стоимость товаров”. В обработке восстановления последовательности получаю записи с отбором по регистратору, записываю (при этом в подписке на событие “Перед записью” пересчитывается стоимость).
Задание выполнила опираясь на уроки. В реализации стоимость списывается по среднескользящей, в конце месяца списываемая стоимость доводится регламентным документом(Закрытие месяца) до средневзвешенной. В обработке восстановления последовательности тоже соответственно использую среднескользящую оценку.
Вообще списание стоимости интересная тема. У нас на работе в 7ой базе есть спец переферийка для перепроведения документов за месяц, чтобы не занимать рабочую базу. Заинтересовал альтернативный учет по методу FIFO :)
Для решения задачи создан регистр накопления, хранящий данные о стоимости товаров (измерение “Номенклатура”, ресурсы “Количество”, “Сумма”); последовательность, которая регистрирует документы реализации; обработка, которая восстанавливает данные о стоимости, опираясь на данные последовательности. Стоимость товаров определяется по среднескользящей. Обработка получает из последовательности документы реализации, которые необходимо допровести. Для каждого документа открывается транзакция и выполняется списание стоимости с помощью отдельной процедуры – как это показано в видеоуроках.
Евгений, ответьте, пожалуйста, на 2 вопроса:
1. В обработке списания стоимости товаров Вы с помощью запроса получаете данные шапки документа (дата и момент времени) – для оптимизации. Также вызывается функция “ПолучитьОбъект” для доступа к коллекции движений документа. Насколько я понимаю, при получении объекта все его реквизиты считываются из БД в память. Зачем тогда делать запрос к данным шапки, когда, по идее, эти данные можно быстро считать из имеющегося в оперативной памяти объекта: ДокументОбъект.Дата, ДокументОбъект.МоментВремени()?
2. В той же обработке при списании по методу ФИФО при расчете суммы списания рассматривается случай: если кол-во к списанию = кол-ву на остатке, то тогда сумма списания = сумма на остатке. А почему нельзя и для этого случая применить известную формулу: кол-во к списанию * сумма на остатке / кол-во на остатке?
1. Да, действительно так и происходит. В данном случае эффективнее дату и момент времени получать от объекта документа.
2. Для исключения потенциальной погрешности округления: если списывается все количество, то нужно списать и всю стоимость.
Хотя при указанной формуле не может быть каких-либо проблем, то есть эту проверку можно и не делать.
Спасибо ;)
Задание выполнено.
Так как сказано, что нужен стоимостной учет по номенклатуре и ничего не сказано о партиях, то выбран вариант учета по средне-скользящей. Реализовано способом аналогичным показанному в уроках. Создан новый регистр сведений СтоимостьТоваров (изм. – Номенклатура, ресурсы – Количество, Сумма). Регистраторами являются документы поступления и реализации товаров (а также должны все будущие документы, производящие расход товара). При поступлении в регистр записываются движения прихода. Расходные движения при проведении документа не формируются, это делается с помощью обработки восстановления последовательности. Эта последовательность РасходТоваров включает документы Реализации, влияющие движения – по регистрам ОстаткиТоваров и СтоимостьТоваров (последний нужен, т.к. при проведении прихода возможна ситуация изменения стоимости номенклатуры при сохранении состава и количества). Граница автоматически не перемещается.
Обработка запросом выбирает все документы последовательности, начиная с граничного (включительно) и вызывает для каждого из них функцию общего модуля, в которой формируются движения по регистру ОстаткиТоваров, и если движения успешно сформированы двигает границу последовательности. Код функции (возвращается признак успешного формирования движений):
<code>
Функция СформироватьДвиженияПоСтоимостиТоваров(Документ) Экспорт
НачатьТранзакцию();
Запрос = Новый Запрос(”
|ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура,
| СУММА(ОстаткиТоваров.Количество) КАК Количество
|ПОМЕСТИТЬ Товары
|ИЗ
| РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
|ГДЕ
| ОстаткиТоваров.Регистратор = &Документ
|
|СГРУППИРОВАТЬ ПО
| ОстаткиТоваров.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура
|ИЗ
| Товары КАК Товары”);
Запрос.УстановитьПараметр(“Документ”, Документ);
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Результат = Запрос.Выполнить();
Блокировка = Новый БлокировкаДанных;
ЭлемБлок = Блокировка.Добавить(“РегистрНакопления.СтоимостьТоваров”);
ЭлемБлок.ИсточникДанных = Результат;
ЭлемБлок.ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”);
Блокировка.Заблокировать();
Запрос.Текст = ”
|ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество,
| ЕСТЬNULL(СтоимостьТоваровОстатки.КоличествоОстаток, 0) КАК ОстатокКоличество,
| ЕСТЬNULL(СтоимостьТоваровОстатки.СуммаОстаток, 0) КАК ОстатокСумма
|ИЗ
| Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьТоваров.Остатки(
| &МоментВремени,
| Номенклатура В
| (ВЫБРАТЬ
| Товары.Номенклатура
| ИЗ
| Товары КАК Товары)) КАК СтоимостьТоваровОстатки
| ПО Товары.Номенклатура = СтоимостьТоваровОстатки.Номенклатура”;
Запрос.УстановитьПараметр(“МоментВремени”, Документ.МоментВремени());
Выборка = Запрос.Выполнить().Выбрать();
Набор = Документ.ПолучитьОбъект().Движения.СтоимостьТоваров;
Дата = Документ.Дата;
НетОшибок = Истина;
Пока Выборка.Следующий() Цикл
Если Выборка.Количество > 0 Тогда
Если Выборка.ОстатокКоличество>=Выборка.Количество Тогда
Запись = Набор.ДобавитьРасход();
Запись.Период = Дата;
Запись.Номенклатура = Выборка.Номенклатура;
Запись.Количество = Выборка.Количество;
Запись.Сумма = Выборка.Количество * Выборка.ОстатокСумма/Выборка.ОстатокКоличество;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “В документе “+Документ+” не хватает товара “+Выборка.Номенклатура+” в кол-ве “+(Выборка.Количество-Выборка.ОстатокКоличество);
Сообщение.Сообщить();
НетОшибок = Ложь;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если НетОшибок Тогда
Набор.Записать();
КонецЕсли;
ЗафиксироватьТранзакцию();
Возврат НетОшибок;
КонецФункции
</code>
Задание выполнено. Методы выполнения задания очень хорошо показаны в материалах курса.
1. Для стоимостного учета создал рег. нак. СтоимостьТоваров (остатки, изм. Номенклатура, рес – Количество, Стоимость). Приход оформляется поступлением, расход – реализацией, дублирует расход регистра ОстаткиТоваров, стоимость записываю на основании данных рег. св. Плановые ЦеныНоменклатуры. Стоимостной учет реализовал методом альтернативного фифо при проведении документа ЗакрытиеМесяца, так как показано в материалах курса (на основании вирт. таблицы ОстаткиИОбороты, но в этом методе заметил одну ошибку: если приход происходит раньше закрываемого месяца, то списание происходит по средневзвешеному -> сделал вывод, что нужно использовать отдельно вирт. таб. Остатки и Обороты).
2. С последовательностью замечаний не возникло. Для восстановления последовательности без проведения документов перенес код по списанию из модуля объекта в функции общих модулей, которые и вызываю в обработке.
Задание выполнено. Сложностей не возникло, т.к. в уроках все хорошо рассказано. И сделано все, в принципе, по аналогии с уроками. Плюс небольшие вариации.
Создан РН “Стоимость товаров”. Себестоимость считается по средневзвешенной. В контроль остатков включен данный регистр. Даже ничего дописывать не пришлось, кроме как присваивание ДополнительныхСвойств у данного РН.
Последовательность создана также, по аналогии с уроками. Обработка для восстановления последовательности также создана.
P.S. Кстати, в уроках есть небольшая неувязочка. Это касается создания обработки для расчета себестоимости. Урок “1CdevAdv-Block2-Chapter08-Lesson07-main”. В нем приводится запрос для получения документов из последовательности. Но… условие связи должно быть не “>”, а “>=”. Т.е. может получится следующее. У нас последовательность восстановлена. Самым последним документом является реализация. Мы зашли в нее и перепровели. Регистр стоимости очистился. Но если теперь запустить обработку расчета себестоимости, то она не отработает по той причине, что последовательность и так находится на самом последнем документе, а он по заданному условию не попадает в список. Соответственно, для этой реализации не будет рассчитана себестоимость.
Сорри….. Себестоимость считается по среднескользящей.
По поводу вида неравенства согласен, спасибо.
Задание выполнено.
1. Выполнять стоимостно учет я буду по новому алгоритму. Значит для этого мне нужно будет создать регистр накопления СтоимостьТоваров (Остатки), с измерениями Номенклатура и ресурсами Количество и Сумма. Так же я создам документ ЗакрытиеМесяца, аналогично тому, что в обучающих занятиях. Регистр СтоимостьТоваров будет иметь регистраторами Приходную накладную(приход кол-ва и суммы), реализацию (для списания количества) и закрытие месяца(списание суммы).
2. В обработке проведения я добавлю еще код, который добавляет записи в созданный регистр с видом Приход.
3. В документе Реализация я создам такие же действия с новым регистром, как и с регистром остатки. А так же в подписке на события я добавлю код для контроля остатков еще и по новому регистру, так же как и по регистру ОстаткиТоваров.
4. В документе Закрытие месяца в обработке проведения я вставлю такой же код как и в учебном занятии. (Приводить его не буду, он подробно там описан. И доработок практически нет)
5. Создам Последовательность документов, РасходныеНакладные, на которую будет влиять документ Реализации и движения остатки товаров. Так как его считаю, будет достаточно для правильного восстановления последовательности.
6. В обработке восстановления я использовал учебную часть код, где в примере списывались партии, без проведения самого документа, таким же образом я и организовал восстановление последовательности.
Создадим регистр СтоимостьТоваров, идентичный регистру ОстаткиТоваров, с дополнительным ресурсом Сумма. Регистраторы – ПоступлениеТоваровИУслуг, РеализацияТоваровИУслуг. В обработке проведения реализации добавим движения по этому регистру аналогично остаткам товаров. Ресурс Сумма будем заполнять по среднескользящей, для расчета добавим в запрос по табличной части остатки по регистру СтоимостьТоваров. Скорректируем обработчики подписок на события с учетом нового регистра. Для окончательного расчета стоимости добавим документа ЗакрытиеМесяца, где будем формировать корректирующие движения по списанию по альтернативному FIFO.
Создадим последовательность стоимостного учета и обработку восстановления последовательности. Чтобы не перепроводить документы, в обработке формируем движения только по регистру СтоимостьТоваров. При возникновении ошибок документ потребуется исправить и перепровести вручную, что приведет в соответствие движения по прочим регистрам.
Отчет о проделанной работе:
1.
1.1Новые объекты: РН СтоимостьТоваров, изм. Номенклатура, Партия, ресурсы Количество, Стоимость; Перечисление МетодыСписания; Константа МетодСписанияСебестоимости. В константе в модуле менеджера значения прописан запрет изменения при существовании хотя бы одной записи в РН СтоимостьТоваров.
1.2 В модуле документа Поступление добавлены приходные движения по РН СтоимостьТоваров
1.3 В подписки ПередЗаписьюДокумента в допсвойства вставляется дополнительный параметр ДвижениеСтоимости
1.4 В обработчике ПриЗаписиРегистраОстатки после контроля при наличии НЕ Отказ и параметра ДвижениеСтоимости формируется списание по выбранному в константе методу (если честно – сделал только фифо и лифо)
2
2.1 Создал Последовательность Товарная с видом перемещения границы – Не перемещать, док-тами Поступление, Реализация, Заказ и Движениями ОстаткиТоваров. В новой подписке ОбработкаПроведения всех документов проверяю, если док входит в последовательность и результат НЕ Проверить(), тогда сдвигаю границу. Восстановление предполагается в сервисной обработке.
2.2 Выборку документов организую с помощью нехитрого запроса
<code>
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ РАЗЛИЧНЫЕ
| ОстаткиТоваров.Регистратор КАК Ссылка
|ИЗ
| РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
|ГДЕ
| ОстаткиТоваров.Регистратор.МоментВремени > &Граница
|
|УПОРЯДОЧИТЬ ПО
| ОстаткиТоваров.Регистратор.МоментВремени”;
Запрос.УстановитьПараметр(“Граница”, ПоследТовары.ПолучитьГраницу());
</code>
Не совсем понял что значит “восстановить учетные данные без перепроведения”. Как мне думается – это переформировать движения по регистрам. Если так, то единственным вариантом мне видется вынос формирование таблиц движений документов в экспортные методы. В обработке восстановления последовательности через набор записей по регистратору из выборки перегружать движения и вызвать Записать с предварителньо выставленным допсвойствами
>Как мне думается – это переформировать движения по регистрам
Все верно.
В д/з №12 указаны для изучения главы 3-7, а в этом 9-10. Глава 8 будет изучаться позже? (есть противоречие с планом в конфигурации, там указаны для этого задания 8 и 9 главы для изучения…)
П.С. А решение д/з №11 будет выложено?
Спасибо за информацию, исправлено.