Добрый день! Учусь в 1С, столкнулся с непониманием и незнанием функционала.
Задача следующая: На форме есть текстовое поле ввода и табличная часть с колонками: Номенклатура, артикул, склад, ОстатокНаСкладе, РозничнаяЦена.
Пользователь вводит в текстовое поле массив артикулов, например: А123, Б432, В567К. Данная строка разбивается на массив по разделителю ",". Далее по этому массиву проводится поиск по справочнику номенклатура и заполняются колонки.
Проблема следующая: Одна и та же номенклатура может находится на нескольких складах, и в табличную часть она выводиться отдельными строками.
Мне же надо в ТЧ сделать группировку по номенклатуре, чтобы выводилась строка с номенклатурой, которую можно было бы развернуть и посмотреть на каких складах она лежит. Как реализовать?
Потуги следующие:
&НаСервере
Процедура ПоказатьНаСервере()
Массив = Новый Массив;
Массив = РазложитьСтрокуВМассивПодстрок(Объект.Текст, Символы.ПС);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| НоменклатураВся.Ссылка КАК Номенклатура,
| ТоварыНаСкладахОстатки.Склад КАК Склад,
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток,
| ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
|ИЗ
| Справочник.Номенклатура КАК НоменклатураВся
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
| ПО (ТоварыНаСкладахОстатки.Номенклатура = НоменклатураВся.Ссылка)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ПО (ЦеныНоменклатурыСрезПоследних.Номенклатура = НоменклатураВся.Ссылка)
|ГДЕ
| НоменклатураВся.Наименование ПОДОБНО ""%"" + &Наименование + ""%""
| И ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены";
Запрос.УстановитьПараметр("ВидЦены", Объект.ВидыЦен);
Объект.Результат.Очистить();
Для каждого эл из Массив Цикл
Запрос.УстановитьПараметр("Наименование", эл);
Результат = Запрос.Выполнить().Выгрузить();
Для каждого строка из Результат Цикл
ТЧ = Объект.Результат.Добавить();
ТЧ.Номенклатура = строка.номенклатура;
ТЧ.Склад = строка.Склад;
ТЧ.ВидЦены = строка.ВидЦены;
ТЧ.ОстатокНаСкладе = строка.Остаток;
ТЧ.Стоимость = строка.Цена;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Показать
Объект.Текст - текстовое поле для ввода
Объект.ВидыЦен - пользователь выбирает вид цен, по которому формируется стоимость
Объект.Результат - табличная часть на форме
P.s. Если видите говнокод, то не стесняйтесь выражать конструктивную критику
ТЧ формы такого не может. Посмотрите в эту сторону: https://infostart.ru/public/991409/ По коду, запрос в цикле, который на сервере с высокой степени вероятности вызовет перебор - не есть хорошо. Получите сперва список номенклатур, потом идите в регистры с ними за требуемым результатом. Неужто у вас артикулы только в наименовании?
ТЧ формы такого не может. Посмотрите в эту сторону: https://infostart.ru/public/991409/ По коду, запрос в цикле, который на сервере с высокой степени вероятности вызовет перебор - не есть хорошо. Получите сперва список номенклатур, потом идите в регистры с ними за требуемым результатом. Неужто у вас артикулы только в наименовании?
(2) Спасибо за ссылку и конструктив. Хотел уточнить на счет запроса. Я правильно понял, что сначала я должен выполнить запрос целиком без этого отбора:
Запрос.УстановитьПараметр("Наименование", эл);
А уже потом отбирать необходимое в цикле?
Артикулы тоже заведены, но искать по ним нужно только в рамках цифр, без префиксов (Артикулы рода DLU752003BS). Тк они не все заполнены, то пока так. В дальнейшем планируется переделать как раз по артикулам.
Я промолчу про запрос в цикле.... В ТЧ у вас есть колонка "склад", разбития строк по складам логична. Если необходимо показывать общие остатки на всех складах, но с возможной детализацией до разреза складов., то тут можно где-нибудь на форме создать элемент формы "Декорация" или небольшую ТЧ (склад, количество) и в них отображать наличие на складах, при выборе строки. То есть ткнул на строку, и в этот момент отобразилось детализация по складам. Или Добавить команду на форму, чтоб открывала форму с детализацией по складам, для номенклатуры из выбранной строки. Но повторюсь, если не убирать колонку "склад", то менять ничего не надо.