Продвинутый курс. Решение ДЗ №1

Представляем решение первого задания продвинутого курса по программированию.

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

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

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

комментариев 17 на “Продвинутый курс. Решение ДЗ №1”

  1. Yuri Golovko 29.09.2011 в 11:56

        Как я понимаю, свойство документа-объекта Проведен  и свойство документа-ссылки Проведен всегда “ходят парой”, так как ни то, ни другое невозможно изменить без записи документа, а при создании документа-объекта свойство Проведен считывается из базы. 
        Что же касается правильного решения ДЗ, то мне кажется верным при вызове процедуры логирования из процедур ПередЗаписью() передавать в нее в качестве параметра РежимЗаписи и делать проверку: РежимЗаписи = РежимЗаписиДокумента.Проведение  И  Ссылка.Проведен. 

  2. Yuri Golovko 29.09.2011 в 10:33

    Меняем цену в проведенном документе. Снимаем его с проведения. По условию задачи такое событие не должно записываться в журнал регистрации. Но в данном решении оно записывается! Ошибка в условии: Если НЕ Отказ И Объект.Проведен И Ссылка.Проведен Тогда…  Ведь перед записью документа свойство Проведен такое же, как и Ссылка.Проведен. При создании объекта ДокументОбъект оно считывается из базы, фактически из Ссылка.Проведен.

    • Да, действительно, есть проблема.
      Спасибо за внимательность, ошибку будем исправлять!

  3. Yuri Golovko 12.07.2011 в 19:14

    А где раньше рассказывалось о временных таблицах?

    • Эту тему затронем в первом блоке, небольшое забегание вперед.

  4. Майор 08.07.2011 в 13:48

    Переписал полностью своё неправильное решение ))).
    Дополнительно реализовал упомянутое удаление элементов справочника при отмене проведения документа-родителя. Событие отлавливаю с помощью подписки. Если документ не создавал элементов справочника – соответственно ничего не удаляется.
    Частичный код листинга общего модуля РаботаСЖурналомРегистраций:

    Процедура УдалениеПроведенияДокументовОбработкаУдаленияПроведения(Источник, Отказ) Экспорт
       
        Если НЕ Отказ Тогда
            ЭлементСправочникаСсылка = Справочники.ИзмененияЦен.НайтиПоРеквизиту("Документ", Источник.Ссылка);
            Если НЕ ЭлементСправочникаСсылка.Пустая() Тогда
                ЭлементСправочникаСсылка.ПолучитьОбъект().Удалить();  
            КонецЕсли;    
        КонецЕсли;    
       
    КонецПроцедуры

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

    PS: буду стараться к каждому решению ДЗ прикладывать ссылки на “помощь ближнему” с форума. Самостоятельно с Платформой не работаю – поэтому своих практических задач-примеров у меня нет. А решение некоторых вопросов на форуме “расширяет” кругозор и приближает к жизни. Считаю это полезным опытом и было бы неплохо завести такую традицию на продвинутом курсе.
    Итак:
    1) http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=581215#581215
    тут как бы и проблемы-то не было.
    2) http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=581217#581217
    тут как бы проблема осталась не решена, но в изначальном вопросе оказалось не все условия были отражены.

    • Хорошая традиция :)

      Только далеко не у всех участников продвинутого есть такая возможность – многие работают на проектах…

  5. Не понятен смысл условия
    <code>
    Если Проведен И Ссылка.Проведен
    </code>
    В ПередЗаписью() свойство Проведен еще не изменено Проведен = Ложь при проведении не проведенного, Проведен = Истина при проведении проведенного и при отмене проведения, т.е соотвествует Ссылка.Проведен.

    • Я сейчас контекста подсказать не могу, т.е. для чего это сделано.

      Но, очевидно, что условие “Если Проведен И Ссылка.Проведен” означает, что ловим перепроведение проведенного документа.
      Согласны?

      • Контекст: второе видео – создание процедуры ПередЗаписью().
        Согласен, но, по-моему,  достаточно
        Если Проведен или
        Если Ссылка.Проведен
        если не нужно выполнять при отмене проведения в условие нужно включить И РежимЗаписи <> РежимЗаписиДокумента.ОтменаПроведения

        • Irina.Tretyak 08.07.2011 в 04:41

          “Если Проведен” и “Если Ссылка.Проведен” будет недостаточно.
          Нас интересует изменение проведенного документа.
          Если документ был проведен, поменяли цены и сняли его с проведения, то это событие нас не интересует.
          Равно как если документ был записан, поменяли цену, провели.

          С Вашим вариантом, использующим РежимЗаписи соглашусь.

      • Майор 07.07.2011 в 23:03

        Правильно.
        По условию задания – контролируем только ранее проведённые документы – Ссылка.Проведен
        С другой стороны – цена могла быть изменена и документ мог быть снят с проведения, такое изменение нам не нужно – контроль за стандартным реквизитом Проведен.

  6. Посмотрел решение, подумал, а почему бы не сделать периодический регистр сведений, например “ИсторияИзмененияЦен”, подчинить его регистратору и писать в него движения в процедуре “ПриЗаписи” в режиме добавления записей. Таким образом сразу решается проблема удаления движений при отмене проведения документа.

    • Да, это интересное предложение, более простое в реализации.

  7. Андрей Кусанов 07.07.2011 в 09:25

    Познавательно, безусловно. Но много допущений, с моей точки. Именно по этому выбрал вариант с регистрацией интерактивного изменения цены. Считаю, что такой вариант решения тоже можно считать правильным. Вы согласны?

    • Да, безусловно, можно предложить несколько правильных вариантов решения этой задачи.