Документ видит остатки с учётом своих движений

1. 21stas 99 03.11.23 16:31 Сейчас в теме
Мне надо убедиться, что при проведении документа будут положительные остатки не только после проведения документа, но и на "после всех документов".
Это применяется при проведении документов задним числом.

Делаю это следующим образом:
		
&Сервер
&Перед("ОбработкаПроведения")
Процедура Расш1_ОбработкаПроведения(Отказ, РежимПроведения)
ОстаткиТовара=РегистрыБухгалтерии.Хозрасчетный.Остатки(,ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура,ОтборНоменклатуры, ,"Количество");
		Если ОстаткиТовара.Количество()>0 Тогда
			ОстатокТовара=ОстаткиТовара[0].КоличествоОстатокДт;
		Иначе                
			ОстатокТовара=0;     
		КонецЕсли;
Показать


Но если документ уже был проведён - остатки считаются с учётом прошлого проведения.
Как сделать, что документ видел остатки после себя без учёта своих старых движений?
Либо как увидеть, сколько было в этих старых движениях?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. Sashares 34 04.11.23 10:07 Сейчас в теме
(1)Очевидно, что надо указать период, на который нужно получать остатки.
5. 21stas 99 04.11.23 16:52 Сейчас в теме
(4) Мне надо остатки после всех документов, поэтому я и не указываю период.
10. schweigen 04.11.23 19:02 Сейчас в теме
(1) Документ должен иметь свойство "Удаление движений - Удалять автоматически".
Процедура вставляется в любой регистр накопления и не дает провести любой документ, если это приведет к отрицательному остатку. Модуль набора записей - ПередЗаписью.
Остаток берется на тот период, который указан в движении.
Измени значение параметра запроса Период, чтобы получить остаток на текущую дату.
Процедура ПередЗаписью(Отказ, Замещение)
	
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	
	Если КонтролироватьОстатки() Тогда
		КонтрольОтрицательныхОстатковРегистраНакопления(Отказ, ЭтотОбъект);
	КонецЕсли;
		
КонецПроцедуры

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

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

Процедура СообщениеОбОшибке(Отказ, ПутьИлиОбъект, Поле = "", Знач ТекстСообщения = "Поле не заполнено") Экспорт
	
	Отказ = Истина;
	Сообщение = новый СообщениеПользователю;
	Сообщение.Поле = Поле;
	Сообщение.Текст = ТекстСообщения;
	Если ТипЗнч(ПутьИлиОбъект) = Тип("Строка") Тогда
		Сообщение.ПутьКДанным = ПутьИлиОбъект;
	Иначе
		Сообщение.УстановитьДанные(ПутьИлиОбъект);
	КонецЕсли;
	Сообщение.Сообщить();
	
КонецПроцедуры
Показать
11. schweigen 04.11.23 19:37 Сейчас в теме
(1) Почему тебе просто не очистить движения данного документа перед получением остатков?
2. soft_wind 03.11.23 17:15 Сейчас в теме
так вы сделайте НОВОЕ проведение и у вас остатки уже будут без "старого" проведения
и как раз смотрите стало ли что меньше 0
6. 21stas 99 04.11.23 16:53 Сейчас в теме
(2)
мотрите стало ли что меньше 0


При перепроведении документа он видит остатки с учётом старых движений.
Если документ распровести, потом снова провести - не видит.
При этом как увидеть его старые движения - не придумал.
9. Sashares 34 04.11.23 17:32 Сейчас в теме
(6)
При этом как увидеть его старые движения - не придумал.

Запрос к регистру бухгалтерии с отбором по ссылке.
3. Dr.HiHi 3 04.11.23 09:22 Сейчас в теме
вариант 1
от текущих остатков отнять движения по текущему документу (если это перед обработкой проведения как на скрине)

вариант 2
анализировать сами движения Хозрасчетный (перед и при записи)

p.s. не бойтесь запросов ;))
7. 21stas 99 04.11.23 16:55 Сейчас в теме
(3) Я пытался увидеть движения Хозрасчётный таким кодом:
ОборотыТовара=РегистрыБухгалтерии.Хозрасчетный.Обороты(ЭтотОбъект.МоментВремени(),ЭтотОбъект.МоментВремени(),ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура,ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура,ОтборНоменклатуры, ,"Количество");
		Если ОборотыТовара.Количество()>0 Тогда
			РасходТовара=ОборотыТовара[0].КоличествоКт;
		Иначе                
			РасходТовара=0;
		КонецЕсли;


Не видит движений.
8. 21stas 99 04.11.23 16:58 Сейчас в теме
(3) Про вариант 2:
Я могу посмотреть, видно ли движения Хозрасчётный перед записью... но как их передать в процедуру ОбработкаПроведения?
12. Dr.HiHi 3 04.11.23 21:10 Сейчас в теме
(8) как вариант, через дополнительное свойство... если Вы окунетесь в мир какой-то последний конфигурации, то там почти в каждой есть процедуры перед записью и при записи в регистрах накопления... вот что-то можно подобное сотворить и для записей регистра бухгалтери ;))
Оставьте свое сообщение

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