ОБСУЖДЕНИЕ

Подскажите С Запросом

13 ответов 8,3 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Здравствуйте! Подскажите по такому вопросу. Есть справочник Номенклатура, есть регистр сведений ШтрихКода. Для каждой позиции номенклатуры штрих код может быть, может не быть, может быть их несколько. Вопрос как в запросе можно выбрать Номенклатуру со всеми ее штрих кодами.Результат должен быть примерно следующий:
|Товар-1|ШтрихКод-1;ШтрихКод-2|
|Товар-2| |
|Товар-3|ШтрихКод-3; |
Подскажите как можно сделать, а то уже все что мог придумать перепробовал.
 
По нормальному нельзя.
А для чего вам?
 
А что же тут не нормального то? Есть позиция номенклатуры Товар 1 со штрих кодами ШтрихКод-1, ШтрихКод-2. Есть позиция номенклатуры Товар-2 у которой вообще нет штрих кодов. Есть позиция номенклатуры Товар3 со штрих кодом 3. Что где хранится написано выше. Результатом запроса должна быть табличка состоящая из 2-х колонок(первая - номенклатура, вторая штрих кода строкой).
Проблема в том что как сделать штрих кода по номенклатуре одной строкой (т.е. штрих1+штрих2...+штрих-n), причем между штрих коами должен быть какой либо разделитель(без разницы какой).
123.jpg
 
Это обязательно делать прям в запросе? Какая задача?
 
я не понял логики зачем при отсутствии штрихкода1 забивать штрихкод3?
а вообще можешь выбирать все штрихкоды, потом циклом обходить полученный результат и формировать либо переменные, которые сразу в форму выводишь либо Таблицу Значений с 2 колонками (что-то типа ШК = Строка(Штрихкод1)+";"+Строка(Штрихкод2) и т.д)
 
Если предположить, что количество штрихкодов не может быть больше N, гуглите нумерацию строк в запросе.
Потом раскладываем на разные колонки... что-то вроде
ВЫБОР КОГДА НомерСтроки = 3 Тогда
Выборка.Штрихкод...

потом
ЕСТЬNULL(Штрихкод1,"")+";"+ЕСТЬNULL(ШтрихКод2,"")
ну мысль такая... но не представляю, зачем это.
В СКД можно попробовать его средства.

Добавлено:
я не понял логики зачем при отсутствии штрихкода1 забивать штрихкод3?
а вообще можешь выбирать все штрихкоды, потом циклом обходить полученный результат и формировать либо переменные, которые сразу в форму выводишь либо Таблицу Значений с 2 колонками (что-то типа ШК = Строка(Штрихкод1)+";"+Строка(Штрихкод2) и т.д)
Мне кажется, он имел в виду, что у третьего товара один штрихкод. Условно :
|Носки|111111;22222|
|Портянки| |
|Гетры с кошечками|333333; |
 
Хех... Порядка 95000 тысяч позиций, у каждой позиции по 3-7 штрих кодов. Цикл ну уж ОЧЕНЬ долгий. Зачем надо - поставщик просит присылать ему такую форму. Количество штрих кодов заранее не известно, может быть и 7 а может не быть ни одного...Вот как то так :) Есть идеи?
Штрих кода и товар конечно заданы условно. Примерно как должно быть можно удивить во вложении выше.
 
Allexei, а что делать-то? все равно тебе нужно отбирать все 7, а потом уже смотреть где там есть ШК, а где нет. Отбирай товары по условию - Поставщик или товарная группа или остаток, думаю это сократит список.
разве что в запросе, вроде бы, можно поставить условие отбора если не Null
 
Мне кажется проще идти не от номенклатуры, а от штрих-кодов. Т.е. Запрос к регистру со штрихКодами и итоги по номенклатуре. На выходе имеем дерево в корне которого номенклатура, а внутри все его штрих коды. И в цикле обходить и собирать в одну строку.
 
Кстати тогда вопрос. Что быстрее (теоретически) сделать как сказал Darlock или же сделать цикл по номенклатуре и запросом выбирать для каждой позиции шк?
Второй вариант представлен ниже:
<!--shcode--><pre><code class='1С'>...
Для Каждого ТекСтрока Из спсНоменклатуры Цикл
Состояние("Формирую штрих кода. Необходимо обработать "+спсНоменклатуры.Количество()+ " записей");
НоваяСтрока = ТабШтрихКода.Добавить();
НоваяСтрока.Номенклатура = ТекСтрока.Номенклатура;
НоваяСтрока.ШтрихКод = ВернутьШтрихКодаНоменклатуры(НоваяСтрока.Номенклатура);
КонецЦикла;
...
Функция ВернутьШтрихКодаНоменклатуры(Номенклатура) ЭКСПОРТ

СтрокаШтрихКода= "";
Запрос= Новый Запрос("ВЫБРАТЬ
| ШтрихкодыНоменклатуры.Штрихкод КАК ШтрихКод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
|ГДЕ
| ШтрихкодыНоменклатуры.Номенклатура = &Номенклатура");
Запрос.УстановитьПараметр("Номенклатура" , Номенклатура);
Выборка= Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если НЕ СтрДлина(Выборка.ШтрихКод)= 13 Тогда
Продолжить;
КонецЕсли;
СтрокаШтрихКода= СтрокаШтрихКода+ СокрЛП(Выборка.ШтрихКод)+ Символы.ПС;//";";
КонецЦикла;
Возврат СтрокаШтрихКода;
КонецФункции[/CODE]
 
нет, для каждой позиции ШК выбирать имхо это утопия. их нада выбрать скопом и потом уже в цикле обходить результаты. хотя возможно Darlock советует самый правильный вариант
 
Так у тебя запрос в цикле ж!
Надо получать данные одним запросом. Ну и итоги по номенклатуре. Скорее все, больше всего времени уйдет на вывод в табличный документ.
А идти надо все же от номенклатуры, т.к. позиции с null-ами тоже надо выводить.
 
Всем спасибо, буду делать как сказал Darlock

...
А ведь действительно стало быстрее работать раза в 3