Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 фев 2026, 02:47

Базовая АБП

Автор Rehala, Вчера в 23:53

0 Пользователей и 1 гость просматривают эту тему.

Rehala

Обработка ПомощникФормированияВыполненияЭтапаПроизводства:

Как из док. ВыполнениеЭтапаПроизводства +-:
ЗаказЗатраченныеМатериалы: + Этап
ВидыРабот: -Бригада, Ответственный. + Этап

&НаКлиенте
Процедура ЗаказПриИзменении(Элемент)
Объект.Изделия.Очистить();
ЗаполнитьИзделияЗаказа();
ЗаполнитьМатериалы();
ЗаполнитьВидыРабот();
КонецПроцедуры

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

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



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

ОбновитьЭтапыИзТабличнойЧасти(ВыборкаДетальныеЗаписи);
КонецПроцедуры

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

ОбновитьЭтапыИзТабличнойЧасти(ВыборкаДетальныеЗаписи);
КонецПроцедуры

&НаСервере
Процедура ОбновитьЭтапыИзТабличнойЧасти(Данные)

ТВ_Этапы = Новый ТаблицаЗначений;
    ТВ_Этапы.Колонки.Добавить("Этап");

    Для Каждого СтрокаСписка Из Этапы Цикл
        НоваяСтрока = ТВ_Этапы.Добавить();
        НоваяСтрока.Этап = СтрокаСписка.Этап;
    КонецЦикла;
   
    Для Каждого Строка Из Данные Цикл
        Если Строка.Этап <> Неопределено Тогда
            НоваяСтрока = ТВ_Этапы.Добавить();
            НоваяСтрока.Этап = Строка.Этап;
        КонецЕсли;
    КонецЦикла;
   
    ТВ_Этапы.Свернуть("Этап");
   
    Этапы.Очистить();
    Для Каждого СтрокаТВ Из ТВ_Этапы Цикл
НоваяСтрока = Этапы.Добавить();
НоваяСтрока.Этап=СтрокаТВ.Этап;
    КонецЦикла;
КонецПроцедуры



&НаКлиенте
Процедура СформироватьДокументы(Команда)
СформироватьДокументыНаСервере();
КонецПроцедуры   

&НаСервере
Процедура СформироватьДокументыНаСервере()

СозданныеДокументы = Новый Массив;

Для Каждого Эт Из Этапы Цикл 

        ЭтапТекущий = Эт.Этап;

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

Для Каждого СтрокаИзделия Из Объект.Изделия Цикл
            Если ЕстьДанныеДляЭтапа(СтрокаИзделия.Спецификация, ЭтапТекущий) Тогда
                НоваяСтрока = Документ.Изделия.Добавить();
                НоваяСтрока.Изделие = СтрокаИзделия.Изделие;
                НоваяСтрока.Спецификация = СтрокаИзделия.Спецификация;
                НоваяСтрока.Количество = СтрокаИзделия.Количество;
            КонецЕсли;
КонецЦикла;

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

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

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

Если СозданныеДокументы.Количество() > 0 Тогда
        Сообщить("Создано документов: " + СозданныеДокументы.Количество());
    Иначе
        Сообщить("Не создано ни одного документа");
    КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ЕстьДанныеДляЭтапа(Спецификация, ЭтапТекущий)
   
    Для Каждого СтрокаМатериала Из Объект.ЗатраченныеМатериалы Цикл
        Если СтрокаМатериала.Этап = ЭтапТекущий Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;

Для Каждого СтрокаВидаРабот Из Объект.ВидыРабот Цикл
        Если СтрокаВидаРабот.Этап = ЭтапТекущий Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;
   
    Возврат Ложь;
   
КонецФункции

ЦитироватьДобавить к "Объект" реквизит "Этапы" с типом ТаблицаЗначений
к нему добавить колонку реквизита "Этап" с типом СправочникСсылка.ЭтапыПроизводства

Добавить кнопку и все привязать СформироватьДокументы



Док.
ЗакупкаМатериалов
СкладПоступления, ОбщаяСуммаМатериалы: Материал, Количество, Цена, Сумма

ЦитироватьНа форме: (Дополнительно)
&НаКлиенте
Процедура МатериалыКоличествоПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
Объект.ОбщаяСумма=Объект.Материалы.Итог("Сумма");
КонецПроцедуры

&НаКлиенте
Процедура МатериалыЦенаПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.Материалы.ТекущиеДанные;
    СтрокаТабличнойЧасти.Сумма = СтрокаТабличнойЧасти.Количество * СтрокаТабличнойЧасти.Цена;
Объект.ОбщаяСумма=Объект.Материалы.Итог("Сумма");
КонецПроцедуры

Добавить ПриИзменении

Регистры накопления:
ЗатратыИЗакупки
Измерения: Номенклатура
Ресурсы: Количество, Сумма

ЦитироватьРегистраторы: ЗакупкаМатериалов, РасходнаяНакладная

ЗакупкаМатериалов -> Конструктор движений.ЗапасыНаСкладах

1) РегистрНакопления.ЗапасыНаСкладах -> Приход -> ТабЧасть(Материалы)
2) РегистрНакопления.ЗатратыИЗакупки -> Приход -> ТабЧасть(Материалы)

Заполнить.



Док.
ПеремещениеМатериалов
СкладПоступления, СкладСписанияМатериалы: Материал, Количество

Движения: -> Конструктор движений.ЗапасыНаСкладах

1) РегистрНакопления.ЗапасыНаСкладах -> Расход -> ТабЧасть(Материалы) -> СкладСписания
2) РегистрНакопления.ЗапасыНаСкладах -> Приход -> ТабЧасть(Материалы) -> СкладПоступления

Движение.Номенклатура = ТекСтрокаМатериалы.Материал;
Движение.Склад = СкладСписания;
Движение.Количество = ТекСтрокаМатериалы.Количество;
КонецЦикла;

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

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

// регистр ЗапасыНаСкладах Приход
Движения.ЗапасыНаСкладах.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

Rehala


Теги: abp 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск