Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Приоритетный поиск по регистру          
Small sa Подменю пользователя
сообщение 02.03.12, 15:07
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

Доброго времени суток!

Ситуация: Есть регистр сведений "Номера ГТД" с измерениями: Инвойс / Номенклатура / СерияНоменклатуры и ресурсом ГТД. В документе ПоступлениеТоваров в ТЧ заполняются поля Инвойс / Номенклатура / СерияНоменклатуры. Поле ГТД должно подставиться автоматически, исходя из приоритета совпадений:
Ищем по условию Инвойс / Номенклатура / СерияНоменклатуры. Если ГТД найдено, подставляем в ТЧ.
Если ГТД не найдено по этим условиям, ищем по Номенклатура / СерияНоменклатуры.
Если ГТД не найдено по этим условиям, ищем по Инвойс / Номенклатура.
Если ГТД не найдено по этим условиям, ищем по Инвойс.

Можно, конечно, делать несколько запросов, проверяя их на наличие результата. Но наверное эти приоритеты можно отследить и в одном запросе (что-нибудь вроде использования конструкции: Выбрать Выбор Когда). Подскажите пожалуйста, как оптимально реализовать эту задачу.

logist Подменю пользователя
сообщение 02.03.12, 15:19
Сообщение #2

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

Цитата(Small sa @ 02.03.12, 15:07) *
что-нибудь вроде использования конструкции: Выбрать Выбор Когда

Ой, а можно конкретнее, на примере кода, как Вы это собираетесь делать. Мне нужно нечто подобное))


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Vofka Подменю пользователя
сообщение 02.03.12, 15:29
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Я бы сделал одним запросом с помощью объединений. Строим запрос так:

ВЫБРАТЬ
тра-та-та
ИЗ
ла-ла-ла
ГДЕ
Инвойс = &Инвойс
И Номенклатура = &Номенклатура
И СерияНоменклатуры = &СерияНоменклатуры

ОБЪЕДИНИТЬ

ВЫБРАТЬ
тра-та-та
ИЗ
ла-ла-ла
ГДЕ
Номенклатура = &Номенклатура
И СерияНоменклатуры = &СерияНоменклатуры

ОБЪЕДИНИТЬ

ВЫБРАТЬ
тра-та-та
ИЗ
ла-ла-ла
ГДЕ
Инвойс = &Инвойс
И Номенклатура = &Номенклатура

ОБЪЕДИНИТЬ

ВЫБРАТЬ
тра-та-та
ИЗ
ла-ла-ла
ГДЕ
Инвойс = &Инвойс


После выполнения проверяем, если запрос не пустой, то берем первую строку из результата запроса.

Спасибо сказали: logist, Small sa,

Small sa Подменю пользователя
сообщение 02.03.12, 17:21
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

2Vofka Да,вероятно это будет самый "компактный" вариант..

2LOGIST А хотела сделать нечто подобное (пишу уже из дома, так что код будет самый приблизительный):

Выбрать НомераГТД.ГТД
      Выбор
           Когда <ПервыйПриоритет> Тогда 1
           Иначе
              ВЫБОР
                   Когда <ВторойПриоритет> Тогда 2
                           .................
       КОНЕЦ КАК Приоритет
ИЗ РегистрСведений.НомераГТД
ГДЕ
     бла-бла-бла = & бла-бла

УПОРЯДОЧИТЬ ПО Приоритет


А в <скобочках> либо еще один запрос собиралась рисовать (поиск по заданным условиям приоритета), либо рассчитывала каким-либо способом указать "условия совпадений". Вот как-то так. unsure.gif

Vofka Подменю пользователя
сообщение 02.03.12, 17:38
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Цитата(Small sa @ 02.03.12, 17:21) *
2Vofka Да,вероятно это будет самый "компактный" вариант..

Я думаю, что и самый правильный.

Small sa Подменю пользователя
сообщение 05.03.12, 12:28
Сообщение #6

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

Цитата
После выполнения проверяем, если запрос не пустой, то берем первую строку из результата запроса.


Без упорядочивания у меня не получился нужный результат. Сделала так:

    "ВЫБРАТЬ
    |    НомераГТД.ГТД,
    |    НомераГТД.НомСтрГТД,
    |    1 КАК Порядок
    |ИЗ
    |    РегистрСведений.НомераГТД КАК НомераГТД
    |ГДЕ
    |    НомераГТД.Инвойс = &Инвойс
    |    И НомераГТД.Номенклатура = &Номенклатура
    |    И НомераГТД.СерияНоменклатуры = &Серия
    |    И НомераГТД.ХарактеристикаНоменклатуры = &Характеристика
    |
    |ОБЪЕДИНИТЬ
    |
    |ВЫБРАТЬ
    |    НомераГТД.ГТД,
    |    НомераГТД.НомСтрГТД,
    |    2
    |ИЗ
    |    РегистрСведений.НомераГТД КАК НомераГТД
    |ГДЕ
    |    НомераГТД.Номенклатура = &Номенклатура
    |    И НомераГТД.СерияНоменклатуры = &Серия
    |    И НомераГТД.ХарактеристикаНоменклатуры = &Характеристика
    |
    |ОБЪЕДИНИТЬ
    |
    |ВЫБРАТЬ
    |    НомераГТД.ГТД,
    |    НомераГТД.НомСтрГТД,
    |    3
    |ИЗ
    |    РегистрСведений.НомераГТД КАК НомераГТД
    |ГДЕ
    |    НомераГТД.Инвойс = &Инвойс
    |    И НомераГТД.Номенклатура = &Номенклатура
    |
    |ОБЪЕДИНИТЬ
    |
    |ВЫБРАТЬ
    |    НомераГТД.ГТД,
    |    НомераГТД.НомСтрГТД,
    |    4
    |ИЗ
    |    РегистрСведений.НомераГТД КАК НомераГТД
    |ГДЕ
    |    НомераГТД.Инвойс = &Инвойс
    |
    |УПОРЯДОЧИТЬ ПО
    |    Порядок";


Всем спасибо!

Vofka Подменю пользователя
сообщение 05.03.12, 12:32
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Вообще странно, должно и без порядка работать.

Small sa Подменю пользователя
сообщение 05.03.12, 12:47
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

Цитата
Вообще странно, должно и без порядка работать.


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

А платформа случайно не делает автоматическую (без явного указания) группировку результатов?

Vofka Подменю пользователя
сообщение 05.03.12, 13:10
Сообщение #9

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Цитата(Small sa @ 05.03.12, 12:47) *
А платформа случайно не делает автоматическую (без явного указания) группировку результатов?

Делает конечно. В этом и прикол. Если результатов в вашем случае 5, а в случае как я изначально говорил всего 2, значит из ваших 5 уникальных записей 2. И вам как раз надо взять первую из этих 2. В общем, эффект получиться должен такой как надо и без порядка.

Small sa Подменю пользователя
сообщение 05.03.12, 13:26
Сообщение #10

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

В том-то и проблема, что первый результат в выборке без упорядочивания для меня не будет первым результатом запроса. Первым в выборке будет первый по порядковому номеру строки ГТД (поля, которое я выбираю), а мне нужны результаты по порядку прохождения запросов (и номер строки ГТД у него может быть каким угодно). rolleyes.gif

Vofka Подменю пользователя
сообщение 05.03.12, 14:27
Сообщение #11

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

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

Small sa Подменю пользователя
сообщение 06.03.12, 7:08
Сообщение #12

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

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

В регистре по Инвойсу такому-то есть записи:



Будем иммитировать ввод в строку и в обработке введем Инвойс и Номенклатуру. По кнопке <Выполнить> выполняется запрос и его результат для наглядности выгружается в табличное поле на форме.

1 вариант: предложенный Vofka запрос.



2 вариант: тот же запрос, но с добавлением Приоритета и упорядочиванием по нему.



При выполнении первого варианта запроса первой строкой результата будет являться результат последнего запроса из блока "Выбрать .... ОБЪЕДИНИТЬ", т.е поиск только по инвойсу и в номер позиции ГТД попадет позиция не той номенклатуры..

Vofka Подменю пользователя
сообщение 06.03.12, 9:22
Сообщение #13

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Цитата(Small sa @ 06.03.12, 7:08) *
Суть задачи состоит в том, чтобы в документах (допустим ПоступлениеТоваров) автоматически подставлять ГТД и номера позиций в ГТД. ГТД и номера позиций хранятся в регистре сведений НомераГТД.

