Имя: Пароль:
1C
1С v8
Всю голову сломал. Что делает этот код? :)
0 akaBrr
 
22.10.14
15:28
ЗапросНом = Новый Запрос;
    ЗапросНом.Текст = "ВЫБРАТЬ
    |    СпрНом.Родитель,
    |    СпрНом.ЭтоГруппа,
    |    СпрНом.Код,
    |    СпрНом.Представление,
    |    СпрНом.Ссылка КАК Ссылка,
    |    СпрНом.Наименование,
    |    СпрНом.НаименованиеПолное,
    |    СпрНом.Артикул,
    |    СпрНом.ЕдиницаИзмерения,
    |    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Количество
    |ИЗ
    |    Справочник.Номенклатура КАК СпрНом
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОст, ) КАК ТоварыНаСкладахОстатки
    |        ПО СпрНом.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
    |ГДЕ
    |    СпрНом.ПометкаУдаления = ЛОЖЬ
    |"+?(ГруппаНоменклатуры.Количество()>0,"    И СпрНом.Ссылка В(&НомГруппа)","")+"
    |
    |УПОРЯДОЧИТЬ ПО
    |    Ссылка ИЕРАРХИЯ";
    
    ЗапросНом.УстановитьПараметр("ДатаОст",Объект.ДатаЦенОстатков);
    СписокНом = Новый СписокЗначений;
    Если ГруппаНоменклатуры.Количество()>0 Тогда
        ВыборкаНом = Справочники.Номенклатура.Выбрать();
        Пока ВыборкаНом.Следующий() Цикл
            Если ВыборкаНом.ЭтоГруппа Тогда
                СписокНом.Добавить(ВыборкаНом.Ссылка);    
            КонецЕсли;    
        КонецЦикла;
        Для Каждого ТекЗначение Из ГруппаНоменклатуры Цикл
            ВыборкаСписка = Справочники.Номенклатура.ВыбратьИерархически(ТекЗначение.Значение);
            Пока ВыборкаСписка.Следующий() Цикл
                СписокНом.Добавить(ВыборкаСписка.Ссылка);    
            КонецЦикла;    
        КонецЦикла;    
        
        ЗапросНом.УстановитьПараметр("НомГруппа",СписокНом);
    КонецЕсли;

ужас :)
1 Маратыч
 
22.10.14
15:31
А где выполнение самого запроса-то? О_о
2 Looser-1c
 
22.10.14
15:31
Судя по результату - ломает голову.
А судя по коду - разворачивает список групп в список номенклатуры
3 akaBrr
 
22.10.14
15:33
(1) там дальше тоже весело
4 mergan
 
22.10.14
15:36
я так понимаю, получает остатки номенклатуры с нулевыми остатками
5 akaBrr
 
22.10.14
15:37
(2) а зачем?
6 Sj
 
22.10.14
15:39
Запрос возвращает весь справочник номенклатуры с остатками.
При наличии групп фильтрует по группам.

СпрНом.Ссылка В( надо было бы написать СпрНом.Ссылка в иерархии( , тогда бы не пришлось писать то, что под

Если ГруппаНоменклатуры.Количество()>0 Тогда
7 akaBrr
 
22.10.14
15:41
(6) согласен, фишка в том что фильтр работать не будет потому что в списке ВСЕ группы номенклатуры

        ВыборкаНом = Справочники.Номенклатура.Выбрать();
        Пока ВыборкаНом.Следующий() Цикл
            Если ВыборкаНом.ЭтоГруппа Тогда
                СписокНом.Добавить(ВыборкаНом.Ссылка);    
            КонецЕсли;    
        КонецЦикла;
8 akaBrr
 
22.10.14
15:43
у меня этой травы еще есть
9 akaBrr
 
22.10.14
15:44
вооот

    Если Номенклатура.Количество() = 0 Тогда
        Выборка = Справочники.Номенклатура.Выбрать();
        Пока Выборка.Следующий() Цикл
            Если Выборка.ЭтоГруппа Тогда
                Продолжить;
            Иначе
                ЗапросКартинки = Новый Запрос("ВЫБРАТЬ
                |    НоменклатураПрисоединенныеФайлы.Ссылка
                |ИЗ
                |    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
                |ГДЕ
                |    НоменклатураПрисоединенныеФайлы.ВладелецФайла = &Номенклатура");
                ЗапросКартинки.УстановитьПараметр("Номенклатура",Выборка.Ссылка);                              
                ВыборКартинки = ЗапросКартинки.Выполнить().Выбрать();
                ИмяКартинки = "";
                Пока ВыборКартинки.Следующий() Цикл
                    //СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(ВыборКартинки.Ссылка,"ФайлХранилище");
                    
                    ИмяКартинки = СокрЛП(Выборка.Ссылка.Код)+"."+ВыборКартинки.Ссылка.Расширение;
                    //ПолучитьФайл(СсылкаНаФайлВИБ,Объект.ПутьККаталогу+"\"+ИмяКартинки,Ложь);
                    
                    ХранилищеФайла = РаботаСФайламиВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы( ВыборКартинки.Ссылка);
                    // ДвоичныеДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(Выборка.Ссылка, Неопределено).СсылкаНаДвоичныеДанныеФайла;
                    МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи();
                    МенеджерЗаписи.ПрисоединенныйФайл = ВыборКартинки.Ссылка;
                    МенеджерЗаписи.Прочитать();
                    ДвоичныеДанные = МенеджерЗаписи.ХранимыйФайл.Получить();
                    //Если ВыборКартинки.Ссылка.ФайлХранилище=Неопределено Тогда Продолжить КонецЕсли;
                    //ДвоичныеДанныеФайла = ВыборКартинки.Ссылка.ФайлХранилище.Получить();
                    Если  (ТипЗнч(ДвоичныеДанные)=Тип("Картинка")) или (ТипЗнч(ДвоичныеДанные)=Тип("ДвоичныеДанные")) Тогда
                        Попытка
                            ДвоичныеДанные.Записать(Объект.ПутьККаталогу+"\"+ИмяКартинки);
                        Исключение
                            Сообщить(ОписаниеОшибки());
                        КонецПопытки;     
                    КонецЕсли;    
                КонецЦикла;
                
            КонецЕсли;    
        КонецЦикла;
    Иначе
        СписокНом = Новый СписокЗначений;
        Для Каждого ТекНом Из Номенклатура Цикл
            Если ТекНом.Значение.ЭтоГруппа Тогда
                ВыборкаСписка = Справочники.Номенклатура.ВыбратьИерархически(ТекНом.Значение);
                Пока ВыборкаСписка.Следующий() Цикл
                    СписокНом.Добавить(ВыборкаСписка.Ссылка);    
                КонецЦикла;
            Иначе
                СписокНом.Добавить(ТекНом.Значение);
            КонецЕсли;    
        КонецЦикла;
        Для Каждого ТекЭлем Из СписокНом Цикл
            Если ТекЭлем.Значение.ЭтоГруппа Тогда
                Продолжить;
            Иначе
                ЗапросКартинки = Новый Запрос("ВЫБРАТЬ
                |    НоменклатураПрисоединенныеФайлы.Ссылка
                |ИЗ
                |    Справочник.НоменклатураПрисоединенныеФайлы КАК НоменклатураПрисоединенныеФайлы
                |ГДЕ
                |    НоменклатураПрисоединенныеФайлы.ВладелецФайла = &Номенклатура");
                ЗапросКартинки.УстановитьПараметр("Номенклатура",ТекЭлем.Значение);                              
                ВыборКартинки = ЗапросКартинки.Выполнить().Выбрать();
                ИмяКартинки = "";
                Пока ВыборКартинки.Следующий() Цикл
                    //СсылкаНаФайлВИБ = ПолучитьНавигационнуюСсылку(ВыборКартинки.Ссылка,"ФайлХранилище");
                    
                    ИмяКартинки = СокрЛП(ТекЭлем.Значение.Код)+"."+ВыборКартинки.Ссылка.Расширение;
                    //ПолучитьФайл(СсылкаНаФайлВИБ,Объект.ПутьККаталогу+"\"+ИмяКартинки,Ложь);
                    
                    //ХранилищеФайла = РаботаСФайламиВызовСервера.ПолучитьХранилищеФайлаИзИнформационнойБазы( ВыборКартинки.Ссылка);
                    // ДвоичныеДанныеФайла = ПрисоединенныеФайлы.ПолучитьДанныеФайла(Выборка.Ссылка, Неопределено).СсылкаНаДвоичныеДанныеФайла;
                    МенеджерЗаписи = РегистрыСведений.ПрисоединенныеФайлы.СоздатьМенеджерЗаписи();
                    МенеджерЗаписи.ПрисоединенныйФайл = ВыборКартинки.Ссылка;
                    МенеджерЗаписи.Прочитать();
                    ДвоичныеДанные = МенеджерЗаписи.ХранимыйФайл.Получить();
                    //Если ВыборКартинки.Ссылка.ФайлХранилище=Неопределено Тогда Продолжить КонецЕсли;
                    //ДвоичныеДанныеФайла = ВыборКартинки.Ссылка.ФайлХранилище.Получить();
                    Если  (ТипЗнч(ДвоичныеДанные)=Тип("Картинка")) или (ТипЗнч(ДвоичныеДанные)=Тип("ДвоичныеДанные"))  Тогда
                        Попытка
                            ДвоичныеДанные.Записать(Объект.ПутьККаталогу+"\"+ИмяКартинки);
                        Исключение
                            Сообщить(ОписаниеОшибки());
                        КонецПопытки;     
                    КонецЕсли;    
                КонецЦикла;
                
            КонецЕсли;    
    
        КонецЦикла;    
    КонецЕсли;
10 Sj
 
22.10.14
15:45
(7) а. тогда точно лажа. там надо накидывать только во втором обходе.
11 akaBrr
 
22.10.14
15:57
Продолжение первой части

ВыхФайл_ = Новый ТекстовыйДокумент;
    
    Выборка_ = ЗапросНом.Выполнить().Выгрузить();
    Для Каждого СтрокаВыборки_ Из Выборка_ Цикл
        Код_ = СтрокаВыборки_.Код;
        Если СтрокаВыборки_.Родитель.Пустая() Тогда
            КодРодителя_ = "";
        Иначе
            КодРодителя_ = СокрЛП(СтрокаВыборки_.Родитель.Код);
        КонецЕсли;
        
        Если СтрокаВыборки_.ЭтоГруппа Тогда
            Группа_ = "1";
            Наименование_ = СокрЛП(СтрокаВыборки_.Представление);
            Описание_ = "";
            ЦенаОпт_ = "0";
            ЦенаРозн_ = "0";
            ЦенаМелкийОпт_ = "0";
            Остаток_ = "0";
        Иначе
            Группа_ = "0";
            Наименование_ = СокрЛП(СтрокаВыборки_.Представление);
            Описание_ = СокрЛП(СтрокаВыборки_.НаименованиеПолное) + " " +?(ЗначениеЗаполнено(СокрЛП(СтрокаВыборки_.Артикул)),СокрЛП("("+СтрокаВыборки_.Артикул+")"),"");
            
            СтруктураПараметровОтбора = Новый Структура("Валюта, Дата, ВидЦены, Номенклатура,Характеристика, Упаковка");
            СтруктураПараметровОтбора.Вставить("Валюта",Объект.Валюта);
            СтруктураПараметровОтбора.Вставить("Дата",Объект.ДатаЦенОстатков);
            СтруктураПараметровОтбора.Вставить("ВидЦены",Объект.ТипЦенОпт);
            СтруктураПараметровОтбора.Вставить("Номенклатура",СтрокаВыборки_.Ссылка);
            СтруктураПараметровОтбора.Вставить("Характеристика",Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
            СтруктураПараметровОтбора.Вставить("Упаковка",Справочники.УпаковкиНоменклатуры.ПустаяСсылка());
            ЦенаОпт = ПродажиСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
            
            СтруктураПараметровОтбора = Новый Структура("Валюта, Дата, ВидЦены, Номенклатура,Характеристика, Упаковка");
            СтруктураПараметровОтбора.Вставить("Валюта",Объект.Валюта);
            СтруктураПараметровОтбора.Вставить("Дата",Объект.ДатаЦенОстатков);
            СтруктураПараметровОтбора.Вставить("ВидЦены",Объект.ТипЦенРозница);
            СтруктураПараметровОтбора.Вставить("Номенклатура",СтрокаВыборки_.Ссылка);
            СтруктураПараметровОтбора.Вставить("Характеристика",Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
            СтруктураПараметровОтбора.Вставить("Упаковка",Справочники.УпаковкиНоменклатуры.ПустаяСсылка());
            ЦенаРозн = ПродажиСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
            
            СтруктураПараметровОтбора = Новый Структура("Валюта, Дата, ВидЦены, Номенклатура,Характеристика, Упаковка");
            СтруктураПараметровОтбора.Вставить("Валюта",Объект.Валюта);
            СтруктураПараметровОтбора.Вставить("Дата",Объект.ДатаЦенОстатков);
            СтруктураПараметровОтбора.Вставить("ВидЦены",Объект.ТипЦенМелкийОпт);
            СтруктураПараметровОтбора.Вставить("Номенклатура",СтрокаВыборки_.Ссылка);
            СтруктураПараметровОтбора.Вставить("Характеристика",Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
            СтруктураПараметровОтбора.Вставить("Упаковка",Справочники.УпаковкиНоменклатуры.ПустаяСсылка());
            ЦенаМелкийОпт = ПродажиСервер.ПолучитьЦенуПоОтбору(СтруктураПараметровОтбора);
            
            
            ЦенаОпт_ = Формат(ЦенаОпт, "ЧН=0; ЧГ=0");
            ЦенаРозн_ = Формат(ЦенаРозн, "ЧН=0; ЧГ=0");
            ЦенаМелкийОпт_ = Формат(ЦенаМелкийОпт, "ЧН=0; ЧГ=0");
            Остаток_ = Формат(СтрокаВыборки_.Количество, "ЧН=0; ЧГ=0");
        КонецЕсли;
        
        ВыхФайл_.ДобавитьСтроку("===");
        ВыхФайл_.ДобавитьСтроку(Группа_);
        ВыхФайл_.ДобавитьСтроку(КодРодителя_);
        ВыхФайл_.ДобавитьСтроку(Код_);
        ВыхФайл_.ДобавитьСтроку(Наименование_);
        ВыхФайл_.ДобавитьСтроку(Описание_);
        ВыхФайл_.ДобавитьСтроку(ЦенаРозн_);
        ВыхФайл_.ДобавитьСтроку(ЦенаОпт_);
        ВыхФайл_.ДобавитьСтроку(ЦенаМелкийОпт_);
        ВыхФайл_.ДобавитьСтроку(Остаток_);
    КонецЦикла;
    
    ВыхФайл_.Записать(Объект.ФайлВыгрузки, КодировкаТекста.ANSI);
    
    Сообщить("Выгрузка завершена!");
2 + 2 = 3.9999999999999999999999999999999...