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

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

Условие задачи из сборника:


Компания занимается оптовой торговлей складских стеллажей и
комплектующих. Закупка комплектующих отражается документом «Приходная
накладная», продажа - «Расходная накладная».
Каждый стеллаж представляет собой некоторый фиксированный наб
комплектующих (например, 4 стойки, 5 полок и 20 болтов). Необходимо
обеспечить уникальность деталей, т.е. одна и та же деталь не может относить с
разным стеллажам.
Учет остатков ведется в разрезе складов. В документах «Приходная
накладная» и «Расходная накладная» склад только один (склад – реквизит шапки
Возможна продажа как отдельных комплектующих, так и цел
стеллажей, причем и стеллажи и их комплектующие указываются в одной
табличной части. В случае продажи стеллажа осуществляется списание со склада
соответствующего количества комплектующих. В том случае, если каких-ли
комплектующих на складе не хватает, документ проводится не должен. У
себестоимости деталей вести не требуется.
Создать отчет, который в разрезе складов будет показывать количество
целых стеллажей, и отчет, который будет показывать количество деталей
разрезе стеллажей, к которым они относятся, и складов. Например, если стеллаж
состоит из 4 стоек, 5 полок и 20 болтов, а на складе есть 8 стоек 15 полок и
болтов, то целый стеллаж только один.











Решение задачи :

 Мне видится логичным следующий способ решения.
1) Данные о стеллажах и их комплектуюших будем хранить в новом регистре сведений "Комплекты". Измерения "Стеллаж", комплектующая (оба с типом номенклатура) и ресурс количество.
Поскольку на экзамене времени лишнего нету, то ввод информации будет происходить сразу в регистр, а в карточке номенклатуры будем только выводить информацию из регистра с отбором. Ввод информации прямо из карточке реализовывать не будем.
Различать номенклатуру стеллаж это или нет будем по булевому признаку "Это стеллаж".
Создадим форму записи регистра и добавим обработчик, который будет проверять чтобы в поле "комплектуюшая" нельзя было внести стеллаж.


&НаКлиенте
Процедура КомплектующаяОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Если ЭтоСтеллаж(ВыбранноеЗначение)  Тогда
ВыбранноеЗначение="";
КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция  ЭтоСтеллаж(ВыбранноеЗначение)
Если ВыбранноеЗначение.ЭтоСтеллаж Тогда
Сообщить("Стелаж не может быть выбран");
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции.

Процедуры формы справочника номенклатуры:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗаполнитьТЧ();
КонецПроцедуры

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

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

2) Переходим к приходной накладной. Так как по условию учет себестоимости реализовывать не надо, то удалим реквизиты "цена" и "сумма". Тоже самое и в док-те "Расходная".

При проведении необходимо стеллажи "перевести" в комплектующие.

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

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

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

3) Переходим к накладной. Это редкий случай когда обработка проведения не многим сложнее обработки проведения приходной.


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

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

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

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

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

Результат = Запрос.Выполнить();
МассивНоменклатуры = Новый("Массив");


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

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

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

4. Отчеты.
"Наличие стеллажей". 

В обоих отчетах потребуется левое соединение регистра сведений и регистра остатков. Главная задача: теперь обратно нужно "перевести " детали в стеллажи.
Сделаем это с помощью деления

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

СГРУППИРОВАТЬ ПО
Комплекты.Стеллаж,
ОстаткиНоменклатурыОстатки.Склад

Со вторым отчетам еще проще, делений не требуется, только необходимо еще добавить измерение "деталь".

Как "бонус" для тех кто дочитал до конца ссылка)






6 комментариев:

  1. Помогите создать отчет ко 2 заданию про детали.

    ОтветитьУдалить
  2. Отчет работать не будет, если комплектующей нет на остатках

    ОтветитьУдалить
  3. Задача решена в корне не верно!

    ОтветитьУдалить
    Ответы
    1. Кроме уникальности деталей для стеллажей - в чем неправильность?

      Удалить
  4. Поздравляю! Экзамен не сдан! "Возможна продажа как отдельных комплектующих, так и цел стеллажей, причем и стеллажи и их комплектующие указываются в одной
    табличной части." попробуй продать 1 стеллаж, когда склад забит комплектующими.

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