Не присваивается статус к номенклатуре! Не могу найти ошибку

1. user1304317 23.03.20 16:29 Сейчас в теме
Функция ОбновитьСтатусыНоменклатуры(Знач Номенклатура, ВернутьПервоеНайденноеЗначение = Ложь) Экспорт
	
	Если Не ТипЗнч(Номенклатура) = Тип("Массив") Тогда
		
		ЗначениеНоменклатура = Номенклатура;
		Номенклатура = Новый Массив;
		Номенклатура.Добавить(ЗначениеНоменклатура);
		
	КонецЕсли;
	
	НоменклатураКопия = Новый Массив;
	ОбщегоНазначенияКлиентСервер.ДополнитьМассив(НоменклатураКопия, Номенклатура, Истина);
	Номенклатура = НоменклатураКопия;
	
	УзелERP = БИТ_СТ_ПовторноеИспользованиеЗначений.ПолучитьЗначениеКонстанты("СТ_НСИ_УзелERP");
	
	СтатусыНоменклатуры = СтатусыНоменклатуры();
	СхемаКомпоновкиДанных = ПолучитьМакет("СхемаКомпоновкиДанныхОтбора");
	
	Для Каждого Статус Из СтатусыНоменклатуры Цикл
		
		Если Не Номенклатура.Количество() Тогда
			Прервать;
		КонецЕсли;
		
		НастройкиКомпоновкиХранилище = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Статус, "НастройкиОтбора");
		НастройкиКомпоновки = НастройкиКомпоновкиХранилище.Получить();
		Если НастройкиКомпоновки = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		
		// Настройки могут меняться. Перезаполняем используемые параметры
		НастройкиКомпоновки.ПараметрыДанных.Элементы.Очистить();
		Для Каждого Параметр Из СхемаКомпоновкиДанных.Параметры Цикл
			НовыйПараметр = НастройкиКомпоновки.ПараметрыДанных.Элементы.Добавить();
			НовыйПараметр.Параметр = Новый ПараметрКомпоновкиДанных(Параметр.Имя);
			НовыйПараметр.Использование = Истина;
		КонецЦикла;
		
		//
		ПараметрНастройки = Новый ПараметрКомпоновкиДанных("Номенклатура");
		НастройкиКомпоновки.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрНастройки, Номенклатура);
		
		ПараметрНастройки = Новый ПараметрКомпоновкиДанных("УзелERP");
		НастройкиКомпоновки.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрНастройки, УзелERP);
		
		ПараметрНастройки = Новый ПараметрКомпоновкиДанных("ГруппаПроектные");
		НастройкиКомпоновки.ПараметрыДанных.УстановитьЗначениеПараметра(ПараметрНастройки, БИТ_СТ_ПовторноеИспользованиеЗначений.ПолучитьЗначениеКонстанты("СТ_ГруппаПроектныхСветильников"));
			
		КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
		МакетКомпоновки   = КомпоновщикМакета.Выполнить(
			СхемаКомпоновкиДанных, 
			НастройкиКомпоновки, 
			, 
			,
			Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
		
		ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
		ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
		
		ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
		ТаблицаРезультат = Новый ТаблицаЗначений;
		
		ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
		ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
		
		Если ТаблицаРезультат.Количество() И ВернутьПервоеНайденноеЗначение Тогда
			Возврат Статус;
		КонецЕсли;
		
		Если ТаблицаРезультат.Количество() Тогда		
			
			НоменклатураКОбновлениюСтатуса = ТаблицаРезультат.ВыгрузитьКолонку("Номенклатура");
			УстановитьОбновитьСтатусыНоменклатуры(НоменклатураКОбновлениюСтатуса, Статус);
			
			Номенклатура = ОбщегоНазначенияКлиентСервер.СократитьМассив(Номенклатура, НоменклатураКОбновлениюСтатуса);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Номенклатура;
	
КонецФункции

Показать



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

Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. burgomister 59 24.03.20 04:21 Сейчас в теме
1. Непонятно что такое СтатусыНоменклатуры - таблица значений, массив или что?
2. В цикле по статусам номенклатуры у вас есть выход из функции:
Если ТаблицаРезультат.Количество() И ВернутьПервоеНайденноеЗначение Тогда
Возврат Статус;
КонецЕсли;
То есть цикл прерывается и дальше ничего не произойдёт. Вообще это уже как-то неправильно. Ну да ладно.
Функция Количество() возвращает число, которое у вас ни с чем не сравнивается. Или я то-то не догоняю?
3. После проверки этих условий у вас дальше вообще идёт выполнение?
4. Поскольку непонятен тип Статус - то непонятно почему не присваивается.
5. В общем, мало информации.
3. user1304317 24.03.20 08:37 Сейчас в теме
(2)

По пунктам:
1)
Функция СтатусыНоменклатуры() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	СТ_СтатусыНоменклатуры.Ссылка КАК Статус
	|ИЗ
	|	Справочник.СТ_СтатусыНоменклатуры КАК СТ_СтатусыНоменклатуры
	|ГДЕ
	|	НЕ СТ_СтатусыНоменклатуры.ПометкаУдаления";
	
	РезултатЗапроса = Запрос.Выполнить();
	РезультатТЗ = РезултатЗапроса.Выгрузить();
	СтатусыНоменклатуры = РезультатТЗ.ВыгрузитьКолонку("Статус");
	
	Возврат СтатусыНоменклатуры;

КонецФункции

Показать


2) Статус - это справочник
4. user1304317 24.03.20 09:27 Сейчас в теме
(2) не по всем позициям номен-ры отрабатывается это условие :

Если ТаблицаРезультат.Количество() Тогда		
			
			НоменклатураКОбновлениюСтатуса = ТаблицаРезультат.ВыгрузитьКолонку("Номенклатура");
			УстановитьОбновитьСтатусыНоменклатуры(НоменклатураКОбновлениюСтатуса, Статус);
			
			Номенклатура = ОбщегоНазначенияКлиентСервер.СократитьМассив(Номенклатура, НоменклатураКОбновлениюСтатуса);
			
		КонецЕсли;

Показать
5. burgomister 59 24.03.20 09:30 Сейчас в теме
Если ТаблицаРезультат.Количество() И ВернутьПервоеНайденноеЗначение Тогда ==== Если 1 и 2 Тогда - такое условие у вас?
            Возврат Статус;        ================================================ Вот здесь уже дальше ничего не будет выполняться.
        КонецЕсли;
        
        Если ТаблицаРезультат.Количество() Тогда        
            
            НоменклатураКОбновлениюСтатуса = ТаблицаРезультат.ВыгрузитьКолонку("Номенклатура");
            УстановитьОбновитьСтатусыНоменклатуры(НоменклатураКОбновлениюСтатуса, Статус); ============ Что в этой функции?
            
            Номенклатура = ОбщегоНазначенияКлиентСервер.СократитьМассив(Номенклатура, НоменклатураКОбновлениюСтатуса);
            
        КонецЕсли;
Показать
6. user1304317 24.03.20 09:34 Сейчас в теме
(5) во время отладки, я туда не могу попасть, мимо проходим, только статус и возвращает, а так это таблица пустая
7. burgomister 59 24.03.20 09:36 Сейчас в теме
Да вообще странно, что у вас это работает. Не должно работать в таком виде.
8. burgomister 59 24.03.20 09:38 Сейчас в теме
ПроцессорВывода.УстановитьОбъект(ТаблицаРезультат);
        ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
        
		//Если ТаблицаРезультат.Количество() И ВернутьПервоеНайденноеЗначение Тогда
		//    Возврат Статус;
		//КонецЕсли;
        
        Если ТаблицаРезультат.Количество() > 0 Тогда        
            
            НоменклатураКОбновлениюСтатуса = ТаблицаРезультат.ВыгрузитьКолонку("Номенклатура");
            УстановитьОбновитьСтатусыНоменклатуры(НоменклатураКОбновлениюСтатуса, Статус);
            
            Номенклатура = ОбщегоНазначенияКлиентСервер.СократитьМассив(Номенклатура, НоменклатураКОбновлениюСтатуса);
            
        КонецЕсли;
Показать
9. user1304317 24.03.20 09:39 Сейчас в теме
10. user1304317 24.03.20 09:51 Сейчас в теме
(8) Не помогло. Статус не добавился в рс, и следовательно нет на форме.
11. burgomister 59 24.03.20 10:00 Сейчас в теме
(10) Присвоение статуса у вас в функции УстановитьОбновитьСтатусыНоменклатуры(НоменклатураКОбновлениюСтатуса, Статус);
Что в ней - я не знаю. И что в параметрах? Они заполнены? Отладка у вас есть?
12. user1304317 25.03.20 08:44 Сейчас в теме
(11) Вчера сидел над этой задачей целый день, удалось определить, что :
- при первом создании номенклатуре, статус не присваивается.
- статус присваивается после второго-третьего проведения.

Если новая позиция, то это условие во время отладки мы не попадаем.
Если ТаблицаРезультат.Количество() Тогда		
			
			НоменклатураКОбновлениюСтатуса = ТаблицаРезультат.ВыгрузитьКолонку("Номенклатура");
			УстановитьОбновитьСтатусыНоменклатуры(НоменклатураКОбновлениюСтатуса, Статус);
			
			Номенклатура = ОбщегоНазначенияКлиентСервер.СократитьМассив(Номенклатура, НоменклатураКОбновлениюСтатуса);
			
		КонецЕсли;
Показать


То есть если статус равен N, который возвращается тут:
		
Если ТаблицаРезультат.Количество() И ВернутьПервоеНайденноеЗначение Тогда
			Возврат Статус;
КонецЕсли;


то мы должны попасть в то условие
13. burgomister 59 25.03.20 09:52 Сейчас в теме
(12) В общем без полной картины мне, например, ничего не ясно. Без точного ТЗ результат ХЗ.
14. user1304317 25.03.20 10:02 Сейчас в теме
(13) Ахааха) Сейчас скину.
А так я добавил проверку на ссылку :
Если Не ЭтоГруппа И Не Отказ 
		И Не ДополнительныеСвойства.Свойство("СТ_НеОбновлятьСтатус") Тогда
		Если Ссылка.Пустая() Тогда
			ЭтотОбъект.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку());
			НоваяСсылка = ПолучитьСсылкуНового();
		Справочники.СТ_СтатусыНоменклатуры.ОбновитьСтатусыНоменклатуры(НоваяСсылка);
		КонецЕсли;
	КонецЕсли;
Показать
15. burgomister 59 25.03.20 10:05 Сейчас в теме
(14) Это как подсматривать в замочную скважину: показали один кусочек, потом другой, а целой картины нет.
16. user1304317 25.03.20 10:20 Сейчас в теме
(15) Вот результаты отладки.
Прикрепленные файлы:
17. burgomister 59 25.03.20 12:29 Сейчас в теме
(16) Вот теперь всё понятно! Теперь можно спасть спокойно! Аминь. Надеюсь, понятно?
18. user1304317 25.03.20 12:52 Сейчас в теме
(17) Понятно, что нужно смотреть тут
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Номенклатура,
	ВЫБОР
		КОГДА Номенклатура.Родитель В ИЕРАРХИИ (&ГруппаПроектные)
			ТОГДА ИСТИНА
		ИНАЧЕ ЛОЖЬ
	КОНЕЦ КАК ВГруппеПроектных
ПОМЕСТИТЬ ВтНоменклатура
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	Номенклатура.Ссылка В(&Номенклатура)
	И НЕ Номенклатура.ЭтоГруппа
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВтНоменклатура.Номенклатура,
	ВЫБОР
		КОГДА СТ_НоменклатураВРаспродаже.Номенклатура ЕСТЬ NULL
			ТОГДА ЛОЖЬ
		ИНАЧЕ ИСТИНА
	КОНЕЦ КАК Распродажа,
	ВтНоменклатура.ВГруппеПроектных,
	ЕСТЬNULL(БлокировкаПродаж.Значение, ЛОЖЬ) КАК БлокировкаПродаж,
	ЕСТЬNULL(БлокировкаПроизводства.Значение, ЛОЖЬ) КАК БлокировкаПроизводства,
	РеквизитВидНоменклатуры.Значение КАК ВидНоменклатура
ИЗ
	ВтНоменклатура КАК ВтНоменклатура
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СТ_НоменклатураВРаспродаже КАК СТ_НоменклатураВРаспродаже
		ПО ВтНоменклатура.Номенклатура = СТ_НоменклатураВРаспродаже.Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.БИТ_СТ_ЗначенияПериодическихПараметровНоменклатуры.СрезПоследних КАК БлокировкаПродаж
		ПО ВтНоменклатура.Номенклатура = БлокировкаПродаж.Номенклатура
			И (БлокировкаПродаж.Параметр = ЗНАЧЕНИЕ(ПланВидовХарактеристик.БИТ_СТ_ПериодическиеПараметрыНоменклатуры.БлокировкаПродаж))
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.БИТ_СТ_ЗначенияПериодическихПараметровНоменклатуры.СрезПоследних КАК БлокировкаПроизводства
		ПО ВтНоменклатура.Номенклатура = БлокировкаПроизводства.Номенклатура
			И (БлокировкаПроизводства.Параметр = ЗНАЧЕНИЕ(ПланВидовХарактеристик.БИТ_СТ_ПериодическиеПараметрыНоменклатуры.БлокировкаПроизводства))
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.БИТ_НСИ_ЗначенияУникальныхРеквизитов КАК РеквизитВидНоменклатуры
		ПО ВтНоменклатура.Номенклатура = РеквизитВидНоменклатуры.Объект
			И (РеквизитВидНоменклатуры.Реквизит = ЗНАЧЕНИЕ(ПланВидовХарактеристик.БИТ_НСИ_УникальныеРеквизиты.ВидНоменклатуры))
			И (РеквизитВидНоменклатуры.Узел = &УзелERP)

Показать
Оставьте свое сообщение

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