|
Нужна помощь. Сделать выборку товаров с последними ценами и остатками в УТ11 | ☑ | ||
---|---|---|---|---|
0
Junker
09.07.21
✎
17:33
|
Раньше кодил на 1с7, в 1с8 никак разобраться не могу, сижу уже несколько дней. УТ11.
Гуглил, вроде все правильно, но не работает, все ругается на параметры. Цены = РегистрыСведений.ЦеныНоменклатуры; Ост = РегистрыНакопления.ТоварыНаСкладах; ВыбСпр = Справочники.Номенклатура.Выбрать(); Пока ВыбСпр.Следующий() Цикл ОтборЦен = Новый Структура; ОтборЦен.Вставить("Номенклатура", ВыбСпр.ПолучитьОбъект()); ОтборЦен.Вставить("ВидЦены", ВидыЦен); // из формы РегЦен = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен); ОтборОст = Новый Структура; ОтборОст.Вставить("Номенклатура", ВыбСпр.ПолучитьОбъект()); ОтборОст.Вставить("Склад", Склад); // из формы РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии"); Сообщить(ВыбСпр.Наименование); Сообщить(РегЦен.Цена); Сообщить(РегОст.Количество()); КонецЦикла; |
|||
1
lubitelxml
09.07.21
✎
17:44
|
Напиши лучше запросом
|
|||
2
Kassern
09.07.21
✎
17:51
|
(0) сразу видно семерочный подход))
|
|||
3
saaken
09.07.21
✎
17:51
|
замени ПолучитьОбъект() на ссылка
|
|||
4
Kassern
09.07.21
✎
17:52
|
(2) и да воспользуйся советом из (1) и сделай уже простой запрос к регистру остатков/резервов/цены
|
|||
5
Kassern
09.07.21
✎
17:53
|
(4) в твоем способе нет учета резервов, товары со склада спишутся только при реализации, лучше к регистру свободных остатков обращайся.
|
|||
6
Junker
11.07.21
✎
22:10
|
Спасибо за подсказки. Немного исправил и все заработало.
Цены = РегистрыСведений.ЦеныНоменклатуры; Ост = РегистрыНакопления.ТоварыНаСкладах; ВыбНом = Справочники.Номенклатура.Выбрать(); Пока ВыбНом.Следующий() Цикл ОтборЦен = Новый Структура; ОтборЦен.Вставить("Номенклатура", ВыбНом.Ссылка); ОтборЦен.Вставить("ВидЦены", ВидыЦен); РегЦен = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен); Цена = РегЦен.Цена; ОтборОст = Новый Структура; ОтборОст.Вставить("Номенклатура", ВыбНом.Ссылка); ОтборОст.Вставить("Склад", Склад); РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии"); Количество = 0; Если РегОст.Количество() > 0 Тогда Количество = РегОст[0].ВНаличии; КонецЕсли; Сообщить(ВыбНом.Наименование); Сообщить(Цена); Сообщить(Количество); КонецЦикла; |
|||
7
Ненавижу 1С
гуру
11.07.21
✎
22:18
|
(6) это фигня всё. Сделай одно обращение через запрос, чем твои дергания данных в цикле
|
|||
8
bolder
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 и маркетингу"-"Прайс лист"
Устнановить галочку "Остатки товаров на складах", выбрать цену в которой надо видеть товар в поле выбора "Вид цены" (автоматически установится галочка "Вид цены") Нажать кнопку "Сформировать". |
|||
12
Junker
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, // кодировка Символы.ВК + Символы.ПС // разделитель строк ); Сообщить("Выгрузка в файл выполнена"); |
|||
13
Kassern
12.07.21
✎
14:10
|
(12) "Запросами пробовал - тормозит жутко" значит вы не правильно пробовали. Скиньте текст запроса
|
|||
14
bolder
12.07.21
✎
14:14
|
(13) Вангую - запрос в цикле.
|
|||
15
Junker
12.07.21
✎
14:24
|
Стер уже код с запросами.
Можно ли перед: ВыбНом = Справочники.Номенклатура.Выбрать(); Установить порядок сортировки по коду? В какую сторону копать? В 1с7 это было, а тут не нахожу пока. |
|||
16
Kassern
12.07.21
✎
14:30
|
(15) используй уже запрос, там и сортировка есть, как тебе нужно
|
|||
17
Kassern
12.07.21
✎
14:31
|
(16) и используй виртуальные таблицы остатков, чтобы быстро считалось и срез последних по цене.
|
|||
18
Мультук
гуру
12.07.21
✎
14:42
|
(0) //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | спрНоменклатура.Ссылка КАК Ссылка, | ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена, | ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта, | ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ВНаличииОстаток |ИЗ | Справочник.Номенклатура КАК спрНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки | ПО (ТоварыНаСкладахОстатки.Номенклатура = спрНоменклатура.Ссылка) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних | ПО спрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура |ГДЕ | спрНоменклатура.ЭтоГруппа = ЛОЖЬ"; Запрос.УстановитьПараметр("ВидЦены", ВидыЦен); Запрос.УстановитьПараметр("Склад", Склад); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщить(ВыборкаДетальныеЗаписи.ссылка); Сообщить(ВыборкаДетальныеЗаписи.Цена); Сообщить(ВыборкаДетальныеЗаписи.ВНаличииОстаток); КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА |
|||
19
Kassern
12.07.21
✎
14:45
|
(18) вот бы еще ТС разобрался, что тут написано.
|
|||
20
Junker
12.07.21
✎
15:10
|
Сделал просто так для групп, все остальное оставил как есть:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | * |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.ЭтоГруппа = ИСТИНА |УПОРЯДОЧИТЬ ПО | Код ВОЗР"; РезультатЗапроса = Запрос.Выполнить(); ВыбНом = РезультатЗапроса.Выбрать(); //ВыбНом = Справочники.Номенклатура.Выбрать(); Теперь все работает как надо. Главное просто и достаточно быстро. Всем большое спасибо! |
|||
21
Kassern
12.07.21
✎
15:11
|
(20) чем вас не устроил вариант из (18)? Там так же можно упорядочить.
|
|||
22
Ненавижу 1С
гуру
12.07.21
✎
15:14
|
(20) а где тут в запросе цены и остатки?
|
|||
23
Junker
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, // кодировка Символы.ВК + Символы.ПС // разделитель строк ); Сообщить("Выгрузка в файл выполнена"); |
|||
24
Kassern
12.07.21
✎
15:18
|
(22) он в цикле потом базу дергает по каждой позиции...В общем бяда
|
|||
25
Junker
12.07.21
✎
15:53
|
Базы данные хранят блоками и при обращении к ячейке, считывают в память весь блок. Поэтому обращение к ячейкам в одном блоке происходит быстро. Запрос тут не даст преимуществ нисколько. Запросы нужны только при выборке по нескольким индексам. Попробуй потестировать.
1С это вообще не про скорость. Я сейчас пишу больше на си, разница с 1С на порядки. |
|||
26
Garykom
гуру
12.07.21
✎
16:06
|
(25) мнение не только мое но и других (лучше чем я профи):
"мудила", "блоками у него данные хранятся", "идиот", "и xml собирает руками... клиника" "рассказать ему что он дебил? или забанят?" |
|||
27
Kassern
12.07.21
✎
16:14
|
(26) не надо тут ругаться, вопрос решается просто через замер производительности
|
|||
28
Kassern
12.07.21
✎
16:15
|
(27) тут без замера понятно, что запросом будет гораздо быстрее. Могу даже затестить ради прикола
|
|||
29
Garykom
гуру
12.07.21
✎
16:16
|
(27) это не я, я просто разместил объяву ибо автор ругательств стесняется
|
|||
30
Garykom
гуру
12.07.21
✎
16:18
|
(25) >Я сейчас пишу больше на си, разница с 1С на порядки.
"на си" ты свой SQL или NoSQL серверы написал? Если нет а просто запросы к СУБД делаешь то какие к черту "на порядки"? |
|||
31
Garykom
гуру
12.07.21
✎
16:26
|
(23) у тебя сплошной говнокод, мне даже считать надоело
но кое что напишу:
Какого хера ты же уже выбрал группы запросом? Зачем дергать базу в цикле через .Ссылка ? Затем ниже у тебя классический запрос в цикле только неявный Нахрена перебирать номенклатуру и по каждой дергать остатки с регистра, когда можно сразу запросом нужное с регистра получить? Причем в нужном виде и с нужными отборами??? |
|||
32
Garykom
гуру
12.07.21
✎
16:27
|
(31)+ Представь что у тебя допустим полляма номенклатуры
Как думаешь за неделю выгрузка пройдет? |
|||
33
Kassern
12.07.21
✎
16:28
|
(29) я только сейчас заметил, посмотрев код, что ТС пытается xml наваять через гланды) Используй Новый ЗаписьXML
|
|||
34
Junker
12.07.21
✎
16:28
|
xml это обычный текстовый файл, чего бы его не сделать самому?
данные на дисках хранятся блоками обычно по 4Кб базы данных всего лишь уплотняют запись и делает дополнительную индексацию на си можно обращаться к блокам файла или диска, читать в память структуры, делать свои индексы и обрабатывать миллионы записей за доли секунды сейчас память дешевая, легко почти любую базу можно в память загрузить. хотя бы ядро базы Гариком, основная задача, чтобы код был простым, а не 1с-кошерным. сделай замеры и докажи, что твой код будет работать сильно быстрее. меня сейчас скорость вполне устраивает |
|||
35
Garykom
гуру
12.07.21
✎
16:30
|
(33) угу непечатные символы в полях/реквизитах и привет XML
Хотя бы XMLСтрока() заюзал |
|||
36
Kassern
12.07.21
✎
16:34
|
(34) запросом дали секунды отработало на 16тыс позициях. Перебором еще отрабатывается)))
|
|||
37
Kassern
12.07.21
✎
16:34
|
(36) *доли
|
|||
38
Junker
12.07.21
✎
16:35
|
Проверка строк происходит там где я загружаю. Нельзя доверять чужим данным, проверять все равно надо.
|
|||
39
Garykom
гуру
12.07.21
✎
16:36
|
(34) Извини но ты даже не на уровне джуна а хуже сильно
И на админа по знаниям ИТ не тянешь, эникей рядовой Мой код может и будет в некоторых условиях (например всего одна номенклатура в справочнике) работать медленней но точно надежней и отлавливать/исправлять ошибки А когда реальные объемы/базы/данные то тебе уже написали другие правильно написанное оно на порядки быстрей твоих "хранятся блоками" ЗЫ Я тестил RAID 0 (Stripe) на SATA SSD и получил в отличие от HDD обескураживающий результат что лучше взять один NVME побыстрей и побольше Если неправильно блоки выбрать то даже хуже становится и да чередование с правильными блоками примерно в два раза лучше чем один SATA но NVMe его обгоняет А RAID 0 на NVMe не имеет смысла ибо PCIe линии в проце и привет тормоза |
|||
40
Kassern
12.07.21
✎
16:38
|
(37) а вот и сравнение https://ibb.co/g9h7mLp
|
|||
41
Kassern
12.07.21
✎
16:39
|
(40) надо ли еще что-то говорить о производительности. Вот код выполнения:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | спрНоменклатура.Ссылка КАК Ссылка, | ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена, | ЦеныНоменклатурыСрезПоследних.Валюта КАК Валюта, | ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК ВНаличииОстаток |ИЗ | Справочник.Номенклатура КАК спрНоменклатура | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &Склад) КАК ТоварыНаСкладахОстатки | ПО (ТоварыНаСкладахОстатки.Номенклатура = спрНоменклатура.Ссылка) | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних | ПО спрНоменклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура |ГДЕ | спрНоменклатура.ЭтоГруппа = ЛОЖЬ"; Запрос.УстановитьПараметр("Склад", Справочники.Склады.НайтиПоНаименованию("МОСТРАНССКЛАД")); Запрос.УстановитьПараметр("ВидЦены", Справочники.ВидыЦен.НайтиПоНаименованию("Закупочные")); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл КонецЦикла; /// &НаСервере Процедура ПереборомНаСервере() ВидыЦен=Справочники.ВидыЦен.НайтиПоНаименованию("Закупочные"); Склад=Справочники.Склады.НайтиПоНаименованию("МОСТРАНССКЛАД"); Остаток=Истина; Цены = РегистрыСведений.ЦеныНоменклатуры; Ост = РегистрыНакопления.ТоварыНаСкладах; ВыбНом = Справочники.Номенклатура.Выбрать(); Пока ВыбНом.Следующий() Цикл Если ВыбНом.Ссылка.ЭтоГруппа = Истина Тогда Продолжить; КонецЕсли; КодРодителя = СокрЛП(ВыбНом.Родитель.Код); ОтборЦен = Новый Структура; ОтборЦен.Вставить("Номенклатура", ВыбНом.Ссылка); ОтборЦен.Вставить("ВидЦены", ВидыЦен); РегЦен = Цены.ПолучитьПоследнее(ТекущаяДата(), ОтборЦен); Цена = Формат(РегЦен.Цена, "ЧГ="); Количество = 1; Если Остаток = Истина Тогда ОтборОст = Новый Структура; ОтборОст.Вставить("Номенклатура", ВыбНом.Ссылка); ОтборОст.Вставить("Склад", Склад); РегОст = Ост.Остатки(ТекущаяДата(), ОтборОст, "Номенклатура, Склад", "ВНаличии"); Количество = РегОст.Количество(); КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
42
Kassern
12.07.21
✎
16:41
|
(41) запрос без процедуры скинул, но думаю и так понятно
|
|||
43
Kassern
12.07.21
✎
16:43
|
остались еще сомнения, по поводу быстрее ли запросом делать?
|
|||
44
Junker
12.07.21
✎
16:47
|
Гариком, в 1с я давно не работал и не собираюсь. Возникла небольшая задача, главной целью которой была простота кода и приемлемая скорость.
На си я например делал полнотекстовый поиск который индексировал тексты на скорости 40мб в сек. Это было давно, лет 10 назад. Сделай такое на 1с.. Кассерн, ваш запрос кажется отбирает только группы, а перебор только товары. У меня же сперва группы, а потом товары. |
|||
45
Kassern
12.07.21
✎
16:50
|
(44) |ГДЕ
| спрНоменклатура.ЭтоГруппа = ЛОЖЬ"; это означает что берутся все позиции кроме групп. таких у меня 16тыс+. Если посмотреть замер производительности, то видно сколько было обращений в цикле в запросе и во втором варианте. |
|||
46
Kassern
12.07.21
✎
16:51
|
(45) во втором варианте чуть больше обращений, потому, что вы обходите ВСЮ номенклатуру, а в цикле еще и через точку(что тоже влияет на производительность) проверяете а не группа ли это)
|
|||
47
Kassern
12.07.21
✎
16:54
|
(44) в 1с есть удобные инструменты для написания xml. Зная их вы бы без труда написали понятный код. Даже есть встроенная функция ЗаписатьXML где можно передать структуру данных и 1ска сама запишет нужные теги
|
|||
48
Garykom
гуру
12.07.21
✎
16:54
|
(44) >На си я например делал полнотекстовый поиск который индексировал тексты на скорости 40мб в сек. Это было давно, лет 10 назад. >Сделай такое на 1с..
пфф ты про https://v8.1c.ru/platforma/polnotekstovyy-poisk/ слышал? а про регламентные/фоновые на сервере? твои "40мб в сек" это ни о чем в крайнем случае ВК (или микросервис) напишу на Golang |
|||
49
Kassern
12.07.21
✎
16:56
|
(48) нет смысла тут агрегатами своими мериться) Был вопрос по быстродействию, я скинул результат. Как там на си я не знаю, а в 1с лучше использовать запросы, особенно если речь идет о данных из виртуальных таблиц итогов.
|
|||
50
Junker
12.07.21
✎
16:57
|
Кассерн, да. Спасибо за код запроса и помощь. Как будет время постараюсь переписать запросом и проверить тоже.
Есть еще код на 1с7 и я хотел, чтобы они были максимально похожи. Если потребуется что-то потом править, чтобы не ломать голову. |
|||
51
Junker
12.07.21
✎
17:01
|
Гариком, я 1с8 ковырял с 2001 года, когда она была еще бета 8.0. До сих пор все тормозит по сравнению с 1с7. Почти все клиенты кто перешел с 1с7 на 1с8, плачут и матерятся. А я туда и не лезу особо больше.
|
|||
52
Junker
12.07.21
✎
17:24
|
(49) Судя по таблице у 1с до сих пор большие проблемы. В 1с7 использовали turbobl. ЭтоГруппа - чудовищно медленное, это ненормально.
|
|||
53
Kassern
12.07.21
✎
17:25
|
(52) если делать, так как рекомендует 1с, то все быстро
|
|||
54
Kassern
12.07.21
✎
17:26
|
(52) когда вы обращаетесь через точку, то 1ска обращается ко всей таблице, это касается и запросов.
|
|||
55
Kassern
12.07.21
✎
17:29
|
(52) когда вы делаете Цены.ПолучитьПоследнее(...) или Ост.Остатки(...) Вы по факту делаете запрос к базе. У вас получается, что вы в цикле делаете 2 запроса к базе, чтобы получить цену и остаток. Если позиций будет к примеру 10тыс, то вы по факту дернете скуль 20тыс раз. В варианте, где все получается запросом, вы всего лишь 1 раз обратитесь к скулю и получите результат.
|
|||
56
Kassern
12.07.21
✎
17:30
|
(55) я думаю из этого сразу напрашивается вывод, что не надо в цикле дергать регистры в данном случае.
|
|||
57
серый КТУЛХУ
13.07.21
✎
04:01
|
не пиши запрос руками - если его можно слепить конструктором!
(я не телепат, просто конструктор не оставляет * в тексте) |
|||
58
acht
13.07.21
✎
08:36
|
(52) > у 1с до сих пор большие проблемы
Уважаемый, судя по тому, что вы вместо вашего любимого С, до сих пор вынуждены заниматься 1С, проблемы-то вовсе не у 1С. |
|||
59
Junker
14.07.21
✎
09:00
|
(53) 1c в свое время взлетела благодаря простоте. Поэтому усложнение ей не к лицу, по моему.
(55) понятно. Вместо обращения к данным, они сделали трансляцию команд в скуль-запросы. Пока код работает, но на днях сделаю одним запросом. Если будет генерировать мгновенно, то почему бы и нет. (58) я забираю данные. подобных обработок полно, но я хочу свою, так как возможно придется ее потом править, а в чужом коде разбираться может быть аврально. На чем написана сама 1С? |
|||
60
ДенисЧ
14.07.21
✎
09:02
|
"Вместо обращения к данным, они сделали трансляцию команд в скуль-запросы."
Х - логика. Интересно, как с точки зрения необузданного критикана должно быть сделано обращение к данным в sql-базе без скуль-запроса? |
|||
61
Kassern
14.07.21
✎
09:04
|
(59) "На чем написана сама 1С?" Насколько я знаю, на плюсах.
|
|||
62
acht
14.07.21
✎
09:11
|
(59) > На чем написана сама 1С?
Эта та самая, в которой "До сих пор все тормозит", или вы уже про другую? |
|||
63
Мультук
гуру
14.07.21
✎
09:14
|
(59) Насколько я знаю - C++
|
|||
64
acht
14.07.21
✎
09:46
|
(63) > C++
Немного подробностей было здесь: https://habr.com/ru/company/1c/blog/429678/ |
|||
65
Junker
14.07.21
✎
22:24
|
(тема скатывается в оффтоп. решение найдено, хорошие советы получены, всем кто помог - большое спасибо)
(60) критикан это тот кто критикует без доводов. где у меня нет доводов? без скуль-запроса делается элементарно: простые функции обращаются напрямую к файлу данных. так же как это делает сам скуль. просто исключается промежуточное звено написания запроса и его парсинга. что мешало 1с сделать так если у них свой скуль? (62) на любом языке можно написать тормозной код. но есть языки которые тормозят сами по себе. например php или python медленнее си и никого это не парит, потому что в своей нише они удобнее. так и 1с удобнее в своей нише. но местами она жутко тормозит. например, ЭтоГруппа() работает в 3! раза медленее получения остатка по регистру.. |
|||
66
mikecool
14.07.21
✎
22:32
|
вот товарищ изобрел Что то сегодня изобрел получение ближайшей закупочной на момент продажи
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |