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

Выбрать из иерархии справочника

Автор malvina_l, 20 мар 2014, 06:44

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

malvina_l

Задача: Заполнить реквизит справочника автоматически при выборе другого реквизита.
Проблема : нужно выбрать реквизит из иерархии во внешней обработке как обратиться?
вот начало:
Процедура КнопкаВыполнитьНажатие(Кнопка)
   Запрос= Новый Запрос;
   ТекстЗапроса="ВЫБРАТЬ
   |справочник.Ссылка
   |ИЗ
   |Справочник КАК Справочник";
   
   Запрос.Текст=ТекстЗапроса;
   Результат= Запрос.Выполнить().Выбрать();
   Пока Результат.Следующий() Цикл
   СпрОбъект = Результат.Ссылка.ПолучитьОбъект();
        
      Если СпрОбъект.реквизит="990003451" тогда
            
      СпрОбъект.реквизитКоторыйНадоЗаполнить="555";
      СпрОбъект.Записать();
   КонецЕсли;
   КонецЦикла;
   КонецПроцедуры

KrivosheevEV

Нет. Начало не правильное.
В текущем положении вы получаете все возможные элементы справочника, на каждый из них получаете объект, и сравниваете значение реквизита.
Намного правильнее было бы получить только один (или несколько) элемент, у которого "СпрОбъект.реквизит="990003451" и дальше уже работать с ним. Это нетрудно сделать в запросе, добавив конструкцию условий "ГДЕ" и передать в условие значение реквизита.

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

malvina_l

Цитата: KrivosheevEV от 20 мар 2014, 09:45
Нет. Начало не правильное.
В текущем положении вы получаете все возможные элементы справочника, на каждый из них получаете объект, и сравниваете значение реквизита.
Намного правильнее было бы получить только один (или несколько) элемент, у которого "СпрОбъект.реквизит="990003451" и дальше уже работать с ним. Это нетрудно сделать в запросе, добавив конструкцию условий "ГДЕ" и передать в условие значение реквизита.

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

А как его обозначить если "СпрОбъект.реквизит="990003451"-это номер группы из спарвочника с иерархией.
вот например далее после запроса:
Пока Результат.Следующий() Цикл
      
    СпрОбъект = Результат.Ссылка.ПолучитьОбъект();
   нг=СпрОбъект.реквизит;
     нг="990003451";
Если ЗначениеЗаполнено(нг) тогда
    СпрОбъект.РеквизитЗаполняемый=справочники.наимен.НайтиПоНаименованию("Наименование");
    СпрОбъект.Записать();
   КонецЕсли;
КонецЦикла;

mixqn

Цитата: malvina_l от 20 мар 2014, 10:06А как его обозначить если "СпрОбъект.реквизит="990003451"-это номер группы из спарвочника с иерархией.
а в чем конкретно проблема то?
в первом сообщении у вас написан код
Цитата: malvina_l от 20 мар 2014, 06:44Если СпрОбъект.реквизит="990003451" тогда
надо всего лишь это условие перенести в запрос. в чем сложность?
то есть если взять ваш первоначальный код, будет вот так:
Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос= Новый Запрос;
ТекстЗапроса="ВЫБРАТЬ
|Справочник.Ссылка
|ИЗ
| Справочник КАК Справочник
|ГДЕ
| Справочник.реквизит=&НужноеВамЗначение";

Запрос.УстановитьПараметр("НужноеВамЗначение", "990003451");

Запрос.Текст=ТекстЗапроса;
Результат= Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
СпрОбъект = Результат.Ссылка.ПолучитьОбъект();
СпрОбъект.реквизитКоторыйНадоЗаполнить="555";
СпрОбъект.Записать();
КонецЦикла;
КонецПроцедуры



Теги:

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

Рейтинг@Mail.ru

Поиск