Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Нужна помощь. Сделать выборку товаров с последними ценами и остатками в УТ11

Нужна помощь. Сделать выборку товаров с последними ценами и остатками в УТ11
Я
   Junker
 
09.07.21 - 17:33
Раньше кодил на 1с7, в 1с8 никак разобраться не могу, сижу уже несколько дней. УТ11.
Гуглил, вроде все правильно, но не работает, все ругается на параметры.


    Цены    = РегистрыСведений.ЦеныНоменклатуры;
    Ост    = РегистрыНакопления.ТоварыНаСкладах;
    
    ВыбСпр    = Справочники.Номенклатура.Выбрать();
    Пока ВыбСпр.Следующий() Цикл
        
        ОтборЦен = Новый Структура;    
        ОтборЦен.Вставить("Номенклатура", ВыбСпр.ПолучитьОбъект());
        ОтборЦен.Вставить("ВидЦены", ВидыЦен);  // из формы
        
        РегЦен = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен);
        
        
        ОтборОст = Новый Структура;
        ОтборОст.Вставить("Номенклатура", ВыбСпр.ПолучитьОбъект());
        ОтборОст.Вставить("Склад", Склад);  // из формы
        
        РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии");
        
        
        Сообщить(ВыбСпр.Наименование);
                
        Сообщить(РегЦен.Цена);
        Сообщить(РегОст.Количество());
        
    КонецЦикла;
   lubitelxml
 
1 - 09.07.21 - 17:44
Напиши лучше запросом
   Kassern
 
2 - 09.07.21 - 17:51
(0) сразу видно семерочный подход))
   saaken
 
3 - 09.07.21 - 17:51
замени ПолучитьОбъект() на ссылка
   Kassern
 
4 - 09.07.21 - 17:52
(2) и да воспользуйся советом из (1) и сделай уже простой запрос к регистру остатков/резервов/цены
   Kassern
 
5 - 09.07.21 - 17:53
(4) в твоем способе нет учета резервов, товары со склада спишутся только при реализации, лучше к регистру свободных остатков обращайся.
   Junker
 
6 - 11.07.21 - 22:10
Спасибо за подсказки. Немного исправил и все заработало.

    Цены    = РегистрыСведений.ЦеныНоменклатуры;
    Ост    = РегистрыНакопления.ТоварыНаСкладах;
    
    ВыбНом    = Справочники.Номенклатура.Выбрать();
    Пока ВыбНом.Следующий() Цикл
        
        ОтборЦен = Новый Структура;    
        ОтборЦен.Вставить("Номенклатура", ВыбНом.Ссылка);
        ОтборЦен.Вставить("ВидЦены", ВидыЦен);
        
        РегЦен    = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен);
        Цена    = РегЦен.Цена;
        
        
        ОтборОст = Новый Структура;
        ОтборОст.Вставить("Номенклатура", ВыбНом.Ссылка);
        ОтборОст.Вставить("Склад", Склад);
        
        РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии");
        
        Количество = 0;
        Если РегОст.Количество() > 0 Тогда
            Количество = РегОст[0].ВНаличии;
        КонецЕсли;        
        
        
        Сообщить(ВыбНом.Наименование);
        Сообщить(Цена);
        Сообщить(Количество);
        
    КонецЦикла;
   Ненавижу 1С
 
7 - 11.07.21 - 22:18
(6) это фигня всё. Сделай одно обращение через запрос, чем твои дергания данных в цикле
   bolder
 
8 - 12.07.21 - 00:00
(6) А теперь аккуратно сотри этот код и напиши запрос.Иначе семерочник из тебя никогда не выйдет.Когда то же надо прочитать базовые книжки новичка в 1С.А лучше сходи поучиться.
   серый КТУЛХУ
 
9 - 12.07.21 - 02:48
я семерочник. почти даже не бывший. но первое что вбил себе в бестолковку - все псевдо-навигационные методки доступа к данным - забыть как страшный сон, все, максимально все - запросами. дальше - уже по обстоятельствам, но это с самого начала.
и - найди себе нормальную, рабочую консоль запросов. их гуглится море - выбирай любую. мне нравится "запросник" (автору - респект!)
вторым пунктом - ответы. каждый отчет - прежде всего пытаться сделать в СКД. для начала по слогам проработав хрусталевой "разработку сложных отчетов". можно и по старому на коленке по макету слепить - но лучше все-таки в скд.
ну и дальше - по обстоятельствам. хотя я бы посоветовал кд2 освоить в полный рост - выручает порой несказанно.
и т.д. на первое время хватит думаю.
а эту вот конкретную беду - бигом на запрос переделывать!
   серый КТУЛХУ
 
10 - 12.07.21 - 02:49
* отЧеты
   Бишбармак
 
11 - 12.07.21 - 09:20
"CRM и маркетинг"->"Отчеты по CRM и маркетингу"-"Прайс лист"
Устнановить галочку "Остатки товаров на складах", выбрать цену в которой надо видеть товар в поле выбора "Вид цены" (автоматически установится галочка "Вид цены")
Нажать кнопку "Сформировать".
   Junker
 
12 - 12.07.21 - 14:07
Запросами пробовал - тормозит жутко. Скорее всего у меня там пересчет регистров на каждой итерации. Разбираться досконально долго.
По моему запрос в 1с ничем не лучше выборки, так как все равно кусок файла сперва качает в буфер. При простом запросе выборка скорее всего будет даже быстрее. По моему запросы нужны только при выборке по нескольким реквизитам и все.

Я делаю простую и быструю выгрузку в YML:
(осталось отсортировать группы по коду и будет готово, если кто подскажет, буду благодарен)
    Каталог    = "c:\"+ВыбКаталог;
    Файл    = Новый ТекстовыйДокумент;
    
    Файл.ДобавитьСтроку("<?xml version=""1.0"" encoding=""UTF8""?>");
    Файл.ДобавитьСтроку("<yml catalog date='"+ТекущаяДата()+"'>");
    Файл.ДобавитьСтроку("    <shop>");
    
    Файл.ДобавитьСтроку("        <name></name>");
    Файл.ДобавитьСтроку("        <company></company>");
    Файл.ДобавитьСтроку("        <currencies>");
    Файл.ДобавитьСтроку("            <currency id='RUR' rate='1'/>");
    Файл.ДобавитьСтроку("        </currencies>");
    Файл.ДобавитьСтроку("");
    Файл.ДобавитьСтроку("        <categories>");    
    
    
    // Группы

    ВыбНом    = Справочники.Номенклатура.Выбрать();
    
    Пока ВыбНом.Следующий() Цикл
        Если ВыбНом.Ссылка.ЭтоГруппа = Ложь Тогда
            Продолжить;
        КонецЕсли;
        
        КодРодителя = СокрЛП(ВыбНом.Родитель.Код);
        Если КодРодителя <> "" Тогда
            СтрРодитель = "parentId='"+КодРодителя+"'";
        Иначе
            СтрРодитель = "";
        КонецЕсли;        
        
        Файл.ДобавитьСтроку("            <category id='"+СокрЛП(ВыбНом.Код)+"' "+СтрРодитель+">"+ВыбНом.Наименование+"</category>");
    КонецЦикла;
    
    Файл.ДобавитьСтроку("        </categories>");
    
    Файл.ДобавитьСтроку("");
    Файл.ДобавитьСтроку("        <offers>");    
    
    
    // Товары

    Цены    = РегистрыСведений.ЦеныНоменклатуры;
    Ост        = РегистрыНакопления.ТоварыНаСкладах;
    
    ВыбНом    = Справочники.Номенклатура.Выбрать();
    Пока ВыбНом.Следующий() Цикл
        Если ВыбНом.Ссылка.ЭтоГруппа = Истина Тогда
            Продолжить;
        КонецЕсли;
        
        КодРодителя        = СокрЛП(ВыбНом.Родитель.Код);
        
        // УТ

        ОтборЦен = Новый Структура;    
        ОтборЦен.Вставить("Номенклатура", ВыбНом.Ссылка);
        ОтборЦен.Вставить("ВидЦены", ВидыЦен);
        
        РегЦен    = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен);
        Цена    = Формат(РегЦен.Цена, "ЧГ=");
        
        Количество = 1;
        Если Остаток = Истина Тогда
            ОтборОст = Новый Структура;
            ОтборОст.Вставить("Номенклатура", ВыбНом.Ссылка);
            ОтборОст.Вставить("Склад", Склад);
            
            РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии");
            Количество = РегОст.Количество();
        КонецЕсли;
        
        Если Количество = 1 Тогда
            Файл.ДобавитьСтроку("            <offer id='"+ВыбНом.Код+"'>");
            Файл.ДобавитьСтроку("                <name>"+ВыбНом.Наименование+"</name>");
            Файл.ДобавитьСтроку("                <price>"+Цена+"</price>");
            Файл.ДобавитьСтроку("                <currencyId>RUR</currencyId>");
            Файл.ДобавитьСтроку("                <categoryId>"+КодРодителя+"</categoryId>");
            Файл.ДобавитьСтроку("            </offer>");
        КонецЕсли;
            
    КонецЦикла;
    Файл.ДобавитьСтроку("        </offers>");

    
    Файл.ДобавитьСтроку("");
    Файл.ДобавитьСтроку("    </shop>");
    Файл.ДобавитьСтроку("</yml_catalog>");    
    
    
    Файл.Записать(
        Каталог + "\1c8_yml.xml",    // путь для сохранения

        КодировкаТекста.UTF8,        // кодировка

        Символы.ВК + Символы.ПС        // разделитель строк

    );
    
    Сообщить("Выгрузка в файл выполнена");
   Kassern
 
13 - 12.07.21 - 14:10
(12) "Запросами пробовал - тормозит жутко" значит вы не правильно пробовали. Скиньте текст запроса
   bolder
 
14 - 12.07.21 - 14:14
(13) Вангую - запрос в цикле.
   Junker
 
15 - 12.07.21 - 14:24
Стер уже код с запросами.
Можно ли перед: ВыбНом = Справочники.Номенклатура.Выбрать();
Установить порядок сортировки по коду? В какую сторону копать? В 1с7 это было, а тут не нахожу пока.
   Kassern
 
16 - 12.07.21 - 14:30
(15) используй уже запрос, там и сортировка есть, как тебе нужно
   Kassern
 
17 - 12.07.21 - 14:31
(16) и используй виртуальные таблицы остатков, чтобы быстро считалось и срез последних по цене.
   Мультук
 
18 - 12.07.21 - 14:42
(0)     //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    // Данный фрагмент построен конструктором.

    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    спрНоменклатура.Ссылка КАК Ссылка,
        |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
        |    ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ВНаличииОстаток
        |ИЗ
        |    Справочник.Номенклатура КАК спрНоменклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
        |        ПО (ТоварыНаСкладахОстатки.Номенклатура = спрНоменклатура.Ссылка)
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        |        ПО спрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
        |ГДЕ
        |    спрНоменклатура.ЭтоГруппа = ЛОЖЬ";
    
    Запрос.УстановитьПараметр("ВидЦены", ВидыЦен);
    Запрос.УстановитьПараметр("Склад", Склад);
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Сообщить(ВыборкаДетальныеЗаписи.ссылка);
                
            Сообщить(ВыборкаДетальныеЗаписи.Цена);
            Сообщить(ВыборкаДетальныеЗаписи.ВНаличииОстаток);
    КонецЦикла;
    
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
   Kassern
 
19 - 12.07.21 - 14:45
(18) вот бы еще ТС разобрался, что тут написано.
   Junker
 
20 - 12.07.21 - 15:10
Сделал просто так для групп, все остальное оставил как есть:

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   *
    |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |   Номенклатура.ЭтоГруппа = ИСТИНА
    |УПОРЯДОЧИТЬ ПО
    |    Код ВОЗР";
    
    РезультатЗапроса    = Запрос.Выполнить();
    ВыбНом        = РезультатЗапроса.Выбрать();
    
    //ВыбНом    = Справочники.Номенклатура.Выбрать();


Теперь все работает как надо. Главное просто и достаточно быстро. Всем большое спасибо!
   Kassern
 
21 - 12.07.21 - 15:11
(20) чем вас не устроил вариант из (18)? Там так же можно упорядочить.
   Ненавижу 1С
 
22 - 12.07.21 - 15:14
(20) а где тут в запросе цены и остатки?
   Junker
 
23 - 12.07.21 - 15:17
Вот что получилось в итоге:

    Каталог    = "c:\"+ВыбКаталог;
    Файл    = Новый ТекстовыйДокумент;
    
    Файл.ДобавитьСтроку("<?xml version=""1.0"" encoding=""UTF8""?>");
    Файл.ДобавитьСтроку("<yml catalog date='"+ТекущаяДата()+"'>");
    Файл.ДобавитьСтроку("    <shop>");
    
    Файл.ДобавитьСтроку("        <name></name>");
    Файл.ДобавитьСтроку("        <company></company>");
    Файл.ДобавитьСтроку("        <currencies>");
    Файл.ДобавитьСтроку("            <currency id='RUR' rate='1'/>");
    Файл.ДобавитьСтроку("        </currencies>");
    Файл.ДобавитьСтроку("");
    Файл.ДобавитьСтроку("        <categories>");    
    
    
    // Группы

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   *
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |   Номенклатура.ЭтоГруппа = ИСТИНА
        |УПОРЯДОЧИТЬ ПО
        |    Код ВОЗР";
    
    РезультатЗапроса    = Запрос.Выполнить();
    ВыбНом                = РезультатЗапроса.Выбрать();
    
    //ВыбНом    = Справочники.Номенклатура.Выбрать();

    Пока ВыбНом.Следующий() Цикл
        Если ВыбНом.Ссылка.ЭтоГруппа = Ложь Тогда
            Продолжить;
        КонецЕсли;
        
        КодРодителя = СокрЛП(ВыбНом.Родитель.Код);
        Если КодРодителя <> "" Тогда
            СтрРодитель = "parentId='"+КодРодителя+"'";
        Иначе
            СтрРодитель = "";
        КонецЕсли;        
        
        Файл.ДобавитьСтроку("            <category id='"+СокрЛП(ВыбНом.Код)+"' "+СтрРодитель+">"+ВыбНом.Наименование+"</category>");
    КонецЦикла;
    
    Файл.ДобавитьСтроку("        </categories>");
    
    Файл.ДобавитьСтроку("");
    Файл.ДобавитьСтроку("        <offers>");    
    
    
    // Товары

    Цены    = РегистрыСведений.ЦеныНоменклатуры;
    Ост        = РегистрыНакопления.ТоварыНаСкладах;
    
    ВыбНом    = Справочники.Номенклатура.Выбрать();
    Пока ВыбНом.Следующий() Цикл
        Если ВыбНом.Ссылка.ЭтоГруппа = Истина Тогда
            Продолжить;
        КонецЕсли;
        
        КодРодителя        = СокрЛП(ВыбНом.Родитель.Код);
        
        // УТ

        ОтборЦен = Новый Структура;    
        ОтборЦен.Вставить("Номенклатура", ВыбНом.Ссылка);
        ОтборЦен.Вставить("ВидЦены", ВидыЦен);
        
        РегЦен    = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен);
        Цена    = Формат(РегЦен.Цена, "ЧГ=");
        
        Количество = 1;
        Если Остаток = Истина Тогда
            ОтборОст = Новый Структура;
            ОтборОст.Вставить("Номенклатура", ВыбНом.Ссылка);
            ОтборОст.Вставить("Склад", Склад);
            
            РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии");
            Количество = РегОст.Количество();
        КонецЕсли;
        
        Если Количество = 1 Тогда
            Файл.ДобавитьСтроку("            <offer id='"+ВыбНом.Код+"'>");
            Файл.ДобавитьСтроку("                <name>"+ВыбНом.Наименование+"</name>");
            Файл.ДобавитьСтроку("                <price>"+Цена+"</price>");
            Файл.ДобавитьСтроку("                <currencyId>RUR</currencyId>");
            Файл.ДобавитьСтроку("                <categoryId>"+КодРодителя+"</categoryId>");
            Файл.ДобавитьСтроку("            </offer>");
        КонецЕсли;
            
    КонецЦикла;
    Файл.ДобавитьСтроку("        </offers>");

    
    Файл.ДобавитьСтроку("");
    Файл.ДобавитьСтроку("    </shop>");
    Файл.ДобавитьСтроку("</yml_catalog>");    
    
    
    Файл.Записать(
        Каталог + "\1c8_yml.xml",    // путь для сохранения

        КодировкаТекста.UTF8,        // кодировка

        Символы.ВК + Символы.ПС        // разделитель строк

    );
    
    Сообщить("Выгрузка в файл выполнена");
   Kassern
 
