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

14:53
Задача 1.13
Стелажи  

закупка Приход накладной ,продажа Расходной накладной

Стелаж это набор комплектующих   к примеру 5 болтов или 10 коробок 30 стоек

надо обеспечить уникальность деталей,одна и та же деталь не может принадлежать разным стеллажам.

учет остатков в разрезе складов .

в шапках приходной и расходной  добавим поле склад.

Списание при продаже  может быть как всех стелажей так и отдельных деталей

2 отчета Наличие стелажей на дату наличие деталей на дату


Приступим

Добавляем поле Склад в регистр остатки и в шапку документов приходная расходная.



Изменяем справочник номенклатура  добавим в него поле стелаж- флажокОбъект.Стелаж (  да нет)

добавим таблицу Комплектующие  две колонки Комплектующие Количество

создадим форму элемента справочника . добавим поле родитель  в форму

В форму добавим код:



&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОтборНаСервере();
КонецПроцедуры


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

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

Комплектующие.Загрузить(Запрос.Выполнить().Выгрузить());
 
КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
ЗаписьНаСервере();
КонецПроцедуры

&НаСервере 
Процедура ЗаписьНаСервере()
//мплектующие
 
КонецПроцедуры


Иерархический иерархия групп и элементов

создадим форму элемента  .добавим реквизит Комплектующие Тип РегистрСведенийНаборЗаписей.Комплекты


Создадим  непериодический регистр сведений Комплекты:
Измерение Комплектующие ,Ресурсы Стеллаж ,Количество


Документы:


Приходная в модуле объекта:

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

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


Расходная:

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

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

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

Результат = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = Результат.Выбрать();

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

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


2 отчета наличие стеллажей наличие деталей 

1) Запрос к двум регистрам Комплекты и ОстаткиНоменклатурыОстатки

функция с выражением в выбранных полях ОстаткиНоменклатурыОстатки.КоличествоОстаток / Комплекты.Количество

связь по левому соединению  по условию   ОстаткиНоменклатурыОстатки.Номенклатура= Комплекты.Комплектуюшее


сам запрос:

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

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

в объед псевдонимах функцию переименовываем в количество

Группировки Склад ,Детальные записи

выбранные поля : Склад, Стелаж ,Количество



Отчет наличие деталей :

В запросе выбираем регистр сведений Комплекты и Регистр  накопления остатки

связь по левому условие связи ОстаткиНоменклатурыОстатки.Номенклатура=Комплекты.Комплектуюшее


Сам запрос отчета: 

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


Параметры : период дата 
выбранные поля склад .Стелаж.номенклатура .КоличествоОстаток


Группировки:  Склад. Стелаж.Детальные записи

Другие настройки располож полей группировок отдельно и только в итогах  галочка стоит
Просмотров: 3611 | Добавил: moshefoo | Рейтинг: 5.0/1
Всего комментариев: 2
2 bearyman  
Для первого отчета так красевее:

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СНулем.Склад,
СНулем.Стелаж,
СНулем.Количество
ИЗ
СНулем КАК СНулем
ГДЕ
СНулем.Количество <> 0

1 bearyman  
А почему мы приходуем целыми стеллажами?

Имя *:
Email *:
Код *: