Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Составить запрос.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
DartRomanius
Доброго времени суток коллеги.

Имеем документ "Заказ".
У документа есть признак статус. Статус у документа меняется со временем.
Собственно статусы:
- открытый;
- подготовка;
- в работе;
- закрыт.

Смена статуса хранится в регистре сведений в записи типа:
Заказ
СтатусБыл
СтатусСтал

Вот теперь задача:
Как отследить заказы у которых в заданный период 1-й раз сменился статус скажем с открытый на подготовка.

Хотелось бы сделать все одним запросом, но что-то потерялась я.... smile.gif

Заранее спасибо.
Vofka
Выбираем по этому регистру все записи у которых период между начальной датой и конечной датой - это полностью всё за определенный период. И говорим, чтобы выбирал только те записи, у которых СтатусБыл такой-то, а СтатусСтал такой-то. И делаем группировку по Заказу, СтатусБыл и СтатусСтал и накладываем на период МИНИМУМ. Как-то так:

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|   МИНИМУМ(МойРегистр.Период),
|  МойРегистр.Заказ
|ИЗ
|   МойРегистр КАК МойРегистр
|ГДЕ
|   СтатусБыл = &СтатусБыл
|   И СтатусСтал = &СтатусСтал
|СГРУППИРОВАТЬ ПО
|   МойРегистр.Заказ,
|   МойРегистр.СтатусБыл,
|   МойРегистр.СтатусСтал
|";


Навскидочку. smile.gif
Домовик
регистр сведений уже хранит информацию или только предполагается такая структура? Просто Статус в регистре недостаточно?
Домовик
я почему спрашиваю, , что могут быть ошибки, кот нужно предусматривать

01.01.2012 открытый подготовка
02.01.2012 открытый подготовка
03.01.2012 открытый подготовка
04.01.2012 в работе закрыт.

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

к тому же тут определенные правила: после "в работе" не ставится "открыт", "подготовка"..... бизнес-процессы, что ли?
DartRomanius
Цитата(Vofka @ 25.01.12, 18:31) необходимо зарегистрироваться для просмотра ссылки
Выбираем по этому регистру все записи у которых период между начальной датой и конечной датой - это полностью всё за определенный период. И говорим, чтобы выбирал только те записи, у которых СтатусБыл такой-то, а СтатусСтал такой-то. И делаем группировку по Заказу, СтатусБыл и СтатусСтал и накладываем на период МИНИМУМ. Как-то так:

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|   МИНИМУМ(МойРегистр.Период),
|  МойРегистр.Заказ
|ИЗ
|   МойРегистр КАК МойРегистр
|ГДЕ
|   СтатусБыл = &СтатусБыл
|   И СтатусСтал = &СтатусСтал
|СГРУППИРОВАТЬ ПО
|   МойРегистр.Заказ,
|   МойРегистр.СтатусБыл,
|   МойРегистр.СтатусСтал
|";


Навскидочку. smile.gif


Уточню, не совсем правильно объяснил.

Берем период: с [Дата] по [Дата]
Статус менялся может быть и до этого периода, но надо выбрать заказ если статус сменился по заданной схеме именно в этот период.
То есть:

01.01.2012 открытый подготовка (первый раз).
02.01.2012 подготовка открытый
03.01.2012 открытый подготовка (второй раз).

Надо отобрать если период скажем с 01.01.2012 по 02.01.2012
а если период с 02.01.2012 по 03.01.2012, тогда не отбирать
pablo
я бы сделал так. в 1 подзапрос поместил бы различные заказы из регистра за период. Во втором подзапросе подсчитал бы по эти заказам количество записей за период и отобрал бы записи с нужным количеством... Если нужны дополнительные условия - накладывал бы их в следующем запросе пакета.
DartRomanius
Цитата(Домовик @ 26.01.12, 9:42) необходимо зарегистрироваться для просмотра ссылки
я почему спрашиваю, , что могут быть ошибки, кот нужно предусматривать

01.01.2012 открытый подготовка
02.01.2012 открытый подготовка
03.01.2012 открытый подготовка
04.01.2012 в работе закрыт.

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

к тому же тут определенные правила: после "в работе" не ставится "открыт", "подготовка"..... бизнес-процессы, что ли?


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

Цитата(pablo @ 26.01.12, 12:55) необходимо зарегистрироваться для просмотра ссылки
я бы сделал так. в 1 подзапрос поместил бы различные заказы из регистра за период. Во втором подзапросе подсчитал бы по эти заказам количество записей за период и отобрал бы записи с нужным количеством... Если нужны дополнительные условия - накладывал бы их в следующем запросе пакета.


вложенными запросами?
Vofka
Изменения структуры регистра возможно?
Домовик
в запросе сформировать по СтатусПосле

сформировать строки "1Открыт1Подготовка1закрыт1Подготовка1Открыт1В работе1" , отбирать по числу вхожедений например подстрокистроки "Открыт1Подготовка" равно 1.
1- разделитель в примере.

Но я как в том анекдоте, про стать зайчикам ёжиками - стратег)) . пока не владею знаниями , как в запросе преобразить данные в строку за период в разрезе заказа.
DartRomanius
Цитата(Vofka @ 26.01.12, 13:05) необходимо зарегистрироваться для просмотра ссылки
Изменения структуры регистра возможно?


Да там простейшая структура:
Заказ
СтатусБыл
СтатусСтал

ну и плюс период как стандартный реквизит.

То есть по регистру мы можем смотреть полную историю смены статусов.
Домовик
Цитата(DartRomanius @ 26.01.12, 8:13) необходимо зарегистрироваться для просмотра ссылки
Да там простейшая структура:
Заказ
СтатусБыл
СтатусСтал

ну и плюс период как стандартный реквизит.

То есть по регистру мы можем смотреть полную историю смены статусов.


а возможные ошибки при этом - пример же приведен
DartRomanius
Цитата(Домовик @ 26.01.12, 13:16) необходимо зарегистрироваться для просмотра ссылки
а возможные ошибки при этом - пример же приведен


Не понял.
Домовик
Цитата(DartRomanius @ 26.01.12, 8:19) необходимо зарегистрироваться для просмотра ссылки
Не понял.


Статусбыл всегда можно прочитать из предыдущих строк в регистре. достаточно только статусПосле в регистре.

Это исключает ошибки. Когда вы перепроводите документ другим числом, который устанавливает статусы в регистр. Это нужны проверки тогда при проведении. А так устанавливаете новый статус на новое число и все.
DartRomanius
Цитата(Домовик @ 26.01.12, 13:27) необходимо зарегистрироваться для просмотра ссылки
Статусбыл всегда можно прочитать из предыдущих строк в регистре. достаточно только статусПосле в регистре.

Это исключает ошибки. Когда вы перепроводите документ другим числом, который устанавливает статусы в регистр. Это нужны проверки тогда при проведении. А так устанавливаете новый статус на новое число и все.


Та ну в этом проблемы нету, документ смены статуса недоступен для прямого редактирования.
Все решается административными и немного программными методами.
и мне не особо важен размер записей если мне придется анализировать какая запись предыдущая, какая следующая.

В догонку:
сложность в том, что как-то не въезжаю как запросом выделить 1-ю запись отвечающую требованиям.

Точнее, так:
1-я проверка, выделить 1-ю запись в регистре отвечающую требованиям перехода между статусами.
в моем случае это, (к примеру) открытый - подготовка.
2-я проверка, уже после выделения этой самой записи, на вхождение в заданный интервал.
Vofka
Цитата
Да там простейшая структура:
Заказ
СтатусБыл
СтатусСтал

ну и плюс период как стандартный реквизит.

То есть по регистру мы можем смотреть полную историю смены статусов.

Я имел ввиду, возможно ли давать советы по модификации структуры регистра?
DartRomanius
Цитата(Vofka @ 26.01.12, 14:28) необходимо зарегистрироваться для просмотра ссылки
Я имел ввиду, возможно ли давать советы по модификации структуры регистра?


Та не вопрос.
Vofka
Цитата
Та не вопрос.

Ну тогда если добавить в регистр реквизит булевого типа и устанавливать его при первом изменении?
DartRomanius
Цитата(Vofka @ 26.01.12, 16:06) необходимо зарегистрироваться для просмотра ссылки
Ну тогда если добавить в регистр реквизит булевого типа и устанавливать его при первом изменении?


Ну я вообщем думал уже об этом.
Просто думаю все-таки существует решение на уровне запроса сделать это, а не потом, как я на данный момент сделал, сравнивать вхождение на заданный период...
Домовик
единичка меня сбила. значит первое изменение статуса, а не заказы с одним-единственным изменением статуса.

