Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
23 ноя 2024, 00:58

Как произвести расход ингредиентов со склада на изготовленную продукцию с проверкой отрицательного к

Автор licoris, 24 мар 2024, 18:06

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

licoris

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

alexandr_ll

licoris, Запросом получить остатки сырья и сравнить со списываемым количеством
Для наглядности можно создать табличную частоь сырья, в которую выводить остатки.
https://helpme1s.ru/registry-nakopleniya-v-yazyke-1s-8-v-primerax

licoris

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

Максим75

licoris, так Сырье надо получить из Продукции. В продукции есть так называемая технологическая карта (у Вас это табличная часть справочника, там где Ингредиент). Вы должны из продукции получить сколько какого ингредиента должно пойти на изготовления количества продукции.
Короче говоря, учите что такое запросы, как связывать различные таблицы и т.д. Одними конструкторами движений не получится, необходимо понимание.

licoris


licoris

Максим75, запрос на выборку из справочника Продукция есть, просто как его результат сравнить с количеством в регистре "Сырье"?

licoris

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

Максим75

licoris, ну раз есть запрос на выборку, то в этот же запрос добавьте еще одно соединение с регистром остатков, связь по номенклатуре, и вытащите из регистра остатков сам остаток. и сбудет у Вас в запросе количество необходимое для списания и количество остатка.

Выложу Вам примерный алгоритм, чего надо делать.

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

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

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

вначале делаю движения, а только после этого проверяю на отрицательные остатки.
так сейчас 1С рекомендует делать.

Теги:  

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

Рейтинг@Mail.ru

Поиск