Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
23 июн 2021, 12:22

Как корректно сформировать запрос

Автор Мухаммад, 13 июл 2016, 19:22

0 Пользователей и 1 гость просматривают эту тему.

Мухаммад

Здравствуйте)). Я хочу составить список всех товаров из всех складов (или склад по выбору) с колонками: номенклатура, штрих-код, цена (розничная), остаток (шт), ячейка (место хранения).

Я как понял нужно запрос делать либо в "РегистрСведений", либо в "РегистрНакопления", либо в "ШтрихкодыНоменклатуры".

Я пока смог получить колонки: номенклатура, штрих-код, остаток. Но остаток неправильный (в окне пересчёта товаров, остаток по учёту совсем другой). И штрих-код я взял "минимум" из всех, мне бы если 2 и более штрих-кодов, то их в 1 строку через пробел, например, 4604534534345_460312434234_42132141242121. Помогите, пожалуйста! :mellow:
&НаСервере
Процедура ЗаполнитьНаСервере()

ЭтаФорма.ТЗ.Очистить();

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

ТЗ_Ш = Новый ТаблицаЗначений;
ТЗ_Ш.Колонки.Добавить("Номенклатура");
ТЗ_Ш.Колонки.Добавить("Штрихкод");

ТЗ_Ш = ЗапросШ.Выполнить().Выгрузить();

МассивШ = Новый Массив;
МассивШК = Новый Массив;
Для каждого Стр из ТЗ_Ш цикл
МассивШ.Добавить(Стр.Номенклатура);
МассивШК.Добавить(Стр.Штрихкод);
КонецЦикла;

/////////////////////////////////////////////////

ЗапросО = Новый Запрос;
ЗапросО.Текст = "ВЫБРАТЬ
                | ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток,
                | ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура
|ИЗ
                | РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки";

ТЗ_Г = Новый ТаблицаЗначений;
ТЗ_Г.Колонки.Добавить("Номенклатура");
ТЗ_Г.Колонки.Добавить("Штрихкод");
ТЗ_Г.Колонки.Добавить("Остаток");

ТЗ_О = Новый ТаблицаЗначений;

ТЗ_О.Колонки.Добавить("Номенклатура");
ТЗ_О.Колонки.Добавить("Остаток");

ТЗ_О = ЗапросО.Выполнить().Выгрузить();

МассивО = Новый Массив;
МассивОст = Новый Массив;
МассивГотН = Новый Массив;
МассивГотШ = Новый Массив;
МассивГотО = Новый Массив;

Для каждого Стр из ТЗ_О цикл
МассивО.Добавить(Стр.Номенклатура);
МассивОст.Добавить(Стр.Остаток);
КонецЦикла;

Для Каждого ЭлементМассиваО из МассивО Цикл
НОстатка = ЭлементМассиваО;
ИндексО = МассивО.Найти(НОстатка);
Для Каждого ЭлементМассиваШ из МассивШ Цикл
НШК = ЭлементМассиваШ;
ИндексШ = МассивШ.Найти(НШК);

Если НОстатка = НШК Тогда

Стр = ТЗ_Г.Добавить();
Стр.Номенклатура = НОстатка;
Стр.Штрихкод = МассивШК.Получить(ИндексШ);
Стр.Остаток = МассивОст.Получить(ИндексО);

КонецЕсли;

КонецЦикла;

КонецЦикла;

ЭтаФорма.ТЗ.Загрузить(ТЗ_Г);

КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда)

ЗаполнитьНаСервере();

КонецПроцедуры




mixqn

В одну строчку штрихкоды вывести будет сложно, так как количество штрихкодов на каждый товар может быть разным. Нормально такое не сделать. Во всяком случае, одним запросом - не сделать. Тут либо сначала отдельным запрос вычислить максимальное количество штрихкодов на 1 позицию, а потом программным кодом формировать результирующий запрос, либо просто заложить заранее какое-то фиксированное количество штрихкодов, например 3. Смысл в том, что для того, чтобы сложить штрихкоды в 1 колонку, они изначально должны оказаться в одной строке. Так как складывать значения из разных строк не получится. Соответственно, чтобы штрихкоды оказались в одной колонке, нужны левые соединения в таком количестве, сколько максимум может быть штрихкодов на одну позицию.
Есть конечно и третий вариант: получить все штрихкоды по товару в разных строках, а потом результат запроса обрабатывать программным кодом, схлопывая штрихкоды в одну строку.

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


Добавлено: 13 июл 2016, 20:17


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

Мухаммад

Я смог получить данные (номенклатура + штрихкод) с "ШтрихкодыНоменклатуры", и (номенклатура + остаток) с "РегистрНакопления".
Массивы нужны, чтобы можно было их "связать" (номенклатура + штрихкод + остаток).
Просто в "ШтрихкодыНоменклатуры" нет остатков, а в "РегистрНакопления" нет штрихкодов.
Если бы можно было, получить с запроса данные сразу в виде (номенклатура + штрихкод + остаток), мне бы не потребовались массивы. Наверно, я принцип запросов плохо понимаю, пришлось с массивами возиться, просто есть опыт в Java. Я сам по сути Android разработчик.

Думаю пока вариант с 1 штрихкодом подойдёт, а потом придумаю, как разные штрихкоды выводить.

Мухаммад

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

Теги:
Рейтинг@Mail.ru Rambler's Top100

Поиск