Честно говоря немного вздохнул с облегчением увидев что есть и простые задачи в этом разделе.
выкладываю свое решение. Кому не трудно прокомментируйте пжл
В целом норм по логике
В остальном:
1. Для чего этот код в проведении "Приход денег" ?
Если НЕ ЭтоНовый() Тогда
Движения.Взаиморасчеты.Записать();
КонецЕсли;
Эта конструкция явно очищает движения документа при перепроведении. И поэтому строка ниже (с границей) не будет иметь смысла.
Но и по ней ест замечание:
При неоперативном проведении мы же не должны прочитать те движения, которые сделал сам документ, поэтому надо исключать:
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Граница = Неопределено;
Иначе
Граница = Новый Граница(МоментВремени(),ВидГраницы.
Исключая);
КонецЕсли;
На мой взгляд, при неоперативном перепроведении, очищая движения вы тем самым искажаете остатки ведь в этот момент их кто-то может считать, а у вас отмена транзакции произошла. В таком случае бы надо сперва установить блокировку, но допустим, вы решили поменять проект, или еще хуже контрагента, тогда тоже не вариант. Правильней будет воспользоваться методом подробно описанном здесь
http://1c.chistov.pro/2013/07/blog-post_25.html2. Судя по задаче если в приходе Проект не указан, то все идет в авансы. Условий на заполненность этого реквизита нет.
По этому же пункту я , думаю, что необходимо устанавливать блокировку еще и по проекту (если заполнен), ведь от чтения нам надо заблокировать только в разрезе проектов.
3. В отчете по состоянию надо добавить порядок, так чтоб авансы в конце отчета были.
Плюс можно, я думаю, обойтись без предопределенного элемента проектов "Авансы", опираясь на знак по регистру остатков.