Имя: Пароль:
1C
1С v8
Выборка всех элементов иерархического справочника
,
0 zarel
 
21.08.12
14:50
Добрый день!
Есть обработка, в которой есть выборка элементов из группы иерархического справочника.
Вопрос - как сделать выборку всех элементов из иерархического справочника ?
Заранее благодарен.

Вот код процедуры запроса:


Процедура ОсновныеДействияФормыОсновныеДействияФормыВыгрузить(Кнопка)
   
   Если ГруппаНоменклатуры.Пустая() Тогда
       Предупреждение("Не выбрана группа!");
       Возврат;
   КонецЕсли;
   
   ТекДата = ТекущаяДата();
   
   Запрос = Новый Запрос;
   Запрос.УстановитьПараметр("ТекДата", ТекДата);
   
   Запрос.Текст =
   "ВЫБРАТЬ
   |    СпрНоменклатура.Ссылка КАК Номенклатура,
   |    ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры КАК Спецификация
   |ПОМЕСТИТЬ ТабГотоваяПродукция
   |ИЗ
   |    Справочник.Номенклатура КАК СпрНоменклатура
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(
   |                &ТекДата,
   |                Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
   |                    И СпецификацияНоменклатуры.Активная
   |                    И СпецификацияНоменклатуры.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОбъектов.Утвержден)) КАК ОсновныеСпецификацииНоменклатурыСрезПоследних
   |        ПО (ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура = СпрНоменклатура.Ссылка)
   |ГДЕ
   |    СпрНоменклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
   |    И (НЕ СпрНоменклатура.ЭтоГруппа)
   |    И (НЕ СпрНоменклатура.ПометкаУдаления)
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ТабГотоваяПродукция.Номенклатура.Наименование КАК Наименование,
   |    ТабГотоваяПродукция.Номенклатура.Код КАК Код
   |ИЗ
   |    ТабГотоваяПродукция КАК ТабГотоваяПродукция
   |ГДЕ
   |    ТабГотоваяПродукция.Спецификация ЕСТЬ NULL
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ТабГотоваяПродукция.Номенклатура
   |ИЗ
   |    ТабГотоваяПродукция КАК ТабГотоваяПродукция
   |ГДЕ
   |    (НЕ ТабГотоваяПродукция.Спецификация ЕСТЬ NULL )
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ТабГотоваяПродукция.Спецификация КАК Спецификация
   |ИЗ
   |    ТабГотоваяПродукция КАК ТабГотоваяПродукция
   |ГДЕ
   |    (НЕ ТабГотоваяПродукция.Спецификация ЕСТЬ NULL )";
   
   Запрос.УстановитьПараметр("ГруппаНоменклатуры", ГруппаНоменклатуры);
   
   Результат = Запрос.ВыполнитьПакет();
   
   Выборка = Результат[1].Выбрать();
   Пока Выборка.Следующий() Цикл
       Сообщить("У номенклатуры - готовой продукции """+Выборка.Наименование+""" ("+СокрЛП(Выборка.Код)+") не задана активная утвержденная основная спецификация на "+Формат(ТекДата, "ДФ=dd.MM.yyyy"));
   КонецЦикла;
   
   СписокНоменклатуры = Результат[2].Выгрузить().ВыгрузитьКолонку("Номенклатура");
   СписокСпецификаций = Результат[3].Выгрузить().ВыгрузитьКолонку("Спецификация");
   
   СписокПолуфабрикатовБезСпецификации = Новый Массив;
   СписокПолуфабрикатов = Новый Массив;
   
   Запрос.Текст =
   "ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура
   |ИЗ
   |    Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
   |ГДЕ
   |    СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка В(&СписокСпецификаций)
   |    И СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура.ВидВоспроизводства <> ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.Производство)
   |    И (НЕ СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура.ПометкаУдаления)
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура,
   |    ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры
   |ПОМЕСТИТЬ ТабПолуфабрикаты
   |ИЗ
   |    Справочник.СпецификацииНоменклатуры.ИсходныеКомплектующие КАК СпецификацииНоменклатурыИсходныеКомплектующие
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(&ТекДата, ) КАК ОсновныеСпецификацииНоменклатурыСрезПоследних
   |        ПО СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура = ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура
   |            И (ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры.Активная)
   |            И (ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОбъектов.Утвержден))
   |            И СпецификацииНоменклатурыИсходныеКомплектующие.ХарактеристикаНоменклатуры = ОсновныеСпецификацииНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры
   |ГДЕ
   |    СпецификацииНоменклатурыИсходныеКомплектующие.Ссылка В(&СписокСпецификаций)
   |    И СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура.ВидВоспроизводства = ЗНАЧЕНИЕ(Перечисление.ВидыВоспроизводстваНоменклатуры.Производство)
   |    И (НЕ СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура В (&СписокПолуфабрикатов))
   |    И (НЕ СпецификацииНоменклатурыИсходныеКомплектующие.Номенклатура.ПометкаУдаления)
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ТабПолуфабрикаты.Номенклатура
   |ИЗ
   |    ТабПолуфабрикаты КАК ТабПолуфабрикаты
   |ГДЕ
   |    ТабПолуфабрикаты.СпецификацияНоменклатуры ЕСТЬ NULL
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ТабПолуфабрикаты.СпецификацияНоменклатуры
   |ИЗ
   |    ТабПолуфабрикаты КАК ТабПолуфабрикаты
   |ГДЕ
   |    (НЕ ТабПолуфабрикаты.СпецификацияНоменклатуры ЕСТЬ NULL )
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ РАЗЛИЧНЫЕ
   |    ТабПолуфабрикаты.Номенклатура
   |ИЗ
   |    ТабПолуфабрикаты КАК ТабПолуфабрикаты
   |ГДЕ
   |    (НЕ ТабПолуфабрикаты.СпецификацияНоменклатуры ЕСТЬ NULL )";
   
   Пока СписокСпецификаций.Количество() > 0 Цикл
       
       Запрос.УстановитьПараметр("СписокСпецификаций", СписокСпецификаций);
       Запрос.УстановитьПараметр("СписокПолуфабрикатов", СписокПолуфабрикатов);
       
       Результат = Запрос.ВыполнитьПакет();
       
       Выборка = Результат[0].Выбрать();
       Пока Выборка.Следующий() Цикл
           СписокНоменклатуры.Добавить(Выборка.Номенклатура);
       КонецЦикла;
       
       Выборка = Результат[2].Выбрать();
       Пока Выборка.Следующий() Цикл
           СписокПолуфабрикатовБезСпецификации.Добавить(Выборка.Номенклатура);
       КонецЦикла;
       
       СписокСпецификаций = Результат[3].Выгрузить().ВыгрузитьКолонку("СпецификацияНоменклатуры");
       
       Выборка = Результат[4].Выбрать();
       Пока Выборка.Следующий() Цикл
           СписокПолуфабрикатов.Добавить(Выборка.Номенклатура);
       КонецЦикла;
       
   КонецЦикла;
   
   ОбщегоНазначения.УдалитьПовторяющиесяЭлементы(СписокПолуфабрикатовБезСпецификации);
   
   Для Каждого Полуфабрикат Из СписокПолуфабрикатовБезСпецификации Цикл
       Сообщить("У номенклатуры - полуфабриката """+Полуфабрикат.Наименование+""" ("+СокрЛП(Полуфабрикат.Код)+") не задана активная утвержденная основная спецификация на "+Формат(ТекДата, "ДФ=dd.MM.yyyy"));
   КонецЦикла;
   
   Текст = Новый ТекстовыйДокумент;
   
   Текст.ДобавитьСтроку("id_voc_good" + Разделитель +
                        "code" + Разделитель +
                        "code_eop" + Разделитель +
                        "id_voc" + Разделитель +
                        "code" + Разделитель +
                        "label" + Разделитель +
                        "no_draw" + Разделитель +
                        "param1" + Разделитель +
                        "param2" + Разделитель +
                        "param3" + Разделитель +
                        "param4" + Разделитель +
                        "mark" + Разделитель +
                        "weight" + Разделитель +
                        "add_request" + Разделитель +
                        "no" + Разделитель +
                        "no1" + Разделитель +
                        "del" + Разделитель +
                        "is_own" + Разделитель +
                        "main" + Разделитель +
                        "note" + Разделитель +
                        "serial");
                       
   Запрос.Текст =
   "ВЫБРАТЬ
   |    СпрНоменклатура.КодЭлюдия,
   |    СпрНоменклатура.КодЕОП,
   |    СпрНоменклатура.НаименованиеПолное,
   |    ВЫБОР
   |        КОГДА СпрНоменклатура.ВидВоспроизводства = &Производство
   |            ТОГДА " + ?(ИспользоватьСвойство, "ЗначенияСвойствОбъектов.Значение", "СпрНоменклатура.Артикул") + "
   |        ИНАЧЕ """"
   |    КОНЕЦ КАК ЧертежныйНомер,
   |    СпрНоменклатура.Код,
   |    ВЫБОР
   |        КОГДА СпрНоменклатура.ВидВоспроизводства = &Производство
   |            ТОГДА 1
   |        ИНАЧЕ 0
   |    КОНЕЦ КАК is_own
   |ИЗ
   |    Справочник.Номенклатура КАК СпрНоменклатура" + ?(ИспользоватьСвойство, "
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
   |        ПО СпрНоменклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
   |            И (ЗначенияСвойствОбъектов.Свойство = &СвойствоЧертежныйНомер)", "") + "
   |ГДЕ
   |    СпрНоменклатура.Ссылка В(&СписокНоменклатуры)";
   
   Запрос.УстановитьПараметр("Производство", Перечисления.ВидыВоспроизводстваНоменклатуры.Производство);
   Запрос.УстановитьПараметр("СвойствоЧертежныйНомер", СвойствоЧертежныйНомер);
   Запрос.УстановитьПараметр("СписокНоменклатуры", СписокНоменклатуры);
   
   Выборка = Запрос.Выполнить().Выбрать();
   Количество = Выборка.Количество();
   й = 0;
   Пока Выборка.Следующий() Цикл
       
       Если ЗначениеЗаполнено(Выборка.КодЭлюдия) И ЗначениеЗаполнено(Выборка.КодЕОП) Тогда
           Продолжить;
       КонецЕсли;
       
       Текст.ДобавитьСтроку(Формат(Выборка.КодЭлюдия, "ЧГ=0") + Разделитель +                    //id_voc_good
                            "" + Разделитель +                                                    //code
                            Выборка.КодЕОП + Разделитель +                                        //code_eop
                            ?(ЗначениеЗаполнено(Выборка.КодЕОП), 482, 0) + Разделитель +        //id_voc
                            "" + Разделитель +                                                    //code
                            Выборка.НаименованиеПолное + Разделитель +                            //label
                            Выборка.ЧертежныйНомер + Разделитель +                                //no_draw
                            "" + Разделитель +                                                    //param1
                            "" + Разделитель +                                                    //param2
                            "" + Разделитель +                                                    //param3
                            "" + Разделитель +                                                    //param4
                            "" + Разделитель +                                                    //mark
                            "" + Разделитель +                                                    //weight
                            "" + Разделитель +                                                    //add_request
                            СокрЛП(Выборка.Код) + Разделитель +                                //no
                            СокрЛП(Выборка.Код) + Разделитель +                                //no1
                            0 + Разделитель +                                                    //del
                            Выборка.is_own + Разделитель +                                        //is_own
                            1 + Разделитель +                                                    //main
                            "" + Разделитель +                                                    //note
                            1);                                                                //serial
                           
       й = й + 1;
       Состояние("Выгрузка номенклатуры в файл: " + Окр(й / Количество * 100) + "%");
       
   КонецЦикла;
   
   ВыбранныйФайл = Новый Файл(ИмяФайла);
   Если ВыбранныйФайл.Существует() Тогда
       
       Если Вопрос("Файл """+ИмяФайла+""" уже существует. Перезаписать?", РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да) = КодВозвратаДиалога.Нет Тогда
           Возврат;
       КонецЕсли;
       
   КонецЕсли;
   
   Текст.Записать(ИмяФайла, КодировкаТекста.ANSI);
   Предупреждение("Выгрузка завершена");
   
КонецПроцедуры
1 DrShad
 
21.08.12
14:50
кто все это читать будет?
2 1C-band
 
21.08.12
14:51
Запросом.
3 Maxus43
 
21.08.12
14:52
в этом запросе убрать все условия на ГруппаНоменклатуры, поидее всё соберёт  
"ВЫБРАТЬ
   |    СпрНоменклатура.Ссылка КАК Номенклатура,
   |    ОсновныеСпецификацииНоменклатурыСрезПоследних.СпецификацияНоменклатуры КАК Спецификация
   |ПОМЕСТИТЬ ТабГотоваяПродукция
   |ИЗ
   |    Справочник.Номенклатура КАК СпрНоменклатура
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОсновныеСпецификацииНоменклатуры.СрезПоследних(
   |                &ТекДата,
   |                Номенклатура В ИЕРАРХИИ (&ГруппаНоменклатуры)
   |                    И СпецификацияНоменклатуры.Активная
   |                    И СпецификацияНоменклатуры.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияОбъектов.Утвержден)) КАК ОсновныеСпецификацииНоменклатурыСрезПоследних
   |        ПО (ОсновныеСпецификацииНоменклатурыСрезПоследних.Номенклатура = СпрНоменклатура.Ссылка)
   |ГДЕ
   |    СпрНоменклатура.Ссылка В ИЕРАРХИИ(&ГруппаНоменклатуры)
   |    И (НЕ СпрНоменклатура.ЭтоГруппа)
   |    И (НЕ СпрНоменклатура.ПометкаУдаления)
4 zarel
 
21.08.12
15:00
Maxus43, спасибо, сейчас буду пробовать...
5 vicof
 
21.08.12
15:04
И убрать условия на не этогруппа
6 Maxus43
 
21.08.12
15:08
(5) а зачем ему группы выбирать? по ним всё равно нет спецификаций и товаров в дальнейшем
7 Eugene_life
 
21.08.12
15:09
А я бы сделал через Выгрузка = Справочники.Номенклатура.ВыбратьИерархически();
8 zarel
 
21.08.12
15:12
Какой тип данных должно иметь поле ввода для справочника "номенклатура" ?
СправочникСсылка или ЛюбаяСсылка ?
9 Maxus43
 
21.08.12
15:13
О_о
10 Eugene_life
 
21.08.12
15:13
По ходу, тут рождается супер-выгрузка :)
11 zarel
 
21.08.12
15:15
Вот так выглядит форма :
http://savepic.su/2333523.htm
12 Eugene_life
 
21.08.12
15:16
(11) Красота. Очень нужная обработка.
13 zarel
 
21.08.12
15:17
Ну кому то она явно не нужна, но мне нужна ))
Вот реквизиты формы:
http://savepic.su/2317139.htm
14 Maxus43
 
21.08.12
15:18
(13) где связь между Темой и тем что тебе сейчас надо? при чем тут форма? реквизит где должен какой тип иметь?
15 vicof
 
21.08.12
15:19
(6) он просил всю номенклатуру
16 zarel
 
21.08.12
15:30
обработка выводит только элементы группы, а нужно чтобы выводились все элементы иерархического справочника, вот я и незнаю как это правильно сделать...
Программист всегда исправляет последнюю ошибку.