helpf.pro
Регистрация

v8.2 УП: Запросы

chainik
19.11.2013 15:00Прочитано: 2627
Есть запрос. созданный конструктором запроса:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслугТовары.Номенклатура,
| СУММА(ПоступлениеТоваровУслугТовары.Цена) КАК Цена,
| СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
| ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения,
| СУММА(ПоступлениеТоваровУслугТовары.Количество * ПоступлениеТоваровУслугТовары.Цена) КАК Поле1
| ПОМЕСТИТЬ вт
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
| ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаОкон
| И ПоступлениеТоваровУслугТовары.Ссылка.ПодразделениеОрганизации = &ПодразделениеОрг
| И ПоступлениеТоваровУслугТовары.Ссылка.Проведен
| СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровУслугТовары.Номенклатура,
| ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| вт.Номенклатура,
| вт.Поле1 / вт.Количество КАК Поле1
|ИЗ
| вт КАК вт
|";
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаОкон", ДатаОкон);
Запрос.УстановитьПараметр("ПодразделениеОрг", ПодразделениеОрг);
// Результат = Запрос.Выполнить();
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();


Как из этого запроса вытащить номер и дату самого документа, если ВыборкаДетальныеЗаписи дает значение только табличной части документа, а не общих реквизитов? Подскажите, пожалуйста
Yandex
Возможно, вас также заинтересует
Реклама на портале
LTrigubovich
19.11.2013 15:32Ответ № 1
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК НомерДокумента,
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаДокумента,
| ПоступлениеТоваровУслугТовары.Номенклатура,
...

Хотя не совсем понятно, каков прикладной смысл поля:
| СУММА(ПоступлениеТоваровУслугТовары.Цена) КАК Цена,

По-моему это совершенно лишнее поле.
Ведь если мы например ввели в поступлении в одной строке - одну штуку по цене 100 руб., а в другой - две с ценой 120, причем одну и ту же номенклатуру, то в поле "Цена" для этой номенклатуры будет 220, что не есть ни цена, ни что-либо подобное цене, т.к. "Количество" будет 3, а "Цена" 220.

Не стоит напрягать SQL, да и 1С-ку получением ненужных данных.
LTrigubovich
19.11.2013 15:34Ответ № 2

Изменено 19.11.13 15:37:31 по причине: ошибка вышла
LTrigubovich
19.11.2013 15:35Ответ № 3
Запрос.Текст =
"ВЫБРАТЬ
| ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК НомерДокумента,
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаДокумента,
| ПоступлениеТоваровУслугТовары.Номенклатура,
...

Хотя не совсем понятно, каков прикладной смысл поля:
| СУММА(ПоступлениеТоваровУслугТовары.Цена) КАК Цена,

По-моему это совершенно лишнее поле.
Ведь если мы например ввели в поступлении в одной строке - одну штуку по цене 100 руб., а в другой - две с ценой 120, причем одну и ту же номенклатуру, то в поле "Цена" для этой номенклатуры будет 220, что не есть ни цена, ни что-либо подобное цене, т.к. "Количество" будет 3, а "Цена" 220.

Не стоит напрягать SQL, да и 1С-ку получением ненужных данных.
chainik
19.11.2013 15:45Ответ № 4
Надо выбрать из документов номенклатуры и вывести среднюю цену. Так что лишнего поля нет. Как в запросе вывести, я знала. Мне не понятно, как из Запроса эти данные вывести. Надо их записать в ДБФ.
Если табличные части вывожу:
ДБФ.km=ВыборкаДетальныеЗаписи.Номенклатура.НомНомер;
ДБФ.name=ВыборкаДетальныеЗаписи.Номенклатура и т.д.
то с основными реквизитами затрудняюсь.

Задача, вообще, стоит более сложнее. Вывести среднюю цену не по Номенклатуре, что более-менее сделано, а по НомНомеру. Но про это и спрашивать страшно.
LTrigubovich
19.11.2013 16:06Ответ № 5
Я надеюсь Вы внимательно прочитали мое первое сообщение?
Заметили там 2 новый поля в начале:

| ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК НомерДокумента,
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаДокумента,

Это и есть нужные Вам "основные" реквизиты!

У строки табличной части (любого объекта) есть поле "Ссылка", в которой и хранится ссылка на объект, которому эта табличная часть принадлежит.
А у Ссылки есть все остальные реквизиты объекта, которые можно извлечь через точку: Ссылка.Дата, Ссылка.Номер, Ссылка.Проведен, Ссылка.ПометкаУдаления,...
В общем - все что угодно можно вытянуть.
LTrigubovich
19.11.2013 16:09Ответ № 6
Простите, наверное непонятно объяснил.
Просто "из этого запроса" - Вы дату и номер никак не вытяните!
Запрос надо менять.
chainik
19.11.2013 16:25Ответ № 7
Извините, но можно по подробнее. Что в запросе к самому документу обращается через ссылку, то поняла, спасибо. Но я еще полный чайник в 8-ке.
Если по порядку. Сделала запрос. Через переменную ВыборкаДетальныеЗаписи запрос выпонили и выбрали. Но... только табличные данные. Пробую ВыборкаДетальныеЗаписи.ПоступлениеТоваровУслугТовары.Ссылка дает ошибку "Поле объекта не обнаружено "ПоступлениеТоваровУслугТовары""
chainik
19.11.2013 16:37Ответ № 8
А вставка новых полей с сылкой при выполнении обработки выдает ошибку:
Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(2, 4)}: Поле не входит в группу "ПоступлениеТоваровУслугТовары.Ссылка.Номер"
<<?>>ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК НомерДокумента,

Ну что я не так делаю?
LTrigubovich
19.11.2013 16:54Ответ № 9
Само-собой, если добавили поля, а в запросе есть агрегатные функции, то надо эти поля добавить к полям группировки, т.е. после СГРУППИРОВАТЬ ПО...

Или просто добавляйте поля в конструкторе, он сам группировку подправит, если понадобится.
LTrigubovich
19.11.2013 17:00Ответ № 10
А вообще, я начинал все же с описания встроенного языка и основных объектов (справочников, документов, регистров, отчетов).

Есть еще книга кажется М.Радченко. "Простые приемы разработки..." кажется называлась. Там очень коротко и понятно было написано - что такое справочники, документы, отчеты, запросы, и как они все работают.

А "метод тыка" - не самый лучший вариант. Не советую)
LTrigubovich
19.11.2013 17:22Ответ № 11
Точнее:
Радченко М. Г., Хрусталева Е. Ю. - 1С:Предприятие 8.2. Практическое пособие разработчика. Примеры и типовые приемы

Скачать можно например здесь:
http://booksteka.info/cat2/kniga1762.html
LTrigubovich
19.11.2013 18:23Ответ № 12
Глянул сам ту книжонку. Похоже кое-что изменилось с тех пор как я ее читал.
Теперь там построение отчетов с помощью СКД описано, а про запросы даже не нашел в оглавлении.

Поэтому поясню кратко основные моменты:
1)Результатом выполнения и запроса и метода Результат.Выбрать() является "выборка", которая содержит "строки". А в каждой строке выборки содержатся только те поля, которые описаны в запросе.

2)Сам язык запросов позволяет описывать поля выборки и определять из каких таблиц (документов, справочников, регистров) будут в них попадать данные.
В Вашем исходном запросе поле "Поле1" будет содержать частное от деления сумм на количество по каждой Номенклатуре из таб. части "Товары" всех документов "поступление товаров услуг", для которых выполняются условия, описанные после "ГДЕ..."

Однако, поскольку в Вашем запросе нету поля, которое содержит сами документы (т.е. Ссылка), то после выполнения этого запроса Вы не сможете из него получить те документы, данные из которых попали в выборку. А только лишь "номенклатуру" и "поле1"

В общем, чтобы что-то из выборки получить, надо сначала позаботиться о том, чтобы в нее эта информация попала, т.е. описать поля запроса так, чтобы в них было все что нужно.

Далее, после выполнения запроса, мы получаем выборку его строк командой:
ВыборкаДетальныеЗаписи = Результат.Выбрать();

После чего "ВыборкаДетальныеЗаписи" - это объект, содержащий строки по всей найденной номенклатуре (или ни одной, если документов не найдется). И чтобы поочередно их обработать, есть специальная команда (метод) - "Следующий()", получающий из выборки следующую строку. Например:

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НоменклатураИзЗАпроса = ВыборкаДетальныеЗаписи.Номенклатура;
ЦенаИзЗапроса = ВыборкаДетальныеЗаписи.Поле1;
//если будут другие поля, можно будет и их значения получать через точку,
//заносить в переменные, сравнивать, складывать, делить, и т.п.
КонецЦикла;

Надеюсь эта информация Вам поможет.
Остальное - ищите в книгах, в синтакс-помощнике или во встроенном хэлпе (в конфигураторе).

Удачи.
chainik
20.11.2013 09:19Ответ № 13
Спасибо большое. Объяснение очень хорошее, только, к сожалению, не дает ответа на мой вопрос.Что надо сделать, чтобы вывести реквизиты самого документа. Дело в том, что я несколько лет работала в 7-ке. Там все просто. В запросах рассматриваются сами документы, а табличные части выводятся с помощью группировки и последующих циклов. В 8-ке все намного сложнее. На решение вроде бы самых простых вопросов уходит слишком много времени. Не имея на руках какой-либо литературы. И из 10 программистов я единственная, кто работает в 8-ке. Приходится искать все либо в интернете, либо на этом форуме.
Цикл у меня есть:
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДБФ.Добавить();
ДБФ.km=ВыборкаДетальныеЗаписи.Номенклатура.НомНомер;
...

ДатаДок-????
ДБФ.Записать();

КонецЦикла;
ДБФ.ЗакрытьФайл();
chainik
20.11.2013 12:55Ответ № 14
И еще один вопрос к этой теме. Необходимо найти среднюю цену товара. По данному запросу она считается правильно, но есть один нюанс. В Номенклатуре есть реквизит НомНомер. Имеется такая ситуация:
123 Круг6000 180 Сталь 35
123 Круг6000 180 Сталь 35-Т
123-НомНомер. Программа считает, что это разные материалы, а необходимо учитывать их как один. Как объединить в таком случае, т.е. расчет вести, учитывая не саму номенклатуру, а его реквизит?
LTrigubovich
22.11.2013 18:07Ответ № 15
Не хочу Вас расстраивать, но без изучения встроенного языка, и в частности языка запросов, Вам вряд ли удастся успешно решать подобные задачи.

Постарайтесь найти в инете хотя бы "Радченко М. Г., Хрусталева Е. Ю. - 1С:Предприятие 8.Х. Практическое пособие разработчика. Примеры и типовые приемы".
Лучше даже 8.0, т.к. там были более простые запросы, без "системы компоновки данных" (СКД). А для 8.2 - все примеры на СКД.

А все Ваши задачи решаются путем описания полей выборки (это то что после ВЫБРАТЬ и до ИЗ) и полей группировки (после СГРУППИРОВАТЬ ПО).
В частности:
1) в выборке должны присутствовать поля, содержащее номер и дату документа:
| ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК НомерДокумента,
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК ДатаДокумента,
2) группировать надо не по номенклатуре и единице измерения (как у Вас было), а по полю, которое содержит НомНомер. Его кстати тоже надо добавить в поля выборки.
3) "Средняя цена" - понятие относительное. Ведь можно просто просуммировать по НомНомеру количество и стоимость всех поступлений и разделить стоимость на количество, а можно еще добавить количество и стоимость остатков, которые были на начало периода.

Разберитесь сначала с полями, посмотрите что получится, потом поговорим о ценах.
LTrigubovich
22.11.2013 18:18Ответ № 16
Я бы как-то так написал запрос:

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

Единственное, что по одному НомНомеру будет несколько строк, с ращными номерами и датами документов. Но у таблицы значений есть методы для поиска строк с отбором по значениям колонок. Придется по каждому артикулу найти итоговые сумму и количество по всем документам и рассчитать среднюю.
LTrigubovich
22.11.2013 18:22Ответ № 17
Есть правда способ сразу получить итоги по каждому НомНомеру (по всем документам), но тогда надо результаты в виде дерева значений получать, а не таблицы.
Для этого кстати тоже есть "волшебные слова" в языке запросов и встроенном языке. И они тоже все описаны в документации.
LTrigubovich
22.11.2013 18:45Ответ № 18
И еще, сразу учтите, чтобы потом не исправлять, ибо исправлять придется при больших объемах базы:
Запросы надо так составлять, чтобы все нужные Вам данные были в его полях.

Потому что обращение к реквизитам справочника или документа через точку при большом объеме информации будет существенно тормозить работу, т.к. за каждым реквизитом 1С-ка "лезет" в базу данных, т.е. как бы делает запрос на получение одного реквизита одного объекта!

То есть вот так было неправильно:
ДБФ.km=ВыборкаДетальныеЗаписи.Номенклатура.НомНомер;

Правильно будет так:
ДБФ.km=ВыборкаДетальныеЗаписи.НомНомер;

Но для этого поле "НомНомер" должно быть в полях запроса (как в моем примере).

А запрос конечно тоже "лезет" в базу, но запрос выполнится 1 раз, а при Вашем варианте к базе будет столько запросов, сколько разных номенклатур попадет в результат. И плюс еще один, который вытягивал номенклатуру и прочее.
chainik
25.11.2013 12:50Ответ № 19
Спасибо большое. С программой справилась.
Подсказка: Вы можете добавить любую страничку в Избранное щелкнув по значку
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.