вторник, 9 июня 2015 г.

1c специалист решение задачи 1.35

За основу берем предыдущую задачу.
Обнаружено 2 отличия:

1) "Необходимо производить контроль, чтобы пользователь не мог несколько раз указать один и тот же проект"
Выбрал способ проверки при записи документа


Процедура ПриЗаписи(Отказ)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходДенегТЧ.Проект КАК Проект,
| СУММА(1) КАК Кол
|ИЗ
| Документ.ПриходДенег.ТЧ КАК ПриходДенегТЧ
|ГДЕ
| ПриходДенегТЧ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПриходДенегТЧ.Проект
|
|ИМЕЮЩИЕ
| СУММА(1) > 1";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Отказ = Истина;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проект " + Выборка.Проект + "выбран "+ Выборка.Кол + "раза.";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры


2) В табличной части документа "Приход денег" вместе с проектами указываются и суммы.

Понял так что в первую очередь нужно списать суммы из ТЧ (Если конечно суммы в ТЧ не больше суммы долга), если сумма распределилась не полностью, то необходимо закрывать проекты не из ТЧ с упорядочиванием по сумме долга. Есть один момент :
допустим у контрагента есть задолженность по проектам Проект1-1200 руб, Проект2 -1000р, Проект 3-100 руб.
Если В ТЧ выбраны 2 проекта:
Проект1 -1100 руб
и Проект2 -1150 руб,  то должны быть следующие движения:

Проект1 -1100
проект2 -1000
осталось списать 150 руб.
Проект1- 100руб
Проект3 -50руб.

Если бы сумма в ТЧ по проекту2 была не 1150, а 1250 то  сумма в движении по проекту 3 была бы 100р,  и 50руб пошли бы на аванс.

Подготовить сразу в запросе все необходимые данные наверное можно, только для меня сложно, тем более на экзамене в условиях цугцванга, поэтому целесообразно выкрутится обработкой результата запроса (Сам запрос тот же что и в предыдущей задаче, только добавляется сумма из ТЧ).


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.Взаиморасчеты.Записывать = Истина;
Движения.Взаиморасчеты.Записать();
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировки = БлокировкаДанных.Добавить("РегистрНакопления.Взаиморасчеты");
ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = ТЧ;;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Проект", "Проект");
БлокировкаДанных.Заблокировать();
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ПриходДенегТЧ.Проект,
| СУММА(ПриходДенегТЧ.Сумма) КАК Сумма
|ПОМЕСТИТЬ ДокТЧ
|ИЗ
| Документ.ПриходДенег.ТЧ КАК ПриходДенегТЧ
|ГДЕ
| ПриходДенегТЧ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПриходДенегТЧ.Проект
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВзаиморасчетыОстатки.Контрагент КАК Контрагент,
| ДокТЧ.Проект,
| ЕСТЬNULL(ВзаиморасчетыОстатки.суммаОстаток, 0) КАК Долг,
| 1 КАК Приоритет,
| ДокТЧ.Сумма КАК СуммаДок
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.Остатки(
| &ТочкаИтогов,
| Контрагент = &Контрагент
| И Проект В
| (ВЫБРАТЬ
| ДокТЧ.Проект
| ИЗ
| ДокТЧ)) КАК ВзаиморасчетыОстатки
| ПО ДокТЧ.Проект = ВзаиморасчетыОстатки.Проект
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ВзаиморасчетыОстатки.Контрагент,
| ВзаиморасчетыОстатки.Проект,
| ЕСТЬNULL(ВзаиморасчетыОстатки.суммаОстаток, 0),
| 2,
| 0
|ИЗ
| РегистрНакопления.Взаиморасчеты.Остатки(
| &ТочкаИтогов,
| Контрагент = &Контрагент
| И НЕ Проект В
| (ВЫБРАТЬ
| ДокТЧ.Проект
| ИЗ
| ДокТЧ)) КАК ВзаиморасчетыОстатки
|
|УПОРЯДОЧИТЬ ПО
| Приоритет,
| Долг УБЫВ";
Запрос.УстановитьПараметр("Контрагент",Контрагент);
Запрос.УстановитьПараметр("Ссылка",Ссылка);
Запрос.УстановитьПараметр("ТочкаИтогов", ?(РежимПроведения = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая)));
Выборка = Запрос.Выполнить().Выбрать();
ОсталосьРаспределить = СуммаОплаты;
ТЗДосписать  = Новый ТаблицаЗначений;
ТЗДосписать.Колонки.Добавить("Проект");
ТЗДосписать.Колонки.Добавить("Сумма");
Отбор = Новый Структура;
Отбор.Вставить("Приоритет",1);
Пока Выборка.НайтиСледующий(Отбор) и ОсталосьРаспределить>0 Цикл
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
Движение.Период     = Дата;
Движение.Контрагент = Контрагент;
Движение.Проект     = Выборка.Проект;
КСписанию           = Мин(Выборка.Долг, Выборка.СуммаДок,ОсталосьРаспределить);
Движение.сумма      = КСписанию;
ОсталосьРаспределить = ОсталосьРаспределить - КСписанию;
// Если Сумма в тч < суммы долга то возможно остаток нужно будет досписать
Если Выборка.СуммаДок < Выборка.Долг Тогда 
СтрокаТЗ = ТЗДосписать.Добавить();
СтрокаТЗ.Проект = Выборка.Проект;
СтрокаТЗ.Сумма    = Выборка.Долг - Выборка.СуммаДок;
КонецЕсли;
КонецЦикла;
// досписываем из тз
Если ОсталосьРаспределить>0 и ТЗДосписать.Количество()>0 Тогда 
Для Каждого ТекСтрока Из ТЗДосписать Цикл
Если ОсталосьРаспределить>0 Тогда
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
Движение.Период     = Дата;
Движение.Контрагент = Контрагент;
Движение.Проект     = ТекСтрока.Проект;
КСписанию           = Мин(ТекСтрока.Сумма,ОсталосьРаспределить);
Движение.сумма      = КСписанию;
ОсталосьРаспределить = ОсталосьРаспределить - КСписанию;
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Выборка.Сбросить();
Отбор = Новый Структура;
Отбор.Вставить("Приоритет",2);
Пока Выборка.НайтиСледующий(Отбор) и ОсталосьРаспределить>0 Цикл
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
Движение.Период     = Дата;
Движение.Контрагент = Контрагент;
Движение.Проект     = Выборка.Проект;
КСписанию           = Мин(Выборка.Долг, ОсталосьРаспределить);
Движение.сумма      = КСписанию;
ОсталосьРаспределить = ОсталосьРаспределить - КСписанию;
КонецЦикла;
// аванс
Если ОсталосьРаспределить >0 Тогда 
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
Движение.Период     = Дата;
Движение.Контрагент = Контрагент;
Движение.сумма      = ОсталосьРаспределить;
КонецЕсли;
КонецПроцедуры




Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаОплаты = ТЧ.Итог("Сумма");
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПриходДенегТЧ.Проект КАК Проект,
| СУММА(1) КАК Кол
|ИЗ
| Документ.ПриходДенег.ТЧ КАК ПриходДенегТЧ
|ГДЕ
| ПриходДенегТЧ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПриходДенегТЧ.Проект
|
|ИМЕЮЩИЕ
| СУММА(1) > 1";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Отказ = Истина;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Проект " + Выборка.Проект + "выбран "+ Выборка.Кол + "раза.";
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
 






Комментариев нет:

Отправить комментарий