[Специалист профессионал 1С 8.2 8.3 ]

20:45
Задача 1.9
1) 

взаиморасчеты в разрезе проектов поэтому создает справочник назовем его соотв Взаиморасчеты добавим реквизит ДатаОплаты 
2) Документы Приходная Расходная ПриходДенег


Создаем регистр Взаиморасчеты вид регистра  Остатки

2 измерения Контрагент ,Проект
ресурс  Сумма

3)в документе ПриходДенег будет 3 реквизита Контрагент,Проект,Сумма

и в модуле объекта пишем след код:


Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

СуммаОплаты = Сумма;
Пока Выборка.Следующий() И СуммаОплаты>0 Цикл
// регистр Взаиморасчеты Приход
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Проект = Выборка.Проект;
Движение.Сумма = Мин(СуммаОплаты,Выборка.СуммаОстаток);
СуммаОплаты = СуммаОплаты - Движение.Сумма;
КонецЦикла;
Если СуммаОплаты Тогда 
// регистр Взаиморасчеты Приход
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Сумма = СуммаОплаты;
КонецЕсли;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры




4)Про приходную в задании не слова ,поэтому и не трогаем ее

5) Расходная  добавим в шапку реквизиты Контрагент Проект

в модуль объекта добавим код :


Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Отчеты СостояниеВзаиморасчетов:


код:

ВЫБРАТЬ
ВзаиморасчетыОстатки.Контрагент,
ВЫБОР
КОГДА ВзаиморасчетыОстатки.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)
ТОГДА "Аванс"
ИНАЧЕ ВзаиморасчетыОстатки.Проект
КОНЕЦ КАК Проект,
ВзаиморасчетыОстатки.СуммаОстаток
ИЗ
РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки




а)  ресурсы СуммаОстаток


Период Дата

б) Группировка Таблица  строки  Контрагент  колонки Проект

выбранные  поля  СуммаОстаток




Отчет Взаиморасчеты За период

код:

ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Контрагент,
ВЫБОР
КОГДА ВзаиморасчетыОстаткиИОбороты.Проект = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)
ТОГДА "Аванс"
ИНАЧЕ ВзаиморасчетыОстаткиИОбороты.Проект
КОНЕЦ КАК Проект,
ВзаиморасчетыОстаткиИОбороты.СуммаНачальныйОстаток,
ВзаиморасчетыОстаткиИОбороты.СуммаПриход,
ВзаиморасчетыОстаткиИОбороты.СуммаРасход,
ВзаиморасчетыОстаткиИОбороты.СуммаКонечныйОстаток
ИЗ
РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты КАК ВзаиморасчетыОстаткиИОбороты


2)Параметры НачалоПериода ,КонецПериода

Группировка Контрагент ,Детальные Записи

Выбр Поля  Контрагент Проект СуммаНачальнОстаток ,приход Расход,СуммаКонечОстаток


Задача Решена





Просмотров: 3522 | Добавил: moshefoo | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *: