Обход всех элементов справочника с одинаковым наименованием

1. AleksandrLeshkov 05.11.21 08:35 Сейчас в теме +1 $m
Добрый день! Задача простая, но не могу понять как разрешить. Имеется справочник Характеристики номенклатуры, в нём из-за дублей пользователей есть много элементов с одинаковым наименованием и свойствами. Делаю обработку, которая в спецификации с определённой характеристикой номенклатуры должна поменять кол-во одного товара. Вопрос заключается в следующем: как обойти все элементы справочника Характеристик с одинаковым наименованием?
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AleksandrLeshkov 05.11.21 08:36 Сейчас в теме
(1) Вот такой код у меня сейчас пока что получился. Всё работает, но только применительно к одному элементу справочника

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Родитель", Объект.ГруппаНоменклатуры);
	Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("НФ-00002472"));
	Запрос.УстановитьПараметр("ХарактеристикаПродукции", Объект.Характеристика.Наименование);
	Запрос.Текст = 	
	"ВЫБРАТЬ
	|	Спецификации.Владелец КАК Владелец,
	|	Спецификации.Владелец.Родитель КАК ВладелецРодитель,
	|	Спецификации.Состав.(
	|		Номенклатура КАК Номенклатура,
	|		Количество КАК Количество
	|	) КАК Состав,
	|	Спецификации.Ссылка КАК Ссылка,
	|	Спецификации.Код КАК Код,
	|	Спецификации.ХарактеристикаПродукции КАК ХарактеристикаПродукции
	|ИЗ
	|	Справочник.Спецификации КАК Спецификации
	|ГДЕ
	|	Спецификации.Владелец.Родитель = &Родитель
	|	И Спецификации.Состав.Номенклатура = &Номенклатура
	|	И Спецификации.ХарактеристикаПродукции = &ХарактеристикаПродукции";
	Запрос = Запрос.Выполнить().Выбрать();
	
		
	Пока Запрос.Следующий() Цикл
		Спр = Запрос.Ссылка.ПолучитьОбъект();
		Состав = Спр.Состав;
		
		Для Каждого Стр из Состав Цикл
			Если Стр.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("НФ-00002472") Тогда
				Формула = Стр.Количество * Объект.Колво/100;
				Стр.Количество = Стр.Количество + Формула;
			КонецЕсли;
			КонецЦикла;
		Спр.Записать();
		КонецЦикла;
Показать
3. KonecEsli 1 05.11.21 09:10 Сейчас в теме
(2)
Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("НФ-00002472"));


Ну вы же сами определили параметр.
4. AleksandrLeshkov 05.11.21 09:11 Сейчас в теме
(3)Это я для другого сделал, оно нигде не используется
5. dehro 7 05.11.21 09:41 Сейчас в теме

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

Для Каждого Стр из Состав Цикл
Если Стр.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("НФ-00002472") Тогда
Формула = Стр.Количество * Объект.Колво/100;
Стр.Количество = Стр.Количество + Формула;
КонецЕсли;
КонецЦикла;
Спр.Записать();
КонецЦикла;
Показать


Жесть. Запрос во вложенных циклах.
Что мешает назначить переменную:
НужныйЭлементНоменклатуры = Справочники.Номенклатура.НайтиПоКоду("НФ-00002472");

Пока Запрос.Следующий() Цикл
        Спр = Запрос.Ссылка.ПолучитьОбъект();
        Состав = Спр.Состав;
        
        Для Каждого Стр из Состав Цикл
            Если Стр.Номенклатура = НужныйЭлементНоменклатуры Тогда
                Формула = Стр.Количество * Объект.Колво/100;
                Стр.Количество = Стр.Количество + Формула;
            КонецЕсли;
            КонецЦикла;
        Спр.Записать();
        КонецЦикла;

Показать
6. AleksandrLeshkov 05.11.21 09:56 Сейчас в теме
(5)А почему так нельзя? Скорость падает?
7. dehro 7 05.11.21 10:29 Сейчас в теме
Да, скорость.

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

Показать
AleksandrLeshkov; +1 Ответить
8. AleksandrLeshkov 05.11.21 10:42 Сейчас в теме
(7) Спасибо! А как применить это действие ко всем дублям одной характеристики номенклатуры? Как в запросе выбрать дубли я знаю, но как перебрать их здесь не понимаю
9. starik-2005 3082 05.11.21 12:31 Сейчас в теме
(8) выбиракте дубли, используете итоги в хапросе, дальше вложенные цикды - сверху номенкдатура, внутри дубли характеристик. Ну и отсортировать по наименованию характеристики, чтобы дубли не были в разнобой...
10. AleksandrLeshkov 05.11.21 12:33 Сейчас в теме
(9)Т.е. вложенным запросом надо отобрать дубли из Характеристики номенклатуры?
11. dehro 7 05.11.21 15:36 Сейчас в теме
(1)
... как обойти все элементы справочника Характеристик с одинаковым наименованием...


Код (2) не решает эту задачу.

Запрос.Текст=
"ВЫБРАТЬ
|	ХарактеристикиНоменклатуры.Наименование,
|	ХарактеристикиНоменклатуры.Ссылка
|ПОМЕСТИТЬ ВТХарактеристики
|ИЗ
|	Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	Характеристики.Наименование,
|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Характеристики.Ссылка) КАК КоличествоЗаписей
|ПОМЕСТИТЬ ВТДублиНаименований
|ИЗ
|	ВТХарактеристики КАК Характеристики
|
|СГРУППИРОВАТЬ ПО
|	Характеристики.Наименование
|
|ИМЕЮЩИЕ
|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Характеристики.Ссылка) > 1
|;
|
|////////////////////////////////////////////////////////////­////////////////////
|ВЫБРАТЬ
|	ВТХарактеристики.Наименование,
|	ВТХарактеристики.Ссылка
|ИЗ
|	ВТДублиНаименований КАК ВТДублиНаименований
|		ЛЕВОЕ СОЕДИНЕНИЕ ВТХарактеристики КАК ВТХарактеристики
|		ПО ВТХарактеристики.Наименование = ВТДублиНаименований.Наименование"

Показать


вот текст запроса, который находит все записи таблицы с повторяющимся полем.
Оставьте свое сообщение

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