Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
13 дек 2024, 16:45

ПолучитьОбъект() и табличная часть справочника

Автор 3030, 16 апр 2013, 15:13

0 Пользователей и 1 гость просматривают эту тему.

3030

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

3030

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


Поправьте меня, если есть решение более изящное, буду благодарен.

lobster13

Так а не проще было по тому же условию получить список элементов (ссылок) справочника,сгруппировав их. Затем по циклу идем получаем объект и выполняем условие
Для Каждого Строка ИЗ Объект.ВспомогательныеМатериалы ЦИКЛ
                 ЕСЛИ Строка.Номенклатура = ЧтоИщем Тогда
                 Строка.Номенклатура = НаЧтоМеняем;
                 Объект.Записать();
                 КонецЕсли;
             КонецЦикла;

Все равно чтобы что-то изменить нужно получить объект.
А вообще, судя по условиям отбора я бы не заморачивался, а использовал обработку Универсальный подбор и обработка объектов, там есть Произвольные алгоритмы, где нужно можно вставить даннный фрагмент и все выполнить - меньше писанины :)

Теги: 8.1 

Похожие темы (5)

Рейтинг@Mail.ru

Поиск