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

1с специалист. Решение задачи 1.41

Задачка довольно простая.
Исходя из требуемой формы отчета в решении используются 3 регистра:

 В Приходе все движения со  знаком +,
В Расходе со знаком -.

Имея такую структуру регистра продажи элементарно можно построить требуемые отчет.




















Остается только "технично" описать процедуру проведения расходной накладной.



Процедура ОбработкаПроведения(Отказ, РежимПроведения)


Движения.ОстаткиНоменклатуры.Записывать = Истина;

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = РезультатЗапроса;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать(); 


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

Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
Движения.ОстаткиНоменклатуры.Записать();

// Проверка не ушли ли в минус

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

Запрос.УстановитьПараметр("ТочкаИтогов",Новый Граница(МоментВремени(), ВидГраницы.Включая));

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

КонецЕсли;
Если Отказ Тогда
Возврат;
КонецЕсли;

Движения.Продажи.Записывать = Истина;
Движения.СтоимостиНоменклатуры.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.СтоимостиНоменклатуры");
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
ЭлементБлокировки.ИсточникДанных = РезультатЗапроса;
ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура", "Номенклатура");
Блокировка.Заблокировать(); 

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


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

Запрос.УстановитьПараметр("ТочкаИтогов",Новый Граница(МоментВремени(), ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ДатаКурса", Дата);
Запрос.УстановитьПараметр("Валюта", Валюта);


ВыборкаНом = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"Номенклатура");
Пока ВыборкаНом.Следующий() Цикл
ОсталосьСписать = ВыборкаНом.КолДок;
Выборка = ВыборкаНом.Выбрать();
Пока Выборка.Следующий() и ОсталосьСписать >0 Цикл
Движение = Движения.СтоимостиНоменклатуры.ДобавитьРасход();
Списываем  = Мин( Выборка.КолРег, Выборка.КолДок);
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаНом.Номенклатура;
Движение.Валюта = Выборка.Валюта;
Движение.Количество = Списываем;
Движение.Стоимость = (Выборка.СумРег/ Выборка.КолРег) * Списываем;

Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаНом.Номенклатура;
Движение.Валюта = Валюта;
Движение.Количество = Списываем;
СебестоимостьРуб    =Списываем* (Выборка.СумРег/ Выборка.КолРег) *  Выборка.КурсВалютыРег;
Движение.СебестоимостьРуб = СебестоимостьРуб;
Движение.СебестоимостьВал = СебестоимостьРуб/ Выборка.КурсВалютыДок;
Движение.ПродажаВал = Выборка.СумДок;
Движение.ПродажаРуб = Выборка.СумДок* Выборка.КурсВалютыДок;

ОсталосьСписать = ОсталосьСписать - Списываем;
КонецЦикла;
КонецЦикла;

КонецПроцедуры



Скачать решение задачи 1.41

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

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