Продвинутый курс. Решение ДЗ №1
Представляем решение первого задания продвинутого курса по программированию.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте — залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись — напишите нам на e-mail поддержки.
Как я понимаю, свойство документа-объекта Проведен и свойство документа-ссылки Проведен всегда “ходят парой”, так как ни то, ни другое невозможно изменить без записи документа, а при создании документа-объекта свойство Проведен считывается из базы.
Что же касается правильного решения ДЗ, то мне кажется верным при вызове процедуры логирования из процедур ПередЗаписью() передавать в нее в качестве параметра РежимЗаписи и делать проверку: РежимЗаписи = РежимЗаписиДокумента.Проведение И Ссылка.Проведен.
Так и есть.
Меняем цену в проведенном документе. Снимаем его с проведения. По условию задачи такое событие не должно записываться в журнал регистрации. Но в данном решении оно записывается! Ошибка в условии: Если НЕ Отказ И Объект.Проведен И Ссылка.Проведен Тогда… Ведь перед записью документа свойство Проведен такое же, как и Ссылка.Проведен. При создании объекта ДокументОбъект оно считывается из базы, фактически из Ссылка.Проведен.
Да, действительно, есть проблема.
Спасибо за внимательность, ошибку будем исправлять!
А где раньше рассказывалось о временных таблицах?
Эту тему затронем в первом блоке, небольшое забегание вперед.
Переписал полностью своё неправильное решение ))).
Дополнительно реализовал упомянутое удаление элементов справочника при отмене проведения документа-родителя. Событие отлавливаю с помощью подписки. Если документ не создавал элементов справочника – соответственно ничего не удаляется.
Частичный код листинга общего модуля РаботаСЖурналомРегистраций:
Если НЕ Отказ Тогда
ЭлементСправочникаСсылка = Справочники.ИзмененияЦен.НайтиПоРеквизиту("Документ", Источник.Ссылка);
Если НЕ ЭлементСправочникаСсылка.Пустая() Тогда
ЭлементСправочникаСсылка.ПолучитьОбъект().Удалить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При пометке документа на удаление, происходит автоматическое снятие с проведения и соответственно обращение к данной процедуре. На случай прямого удаления проведённого документа из базы создал дополнительно подписку на событие перед удалением и указал в обработчике вышеприведённую процедуру. Тестирование отработало корректно.
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
тут как бы проблема осталась не решена, но в изначальном вопросе оказалось не все условия были отражены.
Хорошая традиция :)
Только далеко не у всех участников продвинутого есть такая возможность – многие работают на проектах…
Не понятен смысл условия
<code>
Если Проведен И Ссылка.Проведен
</code>
В ПередЗаписью() свойство Проведен еще не изменено Проведен = Ложь при проведении не проведенного, Проведен = Истина при проведении проведенного и при отмене проведения, т.е соотвествует Ссылка.Проведен.
Я сейчас контекста подсказать не могу, т.е. для чего это сделано.
Но, очевидно, что условие “Если Проведен И Ссылка.Проведен” означает, что ловим перепроведение проведенного документа.
Согласны?
Контекст: второе видео – создание процедуры ПередЗаписью().
Согласен, но, по-моему, достаточно
Если Проведен или
Если Ссылка.Проведен
если не нужно выполнять при отмене проведения в условие нужно включить И РежимЗаписи <> РежимЗаписиДокумента.ОтменаПроведения
“Если Проведен” и “Если Ссылка.Проведен” будет недостаточно.
Нас интересует изменение проведенного документа.
Если документ был проведен, поменяли цены и сняли его с проведения, то это событие нас не интересует.
Равно как если документ был записан, поменяли цену, провели.
С Вашим вариантом, использующим РежимЗаписи соглашусь.
Правильно.
По условию задания – контролируем только ранее проведённые документы – Ссылка.Проведен
С другой стороны – цена могла быть изменена и документ мог быть снят с проведения, такое изменение нам не нужно – контроль за стандартным реквизитом Проведен.
Посмотрел решение, подумал, а почему бы не сделать периодический регистр сведений, например “ИсторияИзмененияЦен”, подчинить его регистратору и писать в него движения в процедуре “ПриЗаписи” в режиме добавления записей. Таким образом сразу решается проблема удаления движений при отмене проведения документа.
Да, это интересное предложение, более простое в реализации.
Познавательно, безусловно. Но много допущений, с моей точки. Именно по этому выбрал вариант с регистрацией интерактивного изменения цены. Считаю, что такой вариант решения тоже можно считать правильным. Вы согласны?
Да, безусловно, можно предложить несколько правильных вариантов решения этой задачи.