Вы правильно выделили ключевую фразу. Только покажите мне пожалуйста, где про это сказано в первом посте? Т.к. про это ничего сказано не было, то я не мог знать, что оно там есть, поєтому предложил вариант, который предложил. И если бы на самом деле номера позиций в ГТД не было, то в результате и моего запроса была бы только 1 строка с верным инвойсом, номенклатурой, серией и ГТД. А так получается, вы не совсем корректно поставили задачу why.gif .

И из приведенных вами данных, я честно говоря всеравно не всё понял. В результате выполнения вашего запроса у вас должно получиться 10 строчек, т.к. каждому условия в запросе соответствует 2 строки в регистре, т.е. 2 строчки с порядком 1, 2 строчки с порядком 2 и т.п., причем скорее всего внутри порядков они будут отсортированы по номеру строки, т.е. первые 2 строчки будут такими:

1009194/090810/0013872 | 1 | 1 | Заказ 1 | Краска черная
1009194/090810/0013872 | 2 | 1 | Заказ 1 | Краска черная

а вся таблица, соответственно как-то так:

1009194/090810/0013872 | 1 | 1 | Заказ 1 | Краска черная
1009194/090810/0013872 | 2 | 1 | Заказ 1 | Краска черная
1009194/090810/0013872 | 1 | 2 | Заказ 1 | Краска черная
1009194/090810/0013872 | 2 | 2 | Заказ 1 | Краска черная
1009194/090810/0013872 | 1 | 3 | Заказ 1 | Краска черная
1009194/090810/0013872 | 2 | 3 | Заказ 1 | Краска черная
1009194/090810/0013872 | 1 | 4 | Заказ 1 | Краска черная
1009194/090810/0013872 | 2 | 4 | Заказ 1 | Краска черная
1009194/090810/0013872 | 1 | 5 | Заказ 1 | Краска черная
1009194/090810/0013872 | 2 | 5 | Заказ 1 | Краска черная

Не?

Сообщение отредактировал Vofka - 06.03.12, 9:42

Small sa Подменю пользователя
сообщение 06.03.12, 9:51
Сообщение #14

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

Цитата
А так получается, вы не совсем корректно поставили задачу

Вы правы. Прошу прощения! rolleyes.gif

Цитата
у вас должно получиться 10 строчек, т.к. каждому условия в запросе соответствует 2 строки в регистре


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


Спасибо за дискуссию! =)

Vofka Подменю пользователя
сообщение 06.03.12, 10:06
Сообщение #15

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Я не заметил, что номенклатура разная. Но даже, если номенклатура все же разная (а я это учитывал при построении запроса), то по идее в результате моего запроса по вашим данным должен получиться такой результат.

ГТД | Номер строки | Инвойс | Номенклатура | Серия

1009194/090810/0013872 | 2 | Заказ 1 | Краска черная
1009194/090810/0013872 | 1 | Заказ 1 | Краска желтая

Не?

Small sa Подменю пользователя
сообщение 06.03.12, 11:08
Сообщение #16

Говорящий
***
Группа: Пользователи
Сообщений: 52
Из: Санкт-Петербург
Спасибо сказали: 12 раз
Рейтинг: 0

Не... =)
Поэтому и спрашивала про автоматическую группировку запроса платформой... или здесь автосортировка...
Вообщем результат без "насильного упорядочивания" по приоритету будет выглядеть как на скрине первого варианта запроса, т.е.
1009194/090810/0013872 | 1 | Заказ 1 | Краска желтая
1009194/090810/0013872 | 2 | Заказ 1 | Краска черная


а если допустим поменять у желтой краски порядковый номер на 3 и искать по ней (по желтой краске), то результат будет таким:

1009194/090810/0013872 | 2 | Заказ 1 | Краска черная
1009194/090810/0013872 | 3 | Заказ 1 | Краска желтая

вот

Vofka Подменю пользователя
сообщение 06.03.12, 13:20
Сообщение #17

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Честно говоря я не понимаю, почему получается такой результат upset.gif . Была бы у меня ваша база (хотя бы только с текущими данными) 439.gif ...

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 12.05.24, 6:41
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!