Обход всех элементов справочника с одинаковым наименованием
Добрый день! Задача простая, но не могу понять как разрешить. Имеется справочник Характеристики номенклатуры, в нём из-за дублей пользователей есть много элементов с одинаковым наименованием и свойствами. Делаю обработку, которая в спецификации с определённой характеристикой номенклатуры должна поменять кол-во одного товара. Вопрос заключается в следующем: как обойти все элементы справочника Характеристик с одинаковым наименованием?
По теме из базы знаний
- Поиск повторяющихся элементов справочников
- Некоторые ошибки и «проблемные» особенности реализации встроенного языка платформы 1С:Предприятие 7.7
- Перенос данных из УПП 1.3 / КА 1.1 в БП 3. Переносятся документы, справочники и начальные остатки
- Замена GUID для объектов
- Перенос данных из БП 3.0 / БП 2.0 в УПП 1.3 / КА 1.1. Переносятся документы, остатки и справочники
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Вот такой код у меня сейчас пока что получился. Всё работает, но только применительно к одному элементу справочника
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Родитель", Объект.ГруппаНоменклатуры);
Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("НФ-00002472"));
Запрос.УстановитьПараметр("ХарактеристикаПродукции", Объект.Характеристика.Наименование);
Запрос.Текст =
"ВЫБРАТЬ
| Спецификации.Владелец КАК Владелец,
| Спецификации.Владелец.Родитель КАК ВладелецРодитель,
| Спецификации.Состав.(
| Номенклатура КАК Номенклатура,
| Количество КАК Количество
| ) КАК Состав,
| Спецификации.Ссылка КАК Ссылка,
| Спецификации.Код КАК Код,
| Спецификации.ХарактеристикаПродукции КАК ХарактеристикаПродукции
|ИЗ
| Справочник.Спецификации КАК Спецификации
|ГДЕ
| Спецификации.Владелец.Родитель = &Родитель
| И Спецификации.Состав.Номенклатура = &Номенклатура
| И Спецификации.ХарактеристикаПродукции = &ХарактеристикаПродукции";
Запрос = Запрос.Выполнить().Выбрать();
Пока Запрос.Следующий() Цикл
Спр = Запрос.Ссылка.ПолучитьОбъект();
Состав = Спр.Состав;
Для Каждого Стр из Состав Цикл
Если Стр.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("НФ-00002472") Тогда
Формула = Стр.Количество * Объект.Колво/100;
Стр.Количество = Стр.Количество + Формула;
КонецЕсли;
КонецЦикла;
Спр.Записать();
КонецЦикла;
ПоказатьПока Запрос.Следующий() Цикл
Спр = Запрос.Ссылка.ПолучитьОбъект();
Состав = Спр.Состав;
Для Каждого Стр из Состав Цикл
Если Стр.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("НФ-00002472") Тогда
Формула = Стр.Количество * Объект.Колво/100;
Стр.Количество = Стр.Количество + Формула;
КонецЕсли;
КонецЦикла;
Спр.Записать();
КонецЦикла;
Жесть. Запрос во вложенных циклах.
Что мешает назначить переменную:
НужныйЭлементНоменклатуры = Справочники.Номенклатура.НайтиПоКоду("НФ-00002472");
Пока Запрос.Следующий() Цикл
Спр = Запрос.Ссылка.ПолучитьОбъект();
Состав = Спр.Состав;
Для Каждого Стр из Состав Цикл
Если Стр.Номенклатура = НужныйЭлементНоменклатуры Тогда
Формула = Стр.Количество * Объект.Колво/100;
Стр.Количество = Стр.Количество + Формула;
КонецЕсли;
КонецЦикла;
Спр.Записать();
КонецЦикла;
Показать
Да, скорость.
НужныйЭлементНоменклатуры = Справочники.Номенклатура.НайтиПоКоду("НФ-00002472")
Запрос = Новый Запрос("ВЫБРАТЬ
| СпецификацииСостав.Ссылка КАК Ссылка
|ИЗ
| Справочник.Спецификации.Состав КАК СпецификацииСостав
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификации КАК Спецификации
| ПО СпецификацииСостав.Ссылка = Спецификации.Ссылка
|ГДЕ
| Спецификации.ХарактеристикаПродукции = &ХарактеристикаПродукции
| И СпецификацииСостав.Номенклатура = &Номенклатура
| И Спецификации.Владелец.Родитель = &Родитель
|
|СГРУППИРОВАТЬ ПО
| СпецификацииСостав.Ссылка");
Запрос.УстановитьПараметр("Родитель", Объект.ГруппаНоменклатуры);
Запрос.УстановитьПараметр("ХарактеристикаПродукции", Объект.Характеристика.Наименование);
Запрос.УстановитьПараметр("Номенклатура", НужныйЭлементНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Спр = Выборка.Ссылка.ПолучитьОбъект();
Для каждого Линия из Спр.Состав цикл
Если Линия.Номенклатура = НужныйЭлементНоменклатуры тогда
Линия.Количество = Линия.Количество * (1+ Объект.Колво/100);
КонецЕсли;
КонецЦикла;
Спр.Записать();
КонецЦикла;
Показать
(1)
Код (2) не решает эту задачу.
вот текст запроса, который находит все записи таблицы с повторяющимся полем.
... как обойти все элементы справочника Характеристик с одинаковым наименованием...
Код (2) не решает эту задачу.
Запрос.Текст=
"ВЫБРАТЬ
| ХарактеристикиНоменклатуры.Наименование,
| ХарактеристикиНоменклатуры.Ссылка
|ПОМЕСТИТЬ ВТХарактеристики
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| Характеристики.Наименование,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Характеристики.Ссылка) КАК КоличествоЗаписей
|ПОМЕСТИТЬ ВТДублиНаименований
|ИЗ
| ВТХарактеристики КАК Характеристики
|
|СГРУППИРОВАТЬ ПО
| Характеристики.Наименование
|
|ИМЕЮЩИЕ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Характеристики.Ссылка) > 1
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ВТХарактеристики.Наименование,
| ВТХарактеристики.Ссылка
|ИЗ
| ВТДублиНаименований КАК ВТДублиНаименований
| ЛЕВОЕ СОЕДИНЕНИЕ ВТХарактеристики КАК ВТХарактеристики
| ПО ВТХарактеристики.Наименование = ВТДублиНаименований.Наименование"
Показатьвот текст запроса, который находит все записи таблицы с повторяющимся полем.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот