Имя: Пароль:
1C
1С v8
Что можно оптимизировать в ниже приведенном коде и почему?
, ,
0 happysan
 
06.06.20
21:40
Что можно оптимизировать в ниже приведенном коде и почему?
Процедура ОбработкаПроведения(Отказ, РежимПроведения)

лкЗапрос = Новый Запрос;
лкЗапрос.Текст = "ВЫБРАТЬ
                 |    РеализацияАвтомобилей.Автомобиль,
                 |    РеализацияАвтомобилей.Стоимость,
                 |    РеализацияАвтомобилей.СтоимостьУЕ,
                 |    РеализацияАвтомобилей.Ссылка
                 |ИЗ
                 |    Документ.РеализацияАвтомобилей.Автомобили КАК РеализацияАвтомобилей";

лкВыборка = лкЗапрос.Выполнить().Выбрать();

Пока лкВыборка.Следующий() Цикл
    
    лкЗапись = Движения.БУ.Добавить();
    
    лкЗапись.СчетДт         = лкВыборка.Ссылка.ДоговорВзаиморасчетов.СчетРасчетов;
    лкЗапись.СчетКт         = ПланыСчетов.БУ.Счет_90_01_1;
    
    лкЗапись.Период         = лкВыборка.Ссылка.Дата;
    лкЗапись.Регистратор         = лкВыборка.Ссылка;
    лкЗапись.Сумма         = лкВыборка.Стоимость;
    
    Если лкЗапись.СчетДт.Валютный Тогда
        лкЗапись.ВалютаДт = лкВыборка.Ссылка.ДоговорВзаиморасчетов.ВалютаУчета;
        лкЗапись.ВалютнаяСуммаДт = лкВыборка.СтоимостьУЕ;
    КонецЕсли;
    
    лкЗапись.Содержание = "Отражена вырузка по автомобилю " + лкВыборка.Автомобиль.Наименование;
    
    лкЗапись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоБУ.Контрагенты] = лкВыборка.Ссылка.Контрагент;
лкЗапись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоБУ.ДоговорыВзаиморасчетов] = лкВыборка.Ссылка.ДоговорВзаиморасчетов;
    лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.ВидыДеятельности] = лкВыборка.Ссылка.ВидДеятельности;
    лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.Брэнды] = лкВыборка.Ссылка.Брэнд;
    лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.СтавкиНДС] = лкВыборка.СтавкаНДС;
        
КонецЦикла;    

КонецПроцедуры
1 Alres
 
06.06.20
21:51
В запросе специально нет отбора по ссылке? Он же все документы из базы вытянет
2 Alres
 
06.06.20
21:54
Запрос к документам конечно так себе.
Постоянное обращение к ссылке через точку - эти поля можно запросом выбрать.

Откуда такая задача?
3 BeerHelpsMeWin
 
06.06.20
21:56
(1) и если делать отбор по ссылке - то зачем тогда запрос, не проще ли работать сразу с таб частью?
4 NcSteel
 
06.06.20
22:09
(3) Нет не проще.
5 happysan
 
06.06.20
22:19
(1) Согласен, принимается.
(2) Тоже сразу на это обратил внимание, принимается.
(4) Согласен.
Что-то ещё заметили?
6 Злопчинский
 
06.06.20
22:35
(0) лк в контексте явно излишне, потому как нет большого перемешивания кода оазной принадлежности/видимости.
7 Ненавижу 1С
 
гуру
06.06.20
22:40
Если все поля, необходимые для записи движений, выбрать в запросе, то весь цикл сведется примерно к следующему:

Движения.БУ.Загрузить(Запрос.Выполнить().Выгрузить());
8 Ненавижу 1С
 
гуру
06.06.20
22:40
+(7) выбрать все поля и дать им соответствующие алиасы
9 happysan
 
06.06.20
22:42
(7)Абсолютно верно, тоже рассматривал этот вариант!
10 H A D G E H O G s
 
06.06.20
22:43
Дичь какаято.
Это даже на задачи с собеседования не тянет.
11 Ненавижу 1С
 
гуру
06.06.20
22:44
+(7) Хотя с субконто вроде не получится
12 hhhh
 
06.06.20
22:49
(11) получится. С субконто как раз Загрузить набор с субконто из ТЗ самое простое, не надо заморачиваться. Просто пишешь Загрузить()
13 happysan
 
06.06.20
23:02
(12) Можно подробнее?
14 Bigcalm
 
06.06.20
23:03
(0)
Получить в запросе все необходимые поля через ВЫРАЗИТЬ, особенно вот это:

Если лкЗапись.СчетДт.Валютный Тогда
        лкЗапись.ВалютаДт = лкВыборка.Ссылка.ДоговорВзаиморасчетов.ВалютаУчета;
        лкЗапись.ВалютнаяСуммаДт = лкВыборка.СтоимостьУЕ;
    КонецЕсли;

лкЗапись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоБУ.Контрагенты]  - это тоже через запрос.

Вощем все это запихнуть в запрос..
15 happysan
 
06.06.20
23:08
(14) Может через ВЫБОР ... КОГДА ... ТОГДА?
16 Bigcalm
 
06.06.20
23:10
Ну у тебя же все сущности предопределенные, попробуй через эту конструкцию
17 Bigcalm
 
06.06.20
23:17
Я бы через точку ничего не делал)
Временных таблиц в запросе бы наделал, где все составные поля через ВЫРАЗИТЬ вывел.
А потом соединениями вывел бы выборку.
18 Bigcalm
 
06.06.20
23:20
Ну и эта, почему запрос к документу?
Может быть есть какой-то регистр?
19 Bigcalm
 
06.06.20
23:30
(0) В чем прикол- то? ))
20 zak555
 
06.06.20
23:40
лкЗапись.Регистратор         = лкВыборка.Ссылка;


это надо ?
21 happysan
 
07.06.20
00:02
(18)Контекст неизвестен.
22 happysan
 
07.06.20
00:03
(20) Под вопросом, задача вырвана из контекста.
23 Bigcalm
 
07.06.20
02:38
лкЗапись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоБУ.Контрагенты] = лкВыборка.Ссылка.Контрагент;
лкЗапись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоБУ.ДоговорыВзаиморасчетов] = лкВыборка.Ссылка.ДоговорВзаиморасчетов;
    лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.ВидыДеятельности] = лкВыборка.Ссылка.ВидДеятельности;
    лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.Брэнды] = лкВыборка.Ссылка.Брэнд;
    лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.СтавкиНДС] = лкВыборка.СтавкаНДС;

В цикле, каждую итерацию делать запрос к таблице пвх? Может есть смысл иицициализировать эти 4 переменные?
Ну и там верно сказали, подготовить таблицу в запросе, и загрузить ее в движения...
24 happysan
 
07.06.20
06:59
(23) Как это будет выглядеть?
25 happysan
 
07.06.20
07:12
(23)(24) Вижу так,
Эти строки загоняются в ТЗ, затем запросом получаем выборку из ТЗ, присваяивая нужные псевдонимы полям и загружаем в движения документа:
лкЗапись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоБУ.Контрагенты] = лкВыборка.Ссылка.Контрагент;
лкЗапись.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоБУ.ДоговорыВзаиморасчетов] = лкВыборка.Ссылка.ДоговорВзаиморасчетов;
лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.ВидыДеятельности] = лкВыборка.Ссылка.ВидДеятельности;
лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.Брэнды] = лкВыборка.Ссылка.Брэнд;
лкЗапись.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоБУ.СтавкиНДС] = лкВыборка.СтавкаНДС;
26 happysan
 
07.06.20
07:13
(25) Читаем как: "... присваивая нужные псевдонимы полям, и загружаем в движения документа:".
27 hhhh
 
07.06.20
09:17
(26) нет. так

ВЫБРАТЬ
                 |    РеализацияАвтомобилей.Ссылка.Контрагент КАК СубконтоДт1,
                 |    РеализацияАвтомобилей.Ссылка.ДоговорВзаиморасчетов КАК СубконтоДт2,
                 |    РеализацияАвтомобилей.Ссылка.ВидДеятельности КАК СубконтоКт1,
                 |    РеализацияАвтомобилей.Ссылка.Брэнд КАК СубконтоКт2,
                 |    РеализацияАвтомобилей.СтавкаНДС КАК СубконтоКт3,
                  |    РеализацияАвтомобилей.Автомобиль,
                 |    РеализацияАвтомобилей.Стоимость,
                 |    РеализацияАвтомобилей.СтоимостьУЕ,
                 |    РеализацияАвтомобилей.Ссылка
                 |ИЗ
                 |    Документ.РеализацияАвтомобилей.Автомобили КАК РеализацияАвтомобилей";

и потом делаешь (7)

а эту хрень из (25) выкинь
28 happysan
 
07.06.20
09:29
Всем спасибо (особенно (27))!!!
29 happysan
 
07.06.20
09:37
(27) В первых четырёх полях запроса следует убрать "Ссылка".
30 такт
 
07.06.20
09:58
(29) конечно убери "Ссылка" и не забудь сюда пожаловаться )
31 Волшебник
 
модератор
07.06.20
10:00
(29) Это же запрос к табличной части. Поле Ссылка позволяет обратиться к шапке документа.
32 happysan
 
07.06.20
15:01
(31) Точно, спасибо, не заметил.
33 Cthulhu
 
07.06.20
16:26
(32): а еще, наверное, не заметил, что каждое(!) ".Ссылка." - это неявное выполнение запроса... лучче бы соединить и потом тянуть.
34 happysan
 
07.06.20
17:05
(33) Это было сразу замечено, плюс ещё упоминали об этом в (17)?
35 Cthulhu
 
07.06.20
18:21
(34): в (17) глупость, которая совсем не про то. (там - про точку (без которой. строго говоря, никак), я - про две точки в варианте, ведущем к неявному запросу). ну и независимо от - ч упомянул о том, что в варианте, декларируемом в качестве решения, есть конкретное упущение (вне зависимости от то. что там и где было "сразу замечено").
36 happysan
 
07.06.20
19:07
(35) Так и воспринималась информация, что речь в (17) идёт о двух точках и более. Понятное ведь дело, что без точки никак!
Ошибка? Это не ошибка, это системная функция.