Имя: Пароль:
1C
1С v8
Параметры виртуальной таблицы
0 NikolayNiko
 
03.11.17
20:28
Здравствуйте! Пожалуйста подскажите, как в параметрах виртуальной таблицы периодического регистра сведений установить отбор так, чтобы получать только последнюю запись по одному конкретному измерению. Всего измерений 4. Один ресурс. Ресурс не заполнен.
1 Волшебник
 
модератор
03.11.17
20:32
Вы как пробовали?
2 NikolayNiko
 
03.11.17
20:37
(1) Не знаю даже как попробовать
3 Волшебник
 
модератор
03.11.17
20:38
(2) Не стесняйтесь.
4 Египтянин
 
03.11.17
20:40
(0) надо попробовать с прочтения книжки http://www.ozon.ru/context/detail/id/138526046/?partner=epoint&partneragentid=955860_42oyurp7mw29vikgougt2b6khgqfyx0g&utm_source=epoint&utm_medium=partner&utm_campaign=955860 ну, или вон хотя бы Митичкина почитай.
5 mistеr
 
03.11.17
20:48
(0) Виртуальная таблица СрезПоследних возвращает записи сразу по всем измерениям. Если нужно только по одному, то кроме задания параметров ВТ, нужно дополнительно упорядочить по периоду (по убыванию) и взять ПЕРВЫЕ 1.
6 Vladal
 
03.11.17
21:34
(5) так уже брать и не виртуальную а обычную.

(0) озвучь задачу полностью. Может там срез последних на каждую дату, или статус договора на момент времени и т.д. И т.п. Не стесняйся, здесь как у доктора — чем четче анамнеза, тем точней диагноз.
7 Волшебник
 
модератор
03.11.17
21:54
(6) Дык я сразу спросил в (1) и (3)
Чувствую себя доктором
8 Cyberhawk
 
03.11.17
23:05
"установить отбор так, чтобы получать только последнюю запись по одному конкретному измерению" // Покажи несколько последних записей таблицы и что должно быть на выходе
9 Sasha_H
 
03.11.17
23:47
(0) зачем упорядычивать по периода когда ты используешь СрезПоследних?
10 NikolayNiko
 
06.11.17
20:12
Если конкретнее, то в периодическом регистре сведений есть измерения: Организация, контрагент, договор; и одно измерение: Аннулировано. Измерение в регистре вообще не заполняется. Мне нужно получить последнюю запись по договору. Вот ломаю голову по незнанию, как же получается эта последняя запись, когда делаешь запрос с помощью конструктора. Да знаю, что надо читать и учиться или вызывать программиста, но надо сделать самому и сегодня же.
11 NikolayNiko
 
06.11.17
20:13
И один Ресурс*
12 Мимохожий Однако
 
06.11.17
20:41
(11) Табличку с примерными данными покажи
13 NikolayNiko
 
06.11.17
20:48
(12) Период Регистратор НомерСтроки Организация Контрагент Договор Аннулирвоано
14 Мимохожий Однако
 
06.11.17
22:52
Теперь покажи запрос, которым пытался получить хоть что-то
15 NikolayNiko
 
06.11.17
23:00
Ведь можно как-то просто в параметрах вирт таблицы указать измерение по которому должен идти поиск последнего. Именно не по всем измерениям, а по одному только. Как это описать, мне только это нужно. Нигде не могу найти
16 Мимохожий Однако
 
06.11.17
23:28
(15) Есть обработка "Консоль запросов". На ней потренируйся.
17 h-sp
 
07.11.17
00:08
(15) можете не искать, нет такой возможности.
18 jsmith82
 
07.11.17
00:42
Аннулировано надо делать измерением, а не ресурсом и указывать в отборе НЕ Аннулировано
19 jsmith82
 
07.11.17
00:43
Ой, чё это я, не то погнал
20 AlvlSpb
 
07.11.17
01:26
Автору надо получить последнюю запись по конкретному договору?

ВЫБРАТЬ ПЕРВЫЕ 1
// поля выбора
ИЗ
    РегистрСведений.НашРегистр.СрезПоследних(, Договор = &Договор) КАК НашРегистрСрезПоследних
УПОРЯДОЧИТЬ ПО
    НашРегистрСрезПоследних.Регистратор.Дата УБЫВ

Или У меня послепраздничный синдром и я не понял задачи?
21 Antony8x
 
07.11.17
03:47
(20) совершенно верно пишите, автор в (15) написал
22 Рэйв
 
07.11.17
04:44
(0)Для того чтобы по одному измерению срез последних дало его только одно и надо поставить в Выбрать. Сколько измерений будет выбрано - столько вариантов разреза и получишь.
23 youalex
 
07.11.17
05:10
Срез последних всегда получает все возможные комбинации измерений, и состав полей выборки (секция ВЫБРАТЬ) тут не играет.
24 NikolayNiko
 
07.11.17
07:15
(20) Нет, не по конкретному документу, а по всем. Например если есть две записи с одним договором, то взять последний. (23) То есть как сказал (17), не возможно?
25 NikolayNiko
 
07.11.17
07:19
Как тогда? Группировать по договору и брать максимальное?
26 Мимохожий Однако
 
07.11.17
07:42
(25) Тебе нужен листочек бумажки,если нет экселя. Выпиши в него табличку с данными и подумай. Пока каша в голове - программу не составишь.
27 Salimbek
 
07.11.17
08:44
(0) Надо что-то типа такого:

Выбрать Данные.* ИЗ
(Выбрать Макс(Период) КАК МПериод, Договор КАК МДоговор ИЗ РегистрСведений.ТвойРегистр ГДЕ Договор=&Договор) Как Выборка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
РегистрСведений.ТвойРегистр КАК Данные ПО МПериод=Данные.Период И МДоговор=Данные.Договор
28 youalex
 
07.11.17
08:59
(24)
У тебя в регистре измерения Организация, контрагент, договор.
Условие "Договор = &Договор" в параметрах среза фильтрует по договору, это то что тебе и нужно.
Контрагент - это скорее всего справочник Контрагенты, который является владельцем спр. Договоры, т.е. Контрагент = Договор.Владелец.
Остается Организация - если у тебя в регистре по выбранному договору одна организация, то будет одна строка, если две - то две строки, т.е. будут выбираться все комбинации с учетом условия Договор = &Договор.

Более правильным будет указать в условиях все измерения, т.е.


ВЫБРАТЬ * //какие-то поля
ИЗ РегистрСведений.НашРегистр.СрезПоследних(, Договор = &Договор И Контрагент = &Контрагент И Организация = &Организация)
)
В параметры запроса пихаешь Договор (он у тебя уже есть), Контрагент (Договор.Владелец) и Организацию (нужно понять откуда ее взять, если она в регистре не заполнена, то просто Справочники.Организация.ПустаяСсылка())
29 DrZombi
 
гуру
07.11.17
09:01
(10) Все и сразу, и желательно без знаний, феерично :)
30 DrZombi
 
гуру
07.11.17
09:03
(24) Последний куда, вы нарисуйте, на бумаге, что бы "мы" поняли :)
31 DrZombi
 
гуру
07.11.17
09:04
(24) Молодец, ты уже близок к решению, вскоре за СП сядешь и напишешь запрос ;)
32 Salimbek
 
07.11.17
09:39
(27) А, да, в первой выборке надо группировку по Договор
33 NikolayNiko
 
07.11.17
12:52
(27) и (28) По моему что-то не то. ГДЕ Договор=&Договор.
Если правильно понимаю будет браться только определенный договор, а мне как я уже писал нужны все. (30) Вот:


Структура регистра: Период|Регистратор|Номер|Организация|Контрагент|Договор|Условия|Аннулировано

Например:
01.01.16|Регистр1|Номер|Орг1|Контр1|Договор1|Усл1|Ложь
01.02.16|Регистр1|Номер|Орг1|Контр1|Договор1|Усл2|Ложь
01.02.16|Регистр1|Номер|Орг1|Контр1|Договор2|Усл3|Ложь
01.03.16|Регистр1|Номер|Орг1|Контр1|Договор2|Усл4|Ложь

Из этого хочу получить:
01.02.16|Регистр1|Номер|Орг1|Контр1|Договор1|Усл2|Ложь
01.03.16|Регистр1|Номер|Орг1|Контр1|Договор2|Усл4|Ложь
34 NikolayNiko
 
07.11.17
13:28
Создаю вложенный запрос. Беру два поля, Договор и период. Группирую договора по МаксПериоду. Хорошо, но как в основном запросе обратиться к полю условие если я его не выбирал во вложенном запросе. А если я его выбираю во вложенном - тогда оно попадает в группировку и результат уже не тот. Что за ... ?! Где лыжи не едут?!
35 Михаил Козлов
 