24 - 12.07.21 - 15:18
(22) он в цикле потом базу дергает по каждой позиции...В общем бяда
   Junker
 
25 - 12.07.21 - 15:53
Базы данные хранят блоками и при обращении к ячейке, считывают в память весь блок. Поэтому обращение к ячейкам в одном блоке происходит быстро. Запрос тут не даст преимуществ нисколько. Запросы нужны только при выборке по нескольким индексам. Попробуй потестировать.

1С это вообще не про скорость. Я сейчас пишу больше на си, разница с 1С на порядки.
   Garykom
 
26 - 12.07.21 - 16:06
(25) мнение не только мое но и других (лучше чем я профи):

"мудила", "блоками у него данные хранятся", "идиот", "и xml собирает руками... клиника"
"рассказать ему что он дебил? или забанят?"
   Kassern
 
27 - 12.07.21 - 16:14
(26) не надо тут ругаться, вопрос решается просто через замер производительности
   Kassern
 
28 - 12.07.21 - 16:15
(27) тут без замера понятно, что запросом будет гораздо быстрее. Могу даже затестить ради прикола
   Garykom
 
29 - 12.07.21 - 16:16
(27) это не я, я просто разместил объяву ибо автор ругательств стесняется
   Garykom
 
30 - 12.07.21 - 16:18
(25) >Я сейчас пишу больше на си, разница с 1С на порядки.

"на си" ты свой SQL или NoSQL серверы написал?
Если нет а просто запросы к СУБД делаешь то какие к черту "на порядки"?
 
 
   Garykom
 
31 - 12.07.21 - 16:26
(23) у тебя сплошной говнокод, мне даже считать надоело
но кое что напишу:

Если ВыбНом.Ссылка.ЭтоГруппа = Ложь Тогда
   Продолжить;
КонецЕсли;

Какого хера ты же уже выбрал группы запросом? Зачем дергать базу в цикле через .Ссылка ?

Затем ниже у тебя классический запрос в цикле только неявный
Нахрена перебирать номенклатуру и по каждой дергать остатки с регистра, когда можно сразу запросом нужное с регистра получить?
Причем в нужном виде и с нужными отборами???
   Garykom
 
32 - 12.07.21 - 16:27
(31)+ Представь что у тебя допустим полляма номенклатуры
Как думаешь за неделю выгрузка пройдет?
   Kassern
 
33 - 12.07.21 - 16:28
(29) я только сейчас заметил, посмотрев код, что ТС пытается xml наваять через гланды) Используй  Новый ЗаписьXML
   Junker
 
34 - 12.07.21 - 16:28
xml это обычный текстовый файл, чего бы его не сделать самому?
данные на дисках хранятся блоками обычно по 4Кб
базы данных всего лишь уплотняют запись и делает дополнительную индексацию
на си можно обращаться к блокам файла или диска, читать в память структуры, делать свои индексы и обрабатывать миллионы записей за доли секунды
сейчас память дешевая, легко почти любую базу можно в память загрузить. хотя бы ядро базы

Гариком, основная задача, чтобы код был простым, а не 1с-кошерным. сделай замеры и докажи, что твой код будет работать сильно быстрее. меня сейчас скорость вполне устраивает
   Garykom
 
35 - 12.07.21 - 16:30
(33) угу непечатные символы в полях/реквизитах и привет XML
Хотя бы XMLСтрока() заюзал
   Kassern
 
36 - 12.07.21 - 16:34
(34) запросом дали секунды отработало на 16тыс позициях. Перебором еще отрабатывается)))
   Kassern
 
37 - 12.07.21 - 16:34
(36) *доли
   Junker
 
38 - 12.07.21 - 16:35
Проверка строк происходит там где я загружаю. Нельзя доверять чужим данным, проверять все равно надо.
   Garykom
 
39 - 12.07.21 - 16:36
(34) Извини но ты даже не на уровне джуна а хуже сильно
И на админа по знаниям ИТ не тянешь, эникей рядовой

Мой код может и будет в некоторых условиях (например всего одна номенклатура в справочнике) работать медленней но точно надежней и отлавливать/исправлять ошибки
А когда реальные объемы/базы/данные то тебе уже написали другие правильно написанное оно на порядки быстрей твоих "хранятся блоками"

ЗЫ
Я тестил RAID 0 (Stripe) на SATA SSD и получил в отличие от HDD обескураживающий результат что лучше взять один NVME побыстрей и побольше
Если неправильно блоки выбрать то даже хуже становится и да чередование с правильными блоками примерно в два раза лучше чем один SATA но NVMe его обгоняет
А RAID 0 на NVMe не имеет смысла ибо PCIe линии в проце и привет тормоза
   Kassern
 
40 - 12.07.21 - 16:38
(37) а вот и сравнение https://ibb.co/g9h7mLp
   Kassern
 
41 - 12.07.21 - 16:39
(40) надо ли еще что-то говорить о производительности. Вот код выполнения:
Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    спрНоменклатура.Ссылка КАК Ссылка,
        |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
        |    ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта,
        |    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ВНаличииОстаток
        |ИЗ
        |    Справочник.Номенклатура КАК спрНоменклатура
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки
        |        ПО (ТоварыНаСкладахОстатки.Номенклатура = спрНоменклатура.Ссылка)
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
        |        ПО спрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
        |ГДЕ
        |    спрНоменклатура.ЭтоГруппа = ЛОЖЬ";
    
    Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию("МОСТРАНССКЛАД")); 
    Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("Закупочные"));
    РезультатЗапроса = Запрос.Выполнить();    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();  
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    КонецЦикла;

///

&НаСервере
Процедура ПереборомНаСервере()
    ВидыЦен=Справочники.ВидыЦен.НайтиПоНаименованию("Закупочные");
    Склад=Справочники.Склады.НайтиПоНаименованию("МОСТРАНССКЛАД");
    Остаток=Истина;
    Цены    = РегистрыСведений.ЦеныНоменклатуры;
    Ост        = РегистрыНакопления.ТоварыНаСкладах;
    
    ВыбНом    = Справочники.Номенклатура.Выбрать();
    Пока ВыбНом.Следующий() Цикл
        Если ВыбНом.Ссылка.ЭтоГруппа = Истина Тогда
            Продолжить;
        КонецЕсли;
        
        КодРодителя        = СокрЛП(ВыбНом.Родитель.Код);
        ОтборЦен = Новый Структура;    
        ОтборЦен.Вставить("Номенклатура", ВыбНом.Ссылка);
        ОтборЦен.Вставить("ВидЦены", ВидыЦен);
        
        РегЦен    = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен);
        Цена    = Формат(РегЦен.Цена, "ЧГ=");
        
        Количество = 1;
        Если Остаток = Истина Тогда
            ОтборОст = Новый Структура;
            ОтборОст.Вставить("Номенклатура", ВыбНом.Ссылка);
            ОтборОст.Вставить("Склад", Склад);
            
            РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии");
            Количество = РегОст.Количество();
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
   Kassern
 
42 - 12.07.21 - 16:41
(41) запрос без процедуры скинул, но думаю и так понятно
   Kassern
 
43 - 12.07.21 - 16:43
остались еще сомнения, по поводу быстрее ли запросом делать?
   Junker
 
44 - 12.07.21 - 16:47
Гариком, в 1с я давно не работал и не собираюсь. Возникла небольшая задача, главной целью которой была простота кода и приемлемая скорость.
На си я например делал полнотекстовый поиск который индексировал тексты на скорости 40мб в сек. Это было давно, лет 10 назад. Сделай такое на 1с..

Кассерн, ваш запрос кажется отбирает только группы, а перебор только товары. У меня же сперва группы, а потом товары.
   Kassern
 
45 - 12.07.21 - 16:50
(44) |ГДЕ
        |    спрНоменклатура.ЭтоГруппа = ЛОЖЬ";
это означает что берутся все позиции кроме групп. таких у меня 16тыс+. Если посмотреть замер производительности, то видно сколько было обращений в цикле в запросе и во втором варианте.
   Kassern
 
46 - 12.07.21 - 16:51
(45) во втором варианте чуть больше обращений, потому, что вы обходите ВСЮ номенклатуру, а в цикле еще и через точку(что тоже влияет на производительность) проверяете а не группа ли это)
   Kassern
 
47 - 12.07.21 - 16:54
(44) в 1с есть удобные инструменты для написания xml. Зная их вы бы без труда написали понятный код. Даже есть встроенная функция ЗаписатьXML где можно передать структуру данных и 1ска сама запишет нужные теги
   Garykom
 
48 - 12.07.21 - 16:54
(44) >На си я например делал полнотекстовый поиск который индексировал тексты на скорости 40мб в сек. Это было давно, лет 10 назад. >Сделай такое на 1с..


пфф
ты про https://v8.1c.ru/platforma/polnotekstovyy-poisk/ слышал?
а про регламентные/фоновые на сервере?

твои "40мб в сек" это ни о чем
в крайнем случае ВК (или микросервис) напишу на Golang
   Kassern
 
49 - 12.07.21 - 16:56
(48) нет смысла тут агрегатами своими мериться) Был вопрос по быстродействию, я скинул результат. Как там на си я не знаю, а в 1с лучше использовать запросы, особенно если речь идет о данных из виртуальных таблиц итогов.
   Junker
 
50 - 12.07.21 - 16:57
Кассерн, да. Спасибо за код запроса и помощь. Как будет время постараюсь переписать запросом и проверить тоже.
Есть еще код на 1с7 и  я хотел, чтобы они были максимально похожи. Если потребуется что-то потом править, чтобы не ломать голову.
   Junker
 
51 - 12.07.21 - 17:01
Гариком, я 1с8 ковырял с 2001 года, когда она была еще бета 8.0. До сих пор все тормозит по сравнению с 1с7. Почти все клиенты кто перешел с 1с7 на 1с8, плачут и матерятся. А я туда и не лезу особо больше.
   Junker
 
52 - 12.07.21 - 17:24
(49) Судя по таблице у 1с до сих пор большие проблемы. В 1с7 использовали turbobl. ЭтоГруппа - чудовищно медленное, это ненормально.
   Kassern
 
53 - 12.07.21 - 17:25
(52) если делать, так как рекомендует 1с, то все быстро
   Kassern
 
54 - 12.07.21 - 17:26
(52) когда вы обращаетесь через точку, то 1ска обращается ко всей таблице, это касается и запросов.
   Kassern
 
55 - 12.07.21 - 17:29
(52) когда вы делаете Цены.ПолучитьПоследнее(...) или Ост.Остатки(...) Вы по факту делаете запрос к базе. У вас получается, что вы в цикле делаете 2 запроса к базе, чтобы получить цену и остаток. Если позиций будет к примеру 10тыс, то вы по факту дернете скуль 20тыс раз. В варианте, где все получается запросом, вы всего лишь 1 раз обратитесь к скулю и получите результат.
   Kassern
 
56 - 12.07.21 - 17:30
(55) я думаю из этого сразу напрашивается вывод, что не надо в цикле дергать регистры в данном случае.
   серый КТУЛХУ
 
57 - 13.07.21 - 04:01
не пиши запрос руками - если его можно слепить конструктором!
(я не телепат, просто конструктор не оставляет * в тексте)
   acht
 
58 - 13.07.21 - 08:36
(52) >  у 1с до сих пор большие проблемы

Уважаемый, судя по тому, что вы вместо вашего любимого С, до сих пор вынуждены заниматься 1С, проблемы-то вовсе не у 1С.
   Junker
 
59 - 14.07.21 - 09:00
(53) 1c в свое время взлетела благодаря простоте. Поэтому усложнение ей не к лицу, по моему.
(55) понятно. Вместо обращения к данным, они сделали трансляцию команд в скуль-запросы.
Пока код работает, но на днях сделаю одним запросом. Если будет генерировать мгновенно, то почему бы и нет.

(58) я забираю данные. подобных обработок полно, но я хочу свою, так как возможно придется ее потом править, а в чужом коде разбираться может быть аврально.
На чем написана сама 1С?
   ДенисЧ
 
60 - 14.07.21 - 09:02
"Вместо обращения к данным, они сделали трансляцию команд в скуль-запросы."

Х - логика.
Интересно, как с точки зрения необузданного критикана должно быть сделано обращение к данным в sql-базе без скуль-запроса?
 
 
   Kassern
 
61 - 14.07.21 - 09:04
(59) "На чем написана сама 1С?" Насколько я знаю, на плюсах.
   acht
 
62 - 14.07.21 - 09:11
(59) > На чем написана сама 1С?
Эта та самая, в которой "До сих пор все тормозит", или вы уже про другую?
   Мультук
 
63 - 14.07.21 - 09:14
(59) Насколько я знаю - C++
   acht
 
64 - 14.07.21 - 09:46
(63) > C++
Немного подробностей было здесь: https://habr.com/ru/company/1c/blog/429678/
   Junker
 
65 - 14.07.21 - 22:24
(тема скатывается в оффтоп. решение найдено, хорошие советы получены, всем кто помог - большое спасибо)

(60) критикан это тот кто критикует без доводов. где у меня нет доводов?
без скуль-запроса делается элементарно: простые функции обращаются напрямую к файлу данных. так же как это делает сам скуль. просто исключается промежуточное звено написания запроса и его парсинга. что мешало 1с сделать так если у них свой скуль?

(62) на любом языке можно написать тормозной код. но есть языки которые тормозят сами по себе. например php или python медленнее си и никого это не парит, потому что в своей нише они удобнее. так и 1с удобнее в своей нише. но местами она жутко тормозит. например, ЭтоГруппа() работает в 3! раза медленее получения остатка по регистру..
   mikecool
 
66 - 14.07.21 - 22:32


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.