пятница, 5 июня 2015 г.

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

Решение:

1) Создаем регистры следующей структуры:

Движения документов по регистарам
Документ "Заказ":
"Заказы покупателей" +

Документ "Приходная накладная":
"Заказы покупателей" -
"Остатки номенклатуры" +

Документ "Расходная накладная":
"Остатки номенклатуры" -

Хорошо бы сумму не добавлять, но фраза в условии "Себестоимость оборудования рассчитывается как средняя в рамках закупок под заказ покупателя", говорит о том что она нужна.

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

3) Документ "Приходная накладная".
Сделаем ввод только на основании заказа. Так как в условии говорится "Оборудование для одного заказа покупателя может поставляться несколькими документами", то предусмотрим этот момент.




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

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

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

КонецЦикла;

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

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

Запрос.УстановитьПараметр("Заказ", Заказ);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда 
Отказ = Истина;
Выборка = Результат.Выбрать();

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

4) Документ "Расходная накладная".



Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения)= Тип("ДокументСсылка.ЗаказПокупателя") Тогда 
Заказ = ДанныеЗаполнения;

НачатьТранзакцию();

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


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

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

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

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

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


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


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


1 комментарий:

  1. Приветствую, к сожалению ссылка не работает, где можно скачать решение? либо можете подсказать с созданием документов, очень нужно

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