Имя: Пароль:
1C
1C 7.7
v7: Перебрать запросом документы и получить цены номенклатуры из справочника цен.
,
0 raykom
 
06.09.14
22:37
Надо перебрать документы по номенклатуре и получать цену не из документа, а из справочника цен на дату документа.

Кто делал, подкиньте кусок кода . Пожалуйста.
1 raykom
 
06.09.14
22:37
Блин ... ТиС, файловая, черный запрос.
2 akaBrr
 
06.09.14
22:39
(1) Обязательно запросом? Нередко выборка работает быстрее в 7.7.
3 raykom
 
06.09.14
22:42
(2)Не обязательно, но надо таблицу строить потом, а итоги по группировкам и вообще, группировки проще в запросе.
4 welwel
 
06.09.14
22:49
В функции чёрного запроса можно использовать функцию из модуля. Может медленно работать, но логику упрощает.
5 welwel
 
06.09.14
22:53
+ Можно и к глПолучитЦену обратиться сразу
6 raykom
 
06.09.14
23:03
(4)Ну да, пробовал уже. Как то тоже криво.
(5)Вот об ней то и речь. Сейчас вот вернулся к этому ...
7 welwel
 
06.09.14
23:12
(5) но если есть аргументы не только из запроса, то к ф-и глоб. модуля придется обращаться через промежуточную ф-ю из модуля
8 raykom
 
06.09.14
23:26
Все из запроса.
Вот что передаю в глобальную

глПолучитьЦену(Номенклатура,СпрПоРекв("ТипыЦен","Код",Строка(Контрагент.ОсновноеСвойство.ЗначениеСвойства)),ДатаДок,Единица,Валюта,"1","1");
9 КонецЦикла
 
07.09.14
01:36
Не надо в запросе - будет жутко
Смотри как получается цена в подборе, например
10 raykom
 
07.09.14
01:38
(9)Блин, совсем разучился подглядывать. Верно ведь.
11 raykom
 
07.09.14
01:47
Вообщето вот такая конструкция получается без лишних подробностей


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

|Группировка Номенклатура Без Групп;

|Функция СуммаБезСкидки=Сумма(Цена) Когда (ВладелецЦены = Номенклатура);
|"//}}ЗАПРОС
;


Вот если вот так

|Функция СуммаБезСкидки=Сумма(Цена);

То запрос отрабатывает и возвращает выборку, но в значениях СуммаБезСкидки - хер знает что, какие то цифры не могу понять как и получаются. Итоги какие то по группировкам, а какие - не соображу.

А вот если так

|Функция СуммаБезСкидки=Сумма(Цена) Когда (ВладелецЦены = Номенклатура);

То выборка пустая.
12 raykom
 
07.09.14
01:53
Мало того, что как то по владельцу надо синхронизировать выборку и группировку, так еще хз, как на дату документа цену получить.
13 КонецЦикла
 
07.09.14
01:53
какая нахрен сумма?
где группировка по строке документа?
у тебя же задача получить цену для каждой номенклатуры в каждой строке?
понятно что у 1с крыша едет...
сделай перебором если не прет
14 raykom
 
07.09.14
01:54
(9)С выборкой все понятно - но блевать охота от подсчета итогов и построения группировок.
15 КонецЦикла
 
07.09.14
01:56
ИТЗ.Группировать()

Вот, падчетай

http://1c911.by/stati_1s/statya-kak-ispolzovat-indeksirovannuyu-tablicu-znacheniy-1s.htm

... или сортировать ТЗ и извращаться... но тут противно действительно
16 raykom
 
07.09.14
01:56
(13)Мне надо не из строки документа цену, а из справочника цен. Так что строка тут не при чем. Было бы из документа - не изгалялся бы
18 КонецЦикла
 
07.09.14
01:58
(16) Так надо отделить строки чтобы не было каши
У тебя 1с суммирует цены по номенклатуре... но номенклатура повторяется в одном/разных документах и т.п.
19 welwel
 
07.09.14
02:01
Примерно так
Функция Сум = Сумма(количество*ПолучитНужнуюЦену(Товар,Док))

И выборка только строк документов - без Справочник...
20 raykom
 
07.09.14
02:01
(18)Так у меня и нет группироввки по документу, что бы заморачиваться, что она сукка тупо не просуммирует цены по контрагенту ? Номенклатура то одна в пределах группирговки, функция суммирует по группировке, по логике. Куррва ...
21 КонецЦикла
 
07.09.14
02:03
Для этого надо выбрать различную номенклатуру и потом уже что-то там лепить и суммировать
А вообще иди проспись, а то забанюнахрен
22 raykom
 
07.09.14
02:06
>ПолучитНужнуюЦену(Товар,Док)

Вот эта ж0па есть глобальная, и она возвращает в такой конструкции цену верную, но функция тут суммирует какую то херню, как и в (11) когда нет условия.

А добавить условие - ПЦ, выборка пустая.
23 raykom
 
07.09.14
02:09
(21) За баней решение есть ? о_О
24 raykom
 
07.09.14
02:10
Сам то че не спишь ... Или белорусы не спят ?
25 КонецЦикла
 
07.09.14
02:13
Настало время главного вопроса: зачем перебирать "документы по номенклатуре" если она и так известна и цена хранится не в документе?
26 raykom
 
07.09.14
02:14
(19)>И выборка только строк документов - без Справочник...

О ... На четверты день Зоркий Сокол увидел, что у сарая нет четвертой стены ...

Попробую
27 raykom
 
07.09.14
02:14
(25))) Таки да ? Зачем ))
28 КонецЦикла
 
07.09.14
02:15
Если не известна - выборка номенклатуры из документов, свертка тз по номенклатуре и вперед, получать цены
29 welwel
 
07.09.14
02:15
А зачем цену суммировать просто так? Какой нужен итог?
30 КонецЦикла
 
07.09.14
02:15
(27) от же сцуко
31 raykom
 
07.09.14
02:16
(25)Потому, что надо выбрать и просуммировать номенклатуру в ореализациях за период
32 КонецЦикла
 
07.09.14
02:16
(29) да он просто нагло троллирует
33 raykom
 
07.09.14
02:17
К стати да, нахера.
(32)Да ладно ... Не до этого. Туплю уже просто
34 welwel
 
07.09.14
02:17
значит нужно цену множить на количество
35 КонецЦикла
 
07.09.14
02:17
(31) Что значит просуммировать номенклатуру?
Ссылки что ли складывать?
36 raykom
 
07.09.14
02:19
(29)Емае ... Ну надо пособирать скидки, вычислить их, получить сумму скидок по каждой номенклатуре. Сумму скидки надо определять через процент от нормальной цены по справочнику ...
37 raykom
 
07.09.14
02:20
(25)Ну некоторые значения по номенклатуре просуммировать ...
38 raykom
 
07.09.14
02:22
Блят ... полпятого
39 raykom
 
07.09.14
02:22
Клянусь - завяжу с одинесом в течении полугода.
40 raykom
 
07.09.14
02:23
Блевать уже от нее охота .
41 raykom
 
07.09.14
02:26
Пошло оно все кобыле в трещину .... Пошол спать.
Спасибо, за посильную помощь. Утро вечера, как говорится ...
42 welwel
 
07.09.14
02:27
Примерно так тогда:

|Период с НачДата по КонДата;
|Реализация         = Документ.Реализация.ТекущийДокумент;
|Номенклатура       = Документ.Реализация.Номенклатура;
.......

|Группировка Номенклатура Без Групп;
|Группировка Документ;

|Функция СуммаСкидки = Сумма(ПолучитьСуммуСкидки(Номенклатура, Реализация, Цена))

в ПолучитьСуммуСкидки описать вычисление скидки
а запрос все просуммирует
43 raykom
 
07.09.14
02:34
От враги ... Сами не спят и другим не дают. Щас попробую. Уже есть похожие конструкции
44 welwel
 
07.09.14
02:34
точнее так:
|Функция СуммаСкидки = Сумма(Количество*ПолучитьСуммуСкидкиНаЕдиницу(Номенклатура, Реализация, Цена))
45 raykom
 
07.09.14
02:36
ага, вам тоже спать пора ...
>ПолучитьСуммуСкидкиНаЕдиницу(Номенклатура, Реализация, Цена)

В Цена то, что будем передавать ? Значение то по владельцу да и периодический еще ...
46 welwel
 
07.09.14
02:38
Цена из документа, если нужна конечно
47 raykom
 
07.09.14
02:38
Не нужна, нужна из справочника
48 raykom
 
07.09.14
02:39
Потому и сыр бор весь
49 welwel
 
07.09.14
02:40
А из справочника цена берётся через вызов глполучитцену из нашей функции получитьсуммускидкинаединицу
50 welwel
 
07.09.14
02:42
Номенклатура и реквизиты шапки реализации все в ней есть
51 welwel
 
07.09.14
02:45
В получитьсуммускидкинаединицу можно передать из запроса еще единицу и валюту, если не брать дефолтные
52 Мимохожий Однако
 
07.09.14
08:22
Посмотри как формируется скидка в печатной форме счета со скидками. Скомпилируй для своей задачи. Может быть, и прозреешь.
53 raykom
 
07.09.14
11:13
Не, парни, уже вторая ветка и меня уводят в сторону.
Не будем вникать в несуществующие детали - что да почему.Нет у меня сведений о скидке в шапке и не могу я собирать данные по алгоритму формы счета со скидками - стандартный механизм скидок у меня не задействован ни как.

Это фейковая скидка, которая обозначена только формальными признаками - типа реквизита - флажек, процент и датаОт.

Все остальное происходит виртуально и приобретает значения уже в таблице выгрузки в другое информационное пространство.
Но и там это уже реализуется в виде абсолютных цифр - цена, сумма, которые УЖЕ уменьшены на процент скидки.
Есть только отметка о скидке, процент скидки в отдельном реквизите и реальная цена в справочнике товара.

ТАк что - нужен ответ на сабж. Звиняйте.
54 welwel
 
07.09.14
12:09
Так вся инф-я из строк документа извлекается в запросе. Передаётся в функцию для расчёта. Да - будет тормозить на больших объёмах, но работать будет
55 raykom
 
07.09.14
12:10
Если производить расчет от обратного - от суммы документа - получим разность в округлениях на копейки, т.к. скидка расчитывалась от цены товара.
56 welwel
 
07.09.14
12:10
Делал подобный отчет по регистрам, сравнивал с ценами заданного пользователем типа цен.
57 raykom
 
07.09.14
12:27
Это же пестец ... Лучше б я и не углублялся в 1с. Так бы и думал, что зачетный софт.

Вопрос то в том, что в запросе к справочнику нельзя получить значения периодического подчиненного реквизита ...
Что тут ненужного в языке запросов по мнению разработчиков ?? Епланы ...
58 NS
 
07.09.14
12:46
(57) При чем тут "зачетный софт"? На любом языке, чтоб что-нибудь написать - надо уметь писать.
59 NS
 
07.09.14
12:50
Убираешь цену из запроса.
И получаешь её естественно при обходе группировок запроса.
60 raykom
 
07.09.14
13:51
(58)Ну ... это я думаю справедливо отнести и к разработчикам ...
Что такого необычного в моем пожелании к функционалу языка запросов ?

Стандартное обращение к стандартному справочнику в стандартной конфигурации ...
За каким хером ламеру надо выписывать какие то кренделя запросом, что бы добыть какие то значения из этой ситуации ?

(59) ... опять за рыбу деньги ...
А итоги ? Опять счетчиком считать ??? Гамнописцы 1совские ...
Так то я и сам своими кривымируками могу, но нахера такие качели то ?
61 Злопчинский
 
07.09.14
14:02
(60) Про кренделя: потому что пери.реквизиты - это совсем другой справочник. Видно влом им было писать транслятор с чорного запроса в нормальный запрос... вот и получилсаь такая фигня.
62 NS
 
07.09.14
14:03
(60) Это не обычное пожелание к языку запросов. Это неумение пользоваться языком. В любом языке есть ограничения, и нужно уметь пользоваться функционалом языка.
63 raykom
 
07.09.14
14:05
(61)Ну так понимаю в принципе то ...
(62)Покажи мне функционал языка запросов для работы с периодическими реквизитами ?
64 NS
 
07.09.14
14:06
(63) А он должен быть? Язык - встроенный язык 1С, и в нем есть полный функционал для работы с периодикой. Естественно не надо при этом пользоваться запросами.
65 raykom
 
07.09.14
14:08
(64)А язык запросов - это встроенный в китайца язык ?
> Естественно не надо при этом пользоваться запросами.

С какого перепугу то такая нелогичная предопределенность то ??
66 NS
 
07.09.14
14:13
(65) Язык запросов - это всего-лишь часть встроенного языка 1С. И в семерке, и в восьмерке, и в Аccess и т.д. - у языка запросов куча ограничений. И предназначен он для решения узкого класса задач и подзадач.
Для решения любой задачи принято использовать те средства, которые для этого предназначены, и в любом случае программист должен использовать те средства при помощи которых задачу можно эффективно решить.

Ничего нелогичного я вообще-то не вижу.
67 NS
 
07.09.14
14:13
(65) О каком китайце идет речь?
68 NS
 
07.09.14
14:15
Кстати, для получения цены даже есть готовая функция у тебя в конфигурации. Если ты не умеешь использовать в запросе внешние функции - это опять-таки никак не проблема 1С.
69 raykom
 
07.09.14
14:26
(66)Ну ... Это уже вопрос религии, по типу - почему винда все делает сама, а Линупс надо кодить выпучив глаза ...
Линуксоиды - за эксюзабельность, а виндоводы - за френдабельность ...

В итоге - это не логика которую подсказывает практика, а логика диктуемая разработчиком.
А уж результатом чего она является - возможностями синтаксиса или представлениями разработчика о том, что ДОСТАТОЧНО программисту в тех или иных ситуациях - вопрос филосовский.

Мое убеждение такое, что в моей ситуации неумение запроса работать с периодикой, в частности, ставит меня в затруднительное положение при выводе результатов в таблицы, так как выборки сложно группировать и суммировать, а так же адаптировать под макет печати.

Т.е. разработчики решили свои проблеммы за мой счет. Казлы.
Поскольку речь таки идет о работе с набором стандартных реквизитов. И о НЕСПОСОБНОСТИ механизма платформы получать из них значения.

(67)Не знаю, о любом. Это я к тому, что язык запросов - неотемлемая часть языка 1С. А не сторонняя приблуда.

(68)Знаю. Она работает только в функции запроса и таки отрабатывает криво, перемножает результат на количество вхождений в группировку. Причем по хер знает по какому то кривому алгоритму.

Начинается как бе не с 1 го вхождения, а со второго и далее.
Сижу вот сейчас разгадываю ... Опять надо или счетчик прикручивать и делить на него или по условию прекращать суммирование при значении счетчика более 1.

Мы тут в дворницкой то тоже не пальцем деланы ...
70 NS
 
07.09.14
14:41
(69) Ни у кого проблем нет, проблемы только у тебя, а виноват естественно язык :)
Код, который ты выкладываешь, ни имеет ни малейших признаков логики, и аналогичный код не будет работать ни на одном языке. Проблема то не в языке, а в том что не всем дано писать. Не лучше ли найти вид деятельности к которому у тебя есть способности, и заниматься им?
71 raykom
 
07.09.14
14:53
(70)Не имел логики.
Счас вот выложу, что допилил и там с логикой порядок.
Но и с ограничениями функционала - тоже все очевидно.
72 NS
 
07.09.14
15:02
(71) По кругу идем. В любом языке функционал ограничен. И в любом языке со временем функционал развивается.
Ты бы видел какие ограничения были в конструкторе запросов в Access на момент появления семерки.
73 raykom
 
07.09.14
15:15
(72)Не ... Это ты по кругу. Я на старте - разрабы - ленивые казлы ...
74 raykom
 
07.09.14
15:18
Вот эта пидерсия отрабатывает правильно.

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

|Условие(Номенклатура=ВыбНоменклатура);
//Это условие для отработки, далее оно не нужно
//Попробуйте организовать фильтр по переменной запроса. Криворукие разработчики ...

|Функция КоличествоКонОст = Сумма(Количество);
|Функция СуммаКурс = Сумма(Курс);
//  вот эту кривую СуммаКурс вынужден прилепить Для определения количества вхождений в группировку благо курс неизменный, а то какую то единицу бы пришлось суммировать

|Функция СуммаБезСкидки=Сумма(глПолучитьЦену(Номенклатура,ТипЦены,ДатаДок,Единица,Валюта,Курс,Кратность));
//почему переменная функции не доступна из самого запроса ???
//Пестец, для того, что бы получить НУЖНЫЙ мне результат из функции СуммаБезСкидки можно было бы просто разделить ее на результат предыдущей функции СуммаКурс
//И почему вообще  обращение к внешним функциям возможно только из функции запроса ??? Почему его нельзя вернуть в переменную запроса 7? Казлы криворукие ...

|"//}}ЗАПРОС
;

// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;

//
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ТабОтчет");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);

Таб.ВывестиСекцию("Шапка");

Пока Запрос.Группировка(1) = 1 Цикл
    Контрагент = Запрос.Контрагент;
    КолвоВхождений  = Запрос.СуммаКурс;//применяем в запросе для подсчета количества вхождений - в рот ноги разработчикам
    Таб.ВывестиСекцию("СтрокаКонт");
    Пока Запрос.Группировка(2) = 1 Цикл
        Контрагент   = "";
        Номенклатура = Запрос.Номенклатура;
        Количество   = Запрос.КоличествоКонОст;
        Цена         = Запрос.СуммаБезСкидки/КолвоВхождений; //вот нзачем такие качели ??
        Таб.ВывестиСекцию("СтрокаНом");
    КонецЦикла;    
КонецЦикла;
//ИтогоСкидка        = Запрос.СуммаБезСкидки  ;
Таб.ВывестиСекцию("Итого");

Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");




И скажите мне после этого, что я ленивый тупой ламер ...
75 raykom
 
07.09.14
15:20
Но так или иначе эту заразу я победил благодаря вашим пинкам и помощи, панове.

Спасибо большое )))
Нужный мне результат получен.
76 NS
 
07.09.14
15:22
|Функция СуммаБезСкидки=Сумма(глПолучитьЦену(Номенклатура,ТипЦены,ДатаДок,Единица,Валюта,Курс,Кратность));
Конечно ламер. нафига ты складываешь ЦЕНУ???
|Функция СуммаБезСкидки=Сумма(глПолучитьЦену(Номенклатура,ТипЦены,ДатаДок,Единица,Валюта,Курс,Кратность)*КОЛИЧЕСТВО);
Естественно решало все твои проблемы.
77 welwel
 
07.09.14
15:23
Зачем цену суммировать без перемножения на количество??!
78 welwel
 
07.09.14
15:24
(76) +1
79 raykom
 
07.09.14
15:27
(76)
1.>Конечно ламер. нафига ты складываешь ЦЕНУ???
Это не я складываю, а функция запроса, потому как обращение к фнешней функции возможно только изФУНКЦИИ ЗАПРОСА и именно ИЗ СУММЫ.

2. Потому что СуммаБезСкидки суммируется не по КОЛИЧЕСТВУ товара, а по количеству ВХОЖДЕНИЙ в группировку.
При чем тут вообще, количество товара ...

Сам ты ... плохо меня понял. :D
80 welwel
 
07.09.14
15:29
Можно взять функцию запроса Среднее, чем делить на вхождения
81 raykom
 
07.09.14
15:32
(80)Ну да, можно. Только я об этом не знал и тут никто не подсказал.
Щас попробую.
82 NS
 
07.09.14
15:33
(79)
"2. Потому что СуммаБезСкидки суммируется не по КОЛИЧЕСТВУ товара, а по количеству ВХОЖДЕНИЙ в группировку.
При чем тут вообще, количество товара ..."
Это всё происходит на живой базе работающей фирмы?!
83 raykom
 
07.09.14
15:34
(82)на копии. а что не так в моем утверждении ???
84 welwel
 
07.09.14
15:36
Цену-то итожить по номенклатуре для чего нужно?
85 raykom
 
07.09.14
15:38
(84)Да где ты видишь, что я ее по номенклатуре то итожу ? Я цену перемноженную на количество итожить, так как надо все суммировать по этой номенклатуре и по контрику.

Я пока только ДОБЫВАЮ ЦЕНУ !!!
86 welwel
 
07.09.14
15:43
Для цены функция запроса вовсе не нужна
87 raykom
 
07.09.14
15:46
(86)епать  вы заколдованные что ли ? Из чего такой вывод  то ??
Мне цена нужна ИЗ СПРАВОЧНИКА
88 raykom
 
07.09.14
15:56
+(87)а ее только через внешнюю функцию добыть можно (для NS об использовании ВСЕХ возможностей этого ушлепского языка), а доступ к ВНЕШНЕЙ функции - только из ФУНКЦИИ ЗАПРОСА ...
89 raykom
 
07.09.14
15:57
(86)Так как она не нужна то ?
90 raykom
 
07.09.14
16:03
(80)Да, еще раз спасибо. Среднее отрабатывает как надо.
Ну так и быть ... Не криворукие разрабы ... Только одна рука у них кривая :D
91 welwel
 
07.09.14
16:24
(89) цену итожить не надо, а значит и посчитать её можно уже на этапе обхода результата запроса перед выводом
92 raykom
 
07.09.14
16:44
(91) пля ... А группировки как суммировать ? Счетчиком ??
93 Voronve
 
07.09.14
16:59
(92) Ты не мудри, ты код покажи какой получился
94 welwel
 
07.09.14
17:15
(92) а суммы суммировать функцией сумма. Получается Среднее лишним будет в запросе - цену можно получать той же внешней функцией уже на этапе обхода результата запроса.
95 NS
 
07.09.14
17:23
(94) А просто функцию запроса "СуммаСоСкидкой" поделить на функцию запроса "Сумма(Количество)"?
96 welwel
 
07.09.14
17:29
Без разницы - главное,что этим не загромождать запрос
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.