Имя: Пароль:
1C
1C 7.7
v7: ТиС Запрос по последней дате продажи контрагенту.
0 goneman
 
08.09.15
09:30
Уважаемые специалисты, подскажите пожалуйста алгоритм запроса для отбора последней продажи контрагенту в типовой "Торговля и Склад".
1 ДенисЧ
 
08.09.15
09:32
выбрать первые 1 период
из РегистрНакопления.Продажи
где контрагент = &контра
упорядочить по период убыв
2 goneman
 
08.09.15
09:35
Это же для 8-ки код?
3 Fedor-1971
 
08.09.15
09:51
(0) максимальная дата накладной с условием, Контрагент=Нужному?
Посмотри в конфигу, если есть оборотный регистр задолженности, можно попробовать опереться на него - то же тебе написали в (2) в формате 8 (для 7 как-нить идею придётся приспособить самостоятельно).
Если установлена компонента Бух.учёт - проводки по 62 счёту.
4 aka AMIGO
 
08.09.15
09:53
Черный Запрос на докиПрихода, ДатаДок с условием на Контрагента
выгрузить Запрос в ТЗ, отсортировать по "-ДатаДок"
Если я всё правильно написал - первая строка ТЗ - искомый док прихода
5 dk
 
08.09.15
09:54
что-то типа
Рег = СоздатьОбъек("Рег.Продажи")
Рег.УстановитьзначениеФильтра(...)
Рег.ОбратныйПорядок
Рег.ВыбратьДвижения()
Рег.ПолучитьДвижение
Сообщить(Рег.Документ)
6 aka AMIGO
 
08.09.15
09:56
Можно через Рег.ОстаткиТМЦ
7 Масянька
 
08.09.15
09:59
(6) По-моему, лучше все-таки через ПартииНаличие.
8 aka AMIGO
 
08.09.15
10:06
(7) Да, это - правильнее.. Но у меня в конфе "Торговля" не используются партии, написал, что роднее :)
Именно "Торговля", а не ТиС :) Образца 2000-го года.. правда, от неё теперь осталось одно название, превратилась в "Склад и Производство" :)
9 Масянька
 
08.09.15
10:13
(8) Я как-то (работая во франче) наткнулась на Торговлю...
Одно название осталось...
Там столько было всего реализовано... При чем - с умом, оптимально, читабельно... Классный программист делал :)
10 goneman
 
08.09.15
10:44
Получился такой запрос:

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

Но "ДатаПродажи" не выгружается в ТаблицуЗначений.
11 aka AMIGO
 
08.09.15
10:46
(10) Запрос.Выгрузить(ТЗ,1 - примерно так написал?
СМ в СП
12 goneman
 
08.09.15
10:49
(11) Вот так:

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    Иначе ТабЗнач = СоздатьОбъект("ТаблицаЗначений");
        Запрос.Выгрузить(ТабЗнач);
        ТабЗнач.ВыбратьСтроку();
    КонецЕсли;
13 aka AMIGO
 
08.09.15
10:50
Запрос.Выгрузить(ТабЗнач,1);

посмотри в синтакс-помощнике аргументы ф-ции "Выгрузить"
14 Масянька
 
08.09.15
10:53
Извините, что вмешиваюсь, но - зачем выгружать?
Обработать запрос, не?
15 goneman
 
08.09.15
10:56
Все дополнительные переменные стали выгружаться, кроме "ДатаПродажи".
:-)
16 goneman
 
08.09.15
10:58
(14) Надо найти последнюю продажу, нужен анализ даты, а она в переменную "ДатаПродажи" не попадает.
17 aka AMIGO
 
08.09.15
10:58
(14) хмык, нормально вмешиваешься :) это просто один из предложенных вариантов, больше ничего особенного :)
Обработать запрос,

(15)Выгрузив запрос, добавь в ТабЗнач поле "ДатаДок", и в цикле записать туда из ТекущийДокумент ДатуДок
После этого можно сортировать :)
18 Масянька
 
