Имя: Пароль:
1C
 
Запрос регистра сведений
, ,
0 Deahianaianyrto
 
22.08.14
10:57
Есть непериодический регистр сведений Измерение: ГруппаНоменклатуры, ресурс: ВидЦен
Есть Товар. Необходимо определить ВидЦен для соответствующей группы номенклатуры (в иерархии)
Как задать запрос?
1 User_Agronom
 
22.08.14
11:00
Запрос = новый Запрос;
Запрос.Текст = "тут пишешь текст запроса";
Запрос.УстановитьПараметр("ГруппаНоменклатуры", ЯХЗКакУТебяЭтоБудетОпределятся);
Выборка = Запрос.Выполнить().Выбрать();
2 Deahianaianyrto
 
22.08.14
11:02
Да нет, параметр - товар, а в регистре сведений ГруппыНоменклатуры и ВидыЦен.
Надо подобрать из какой группы товар и получить соответствующий ВидЦены
3 ale-sarin
 
22.08.14
11:04
(2) Родитель. Только помните, что у родителя тоже родитель может быть.
4 Deahianaianyrto
 
22.08.14
11:10
В том то и дело много родителей
Как условие поставить на товар в группе?
5 User_Agronom
 
22.08.14
11:10
(2) Ну так измени:
Запрос = новый Запрос;
Запрос.Текст = "тут пишешь текст запроса";
Запрос.УстановитьПараметр("Товар", ЯХЗКакУТебяЭтоБудетОпределятся);
Выборка = Запрос.Выполнить().Выбрать();

Делов то :)
6 Deahianaianyrto
 
22.08.14
11:10
(5) А как в запросе поставить условие что товар в группе?
7 MaXpaT
 
22.08.14
11:12
(6) Где Таблица.Номенклатура В ИЕРАРХИИ (&Товар)
8 Deahianaianyrto
 
22.08.14
11:14
(7) А так будет работать? Ведь по идее наоборот Товар в Иерархии Группа
9 User_Agronom
 
22.08.14
11:17
Группы = Новый Массив;
ТоварЗапомнить = Товар;
Пока ТоварЗапоминить.Родитель <> Справочник.Номенклатура.Пустая Ссылка цикл
  Группы.Добавить(товарЗапомнить.Родитель);
  ТоварЗапоминить = ТоварЗапоминить.Родитель;
КонецЦикла;

И этот массив передавай параметром.
10 hhhh
 
22.08.14
11:19
(8) (ВЫБРАТЬ Ссылка Из Справочник.Номенклатура КАК НОменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСВедений.Цены КАК  Цены
ПО НОменклатура.РОдитель = Цены.ГРуппаНоменклатуры
ИЛИ НОменклатура.РОдитель.РОдитель = Цены.ГРуппаНоменклатуры
ИЛИ НОменклатура.РОдитель.РОдитель.РОдитель = Цены.ГРуппаНоменклатуры
ИЛИ НОменклатура.РОдитель.РОдитель.РОдитель.РОдитель = Цены.ГРуппаНоменклатуры
ИЛИ НОменклатура.РОдитель.РОдитель.РОдитель.РОдитель.РОдитель = Цены.ГРуппаНоменклатуры
ИЛИ НОменклатура.РОдитель.РОдитель.РОдитель.РОдитель.РОдитель.РОдитель = Цены.ГРуппаНоменклатуры
11 User_Agronom
 
22.08.14
11:21
(10) И выпал в ошибку. Ты же не знаешь сколько уровней брать?
12 MaXpaT
 
22.08.14
11:24
посмотри аналог в типовой бухии 2.0
общиймодуль.БухгалтерскийУчет.ПолучитьСчетаУчетаНоменклатуры()

там это сделано примерно как в (10)
    СписокГрупп = ОбщегоНазначения.ПолучитьСписокВышестоящихГрупп(Номенклатура);

Функция ПолучитьСписокВышеСтоящихГрупп(ЭлементСправочника) Экспорт
    
    Результат = Новый Массив;        
    
    Если НЕ ЗначениеЗаполнено(ЭлементСправочника) Тогда
        Возврат Результат;
    КонецЕсли;
    
    МетаданныеСправочника = ЭлементСправочника.Метаданные();
    Если НЕ МетаданныеСправочника.Иерархический Тогда
        Возврат Результат;
    КонецЕсли;
    ИмяСправочника = МетаданныеСправочника.Имя;    
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Справочник1.Родитель КАК Родитель1,
    |    Справочник2.Родитель КАК Родитель2,
    |    Справочник3.Родитель КАК Родитель3,
    |    Справочник4.Родитель КАК Родитель4,
    |    Справочник5.Родитель КАК Родитель5
    |ИЗ
    |    Справочник." + ИмяСправочника + " КАК Справочник1
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник2
    |        ПО (Справочник2.Ссылка = Справочник1.Родитель)
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник3
    |        ПО (Справочник3.Ссылка = Справочник2.Родитель)
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник4
    |        ПО (Справочник4.Ссылка = Справочник3.Родитель)
    |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник." + ИмяСправочника + " КАК Справочник5
    |        ПО (Справочник5.Ссылка = Справочник4.Родитель)
    |ГДЕ
    |    Справочник1.Ссылка = &Ссылка";
    
    ТекущийЭлемент = ЭлементСправочника;
    
    Пока ЗначениеЗаполнено(ТекущийЭлемент) Цикл        
        Запрос.УстановитьПараметр("Ссылка", ТекущийЭлемент);
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Следующий() Тогда
            Для Индекс = 1 по 5 Цикл
                ТекущийЭлемент = Выборка["Родитель" + Индекс];
                Если ЗначениеЗаполнено(ТекущийЭлемент) Тогда
                    Результат.Добавить(ТекущийЭлемент);
                Иначе
                    Прервать;
                КонецЕсли;                
            КонецЦикла;
        Иначе
            ТекущийЭлемент = Неопределено;
        КонецЕсли;
    КонецЦикла;    
    
    Возврат Результат;
    
КонецФункции
13 MaXpaT
 
22.08.14
11:25
ну или как в (9) по-сути тоже самое, выполняться немного дольше будет, зато текста поменьше
14 anatoly
 
22.08.14
11:30
(10) рукалицо...
В ИЕРАРХИИ некошерно?
(8) да - наоборот, просто поменять местами поле и параметр в той строке
15 Deahianaianyrto
 
22.08.14
11:34
(9)
    Группы = Новый Массив;
    ТоварЗапомнить = Товар;
    Пока ТоварЗапомнить.Родитель <> Справочники.Номенклатура.ПустаяСсылка() Цикл
        Группы.Добавить(ТоварЗапомнить.Родитель);
        ТоварЗапоминить = ТоварЗапомнить.Родитель;
    КонецЦикла;

Даёт бесконечный цикл
16 Deahianaianyrto
 
22.08.14
11:38
(14) Говорит что некорректное условие (если поменять местами)
17 User_Agronom
 
22.08.14
11:39
(15) А глазки разуть? Самому?
18 User_Agronom
 
22.08.14
11:48
Похоже не получается:

    
Группы = Новый Массив;
ТоварЗапомнить = Товар;
Пока ТоварЗапомнить.Родитель <> Справочники.Номенклатура.ПустаяСсылка() Цикл
    Группы.Добавить(ТоварЗапомнить.Родитель);
    ТоварЗапомнить = ТоварЗапомнить.Родитель;
КонецЦикла;
    
Сообщить("найдено "+Группы.Количество()+" элементов");


Работает код
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс