Продвинутый курс. Занятие №13

Третье занятие 2-го блока продвинутого курса по программированию.

Необходимо изучить следующие главы текущего блока.
Глава 8. Расчет стоимости.
Глава 9. Кейсы.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментариев 17 на “Продвинутый курс. Занятие №13”

  1. Задание выполнено.

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

  2. Задание выполнено. Новый регистр накопления “”Стоимость товаров”, измерение Номенклатура, ресурсы – Количество, Сумма. Стоимость рассчитывается по среднескользящей в подписке на событие ПередЗаписью регистра “Стоимость товаров”. В обработке восстановления последовательности получаю записи с отбором по регистратору, записываю (при этом  в подписке на событие “Перед записью” пересчитывается стоимость).

  3. Задание выполнила опираясь на уроки. В реализации стоимость списывается по среднескользящей, в конце месяца списываемая стоимость доводится регламентным документом(Закрытие месяца) до средневзвешенной. В обработке восстановления последовательности тоже соответственно использую среднескользящую оценку.
    Вообще списание стоимости интересная тема. У нас на работе в 7ой базе есть спец переферийка для перепроведения документов за месяц, чтобы не занимать рабочую базу. Заинтересовал альтернативный учет по методу FIFO :)

  4. Для решения задачи создан регистр накопления, хранящий данные о стоимости товаров (измерение “Номенклатура”, ресурсы “Количество”, “Сумма”); последовательность, которая регистрирует документы реализации; обработка, которая восстанавливает данные о стоимости, опираясь на данные последовательности. Стоимость товаров определяется по среднескользящей. Обработка получает из последовательности документы реализации, которые необходимо допровести. Для каждого документа открывается транзакция и выполняется списание стоимости с помощью отдельной процедуры – как это показано в видеоуроках.

    Евгений, ответьте, пожалуйста, на 2 вопроса:
    1.  В обработке списания стоимости товаров Вы с помощью запроса получаете данные шапки документа (дата и момент времени) – для оптимизации.  Также вызывается функция “ПолучитьОбъект” для доступа к коллекции движений документа. Насколько я понимаю, при получении объекта все его реквизиты считываются из БД в память.  Зачем тогда делать запрос к данным шапки, когда, по идее, эти данные можно быстро считать из имеющегося в оперативной памяти объекта: ДокументОбъект.Дата, ДокументОбъект.МоментВремени()?
    2. В той же обработке при списании по методу ФИФО при расчете суммы списания рассматривается случай: если кол-во к списанию = кол-ву на остатке, то тогда сумма списания = сумма на остатке. А почему нельзя и для этого случая применить известную формулу: кол-во к списанию * сумма на остатке / кол-во на остатке?

    • 1. Да, действительно так и происходит. В данном случае эффективнее дату и момент времени получать от объекта документа.

      2. Для исключения потенциальной погрешности округления: если списывается все количество, то нужно списать и всю стоимость.
      Хотя при указанной формуле не может быть каких-либо проблем, то есть эту проверку можно и не делать.

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

    Запрос.УстановитьПараметр(“Документ”, Документ);
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Результат = Запрос.Выполнить();

    Блокировка = Новый БлокировкаДанных;
    ЭлемБлок = Блокировка.Добавить(“РегистрНакопления.СтоимостьТоваров”);
    ЭлемБлок.ИсточникДанных = Результат;
    ЭлемБлок.ИспользоватьИзИсточникаДанных(“Номенклатура”, “Номенклатура”);
    Блокировка.Заблокировать();

    Запрос.Текст = ”
    |ВЫБРАТЬ
    |    Товары.Номенклатура,
    |    Товары.Количество,
    |    ЕСТЬNULL(СтоимостьТоваровОстатки.КоличествоОстаток, 0) КАК ОстатокКоличество,
    |    ЕСТЬNULL(СтоимостьТоваровОстатки.СуммаОстаток, 0) КАК ОстатокСумма
    |ИЗ
    |    Товары КАК Товары
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьТоваров.Остатки(
    |                &МоментВремени,
    |                Номенклатура В
    |                    (ВЫБРАТЬ
    |                        Товары.Номенклатура
    |                    ИЗ
    |                        Товары КАК Товары)) КАК СтоимостьТоваровОстатки
    |        ПО Товары.Номенклатура = СтоимостьТоваровОстатки.Номенклатура”;

    Запрос.УстановитьПараметр(“МоментВремени”, Документ.МоментВремени());
    Выборка = Запрос.Выполнить().Выбрать();

    Набор = Документ.ПолучитьОбъект().Движения.СтоимостьТоваров;
    Дата = Документ.Дата;
    НетОшибок = Истина;

    Пока Выборка.Следующий() Цикл
    Если Выборка.Количество > 0 Тогда
    Если Выборка.ОстатокКоличество>=Выборка.Количество Тогда
    Запись = Набор.ДобавитьРасход();
    Запись.Период = Дата;
    Запись.Номенклатура = Выборка.Номенклатура;
    Запись.Количество = Выборка.Количество;
    Запись.Сумма = Выборка.Количество * Выборка.ОстатокСумма/Выборка.ОстатокКоличество;
    Иначе
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “В документе “+Документ+” не хватает товара “+Выборка.Номенклатура+” в кол-ве “+(Выборка.Количество-Выборка.ОстатокКоличество);
    Сообщение.Сообщить();
    НетОшибок = Ложь;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;

    Если НетОшибок Тогда
    Набор.Записать();
    КонецЕсли;

    ЗафиксироватьТранзакцию();
    Возврат НетОшибок;
    КонецФункции
    </code>

  6. respublica 24.06.2011 в 02:50

    Задание выполнено. Методы выполнения задания очень хорошо показаны в материалах курса.
    1. Для стоимостного учета создал рег. нак. СтоимостьТоваров (остатки, изм. Номенклатура, рес – Количество, Стоимость). Приход  оформляется поступлением, расход – реализацией, дублирует расход регистра ОстаткиТоваров, стоимость записываю на основании данных рег. св.  Плановые ЦеныНоменклатуры. Стоимостной учет реализовал методом альтернативного фифо при проведении документа ЗакрытиеМесяца, так как показано в материалах курса (на основании вирт. таблицы ОстаткиИОбороты, но в этом методе заметил одну ошибку:  если приход происходит раньше закрываемого месяца, то списание происходит по средневзвешеному -> сделал вывод, что нужно использовать отдельно вирт. таб. Остатки и Обороты).
    2. С последовательностью замечаний не возникло. Для восстановления последовательности без проведения документов перенес код по списанию из модуля объекта в функции общих модулей, которые и вызываю в обработке.

  7. Задание выполнено. Сложностей не возникло, т.к. в уроках все хорошо рассказано. И сделано все, в принципе, по аналогии с уроками. Плюс небольшие вариации.
    Создан РН “Стоимость товаров”. Себестоимость считается по средневзвешенной. В контроль остатков включен данный регистр. Даже ничего дописывать не пришлось, кроме как присваивание ДополнительныхСвойств у данного РН.
    Последовательность создана также, по аналогии с уроками. Обработка для восстановления последовательности также создана.
     
    P.S. Кстати, в уроках есть небольшая неувязочка. Это касается создания обработки для расчета себестоимости. Урок “1CdevAdv-Block2-Chapter08-Lesson07-main”. В нем приводится запрос для получения документов из последовательности. Но… условие связи должно быть не “>”, а “>=”. Т.е. может получится следующее. У нас последовательность восстановлена. Самым последним документом является реализация. Мы зашли в нее и перепровели. Регистр стоимости очистился. Но если теперь запустить обработку расчета себестоимости, то она не отработает по той причине, что последовательность и так находится на самом последнем документе, а он по заданному условию не попадает в список. Соответственно, для этой реализации не будет рассчитана себестоимость.

    • Сорри….. Себестоимость считается по среднескользящей.

    • По поводу вида неравенства согласен, спасибо.

  8. Кононов Сергей 23.06.2011 в 19:45

    Задание выполнено.
    1.  Выполнять стоимостно учет я буду по новому алгоритму. Значит для этого мне нужно будет создать регистр накопления СтоимостьТоваров (Остатки), с измерениями Номенклатура и ресурсами Количество и Сумма. Так же я создам документ ЗакрытиеМесяца, аналогично тому, что в обучающих занятиях.  Регистр СтоимостьТоваров будет иметь регистраторами Приходную накладную(приход кол-ва и суммы), реализацию (для списания количества) и закрытие месяца(списание суммы).
    2. В обработке проведения я добавлю еще код, который добавляет записи в созданный регистр с видом Приход.
    3. В документе Реализация я создам такие же действия с новым регистром, как и с регистром остатки. А так же в подписке на события я добавлю код для контроля остатков еще и по новому регистру, так же как и по регистру ОстаткиТоваров.
    4. В документе Закрытие месяца в обработке проведения я вставлю такой же код как и в учебном занятии. (Приводить его не буду, он подробно там описан. И доработок практически нет)
    5. Создам Последовательность документов, РасходныеНакладные, на которую будет влиять документ Реализации и движения остатки товаров. Так как его считаю, будет достаточно для правильного восстановления последовательности.
    6. В обработке восстановления я использовал учебную часть код, где в примере списывались партии, без проведения самого документа, таким же образом  я и организовал восстановление последовательности.

  9. Создадим регистр СтоимостьТоваров, идентичный регистру ОстаткиТоваров, с дополнительным ресурсом Сумма. Регистраторы – ПоступлениеТоваровИУслуг, РеализацияТоваровИУслуг. В обработке проведения реализации добавим движения по этому регистру аналогично остаткам товаров. Ресурс Сумма будем заполнять по среднескользящей, для расчета добавим в запрос по табличной части остатки по регистру СтоимостьТоваров. Скорректируем обработчики подписок на события с учетом нового регистра. Для окончательного расчета стоимости добавим документа ЗакрытиеМесяца, где будем формировать корректирующие движения по списанию по альтернативному FIFO.
    Создадим последовательность стоимостного учета и обработку восстановления последовательности. Чтобы не перепроводить документы, в обработке формируем движения только по регистру СтоимостьТоваров. При возникновении ошибок документ потребуется исправить и перепровести вручную, что приведет в соответствие движения по прочим регистрам.

  10. Отчет о проделанной работе:
    1.
    1.1Новые объекты: РН СтоимостьТоваров, изм. Номенклатура, Партия, ресурсы Количество, Стоимость; Перечисление МетодыСписания; Константа МетодСписанияСебестоимости. В константе в модуле менеджера значения прописан запрет изменения при существовании хотя бы одной записи в РН СтоимостьТоваров.
    1.2 В модуле документа Поступление добавлены приходные  движения по РН СтоимостьТоваров
    1.3 В подписки ПередЗаписьюДокумента в допсвойства вставляется дополнительный параметр ДвижениеСтоимости
    1.4 В обработчике ПриЗаписиРегистраОстатки после контроля при наличии НЕ Отказ и параметра ДвижениеСтоимости формируется списание по выбранному в константе методу (если честно – сделал только фифо и лифо)
    2
    2.1 Создал Последовательность Товарная с видом перемещения границы – Не перемещать, док-тами Поступление, Реализация, Заказ и Движениями ОстаткиТоваров.  В новой подписке ОбработкаПроведения всех документов проверяю, если док входит в последовательность и результат НЕ Проверить(), тогда сдвигаю границу. Восстановление предполагается в сервисной обработке.
    2.2 Выборку документов организую с помощью нехитрого запроса
    <code>
    Запрос = Новый Запрос;
    Запрос.Текст =
    “ВЫБРАТЬ РАЗЛИЧНЫЕ
    | ОстаткиТоваров.Регистратор КАК Ссылка
    |ИЗ
    | РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
    |ГДЕ
    | ОстаткиТоваров.Регистратор.МоментВремени > &Граница
    |
    |УПОРЯДОЧИТЬ ПО
    | ОстаткиТоваров.Регистратор.МоментВремени”;
    Запрос.УстановитьПараметр(“Граница”, ПоследТовары.ПолучитьГраницу());
    </code>
    Не совсем понял что значит “восстановить учетные данные без перепроведения”. Как мне думается – это переформировать движения по регистрам. Если так, то единственным вариантом мне видется вынос формирование таблиц движений документов в экспортные методы. В обработке восстановления последовательности через набор записей по регистратору из выборки перегружать движения и вызвать Записать с предварителньо выставленным допсвойствами

    • >Как мне думается – это переформировать движения по регистрам
      Все верно.

  11. respublica 22.06.2011 в 23:56

    В д/з №12 указаны для изучения главы 3-7, а в этом 9-10. Глава 8 будет изучаться позже? (есть противоречие с планом в конфигурации, там указаны для этого задания 8 и 9 главы для изучения…)
    П.С. А решение д/з №11 будет выложено?