Имя: Пароль:
1C
1С v8
Вычисляемая колонка в форме списка документа.
,
0 Koliaff
 
14.06.13
18:28
Попросили в форме списка документа "Внутренний заказ" сделать дополнительную колонку "Сумма в оптовых ценах". Написал запрос и подцепил его в процедуру при "ВыводеСтроки"


Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
   
        Запрос = Новый Запрос;
       Менеджер = новый МенеджерВременныхТаблиц;
       Запрос.МенеджерВременныхТаблиц = Менеджер;
       Запрос.Текст = "ВЫБРАТЬ
                      |    ПТЗ.Номенклатура,
                      |    ПТЗ.ЕдиницаИзмерения,
                      |    ПТЗ.Количество
                      |ПОМЕСТИТЬ ВТЗ
                      |ИЗ
                      |    &ПТЗ КАК ПТЗ";
       Запрос.УстановитьПараметр("ПТЗ", ДанныеСтроки.Ссылка.Товары.Выгрузить());              
       Запрос.Выполнить();
       
       Запрос.Текст = "ВЫБРАТЬ
                      |    СУММА(ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) * ВТЗ.Количество) КАК Сумма
                      |ИЗ
                      |    ВТЗ КАК ВТЗ
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаДок, ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
                      |        ПО ВТЗ.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
                      |            И ВТЗ.ЕдиницаИзмерения = ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения";
       Запрос.УстановитьПараметр("ДатаДок", ДанныеСтроки.Ссылка.Дата);
       Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("00002"));
       ТЗСумм = Запрос.Выполнить().Выгрузить();
       Если ТЗСумм.Количество()>0 Тогда
           ОформлениеСтроки.Ячейки.СуммаОпт.Значение = ТЗСумм.Итог("Сумма");
       Иначе
           ОформлениеСтроки.Ячейки.СуммаОпт.Значение ="";
       КонецЕсли;

   
КонецПроцедуры
=============================================

Очень сильно тормозит. Что подскажите ?
Реквизит "сумма в оптовых ценах" в документе нельзя делать, т.к. цены могут меняться и все документы надо перепроводить для истинного положения дел ....
1 Андрей Федотов
 
14.06.13
18:33
Можно сделать соответтсвующий реквизит в документе конечно скрытый и выводить его просто))
При выводе строки просто очень много раз работает.
2 Koliaff
 
14.06.13
18:34
(Андрей Федотов) Я в (0) писал :
Реквизит "сумма в оптовых ценах" в документе нельзя делать, т.к. цены могут меняться и все документы надо перепроводить для истинного положения дел ....
3 Koliaff
 
14.06.13
18:38
Может запрос можно оптимизировать ?
4 PR
 
14.06.13
18:39
(3) ПриПолученииДанных и кеш
5 Koliaff
 
14.06.13
18:40
(PR) А в каком случае кэш обновлять ?
6 PR
 
14.06.13
18:48
(5) В случае, если в кеше нет данных для нужной строки или если поменялось в табличной части что-то, от чего зависит рассчитанное значение.
7 banco
 
14.06.13
18:49
(5) наверное при изменении оптовых цен
8 Koliaff
 
14.06.13
18:51
А как отследить что изменилась цена ? Тоже этот вариант не выход.
9 banco
 
14.06.13
18:51
(5) а главное запрос оптимизируй, например отбор по номенклатуре в параметрах виртуальной таблицы
10 Koliaff
 
14.06.13
18:53
(banco) МОжно поподробнее ? На счет отбора по номенклатуре в виртуальной таблице ...
11 banco
 
14.06.13
18:54
(8) наверное при записи регистра сведений цен, а вообще лучше в отчете все это делать, а не в форме списка документа
12 PR
 
14.06.13
19:00
(8) Ты о чем? Я говорю, при изменении данных в текущем документе. И только.
13 PR
 
14.06.13
19:01
+(12) А, пардон. У нас же форма списка. Тогда вообще только оптимизировать запрос и выполнять его в ПриПолучении Данных. А кеш можно предусмотреть обновление пользователем например.
14 Koliaff
 
14.06.13
19:03
(PR) Я работаю над формой списка, а не над одним документом.
15 Mitriy
 
14.06.13
19:15
(13)+ для запроса сделать переменную модуля и создавать его один раз перед или при открытии формы...
16 Ювелир
 
14.06.13
19:19
Кэш - делаешь, например, соответствием.

В соответствие загоняешь результаты выполнения запроса сразу по всему списку документов на момент вызова формы.

На форме вешаешь кнопку - обновить и туда кидаешь процедуру обновления кэш.

Ну или прописываешь события.

При получении данных - выводишь из соответствия в соответствии с документом готовую цифру.
17 Mitriy
 
14.06.13
19:24
Перем мКеш;
Перем мЗапрос;

Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
 СоответствиеСсылок = Новый Соотвествие;
 МассивСсылок = Новый Массив;
 Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
   ДокСсылка = ОформлениеСтроки.ДанныеСтроки.Ссылка;
   СуммаДолга = мКеш[ДокСсылка];
   Если СуммаДолга = Неопределено Тогда
     МассивСсылок.Добавить(ДокСсылка);
     СоответствиеСсылок.Вставить(ДокСсылка, ОформлениеСтроки);
   Иначе
     Оформление.Ячейки.СуммаДолга.Значение = СуммаДолга;
   КонецЕсли;
 КонецЦикла;
 Если Не МассивСсылок.Количество() Тогда
   Возврат;
 КонецЕсли;
 мЗапрос.УстановитьПараметр("МассивСсылокДокументов", МассивСсылок);
 Выборка = мЗапрос.Выполнить().Выбрать();
 Пока Выборка.Следующий() Цикл
   мКеш.Вставить(Выборка.СсылкаДока, Выборка.СуммаДолга);
   Оформление = СоответствиеСсылок.Получить(Выборка.СсылкаДока);
   Оформление.Ячейки.СуммаДолга.Значение = Выборка.СуммаДолга;
 КонецЦикла;
КонецПроцедуры;

мКеш = Новый Соответствие;
мЗапрос = Новый Запрос;
мЗпрос.Текст =
"ВЫБРАТЬ
...
| Где ЧтоТоТам В (&МассивСсылокДокументов)";
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn