Имя: Пароль:
1C
1С v8
УНФ аналоги материалов
0 Raideres
 
09.07.21
15:47
Ребят помогите пожалуйста как в УНФ можно чтот сделать для работы с аналогами в производстве?
например
Материал А
и у него есть Аналог А-1
Аналог А-2 и Аналог А-3
когда не хватает Материала А тратится А-1 потом А-2 и так далее
МБ кто то делал подобную доработку??????
1 Krendel
 
09.07.21
15:48
Разработчики УПП и ЕРП делали эту разработку ;-)
2 Raideres
 
09.07.21
16:01
(1) Сам чёрт ногу сломит хотел посмотреть как в ЕРП устроено хрен что разберешь

сейчас написал вот так но это неправильно в край и толком не работает)
Процедура ЗаполнитьТабличнуюЧастьПоАналогам()
    Объект.Запасы.Очистить();
    Объект.СерийныеНомера.Очистить();
    ЭтоРазборка = (Объект.ВидОперации=Перечисления.ВидыОперацийСборкаЗапасов.Разборка);
    
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    
    ДобавитьВременныеТаблицы(Запрос);
    ДобавитьРаспределениеПоСпецификации(Запрос);
    ЗаполнитьЗапасыПоЭтапам(Запрос);
    
    СтатусПартии = Новый СписокЗначений;
    СтатусПартии.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыПартий.СобственныеЗапасы"));
    СтатусПартии.Добавить(ПредопределенноеЗначение("Перечисление.СтатусыПартий.ДавальческоеСырье"));
    
    Организация = Константы.УчетПоКомпании.Компания(Объект.Организация);
    

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

            Запрос.Текст =
            "ВЫБРАТЬ
            |    АМ_АналогиНоменклатуры.Номенклатура КАК Номенклатура,
            |    АМ_АналогиНоменклатуры.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
            |    АМ_АналогиНоменклатуры.Аналог КАК Аналог,
            |    АМ_АналогиНоменклатуры.ХарактеристикаАналога КАК ХарактеристикаАналога,
            |    АМ_АналогиНоменклатуры.Количество КАК Количество,
            |    АМ_АналогиНоменклатуры.КоличествоАналога КАК КоличествоАналога,
            |    АМ_АналогиНоменклатуры.Приоритет КАК Приоритет
            |ПОМЕСТИТЬ ВТ_Аналог
            |ИЗ
            |    РегистрСведений.АМ_АналогиНоменклатуры КАК АМ_АналогиНоменклатуры
            |ГДЕ
            |    АМ_АналогиНоменклатуры.Номенклатура = &Номенклатура
            |    И АМ_АналогиНоменклатуры.ХарактеристикаНоменклатуры = &Характеристика
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            |    СУММА(ЗапасыОстаткиСвободные.КоличествоОстаток) КАК КоличествоСвободно,
            |    ЗапасыОстаткиСвободные.Номенклатура КАК Номенклатура,
            |    ЗапасыОстаткиСвободные.Характеристика КАК Характеристика,
            |    ЗапасыОстаткиСвободные.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница
            |ПОМЕСТИТЬ ВТОстатокАналогов
            |ИЗ
            |    РегистрНакопления.Запасы.Остатки(
            |            ,
            |            Номенклатура В
            |                    (ВЫБРАТЬ
            |                        Вт_аналог.Аналог КАК номенклатура
            |                    ИЗ
            |                        Вт_аналог)
            |                И ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
            |                И СтруктурнаяЕдиница = &СтруктурнаяЕдиница
            |                И Характеристика = &Характеристика
            |                И Организация = &Организация) КАК ЗапасыОстаткиСвободные
            |
            |СГРУППИРОВАТЬ ПО
            |    ЗапасыОстаткиСвободные.Номенклатура,
            |    ЗапасыОстаткиСвободные.Характеристика,
            |    ЗапасыОстаткиСвободные.СтруктурнаяЕдиница
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            |    ВТ_Аналог.Аналог КАК Номенклатура,
            |    ВТ_Аналог.ХарактеристикаАналога КАК Характеристика,
            |    ВТ_Аналог.Количество КАК КоэффицентОсновной,
            |    ВТ_Аналог.КоличествоАналога КАК КоэффицентАналога,
            |    ВТ_Аналог.Приоритет КАК Приоритет,
            |    ЕСТЬNULL(ВТОстатокАналогов.КоличествоСвободно, 0) КАК Количество,
            |    ВТОстатокАналогов.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница
            |ПОМЕСТИТЬ ВтИтоговая
            |ИЗ
            |    ВТ_Аналог КАК ВТ_Аналог
            |        ЛЕВОЕ СОЕДИНЕНИЕ ВТОстатокАналогов КАК ВТОстатокАналогов
            |        ПО ВТ_Аналог.Аналог = ВТОстатокАналогов.Номенклатура
            |            И ВТ_Аналог.ХарактеристикаАналога = ВТОстатокАналогов.Характеристика
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |ВЫБРАТЬ
            |    ВтИтоговая.Номенклатура КАК Номенклатура,
            |    ВтИтоговая.Характеристика КАК Характеристика,
            |    ВтИтоговая.КоэффицентОсновной / ВтИтоговая.КоэффицентАналога КАК Коэффицент,
            |    ВтИтоговая.Приоритет КАК Приоритет,
            |    ВтИтоговая.Количество КАК Количество,
            |    ВтИтоговая.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница
            |ИЗ
            |    ВтИтоговая КАК ВтИтоговая
            |ГДЕ
            |    ВтИтоговая.Количество > 0
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |УНИЧТОЖИТЬ ВТ_Аналог
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |УНИЧТОЖИТЬ ВТОстатокАналогов
            |;
            |
            |////////////////////////////////////////////////////////////////////////////////
            |УНИЧТОЖИТЬ ВтИтоговая";
            
            Выборка = Запрос.Выполнить().Выбрать();
            
            ////3. Добавить аналоги  и уменьшить количество в документе но перед этим проверим сколько есть для списания основного материала
            Нехватает = ТребуетсяСписать-(СтруктураОстатков.КоличествоСвободно+СтруктураОстатков.КоличествоРезерв);
            СтрокаТабличнойЧасти.Количество = СтруктураОстатков.КоличествоСвободно+СтруктураОстатков.КоличествоРезерв;
            СтрокаТабличнойЧасти.Резерв     = СтруктураОстатков.КоличествоРезерв;
            СчетчикДобавляемыхАналогов=0;
            НехватаетК=Нехватает;
            
            Пока Выборка.Следующий()и  Нехватает >0 Цикл
                Списываем = Мин(Выборка.Количество, Нехватает/Окр(Выборка.Коэффицент,3));
                //НоваяСтрока = ТаблицаДобавляемыхАналогов.Добавить();
                //НоваяСтрока.НомерСтроки = СтрокаТабличнойЧасти.НомерСтроки;
                ////СчетчикДобавляемыхАналогов = СчетчикДобавляемыхАналогов + 1;
                //ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
                //НоваяСтрока.Количество = Списываем;
                
                НоваяСтрока=Объект.Запасы.Вставить(СтрокаТабличнойЧасти.НомерСтроки+СчетчикДобавляемыхАналогов);
                СчетчикДобавляемыхАналогов = СчетчикДобавляемыхАналогов + 1;
                ЗаполнитьЗначенияСвойств(НоваяСтрока,Выборка);
                НоваяСтрока.Количество = Списываем;
                Нехватает = Нехватает - Списываем*Окр(Выборка.Коэффицент,3);
            КонецЦикла;
            
            
        Иначе  //количества хватает но надо заполнить резерв
            СтрокаТабличнойЧасти.Резерв=СтруктураОстатков.КоличествоРезерв;
        КонецЕсли;
        
        //типовые действия
        СтрокаТабличнойЧасти.Партия = ?(ЗначениеЗаполнено(СтрокаТабличнойЧасти.Номенклатура)
        , НоменклатураВДокументахСервер.ЗначенияПартийНоменклатурыПоУмолчанию(СтрокаТабличнойЧасти.Номенклатура,СтатусПартии)
        , Неопределено);
        
        Если ЗначениеЗаполнено(СтрокаТабличнойЧасти.СтруктурнаяЕдиница) И Объект.ПоложениеСклада=Перечисления.ПоложениеРеквизитаНаФорме.ВТабличнойЧасти Тогда
            Продолжить;
        КонецЕсли;
        
        СтрокаТабличнойЧасти.СтруктурнаяЕдиница = ?(ЭтоРазборка, Объект.СтруктурнаяЕдиницаПродукции, Объект.СтруктурнаяЕдиницаЗапасов);
        СтрокаТабличнойЧасти.Ячейка = ?(ЭтоРазборка, Объект.ЯчейкаПродукции, Объект.ЯчейкаЗапасов);
        
    КонецЦикла;
    
    

    
КонецПроцедуры
3 Raideres
 
09.07.21
16:02
Функция СвободныйОстатокПоСтруктурнойЕдинице(СтруктурнаяЕдиница, Номенклатура, Характеристика, Партия, ЕдиницаИзмерения)
    
    Коэффициент = ?(ТипЗнч(ЕдиницаИзмерения) = Тип("СправочникСсылка.ЕдиницыИзмерения"), ЕдиницаИзмерения.Коэффициент, 1);
    
    Организация = Константы.УчетПоКомпании.Компания(Объект.Организация);
    
    Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Характеристика", Характеристика);
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("Партия", Партия);
    Запрос.УстановитьПараметр("СтруктурнаяЕдиница", СтруктурнаяЕдиница);
    
    ЕстьЗаказ = ЗначениеЗаполнено(Объект.ЗаказПокупателя);
    
    Если ЕстьЗаказ Тогда
        Запрос.УстановитьПараметр("Заказ", Объект.ЗаказПокупателя);
        
        Запрос.Текст =
        "ВЫБРАТЬ
        |    СУММА(ЗапасыОстаткиСвободные.КоличествоОстаток) КАК КоличествоСвободно,
        |    СУММА(ЗапасыОстаткиРезерв.КоличествоОстаток) КАК КоличествоРезерв
        |ИЗ
        |    РегистрНакопления.Запасы.Остатки(
        |            ,
        |            Номенклатура = &Номенклатура
        |                И ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
        |                И Организация = &Организация
        |                И Характеристика = &Характеристика
        |                И Партия = &Партия
        |                И СтруктурнаяЕдиница = &СтруктурнаяЕдиница) КАК ЗапасыОстаткиСвободные,
        |    РегистрНакопления.Запасы.Остатки(
        |            ,
        |            Номенклатура = &Номенклатура
        |                И ЗаказПокупателя = &Заказ
        |                И Организация = &Организация
        |                И Характеристика = &Характеристика
        |                И Партия = &Партия
        |                И СтруктурнаяЕдиница = &СтруктурнаяЕдиница) КАК ЗапасыОстаткиРезерв
        |
        |УПОРЯДОЧИТЬ ПО
        |    КоличествоСвободно УБЫВ";
        
    Иначе
        
        Запрос.Текст =
        "ВЫБРАТЬ
        |    СУММА(ЗапасыОстаткиСвободные.КоличествоОстаток) КАК КоличествоСвободно
        |ИЗ
        |    РегистрНакопления.Запасы.Остатки(
        |            ,
        |            Номенклатура = &Номенклатура
        |                И ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
        |                И Организация = &Организация
        |                И Характеристика = &Характеристика
        |                И Партия = &Партия
        |                И СтруктурнаяЕдиница = &СтруктурнаяЕдиница) КАК ЗапасыОстаткиСвободные
        |
        |УПОРЯДОЧИТЬ ПО
        |    КоличествоСвободно УБЫВ";
    КонецЕсли;
    
    Результат = Запрос.Выполнить().Выбрать();
    
    СтруктураВозврата = Новый Структура("КоличествоСвободно, КоличествоРезерв");
    
    Пока Результат.Следующий() Цикл
        СтруктураВозврата.КоличествоСвободно = Результат.КоличествоСвободно/Коэффициент;
        СтруктураВозврата.КоличествоРезерв = ?(ЕстьЗаказ, Результат.КоличествоРезерв/Коэффициент, 0);
    КонецЦикла;
    
    Возврат СтруктураВозврата;
    
КонецФункции