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

1С 8.2: Как сделать контроль остатков?

Автор Logos300, 15 мар 2013, 06:59

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

Logos300

Всем привет! Сразу говорю, я полный новичок в 1С !
Ситуация следующая...
Пишу конфигурацию на 1С 8.2.
Есть там документ "ПриходнаяНакладная", в нем табличная часть "Товары" с реквизитами: Товар и Количество.
Планируется, что юзер будет вводить ПриходныеНакладные с приходом партий товаров из номенклатуры, то есть фактически - начальные остатки товаров. Также есть документ "ОплатаВКассу", регистрирующий продажу товаров через регистр накопления (статья "Расход").
Вопрос: как сделать так, чтобы нельзя было продать больше того количества товаров из номенклатуры, которое в данный момент есть на складе?
Ответьте, пожалуйста, как можно развёрнутее... Потому что я ну полнейший новичок :)))

Besart

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


Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл

Нехватка = Выборка.КолДок - Выборка.КолДт;
Если Нехватка>0 Тогда

Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Товара "+Выборка.Номенклатура+" недостаточно в количестве" +Нехватка;
Сообщение.Поле = "Товары["+(Выборка.НомерСтроки-1)+"].Количество";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ=Истина;

КонецЕсли;

Если Отказ Тогда

Продолжить;

КонецЕсли;
Движение = Движения.РегистрБухгалтерии1.Добавить();
Движение.СчетДт = ПланыСчетов.ПланСчетов1.Себестоимость;
Движение.СчетКт = ПланыСчетов.ПланСчетов1.Товары;
Движение.Период = Дата;
Движение.Организация=Организация;
        Движение.КоличествоКт = Выборка.КолДок;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = Выборка.Номенклатура;
Если Выборка.КолДт<>0 Тогда
Движение.Сумма = Выборка.КолДок * Выборка.СуммаДт/Выборка.КолДТ;

Иначе
Движение.Сумма=0;

КонецЕсли;
Если НЕ Отказ Тогда

Движения.РегистрБухгалтерии1.Записывать=Истина;

Движение = Движения.РегистрБухгалтерии1.Добавить();
Движение.СчетДт = ПланыСчетов.ПланСчетов1.Покупатели;
Движение.СчетКт = ПланыСчетов.ПланСчетов1.Выручка;
Движение.Период = Дата;
Движение.Организация=Организация;
Движение.Сумма = Товары.Итог("Сумма");
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;

КонецЕсли;


КонецЦикла;



указанный код сложнее чем вам нужно, так как остатки сранвиваются по регистру бухгалтерии

Logos300

Можно я конкретизирую? :)))

1.Есть документ "ПриходнаяНакладная" (Отражает поступление товаров).
У него есть реквизит "Склад".
Также у документа есть табличная часть "Товары" с реквизитами:
"Товар", "Количество".

2.Есть документ "ОплатаВКассу" (отражает продажу, расход, товаров).
У документа есть реквизиты: "Склад", "Кассир".
Также есть табличная часть "ПереченьНоменклатуры" с реквизитами:
"Номенклатура", "Количество", "Цена", "Сумма".

3. Есть регистр накопления "ТоварыНаСкладе" (В нем отражается приход и расход товаров). У этого регистра есть измерения "Товар", "Склад" и ресурс "Количество".

Исходя из ЭТОЙ информации, какой код мне нужно набить?
Повторюсь: Я полнейший новичок.

Besart

запросом выбираете товар из документа "Оплата в кассу" и количество из регистра накопления  "ТоварыНаСкладе", а потом сравниваете их количество, в случае нехватки товара запрещаете проведение документа "Оплата в кассу", елси это непонятно то вам необходимо изучить запросы и проведение документов

Logos300

Вот я кое-что набросал в процедуре проведения документа "ОплатаВКассу", но при проверке никаких сообщений не выдается и записей в регистр не делается:

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

//Контроль остатков

   Движения.ТоварыНаСкладе.Записывать=Истина;
   Движения.РеализацияУслуг.Записывать=Истина;


Запрос=Новый Запрос;
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

Запрос.УстановитьПараметр("Количество", Количество);

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

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

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

// регистр ТоварыНаСкладе Расход
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Товар
Тогда

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

КонецЕсли;
КонецЦикла;

// регистр РеализацияУслуг Расход
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры=Перечисления.ВидыНоменклатуры.Услуга
Тогда

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

КонецЕсли;
КонецЦикла;

КонецЦикла;

//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА


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


Можете помочь? :)))

Теги:

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

Рейтинг@Mail.ru

Поиск