понедельник, 16 февраля 2015 г.

1с специалист задача 1.18


Решение:

  • Для хранения сведений о условиях кредита заведем регистр сведений "ПараметрыКредита",Измерение -"Контрагент", ресурсы "Дней" и "сумма кредита".
  • Добавим новый регистр накопления "Взаиморасчеты" (со знаком "+" будут отражатся отгрузки, со знаком "-" оплаты).
  • Измерения: "Контрагент", "Реализация", ресурс "Сумма".
  • Добавим новый документ "Приход денег" с ТЧ "СуммыПрихода", реквизиты ТЧ "Контрагент" и "Сумма оплаты". Этот документ как и "Расходная накладная" будет регистратором регистра "Взаиморасчеты".
Потребуется  прописать обработку проведения 3-х документов.

1) Приходная накладная. 
Тут все стандартно, движения в регистр "Остатки номенклатуры"



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

2) Приход денег.
Здесь необходимо "закрыть" накладные если они есть, всю оставшуюся сумму "закинуть" на предоплату. (движением с пустым измерением "реализация").


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

3) Расходная накладная.
При проведении сначала проверим возможность проведения с учетом долга контрагента и его кредита, затем проверим хватает ли вообще списываемого товара.



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

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

И на десерт "Отчет".
Текст запроса:

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

Скачать задачу 1.18 1с специалист


Все БЕСПЛАТНЫЕ курсы по работе в 1С:УТ 11.1


Вы можете скачать бесплатные видеокурсы по работе в 1С:УТ 11.1 перейдя по ссылке 

2 комментария:

  1. УПОРЯДОЧИТЬ ПО
    | ВзаиморасчетыОстатки.Реализация.Дата (МоментВремени)

    должно быть ни через дату, а через момент времени

    ОтветитьУдалить
  2. Как будто ссылка на расчетную задачу

    ОтветитьУдалить