08.09.15
11:00
(16) Во, нашла...

    ПартииНаличие = СоздатьОбъект("Регистр.ПартииНаличие");
    ТаблОстатков = СоздатьОбъект("ТаблицаЗначений");
    
    ПартииНаличие.УстановитьЗначениеФильтра("Номенклатура", ВыбЗнач, 1);          
    ПартииНаличие.ВыгрузитьИтоги(ТаблОстатков,1,1);
    
    ТаблОстатков.Свернуть("Партия","Количество,СуммаУпр");

    ТаблОстатков.Сортировать("Партия+");
    
    КолВоСтрок = ТаблОстатков.КоличествоСтрок();

    ТаблОстатков.ВыбратьСтроки();
    Если КолВоСтрок <> 0 Тогда
        ТаблОстатков.ПолучитьСтрокуПоНомеру(КолВоСтрок);
        Док = ТаблОстатков.Партия.ПриходныйДокумент;
    Иначе
        Док = "";
    КонецЕсли;

Только тут я последний приход беру.
19 goneman
 
08.09.15
11:05
(17) Как-то громоздко, наверное так и сделаю, но просто хочется понять, почему дата не попадает в запрос.
20 Масянька
 
08.09.15
11:06
(19) Слышь, ты, блин... На свой код посмотри...
21 goneman
 
08.09.15
11:09
(20) "Громоздко" - это про заполнение колонки в таблице значений циклом.
А что не так в моем коде?
22 Масянька
 
08.09.15
11:12
(21) Пардон... Показалось, что ты про мой сказал... Еще раз - пардон.
В твоем - строчек много :)))))
23 Ёпрст
 
гуру
08.09.15
11:13
(10) хреновый запрос, и в чорном запросе нет атрибутов у реквизитов с типом <неопределенный вид>/<неопределенный тип>

+ такой запрос не эффективен и медленный.
+ смотреть продажи в регистре Покупатели, не верно
24 Ёпрст
 
гуру
08.09.15
11:14
(21) всё
25 aka AMIGO
 
08.09.15
11:14
(21) ну, это выполняется мгновенно.

Делай код, чтоб красиво было :)
Пригодится в будущем :)
26 Ёпрст
 
гуру
08.09.15
11:15
быстрее будет только прямой запрос или хотя бы (5)
27 Ёпрст
 
гуру
08.09.15
11:16
(18) какое отношение остатки по партиям имеют к последней продаже по клиентосу - загадка
28 goneman
 
08.09.15
11:16
(24) Хорошо, пусть всё не правильно, а как тогда правильно?
Задача проста - найти последнюю продажу конкретному контрагенту.
29 Ёпрст
 
гуру
08.09.15
11:25
(28) если не умеешь писать прямой запрос - см (5)
30 goneman
 
08.09.15
11:32
(29) попробовал, как в (5), но там нет информации о документе продажи.
31 goneman
 
08.09.15
11:34
(29) Беру свои слова обратно, надо писать - Рег.ТекущийДокумент()
:-)
32 goneman
 
08.09.15
12:02
Итоговый вариант получился такой:

    Рег = СоздатьОбъект("Регистр.Продажи");
    Рег.УстановитьзначениеФильтра("Покупатель", ВыбКонтрагент);
    Рег.ОбратныйПорядок(1);
    Рег.ВыбратьДвижения(НачДата, КонДата,);
    
    Если Рег.ПолучитьДвижение() = 1 Тогда
        Сообщить("" + Рег.ТекущийДокумент().ДатаДок);
    КонецЕсли;

Простенько и со вкусом.
Всем большое спасибо.
:-)
33 Chameleon1980
 
08.09.15
21:43
всю ветку не читал, но вроде при выборе запроса параметр №2 - направление нет?

Группировка(<?>,)
Синтаксис:
Группировка(<Группировка>,<Направление>)
Назначение:
Получить следующее значение выборки Запроса
Возвращает: 1 - если получено следующее значение выборки запроса, 0 - иначе.
Параметры:
<Группировка> - выражение, содержащее номер или имя группировки.
<Направление> -  необязательный параметр. Число: 1 - выборка значений группировки по возрастанию; -1 (минус единица) - выборка значений группировки по убыванию. Значение по умолчанию: 1.


и запрос с условием нужным
Закон Брукера: Даже маленькая практика стоит большой теории.