Версия для печати темы (https://pro1c.org.ua/index.php?s=4e8ae9a6e6510b5e069955880456f4a8&showtopic=25142)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Последнее поступление товара.

Автор: Sede 15.09.15, 16:26

Доброго Дня.
Подсобите пожалуйста:
Есть:
ТаблицаЗначений (тзТаблица) с колонками - Товар(заполнено), Контрагент(пусто), датаПоследнегоПоступления(пусто)

Как заполнить пустые колонки.

Данную задачу решил таким путем:

Процедура ЗапросПН()
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(ЗапросПН)      
    |Период с (НачГода(ТекущаяДата())) по (ТекущаяДата());
//    |Период с ВыбНачПериода по ВыбКонПериода;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Контрагент = Документ.ПриходнаяНакладная.Контрагент;
    |ТМЦ = Документ.ПриходнаяНакладная.ТМЦ;
    |ДатаДок = Документ.ПриходнаяНакладная.ДатаДок;
    |Группировка ТМЦ;
    |Условие(ТМЦ = тзТаблица.Товар);
    |"//}}ЗАПРОС
;
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

        тзТаблица.Контрагент = Запрос.Контрагент;
        тзТаблица.ДатаПослПост=Запрос.ДатаДок;

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


Далее просто делаю перебор самой таблицы
тзТаблица.ВыбратьСтроки();
Пока тзТаблица.ПолучитьСтроку()=1 Цикл
ЗапросПН();      
КонецЦикла;


Все работает, результат правильный.
Но больно долго думает, особенно когда товаров много. Что-то мне подсказывает что есть варианты "По правильнее" и более быстрые.

Автор: Naghual 15.09.15, 16:29

Конечно долго! Запрос на каждую строку ТЗ - это-ж кошмар!
сделайте СписокЗначений со всеми товарами из ТЗ и получи все результаты в одном запросе.

Потом уже циклом по результатам пройдись и проставь значения в ТЗ.

Автор: Sede 15.09.15, 16:43

А примерчик как в запрос засунуть список можно?

Автор: Naghual 15.09.15, 16:50

можно так:
|Условие(ТМЦ В СЗ);

Но более правильно будет так:
|Условие(СЗ.Принадлежит(ТМЦ)=1);

Автор: Sede 15.09.15, 16:57

Цитата(Naghual @ 15.09.15, 17:50) *
можно так:
|Условие(ТМЦ В СЗ);

Но более правильно будет так:
|Условие(СЗ.Принадлежит(ТМЦ)=1);


Большое спасибо.
Казалось бы ничего сложного... одна строчка но найти нормальной учебной информации днем с огнем не сыщешь.

Автор: mister-x 15.09.15, 21:58

Цитата(Sede @ 15.09.15, 16:57) http://pro1c.org.ua/index.php?act=findpost&pid=103034 заглядали?

Автор: Dartvader111 17.09.15, 9:33

Ускорить очень просто в десятки раз.


    ТекстЗапроса = 
    "Период с (НачГода(ТекущаяДата())) по (ТекущаяДата());
    |Без итогов;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Контрагент = Документ.ПриходнаяНакладная.Контрагент;
    |ТМЦ = Документ.ПриходнаяНакладная.ТМЦ;
    |ДатаДок = Документ.ПриходнаяНакладная.ДатаДок;
    |Группировка Контрагент без групп без упорядочивания;
    |Группировка ТМЦ без групп без упорядочивания;
    |Группировка ДатаДок без групп без упорядочивания;
    |Условие(ТМЦ = тзТаблица.Товар);
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    Запрос.Выгрузить(тбТоварыПрихода)
    тбТоварыПрихода.Сортировать("Товар,ДатаДок");
КонецПроцедуры



 i 

Код можно выделять
 

Автор: twilight_dream 17.09.15, 9:51

Вы что ребята, беленов объелись, простите, не сдержался. Вообще всю таблицу нужно получить одним запросом.
А если запрос медленно работает, то плюсы ставить и SQL запросом.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua