Имеется розница обыкновенная, редакции 2.1
В справочнике номенклатура имеются позиции которые содержат несколько штрихкодов. Могут быть несколько штрихкодов производителя + собственный штрих код.
Обработка Печати ценников и этикеток не особо заморачиваясь выбирает штрихкод по максимальному значению (вот фрагмент запроса)

```1c
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Штрихкоды.Владелец КАК Номенклатура,
    Штрихкоды.Характеристика КАК Характеристика,
    Штрихкоды.Упаковка КАК Упаковка,
    МАКСИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
    ПОМЕСТИТЬ ШтрихкодыНоменклатуры
```

Задача: Переделать запрос таким образом, чтобы штрихкоды выбирались со следующим приоритетом
Если есть внутренний штрихкод, то выбирать его, если его нет
то следующий по приоритету код с типом EAN13, далее EAN8 и следом все остальное.
Идея пришла следующая:
Сделать подзапрос с колонкой Приоритет, по которой и производить нужную сортировку.

```1c
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Штрихкоды.Владелец КАК Владелец,
    Штрихкоды.Штрихкод,
    ВЫБОР
    КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN13)
    ТОГДА ВЫБОР
    КОГДА ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 1) = "2"
    ТОГДА 1
    ИНАЧЕ 2
    КОНЕЦ
    КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN8)
    ТОГДА 3
    ИНАЧЕ 4
    КОНЕЦ КАК Приоритет
    ИЗ
    РегистрСведений.Штрихкоды КАК Штрихкоды

    УПОРЯДОЧИТЬ ПО
    Владелец,
    Приоритет
```

Выборка производится как и задумывалось, но дальше у меня затык. Как из этой выборки выбрать штрихкод с самым высоком приоритетом?
Чет не могу сообразить.
---
Все просто:
1. Считаете в запросе приоритеты, помещаете эту таблицу в ВТ.
2. Далее во вложенном запросе определяете минимальный приоритет методом Сгруппировать по Номенклатура. Минимум(Приоритет) - получаете для каждой номенклатуры минимальный приоритет
3. Далее Соединяете ВТ и Вложенный запрос по Номенклатура, Приоритет. Из ВТ берете само значение штрих-кода.

Пример определения наиболее приоритетной спецификации:

```1c
    ВЫБРАТЬ
    ВТСпецификации.Номенклатура,
    ВТСпецификации.ХарактеристикаНоменклатуры,
    ВТСпецификации.СпецификацияНоменклатуры
    ПОМЕСТИТЬ ВТСпецификацииПоУмолчанию
    ИЗ
    ВТСпецификации КАК ВТСпецификации
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    ВТСпецификации.Номенклатура КАК Номенклатура,
    ВТСпецификации.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    МИНИМУМ(ВТСпецификации.Приоритет) КАК Приоритет
    ИЗ
    ВТСпецификации КАК ВТСпецификации

    СГРУППИРОВАТЬ ПО
    ВТСпецификации.Номенклатура,
    ВТСпецификации.ХарактеристикаНоменклатуры) КАК МинимальныйПриоритет
    ПО ВТСпецификации.Номенклатура = МинимальныйПриоритет.Номенклатура
    И ВТСпецификации.ХарактеристикаНоменклатуры = МинимальныйПриоритет.ХарактеристикаНоменклатуры
    И ВТСпецификации.Приоритет = МинимальныйПриоритет.Приоритет
    ;
```

Вопросы?
---
```1c
    | МИНИМУМ(ВЫБОР
    | КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN13)
    | ТОГДА ВЫБОР
    | КОГДА ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 1) = "2"
    | ТОГДА 1
    | ИНАЧЕ 2
    | КОНЕЦ
    | КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN8)
    | ТОГДА 3
    | ИНАЧЕ 4
    | КОНЕЦ) КАК Приоритет
```
---
В таком виде можно выбрать минимальное значение из колонки "Приоритет", но мне нужно не значение приоритета, а значение "Штрихкод". Т.е. сортировка осуществляется по значению приоритет, но необходимо взять значение из колонки "Штрихкод". В этом то и весь затык.
---
Проверил в консоли, работает

```1c
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Штрихкоды.Владелец КАК Владелец,
    Штрихкоды.Штрихкод,
    МИНИМУМ(ВЫБОР
    КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN13)
    ТОГДА ВЫБОР
    КОГДА ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 1) = "2"
    ТОГДА 1
    ИНАЧЕ 2
    КОНЕЦ
    КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN8)
    ТОГДА 3
    ИНАЧЕ 4
    КОНЕЦ) КАК Приоритет
    ИЗ
    РегистрСведений.Штрихкоды КАК Штрихкоды

    СГРУППИРОВАТЬ ПО
    Штрихкоды.Владелец,
    Штрихкоды.Штрихкод

    УПОРЯДОЧИТЬ ПО
    Владелец,
    Приоритет
```
---
Работать то оно работает, но не так как надо.
Например имеем следующую позицию номенклатуры:
Шампунь BIPA 400 мл (ассортимент)
С данной позицией сопоставлены следующие штрихкоды :
6952581790983, 6952581790990, 6952581790976, 2200000000019

Запрос даст следующую выборку:
Шампунь BIPA 400 мл (ассортимент) 2200000000019 1
Шампунь BIPA 400 мл (ассортимент) 6952581790983 2
Шампунь BIPA 400 мл (ассортимент) 6952581790990 2
Шампунь BIPA 400 мл (ассортимент) 6952581790976 2

А нужна всего одна запись
Шампунь BIPA 400 мл (ассортимент) 2200000000019

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

```1c
    ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Штрихкоды.Владелец КАК Номенклатура,
    Штрихкоды.Штрихкод КАК Штрихкод,
    ВЫБОР
    КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN13)
    ТОГДА ВЫБОР
    КОГДА ПОДСТРОКА(Штрихкоды.Штрихкод, 1, 1) = "2"
    ТОГДА 1
    ИНАЧЕ 2
    КОНЕЦ
    КОГДА Штрихкоды.ТипШтрихкода = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ТипыШтрихкодов.EAN8)
    ТОГДА 3
    ИНАЧЕ 4
    КОНЕЦ КАК Приоритет
    ПОМЕСТИТЬ ВТПриоритет
    ИЗ
    РегистрСведений.Штрихкоды КАК Штрихкоды
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТПриоритет.Номенклатура,
    МИНИМУМ(ВТПриоритет.Штрихкод) КАК Штрихкод
    ИЗ
    ВТПриоритет КАК ВТПриоритет
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    Порядок.Номенклатура КАК Номенклатура,
    МИНИМУМ(Порядок.Приоритет) КАК Порядок
    ИЗ
    ВТПриоритет КАК Порядок

    СГРУППИРОВАТЬ ПО
    Порядок.Номенклатура) КАК Подзапрос
    ПО ВТПриоритет.Номенклатура = Подзапрос.Номенклатура
    И ВТПриоритет.Приоритет = Подзапрос.Порядок

    СГРУППИРОВАТЬ ПО
    ВТПриоритет.Номенклатура
```

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

Пример определения наиболее приоритетной спецификации:

```1c
    ВЫБРАТЬ
    ВТСпецификации.Номенклатура,
    ВТСпецификации.ХарактеристикаНоменклатуры,
    ВТСпецификации.СпецификацияНоменклатуры
    ПОМЕСТИТЬ ВТСпецификацииПоУмолчанию
    ИЗ
    ВТСпецификации КАК ВТСпецификации
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    ВТСпецификации.Номенклатура КАК Номенклатура,
    ВТСпецификации.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    МИНИМУМ(ВТСпецификации.Приоритет) КАК Приоритет
    ИЗ
    ВТСпецификации КАК ВТСпецификации

    СГРУППИРОВАТЬ ПО
    ВТСпецификации.Номенклатура,
    ВТСпецификации.ХарактеристикаНоменклатуры) КАК МинимальныйПриоритет
    ПО ВТСпецификации.Номенклатура = МинимальныйПриоритет.Номенклатура
    И ВТСпецификации.ХарактеристикаНоменклатуры = МинимальныйПриоритет.ХарактеристикаНоменклатуры
    И ВТСпецификации.Приоритет = МинимальныйПриоритет.Приоритет
    ;
```

Вопросы?
---
Все просто:Так думалось, что можно еще проще :)
Чтобы вообще обойтись без подзапроса. Фактически вы предлагаете тот же самый вариант, который я описал в (7). Да этот вариант вполне рабочий. Спасибо.
По этому варианту вопросов нет :)
---
А обязятельно вычленять нужный штрихкод именно в самом запросе?. У мня был аналогичный случай... После всех экспериментов с консолью решил не городить огород. В запросе выбираю все что есть по товару, а алгороим выбора нужного штрихкода вынес в отдельную ф-ю, кот. вызываю в цикле обхода выборки. И работает быстреее и мозг загружать не пришлось....
После выбора нужного штрихкода в соответствие вносим пару Товар - ШтрихКод и при повторном попадании в цикле уже имеем нужное значение штрихкода
---
А обязятельно вычленять нужный штрихкод именно в самом запросе?Ну в моем случае обязательно, так как сам запрос является источником данных схемы СКД, которая в свою очередь храниться в макете этикетки или ценника. Если делать по другому, то придется кардинально перекраивать весь код типовой обработки, со всеми вытекающими, либо создавать свою обработку. А так достаточно просто изменить запрос в процессе редактирования макета этикетки прямо в режиме Предприятия. Даже конфигуратор открывать не нужно.
---
это меняет дело. Так что, проблема актуальна? Если да, то поколдую на досуге.