А сначала сделать отбор строк по условию СтатусДо= и статусПосле= , а потом упорядочить по Период. группировки Заказ, за ним группировка период. И снимать только первые записи при обходе выборки...
DartRomanius
Цитата(Домовик @ 26.01.12, 16:50) необходимо зарегистрироваться для просмотра ссылки
единичка меня сбила. значит первое изменение статуса, а не заказы с одним-единственным изменением статуса.

А сначала сделать отбор строк по условию СтатусДо= и статусПосле= , а потом упорядочить по Период. группировки Заказ, группировка период. И снимать только первые записи при обходе выборки... не заходить внутрь группировки Период


Как я делал:
                       ВЫБРАТЬ
                   |    Заказы.Ссылка КАК СсылкаНаЗаказ
                   |ИЗ
                   |    Документ.Заказ КАК Заказы
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказРолиСотрудников КАК Роли
                   |        ПО (Роли.Заказ = Заказы.Ссылка)
                   |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
                   |            Заказы.Ссылка КАК СсылкаНаЗаказ,
                   |            ЗаказыИсторияСтатусов.СтатусБыл КАК СтатусБыл,
                   |            ЗаказыИсторияСтатусов.СтатусСтал КАК СтатусСтал,
                   |            ЗаказыИсторияСтатусов.Период КАК Период
                   |        ИЗ
                   |            Документ.Заказ КАК Заказы
                   |                ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗаказыИсторияСтатусов КАК ЗаказыИсторияСтатусов
                   |                ПО (ЗаказыИсторияСтатусов.Заказ = Заказы.Ссылка)
                   |        ГДЕ
                   |            НЕ Заказы.ПометкаУдаления
                   |            И Заказы.Проведен
                   |            И ((ЗаказыИсторияСтатусов.СтатусБыл.ТипСтатуса = &ПарамОткрытый
                   |                        ИЛИ ЗаказыИсторияСтатусов.СтатусБыл.ТипСтатуса = &ПарамДоПроизводства)
                   |                        И ЗаказыИсторияСтатусов.СтатусСтал.ТипСтатуса = &ПарамПроизводство
                   |                    ИЛИ ЗаказыИсторияСтатусов.СтатусБыл.ТипСтатуса = &ПарамДоПроизводства
                   |                        И ЗаказыИсторияСтатусов.СтатусСтал.ТипСтатуса = &ПарамПроизводство)
                   |            И ЗаказыИсторияСтатусов.Период МЕЖДУ &НачДатаВремя И &КонДатаВремя) КАК Отбор23
                   |        ПО Заказы.Ссылка = Отбор23.СсылкаНаЗаказ
                   |ГДЕ
                   |    НЕ Отбор23.СсылкаНаЗаказ ЕСТЬ NULL


Правда не работает как надо... smile.gif
Vofka
Цитата
Как я делал:


А вот вариант, как надо делать smile.gif :

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


Исче как болтается.
Ziam
Тогда вариант Vofka должен помочь. Единственное я б наверное наложил ограничение на виртуальную таблицу СрезПервых на дату &НачПериод
Zaval
Вот в статусБыл и статусСтал - вот здесь грабельки поставлены. Для всех.
По-моему, Регистр надо сделать периодическим - фиксировать изменение статуса.

ЗЫ. Сам щас инет-магазин автоматизирую(
ЗЗЫ. Полегче со "срезами" - это оч специфичная вещь, закидоны с ними в ЗУПе уже претендуют на притчи.
Vofka
Цитата
Единственное я б наверное наложил ограничение на виртуальную таблицу СрезПервых на дату &НачПериод

Так нельзя, потому что тогда вы не получите реально первое именение статуса, а получите первое изменение статуса с такой-то даты.
DartRomanius
Цитата(Zaval @ 26.01.12, 17:47) необходимо зарегистрироваться для просмотра ссылки
Вот в статусБыл и статусСтал - вот здесь грабельки поставлены. Для всех.
По-моему, Регистр надо сделать периодическим - фиксировать изменение статуса.

ЗЫ. Сам щас инет-магазин автоматизирую(
ЗЗЫ. Полегче со "срезами" - это оч специфичная вещь, закидоны с ними в ЗУПе уже претендуют на притчи.


Так регистр и есть периодический. (Сорри забыл упомянуть).

Собственно записи и хранятся в порядке возникновения события смены статуса.
Типа:
01/01/2012 - ...... - открытый (создание документа заказ)
02/01/2012 - открытый - подготовка
.....
PROFIT smile.gif



ЗЫ: Появилась мысль насчет срез первых с условием, может прокатит.....
Vofka
- Доктор, мне кажется меня все игнорируют.
- Кто здесь?

DartRomanius, а откоментить мой запрос нельзя? Или я его для себя выложил?
Zaval
Чуть подкину по поводу срезов.
Срез дает все возможные комбинации измерений.
Горбуха из ЗУПа:
Сотр поработал, уволился, затем снова вернулся.
Для рассчета больничных/отпусков нам нужен стаж - срез первых? Хрен Вам, дорогие товарищи! Нужен срез первых по Сотру с игнорированием ФизЛица.
Всем советую: научитесь расписывать Срез, писать Срез в конструкторе, не упоминая это страшное слово. Тогда Вы легко сможете отключить одно или несколько измерений - и Ваш Срез воссияет, и решит все Ваши проблемыsmile.gif

Цитата(DartRomanius @ 26.01.12, 15:56) необходимо зарегистрироваться для просмотра ссылки
Так регистр и есть периодический. (Сорри забыл упомянуть).

Собственно записи и хранятся в порядке возникновения события смены статуса.
Типа:
01/01/2012 - ...... - открытый (создание документа заказ)
02/01/2012 - открытый - подготовка
.....
PROFIT smile.gif



ЗЫ: Появилась мысль насчет срез первых с условием, может прокатит.....



ППЦ! Тогда нахера, простите за фигуру речи, "был"? Предыдущей записи недостаточно?
DartRomanius
Цитата(Vofka @ 26.01.12, 17:59) необходимо зарегистрироваться для просмотра ссылки
- Доктор, мне кажется меня все игнорируют.
- Кто здесь?

DartRomanius, а откоментить мой запрос нельзя? Или я его для себя выложил?


Уппс, проморгал.

Цитата(Vofka @ 26.01.12, 17:59) необходимо зарегистрироваться для просмотра ссылки
- Доктор, мне кажется меня все игнорируют.
- Кто здесь?

DartRomanius, а откоментить мой запрос нельзя? Или я его для себя выложил?


Не проходит первый пакет запроса, короче оно сначала берет срез первых, а потом налагает условия.....
буду копать....
Vofka
Цитата
Не проходит первый пакет запроса, короче оно сначала берет срез первых, а потом налагает условия.....

Было сказано:
Цитата
01.01.2012 открытый подготовка (первый раз).
02.01.2012 подготовка открытый
03.01.2012 открытый подготовка (второй раз).

Надо отобрать если период скажем с 01.01.2012 по 02.01.2012
а если период с 02.01.2012 по 03.01.2012, тогда не отбирать

Что здесь не проходит?
Zaval
Перечитайте мой пост. Стандартный Срез - зло. Не ленитесь.
Домовик
хорошо - вместо удалить, если прочтут:
влож запрос -- отобрать по условию. внешн запрос поля Период, Заказ. Упорядочить по Период. Группировка ЗАказ, Период. В выборке обход заходить только по первым записям.
Vofka
Цитата
Перечитайте мой пост. Стандартный Срез - зло. Не ленитесь.

Не поверите, я читаю все посты. А теперь перечитайте мой запрос и скажите какое отношение его текст имеет к вашему посту?
DartRomanius
|ВЫБРАТЬ
|    СтатусыСрезПервых.Период,
|    СтатусыСрезПервых.Заказ
|ПОМЕСТИТЬ СрезПервых
|ИЗ
|    РегистрСведений.Статусы.СрезПервых КАК СтатусыСрезПервых
|ГДЕ
|    СтатусыСрезПервых.СтатусБыл = &СтатусБыл
|    И СтатусыСрезПервых.СтатусСтал = &СтатусСтал



Как я написал выше, сначала берет срез первых.
Если мы уберем условие, значения есть.

как только использовать условие и запись не является 1-й, она не попадает в временную таблицу
Vofka
Цитата
как только использовать условие и запись не является 1-й, она не попадает в временную таблицу

Так вы ж сами говорили, что надо как раз выбирать запись, если ОНА ПОПАЛА В ЭТОТ ПЕРИОД и она ПЕРВАЯ. Не?
Цитата
01.01.2012 открытый подготовка (первый раз).
02.01.2012 подготовка открытый
03.01.2012 открытый подготовка (второй раз).

Надо отобрать если период скажем с 01.01.2012 по 02.01.2012
а если период с 02.01.2012 по 03.01.2012, тогда не отбирать


ЗЫ. Домовик, а почему вы сначала пишете, а потом удаляете? Не в первый раз за вами такое замечаю? Права на редактирование постов мешают? Так можно убать smile.gif
Zaval
Цитата(Vofka @ 26.01.12, 16:54) необходимо зарегистрироваться для просмотра ссылки
Не поверите, я читаю все посты. А теперь перечитайте мой запрос и скажите какое отношение его текст имеет к вашему посту?


Я так понимаю, что безадресные посты адресуются ТС.
Если запостил в ответ на Ваш пост - это ошибка, я стараюсь отвечать только на посты ТС

ЗЫ. Но СрезП.... по регистру, где больше одного Измерения - грабли для лентяев! И ... это... непарит, вобщем smile.gif
Vofka
Цитата
Я так понимаю, что безадресные посты адресуются ТС.
Если запостил в ответ на Ваш пост - это ошибка, я стараюсь отвечать только на посты ТС

Просто ваш пост оказался под моим, поэтому решил, что это мне.

Цитата
Но СрезП.... по регистру, где больше одного Измерения - грабли для лентяев! И ... это... непарит, вобщем smile.gif

Грабли - если в ВЫБРАТЬ выбирать несколько измерений. И опять таки, автор не указал что измерения, а что нет. Я специально создал конфу с 1 регистром, чтоб проверить запрос. В моем регистре "Заказ" - это измерение, остальное ресурсы.
DartRomanius
Уточняю:

Регистр ИсторияСтатусов
Измерения:
Заказ
Ресурсы:
СтатусБыл
СтатусСтал
Реквезиты:
Нет

Регистр периодический. Режим записи - подчинен регистратору. Периодичность - по позиции регистратора.
Vofka
Можно на пальцах, для тех кто в танке, почему не правильно отработает мой запрос?
Домовик
Цитата(Vofka @ 27.01.12, 6:47) необходимо зарегистрироваться для просмотра ссылки
Можно на пальцах, для тех кто в танке, почему не правильно отработает мой запрос?



срез первых выбирает только первые записи, не зависимо - какие они. таблица изначально усечена.

а нужно сразу найти искомые записи, потом "срезать".
Vofka
Цитата
срез первых выбирает только первые записи, не зависимо - какие они. таблица изначально усечена.
а нужно сразу найти искомые записи, потом "срезать".

Ещё раз, прошу ВНИМАТЕЛЬНО прочитать это:

Цитата
01.01.2012 открытый подготовка (первый раз).
02.01.2012 подготовка открытый
03.01.2012 открытый подготовка (второй раз).

Надо отобрать если период скажем с 01.01.2012 по 02.01.2012
а если период с 02.01.2012 по 03.01.2012, тогда не отбирать


И я просил объяснить на пальцах (на примерах каких-то данных).
Домовик
Цитата(Vofka @ 27.01.12, 7:03) необходимо зарегистрироваться для просмотра ссылки
Ещё раз, прошу ВНИМАТЕЛЬНО прочитать это:



И я просил объяснить на пальцах (на примерах каких-то данных).


Vofka, ваш запрос рабочий, но постановка, думаю, другая.
объяснение было по конкретному тому примеру.

сейчас приводить таблички-примеры нет возможности. есть тут у меня тут оператор понятного интерфейса.
Домовик
задача эта,думаю, выглядит так:

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


в зеленых рамках - записи-рещения.

синим фоном - показан срез первых.

правильно ли понята задача - неизвестно. можно ли применить "выбрать первые " с учетом группировки(заказ) мне тоже неизвестно.
Vofka
Цитата
задача эта,думаю, выглядит так:

Я, честно говоря, потерял интерес к задаче, поэтому не хочу уже разбираться. А вам жму палец за то, что не поленились изобразить (в отличии от ТС)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.