07.11.17
13:46
Если правильно понял:
- выгрузить во временную таблицу договор и МАКС(Период) из таблицы регистра;
- соединить таблицу регистра с временной таблицей по договору и периоду. Поле Условие получите из таблицы регистра, если соединение по договору и периоду дает единственную запись в таблице регистра.
36 Сти
 
07.11.17
15:03
(35) Будет множить записи, если на один договор с тем же самым периодом будут записи для других организаций и контрагентом.

Вообще можно сделать с помощью скореллированного запроса:

ВЫБРАТЬ
    РегистрСрезПоследних.ДоговорКонтрагента
ИЗ
    СамыйОфигенныйРегистрКАК РегистрСрезПоследних
ГДЕ
    (РегистрСрезПоследних.Организация, РегистрСрезПоследних.Контрагент) В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                ВспомогательныйСрез.Организация,
                ВспомогательныйСрез.Контрагент
            ИЗ
                СамыйОфигенныйРегистрКАК ВспомогательныйСрез
            ГДЕ
                ВспомогательныйСрез.ДоговорКонтрагента = РегистрСрезПоследних.ДоговорКонтрагента
                И ВспомогательныйСрез.Период В
                    (ВЫБРАТЬ
                        МАКСИМУМ(ЕщеОдинСрез.Период)
                    ИЗ
                        СамыйОфигенныйРегистрКАК ЕщеОдинСрез
                    ГДЕ
                        ЕщеОдинСрез.Организация = ВспомогательныйСрез.Организация
                        И ЕщеОдинСрез.Контрагент = ВспомогательныйСрез.Контрагент
                        И ЕщеОдинСрез.ДоговорКонтрагента = ВспомогательныйСрез.ДоговорКонтрагента))

Множить записи не будет, тут проблема только одна - если по всем трем измерениям есть записи с одинаковым периодом, то выберет какую-то одну из этих трех, но какую - один SQL знает.
С двумя измерениями было бы проще, используя "упорядочить по Период Убыв" во вложенном, но, увы - условие на соответствие списка списку не дает сортировать.
37 Сти
 
07.11.17
15:06
(36) Блин, пробелы съелись. И отредактировать нельзя...
ВЫБРАТЬ
    РегистрСрезПоследних.ДоговорКонтрагента
ИЗ
    СамыйОфигенныйРегистр КАК РегистрСрезПоследних
ГДЕ
    (РегистрСрезПоследних.Организация, РегистрСрезПоследних.Контрагент) В
            (ВЫБРАТЬ ПЕРВЫЕ 1
                ВспомогательныйСрез.Организация,
                ВспомогательныйСрез.Контрагент
            ИЗ
                СамыйОфигенныйРегистр КАК ВспомогательныйСрез
            ГДЕ
                ВспомогательныйСрез.ДоговорКонтрагента = РегистрСрезПоследних.ДоговорКонтрагента
                И ВспомогательныйСрез.Период В
                    (ВЫБРАТЬ
                        МАКСИМУМ(ЕщеОдинСрез.Период)
                    ИЗ
                        СамыйОфигенныйРегистр КАК ЕщеОдинСрез
                    ГДЕ
                        ЕщеОдинСрез.Организация = ВспомогательныйСрез.Организация
                        И ЕщеОдинСрез.Контрагент = ВспомогательныйСрез.Контрагент
                        И ЕщеОдинСрез.ДоговорКонтрагента = ВспомогательныйСрез.ДоговорКонтрагента))
38 Михаил Козлов
 
07.11.17
15:16
(36) Конфа не озвучена, но в типовых у договора 1 владелец (Контрагент) и 1 организация.
Срез последних, мне кажется, вообще ни при чем.
39 Сти
 
07.11.17
15:28
(38) Да это понятно, но каких только чудес не встречалось в дописках-переделках. И 20 измерений в регистре накопления, а ведь это больше миллиона итогов. И периодический регистр сведений с одним из измерений в виде строки ТЧ документа (видимо, чтобы номенклатуру можно было повторить в доке, что было в нем абсолютно противопоказано). И...
40 NikolayNiko
 
07.11.17
15:54
(35) Спасибо! Так и сделал. Все окей! (37) Тоже большое списибо. Конфа не типовая, но описанных сюрпризов теоретически быть не должно.
Да и вообще спасибо всем кто откликнулся!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший