Продвинутый курс. Занятие №13
Третье занятие 2-го блока продвинутого курса по программированию.
Необходимо изучить следующие главы текущего блока.
Глава 8. Расчет стоимости.
Глава 9. Кейсы.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

22.06.2011
Задание выполнено.
Стоимостной учет ведется по среднескользящей оценке. Списание себестоимости осуществляется специальной обработкой, которая “допроводит” документы реализации по регистру учета. Список документов, по которым необходимо сформировать движения, получаем с помощью последовательности. При удачном списании себестоимости по документу перемещается граница последовательности.
Задание выполнено. Новый регистр накопления “”Стоимость товаров”, измерение Номенклатура, ресурсы – Количество, Сумма. Стоимость рассчитывается по среднескользящей в подписке на событие ПередЗаписью регистра “Стоимость товаров”. В обработке восстановления последовательности получаю записи с отбором по регистратору, записываю (при этом в подписке на событие “Перед записью” пересчитывается стоимость).
Задание выполнила опираясь на уроки. В реализации стоимость списывается по среднескользящей, в конце месяца списываемая стоимость доводится регламентным документом(Закрытие месяца) до средневзвешенной. В обработке восстановления последовательности тоже соответственно использую среднескользящую оценку.
Вообще списание стоимости интересная тема. У нас на работе в 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 будет выложено?
Спасибо за информацию, исправлено.