Тренинг по подготовке к аттестации.
Второй поток – Задача 10. “Проекты”
Приветствую.
Итоги голосования по задаче первого раздела сборника подтвердили статистику и совпали с итогами первого потока. Была выбрана задача со сценарием “Пени”.
Мы могли бы просто выложить текст задачи “Пени” и видеорешение из первого потока, но решили сделать немного по другому…
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись — напишите нам на e-mail поддержки.
в отчете Ведомость по взаиморасчетам за период, там где пустые строчки – имеется ввиду группировка по контрагентам?
Да, таблица немного поползла при форматировании.
А зачем здесь создавать последовательности? Ведь не сказано, что документы могут вводить задним числом, и что надо это учесть(
Еще вопросик возник) Сказано, что если в приходе денег указан проект, то надо проверить сумму отгрузки и т.д. Если нет задолженности по данному проекту, то о надо проводить документ всё равно и всю сумму зачислять как Аванс, или делать отказ от проведения?
Если долга нет, то все зачислять как аванс.
Это принципиально?
Ну мало ли)))
Последовательности хорошо создавать во всех задачах.
Какой-то интерфейс надо накручивать для работы с последовательностями? Или считается, что пользователь способен добраться до встроенный формы через все функции – стандартные – проведение документов – восстановление последовательностей?
Интерфейс не нужен
Павел, а блокировки в этой задаче нужны или нет? С одной стороны, при одновременном вводе документов, было бы неплохо гарантировать правильное состояние взаиморасчетов. С другой, если есть последовательность, и предполагается ее использование, то состояние взаиморасчетов будет выправляться при ее восстановлении. Как смотрят на экзамене на пренебрежение блокировками в подобных задачах?
Блокировки нужны!
“Аванс” можно сделать пустой ссылкой. Это как в задачах с ЛИФО, ФИФО и ПоСредней (если ПоСредней, то партию можно пустой ссылкой делать). Тогда при сортировке по ссылке пустая всегда будет внизу, либо вверху (в зависимости от типа сортировки). Но вот как регистр реагирует на пустую ссылку (в плане расчета итогов)?
Регистр никак не реагирует на пустую ссылку, для системы пустая ссылка или не пустая – одно и то же.
можете мне помочь, я неуверен что мое решение этой задачи правильное
проведени документа «Приход денег»
//=======================
Движения.Проекты.Записывать = Истина;
Движения.Проекты.Очистить();
Движения.Проекты.Записать();
Движения.Авансы.Записывать = Истина;
Движения.Авансы.Очистить();
Движения.Авансы.Записать();
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(“РегистрНакопления.Проекты”);
ЭлементБлокировки.УстановитьЗначение(“Контрагенты”, Контрагент);
Если ЗначениеЗаполнено(Проект) Тогда
ЭлементБлокировки.УстановитьЗначение(“Проекты”, Проект);
КонецЕсли;
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый Запрос(“ВЫБРАТЬ
| ПроектыОстатки.Контрагенты,
| ПроектыОстатки.Проекты,
| ПроектыОстатки.СуммаОстаток
|ИЗ
| РегистрНакопления.Проекты.Остатки(
| &МоментВремени,
| Контрагенты = &Контрагенты
| И Проекты = &Проекты) КАК ПроектыОстатки
|ГДЕ
| ПроектыОстатки.СуммаОстаток < 0
|
|УПОРЯДОЧИТЬ ПО
| ПроектыОстатки.Проекты.ДатаОплаты
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АвансыОстатки.Контрагенты,
| АвансыОстатки.СуммаОстаток
|ИЗ
| РегистрНакопления.Авансы.Остатки(&МоментВремени, Контрагенты = &Контрагенты) КАК АвансыОстатки
|ГДЕ
| АвансыОстатки.СуммаОстаток > 0”);
Если Не ЗначениеЗаполнено(Проект) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, “И Проекты = &Проекты”, “”);
Иначе
Запрос.УстановитьПараметр(“Проекты”, Проект);
КонецЕсли;
Запрос.УстановитьПараметр(“Контрагенты”, Контрагент);
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос.УстановитьПараметр(“МоментВремени”, МоментВремени());
Иначе
Запрос.УстановитьПараметр(“МоментВремени”, ‘00010101’);
КонецЕсли;
ПакетЗапросов = Запрос.ВыполнитьПакет();
Проекты = ПакетЗапросов[0];
СуммаДляСписания = Сумма;
ВыборкаПроекты = Проекты.Выбрать();
Пока ВыборкаПроекты.Следующий() и СуммаДляСписания <> 0 Цикл
СуммаДляРегистра = Мин(-ВыборкаПроекты.СуммаОстаток, СуммаДляСписания);
// регистр Проекты Приход
Движение = Движения.Проекты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагенты = Контрагент;
Движение.Проекты = ВыборкаПроекты.Проекты;
Движение.Сумма = СуммаДляРегистра;
СуммаДляСписания = СуммаДляСписания – СуммаДляРегистра;
КонецЦикла;
Если СуммаДляСписания > 0 Тогда
// регистр Авансы Приход
Движение = Движения.Авансы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагенты = Контрагент;
Движение.Сумма = СуммаДляСписания;
КонецЕсли;
//=============
Проведение документа «Расходная накладная»
Движения.Проекты.Записывать = Истина;
Движения.Авансы.Записывать = Истина;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить(“РегистрНакопления.Авансы”);
ЭлементБлокировки.УстановитьЗначение(“Контрагенты”, Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый Запрос(“ВЫБРАТЬ
| АвансыОстатки.Контрагенты,
| АвансыОстатки.СуммаОстаток
|ИЗ
| РегистрНакопления.Авансы.Остатки(&МоментВремени, Контрагенты = &Контрагенты) КАК АвансыОстатки
|ГДЕ
| АвансыОстатки.СуммаОстаток > 0”);
Запрос.УстановитьПараметр(“Контрагенты”, Контрагент);
Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
Запрос.УстановитьПараметр(“МоментВремени”, МоментВремени());
Иначе
Запрос.УстановитьПараметр(“МоментВремени”, ‘00010101’);
КонецЕсли;
Результат = Запрос.Выполнить();
СуммаДляСписания = Сумма;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() и СуммаДляСписания <> 0 Цикл
СуммаДляРегистра = Мин(Выборка.СуммаОстаток, СуммаДляСписания);
// регистр Авансы Приход
Движение = Движения.Авансы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагенты = Контрагент;
Движение.Сумма = СуммаДляРегистра;
СуммаДляСписания = СуммаДляСписания – СуммаДляРегистра;
КонецЦикла;
Если СуммаДляСписания > 0 Тогда
Если ЗначениеЗаполнено(Проект) Тогда
// регистр Проекты Приход
Движение = Движения.Проекты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагенты = Контрагент;
Движение.Проекты = Проект;
Движение.Сумма = СуммаДляСписания;
Иначе
Движение = Движения.Авансы.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагенты = Контрагент;
Движение.Сумма = СуммаДляСписания;
КонецЕсли;
КонецЕсли;
Сформулируйте вопрос, я с удовольствием отвечу.
В решении задействован отдельный регистр для авансов. Насколько это оправдано? На что больше похож аванс – на отдельный показатель, которому полагается свой регистр, или это разрез суммы взаиморасчетов? И почему?
Показатель в задаче один – сумма взаиморасчетов. А разрезов у него два – контрагент, проект.
Аванс не является отдельным показателем, а приравнивается к отдельному проекту, что наглядно видно из отчетов.
Есть несколько вопросов.
Для решения задачи создаю два регистра остатков в первом измерение контрагент и проекты, ресурс сумма. Второй регистр измерение Контрагент и ресурс сумма (используется для учета авансов).
Вопрос правильно ли это ???????
Если предыдущий способ решение приемлем, как во втором отчете на СКД сделать чтобы ресурс второго регистра выводился под проектами (соединением двух источников у меня не получилось)
Объясните, зачем авансы записывать в отдельный регистр?
А как тогда обеспечить вывод регистра в ноль, если использовать один регистр с измерениями контрагент, проект и аванс вывод в ноль не получиться (если я правильно понял разбор первой учебной задачи по оперативному учету)
Для себя начертите схему, в центре показатели (сколько их и какие?) по краям регистраторы изменений показателей (документы) и стрелками укажите связь регистраторов с показателями. Если есть показатели остатков с одним вхождением регистратора (+ или -) то показатели спроектированы неверно.
“Аванс” – предопределенный элемент справочника “Проекты” с наименьшим кодом. При сортировке проектов по коду в порядке убывания “Аванс” будет последним. Если не надо показывать пользователю проект “Аванс” в форме выбора, это решается настройкой отбора списка.
Код может изменить пользователь.
Сам будет виноват. В типовых многое рассчитано на то, что пользователь не будет хулиганить. Кроме того, завтра может понадобиться переместить аванс с первого места на последнее.
Отличная аргументация для апелляционного письма!
Т.е. на экзамене за такое будут сняты баллы?
Я думаю, что на это будут обращать внимание в последнюю очередь.
Тогда можно добавить проверочку перед записью:
Процедура ПередЗаписью(Отказ)
Если Предопределенный и Не Число(Код) = 0 Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
За что Вы так не любите пользователей? Все бы Вам запрещать! :)
Сортировать предлагаю сначала по стандартному реквизиту справочника “Предопределенный”, а уже потом по другим реквизитам.
+1
А если потом понадобятся другие предопределенные элементы?
Скорее всего, они должны будут отображаться рядом. Если нет, тогда нужно вводить дополнительное поле для сортировки.