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

Не ведет учет товара по складам. Новичок!!!

Автор MevMix, 14 апр 2011, 19:02

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

MevMix

Столкнулся с такой проблемой при проведении реализации товаров и услуг.
Конфиг не типовой, а мой.

Вообщем есть приход одного и того же товара, но на разные склады по одной штуке
(к примеру 1 штук на основной и 1 на дополнительный склады)
Если списываю 2 с одного из складов(Дополнительный или Основной) то без проблем проводить.
не ругается, что на складе товара только 1 штука.
Вот ОбработкаПроведения реализации товаров и услуг

Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
СтруктураШапкиДокумента = ОбщегоНазначения.СформироватьСтруктуруШапкиДокумента(ЭтотОбъект);
Заголовок = ОбщегоНазначения.ПредставлениеДокументаПриПроведении(СтруктураШапкиДокумента);
ПроверитьЗаполнениеШапки(СтруктураШапкиДокумента, Отказ, Заголовок);


//проверить заполнение табличной части
СтруктураПолей = Новый Структура;
    СтруктураПолей.Вставить("Номенклатура");
    СтруктураПолей.Вставить("Количество");
    ЗаполнениеДокументов.ПроверитьЗаполнениеТабличнойЧасти(ЭтотОбъект, "ПереченьНоменклатуры", СтруктураПолей, Отказ, Заголовок);

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

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

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

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

// Сформировать движения.
Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

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


КонецЦикла;
   
// Записать движения регистров
   Движения.ОстаткиТоваров.Записать();
   Движения.Продажи.Записать();
КонецЕсли;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Повторюсь еще раз НОВИЧОК.
подскажите де трабла
Спасибо



MevMix

Сорри за код

дубль два


Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
СтруктураШапкиДокумента = ОбщегоНазначения.СформироватьСтруктуруШапкиДокумента(ЭтотОбъект);
Заголовок = ОбщегоНазначения.ПредставлениеДокументаПриПроведении(СтруктураШапкиДокумента);
ПроверитьЗаполнениеШапки(СтруктураШапкиДокумента, Отказ, Заголовок);


//проверить заполнение табличной части
СтруктураПолей = Новый Структура;
    СтруктураПолей.Вставить("Номенклатура");
    СтруктураПолей.Вставить("Количество");
    ЗаполнениеДокументов.ПроверитьЗаполнениеТабличнойЧасти(ЭтотОбъект, "ПереченьНоменклатуры", СтруктураПолей, Отказ, Заголовок);

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

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

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

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

// Сформировать движения.
Если ВыборкаРезультатаЗапроса.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

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


КонецЦикла;
   
// Записать движения регистров
   Движения.ОстаткиТоваров.Записать();
   Движения.Продажи.Записать();
КонецЕсли;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

MevMix


Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск