Имя: Пароль:
1C
1C 7.7
v7: ТИС 77. Получить весь товар от контрагента
0 2S
 
19.04.17
20:40
Назад в будущее...
Как в ТиС оптимальней получить список всех товаров, поступивших от определенного контрагента?
Из нужных движений поступления ТМЦ только регистр "Партии наличие", но это регистр остатков. Запрос по документам, имхо не комильфо.
И тут я понял, что ТиС забыл...:)
Короче, кто подскажет.
1 Zypse
 
19.04.17
20:50
И что, регистр остатков не может показать обороты?
Только регистр этот обычно большой и тормозной. По документам имхо быстрее всего будет
2 2S
 
19.04.17
20:53
(1) ну да, наверное, скорость имеет значение.
Мне еще нужно будет связать это с остатками по всем фирмам....
3 2S
 
19.04.17
20:58
во, кажется нашел решение
Справочник Партии
4 HawkEye
 
19.04.17
21:03
(0) запросом выбрать приход по регистру партии
5 Злопчинский
 
19.04.17
21:04
(3) неправильно
6 Злопчинский
 
19.04.17
21:05
(4) правильно. Только не приход а с кдом операции нужным
7 2S
 
19.04.17
21:05
(6) угу, понял
спасибо
8 NSSerg
 
19.04.17
21:25
Задача звучит как - получение всех товаров из проведенных приходных накладных по заданному поставщику.

После этого фраза в (0) звучит как минимум странно, это как минимум

Правильный запрос
Запрос=создатьобъект("запрос");
Текстзапроса="
|Период с начдата по кондата;
|ОбрабатыватьДокументы проведенные;
|Поставщик=Документ.поступлениеТМЦ.контрагент;
|условие (Поставщик=выбпоставщик);
|Товар=Документ.поступлениеТМЦ.номенклатура;
|группировка Товар без групп;
|Без итогов;";
Запрос.выполнить(текстзапроса);
Пока запрос.группировка()=1 цикл
Сообщить(запрос.товар);
Конеццикла;
9 2S
 
19.04.17
21:28
(8) изврат

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

    НетОш = 1; // нет ошибок при наложении фильтров
    Если ВидРазделителя = 1 Тогда
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Фирма",ВыбРазделитель1,"ВыбРазделитель1",ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "ЮрЛицо",,,ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "УпрАналитика",,,ТекстЗапроса,Загол);
    ИначеЕсли ВидРазделителя = 2 Тогда                                                  
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "ЮрЛицо",ВыбРазделитель2,"ВыбРазделитель2",ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Фирма",,,ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "УпрАналитика",,,ТекстЗапроса,Загол);
    ИначеЕсли ВидРазделителя = 3 Тогда                                                  
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "УпрАналитика",ВыбРазделитель3,"ВыбРазделитель3",ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Фирма",,,ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "ЮрЛицо",,,ТекстЗапроса,Загол);
    КонецЕсли;
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Номенклатура",ВыбТМЦ, "ВыбТМЦ", ТекстЗапроса, Загол, "СвойстваНоменклатуры");
                  
    Если НетОш = 0 Тогда
        Возврат;
    КонецЕсли;
10 NSSerg
 
19.04.17
22:25
(8) мало того что утебя в итоге запрос по куче таблиц
То есть он тупо медленней работает,
Но и вдобавок ты зачем-то подменил одну задачу другой.
То есть мало того что тому кто смотрит твой запрос нужно напрягаться чтоб понять что-же ты хотел получить, но и если например произойдет отказ от регистра партии товаров (от самих партий - например учет по средней)  - то отчет просто перестанет работать.
11 2S
 
19.04.17
22:28
(10) не только лишь все...там все работает по одной таблице

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

    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;    
    Пока Запрос.Группировка(1) = 1 Цикл
        Сообщить(Запрос.Номенклатура);
    КонецЦикла;


не работает и все, запрос выполняется.
Честно уже не помню, в чем фишка, надо описывать все измерения и ресурсы?
12 2S
 
19.04.17
22:31
вот полный код
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    Загол =  "";
    ДатаНачала = ?(ПустоеЗначение(ДатаОтбора) = 1, '01.01.17', ДатаОтбора);
    ТекстЗапроса =    
    "//{{ЗАПРОС(Товары)
    |Период с ДатаНачала по ДатаКонца;
    |Номенклатура = Регистр.ПартииНаличие.    Номенклатура;
    |Поставщик    = Регистр.ПартииНаличие.    Партия.Поставщик;
    |Фирма        = Регистр.ПартииНаличие.    Фирма;
    |ЮрЛицо       = Регистр.ПартииНаличие.    Фирма.ЮрЛицо;
    |УпрАналитика = Регистр.ПартииНаличие.    Фирма.УпрАналитика;
    |КодОперации  = Регистр.ПартииНаличие.    КодОперации;
    |Группировка Номенклатура без групп;
    |Условие ((КодОперации = Перечисление.КодыОпераций.Закупка) или (КодОперации = Перечисление.КодыОпераций.ЗакупкаРозница));
    |Условие (Поставщик = ВыбПоставщик);
    |"//}}ЗАПРОС
    ;

    НетОш = 1; // нет ошибок при наложении фильтров
    Если ВидРазделителя = 1 Тогда
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Фирма",ВыбРазделитель1,"ВыбРазделитель1",ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "ЮрЛицо",,,ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "УпрАналитика",,,ТекстЗапроса,Загол);
    ИначеЕсли ВидРазделителя = 2 Тогда                                                  
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "ЮрЛицо",ВыбРазделитель2,"ВыбРазделитель2",ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Фирма",,,ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "УпрАналитика",,,ТекстЗапроса,Загол);
    ИначеЕсли ВидРазделителя = 3 Тогда                                                  
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "УпрАналитика",ВыбРазделитель3,"ВыбРазделитель3",ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Фирма",,,ТекстЗапроса,Загол);
        НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "ЮрЛицо",,,ТекстЗапроса,Загол);
    КонецЕсли;
    НетОш = НетОш * глФильтрПоПеременнойЗапроса(, "Номенклатура",ВыбТМЦ, "ВыбТМЦ", ТекстЗапроса, Загол, "СвойстваНоменклатуры");
                  
    Если НетОш = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;    
    
    ТаблицаТоваровОтбор = СоздатьОбъект("ТаблицаЗначений");
    СписокТоваровОтбор = СоздатьОбъект("СписокЗначений");
    Запрос.Выгрузить(ТаблицаТоваровОтбор,,0);  
    ТаблицаТоваровОтбор.Выгрузить(СписокТоваровОтбор,,,1);

ТаблицаТоваровОтбор возвращается пустая. Я провел в тестовом режиме 5 документов поступления...
13 NSSerg
 
19.04.17
22:31
(11) потому что не пишут запрос по регистрам когда нужно получить данные из документов.
Регистры для другого предназначены, поэтому одно из требований запроса по регистрам - наличие функций.

Пока не поздно - сделай всё по-человечески, без извоащений.
14 2S
 
19.04.17
22:34
(13) ты ответил на мой вопрос, спасибо ;)
точно, надо функцию описать
15 NSSerg
 
19.04.17
22:35
(14) это называется - клинически неисправим.
16 2S
 
19.04.17
22:36
(15) вариант с запросом по документам не исключаю.
Если будут тормоза на реальных данных, проведу сравнение.
17 LazyStranger
 
19.04.17
22:38
в данном примере таблица регистра ничем, имхо, принципиально не отличается от таблицы документов, я бы по документом делал, примерно как в (8)
18 Злопчинский
 
20.04.17
00:33
Если типовая конфига - то по регистру. Если нетиповая - то смотреть. По регистру - правильнее, ибо там аккамулируется все., в т.ч. - если пишет вменяемый - и проведение нетиповых документов.

все, как обычно.
Кому - татор, а кому - лятор...
19 GreyK
 
20.04.17
00:46
Меня интересует вопрос: Что топикстартер хочет увидеть в итоге?
Все товары попавшие в приходные документы от контрагента или товары которые есть в остатках по партиям, ну или у (0) есть своя интерпретация вопроса.
20 Злопчинский
 
20.04.17
00:52
(19) ..трудна и неказиста жизнь топикстартера-программиста...
21 NSSerg
 
20.04.17
01:12
(18) можно поподробней?
Чем в регистре аккумулируется "больше всё", чем в приходных накладных? Особенно учитывая задачу - нам нужен товар из приходных наладных по контрагенту.
Откуда ты регистре "партии" возмешь поставщика при учете себестоимости "по средней"?
22 Злопчинский
 
20.04.17
01:35
(21) "приходных наладных..." - их в типовой ТиС как минимум три - Поступление тмц, Поступление ТМЦ розница, Поступление ТМЦ импорт, работая "по документам" - всегда есть шанс "забыть" какой-то вид документов...
работая по регистру - проблем меньше - туда уже все "заскладировано"
23 Злопчинский
 
20.04.17
01:35
(21) а про "по средней" - это я только и хотел написать в (12) как ошибку
24 Злопчинский
 
20.04.17
01:38
(21) частично согласен...

однако хотеть "товары от определенного контрагента" и режим "по средней" у меня плохо в уме складываются... ;-)

и сильно имхается что коллега хочет решить какую-то задачу, но подходит через жпс...
25 NSSerg
 
20.04.17
01:41
(22) Вот и напиши в запросе через запятую три вида документов, если тебе нужны три.
(24) Я не вижу ни малейшей связи между желанием получить матрицу поставщика (получить товар поставляемый определенным поставщиком) и способом расчета себестоимости.
Фирмы, которые считают "по средней" не хотят знать кто поставляет конкретный товар, и какой товар поставляет конкретный поставщик?
26 NSSerg
 
20.04.17
01:44
(24) Я думаю, что и как и в любой другой торговой фирме хотят решить совершенно четкую задачу - узнать какой товар поставляет конкретный поставщик. Это странная задача?
Более того, есть фирмы, которые считают экономические показатели в разрезе поставщиков, и при этом учет "по средней" ну никак этому не мешает, особенно если товар от разных поставщиков не пересекается.
27 Злопчинский
 
20.04.17
01:58
(25) мне не нужны три вида документов, не нужен один.
мне нужна номенклатура, поставляемая поставщиком и пофиг каким документом это отражено. не проводя аудит системы для каждого конкретного случая получения такого отчета - реально это можно собрать только через регистр. я бы тянул просто - движения с кодом операции по закупу в группировке по документу-регистратору, в обходе группировки по документам тянул бы "документ.контрагент" и фильтровал бы по нему. документ тоже получается задействован, ибо схема по поставщикам в ТиС имхо недоделанная какая-то...

любителям пробежаться по документам - тоже можно, проблем не вижу. просто риски чуть выше напороться на какую-нибудь хрень, типа в документе строка номенклатуры с нулевым количеством... или фильтр на проведенность документа забыли поставить..
28 Злопчинский
 
20.04.17
01:59
(26) не возражаю... ;-)
29 NSSerg
 
20.04.17
02:03
(267) Коды операций могут быть расширены, документ ввода остатков может быть без контрагента, могут потребоваться не все документы поступления, а только одного/нескольких видов и т.д.

Вообще ИМХО горе от ума - простейшую задачу превращают в полный маразм.
30 NSSerg
 
20.04.17
02:05
(27)
Риски напороться как раз больше когда задачу решают через гланды - вместо того чтоб напрямую взять данные из документов - сами документы собирают через регистр, который предназначен совсем для другого - для расчета себестоимости.
31 Злопчинский
 
20.04.17
02:28
Непродуктивно.
Работать по документам имеет смысл когда в базе бардак и наваяно хрен знает как без соблюдения логики построения конфиги.
Использовать регистр если он подходит для решения задачи - вполне допустимо.
Юзать регистр или документы - дело вкуса. Часто и довольно часто юзают документы. Ибо это близко парадигме ручного отчекрыживания
32 VladZ
 
20.04.17
07:52
(0) Если все приходы прошли по одному виду документов можно и по документам запрос сделать.
33 Масянька
 
20.04.17
08:00
Извините, что вмешиваюсь.
А чем не устраивает стандартный "Ведомость по партиям"?
34 2S
 
20.04.17
08:24
(20) И не говори, изобретать велосипед - дело не простое. (19) Помощник оформления заявок поставщику.
(33) надо реализовать кучу всяких условий + формекс задействовать для юзабилити. Получение матрицы - это неосновной код обработки.

Не приставайте к Злопчинскому, матрицу собрал по регистру.
Сравнил запросом по документам, разница обработки несущественна.
35 VladZ
 
20.04.17
09:46
Кстати, если операция разовая можно использовать docprint или regprint.
36 NSSerg
 
20.04.17
10:18
(31) когда регистр подходит - это регистр продажи для сбора продаж, но никак не регистр партии для сбора поступлений.
37 Злопчинский
 
20.04.17
14:03
(36) изыди, товарищ собрал по регистру ;-)
38 aka AMIGO
 
20.04.17
14:29
Регистр партии.. Хотел я тут как-то использовать его в отчете, смотрю - а у дира он пуст..
Спрашиваю, почто не заполняете, отвечает - мне партии без надобностев.
Так что использую Регистр Остатков Товаров.

А поскольку регПартий не использую в работе - то и не знаю, как он работает, и что из него можно получить..
Вот так: практики нет - остаюсь неграмотным в вопросе :)
Основная теорема систематики: Новые системы плодят новые проблемы.