1. user1304317 23.03.20 16:29 Сейчас в теме

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

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

Показать



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

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

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


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


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

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

Показать
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Product Owner (Менеджер по продукту 1С)
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день

Тим лид по разработке 1С (Team Lead 1С)
Москва
зарплата от 100 000 руб. до 200 000 руб.
Полный день

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Программист 1С
Новосибирск
зарплата от 30 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день