Проверка остатков при проведении

1. user992694 30.11.18 06:23 Сейчас в теме
Всем доброго дня.
Занимаюсь изучением программирования/конфигурирования 1с и для этого с нуля пишу свою конфигурацию, дабы глубже вникнуть.
возникла следующая ситуация:
Остатки на складе хранятся не только в разрезе номенклатуры но и в разрезе цен закупки и счета закупа.
т.е. регистр накопления имеет следующие реквизиты:

Номенклатура
Цена
СредстваЗакупки

И измерение
Количество.

В проводимом документе в табличной части так же есть эти реквизиты.
Для проведения документа и проверки остатков решил воспользоваться новым методом, т.е. списываем а потом смотрим что ушло в минус. Родился следующий код:

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

	//тут располагается мудреный код движения по регистрам

*************
		КонецЦикла; 


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


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

Показать


Проблема данного кода заключается в следующем. Предположим на складе есть:

|Номенклатура|ЦенаЗакупа|СчетЗакупа |количество|
| Стул | 11.20 |Основной | 5 |
| Стул | 15 |Не Основной | 1 |

Если АктВыполненыхРабот содержит стулья по одной цене, то все отрабатывает корректно. при этом не важно одной строчкой или несколькими строками. все пересчитывается.
а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула

Понимаю что проблема где то есть ) но пока не могу ее найти. взываю к вашему опыту.
По теме из базы знаний
Найденные решения
11. user992694 30.11.18 18:10 Сейчас в теме
Всем спасибо. Нашел ошибку.
Вот этот вот цикл все портил

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

Убрал его и все заработало как надо.
Около часа тестировал разными комбинациями, все отрабатывает корректно. Этот цикл запускал движения по регистрам столько раз сколько строк в табличной части.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Aitbay 30.11.18 07:15 Сейчас в теме
|СГРУППИРОВАТЬ ПО
        |    АктВыполненыхРаботЗИП.Номенклатура,
        |    АктВыполненыхРаботЗИП.ЦенаЗакупки,
        |    АктВыполненыхРаботЗИП.СчетЗакупа


--------------------
вот это лишнее | АктВыполненыхРаботЗИП.ЦенаЗакупки,
3. Fox-trot 162 30.11.18 07:22 Сейчас в теме
(2) не факт, точной структуры ведь нет
5. user992694 30.11.18 08:33 Сейчас в теме
(2)хм. а разве если я буду группировать по ценам, не получится так что будет сгруппирована разная номенклатура с одинаковой ценой. пример. стул по три рубля две штуки и чайник по три рубля одна штука. в итоге у меня есть три непонятно чего.
4. Alexei_Siva 204 30.11.18 07:28 Сейчас в теме
Видимо, проводки получаются не такие как задумано. Попробуйте отключить контроль и посмотреть действительно ли остатки уходят в минус.
6. user992694 30.11.18 08:47 Сейчас в теме
закоментировал весь код проверки на остатки. оставил только проводки.

получилось следующее.
Остатки:
стул 11,20 в колличестве 5 штук
стул 15.00 в колличестве 1 штука

списываю:
стул 11,20 в колличестве 6 штук
стул 15,00 в колличестве 2 штука

на остатках:
стул 11,20 в колличестве -1 штук
стул 15,00 в колличестве -1 штука



Но есть одна интересная фишка.
Если закомментировать только строку
"Отказ = Истина; "
получается что то странное.


Остатки:
стул 11,20 в колличестве 5 штук
стул 15.00 в колличестве 1 штука

списываю:
стул 11,20 в колличестве 6 штук
стул 15,00 в колличестве 2 штука

на остатках:
стул 11,20 в колличестве -7 штук
стул 15,00 в колличестве -3 штука
9. mifka186 9 30.11.18 13:39 Сейчас в теме
(6)Все логично, нет отказа - значит новые движения добавились в базу, еще раз перепроведете, получите еще больший минус.

(1)
а вот если пытаюсь списать один стул за 15 и один стул за 11 то не проводится и прилетает отчет что не хватает 1 стула

Косячит процедура списания. Списывает все с одной цены, проверяйте свой код.
10. user992694 30.11.18 18:05 Сейчас в теме
(9)нет, не логично. Было 5 стульев. Один списал. Стало -6.
7. bad_wag 51 30.11.18 10:37 Сейчас в теме
Вот тут ничего не понятно, приложите скриншот, где видно структуру регистра

т.е. регистр накопления имеет следующие реквизиты:

Номенклатура
Цена
СредстваЗакупки

И измерение
Количество.
8. bad_wag 51 30.11.18 10:55 Сейчас в теме
А вообще, как я понял, то остатки хранятся в разрезе цен, а при проверке получаете их только по номенклатуре.
11. user992694 30.11.18 18:10 Сейчас в теме
Всем спасибо. Нашел ошибку.
Вот этот вот цикл все портил

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

Убрал его и все заработало как надо.
Около часа тестировал разными комбинациями, все отрабатывает корректно. Этот цикл запускал движения по регистрам столько раз сколько строк в табличной части.
12. spacecraft 30.11.18 18:43 Сейчас в теме
(11) ошибка точно не в "Пока ВыборкаДетальныеЗаписи.Следующий() Цикл", а в "//тут располагается мудреный код движения по регистрам".
Как можно по одной записи из выборки "Правильно" сделать движения?
Тут 2 вариант: или там движения строились не на основании данных из выборки, или движения совсем не правильные.
13. user992694 01.12.18 05:51 Сейчас в теме
(12)в коде два запроса. Первый выбирает данные из документа и помещает во временную таблицу. Все данные. Затем выполняется проводка документа, не на основании выборки а как это бы выпооеялось, если бы проверки на остатки не было вообще. После этого запускается второй запрос, который берет номенклатуру из временной таблицы и проверяет ее остатки в регистре накопления.
Так что ошибка как раз в той строке, которую я указал.
14. spacecraft 01.12.18 09:46 Сейчас в теме
(13)
Затем выполняется проводка документа, не на основании выборки а как это бы выпооеялось, если бы проверки на остатки не было вообще

Вот о чем я и подразумевал под первым вариантом. Движения делались не на основании выборки из запроса. Тогда смысла первого запроса? Он тогда совсем не нужен, а не просто проход выборки.
15. user992694 01.12.18 10:39 Сейчас в теме
(14) смысл первой выборки в том, что бы не делать проверку отрицательных остатков по всему регистру, а только ту номенклатуру, что учавствовала в конкретном документе. Иначе возникнет следующая ситуация, что если на складе из ща какой либо ошибки возникнет отрицательный остаток по одной номенклатуре, то больше не получится провести ни ни один документ, так как эта, сбойная номенклатура всегда будет попадать во вторую выборку.
16. spacecraft 01.12.18 12:32 Сейчас в теме
(15) да не используете первую выборку совсем. Во всяком случае в приведенном коде. Движения делаете без учета первой выборки. Первая выборка просто для красоты. Из запроса используете только ВТ для последующего запроса. С таким же успехом можно было ВТ делать сразу во втором запросе и первый запрос просто не нужен был бы.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот