Заказчик переходил с переписанной торговли 7.7 на УТ 11.5.
В 7.7. был подбор с просмотром остатков по складам в колонках списка, не активизируя строку, попросили сделать в УТ так же:
Чтобы операторы не мучались, надо отключить
Создаем расширение, в котором правим только основную форму "ПодборТоваровВДокументПродажи".
Прежде всего необходимо "ПриСозданииНаСервере " проверить, если это группа складов, то добавить колонки со складами из группы
И добавить процедуры для соответствующих списков "ПриПолученииДанныхНаСервере"
//============================================= Подключение к элементам формы
&НаСервере
&После("ПриСозданииНаСервере")
Процедура РасшОстатки_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Включаем наш интерфейс только! при подборе по группе складов.
Если Склад.ЭтоГруппа Тогда
КомпанияИНФОРМ_ДобавитьОбновитьЭлементыИнтерфейсаНаФорму();
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РасшОстатки_СписокСтандартныйПоискНоменклатураПриПолученииДанныхНаСервереПосле(ИмяЭлемента, Настройки, Строки)
КомпанияИНФОРМ_ЗаполнитьСтрокиСпискаОстатками(Строки);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура РасшОстатки_СписокРасширенныйПоискНоменклатураПриПолученииДанныхНаСервереПосле(ИмяЭлемента, Настройки, Строки)
КомпанияИНФОРМ_ЗаполнитьСтрокиСпискаОстатками(Строки);
КонецПроцедуры
Оставим основной запрос типовым, как он есть, но добавим к нему склады в колонки. К именам колонок добавим "Склад_" , чтобы отображать остатки "ПриПолученииДанныхНаСервере"
&НаСервере
Процедура КомпанияИНФОРМ_ДобавитьОбновитьЭлементыИнтерфейсаНаФорму()
// в моем случае - используется только подбор по иерархии и переход к отбору по свойствам не нужен
// определяем включен ли расширенный поиск подбора товара,
// в зависимости от этого выбираем элементы формы, на которые накладываем расширение
//ПередКакойКолонкойДобавляем - это перед чем будем вставлять, будем добавлять перед колонкой "Доступно".
Если ИспользоватьСтандартныйПоискПриПодбореТоваров Тогда
ТаблицаФормыКудаДобавляем = "СписокСтандартныйПоискНоменклатура";
ПередКакойКолонкойДобавляем = "СписокСтандартныйПоискНоменклатураДоступно";
ОбщийОстатокКолонка = "СписокРасширенныйПоискНоменклатураВНаличииОстаток";
Элементы.СписокСтандартныйПоискНоменклатураВНаличииОстаток.Видимость = Ложь;
Иначе
ТаблицаФормыКудаДобавляем = "СписокРасширенныйПоискНоменклатура";
ПередКакойКолонкойДобавляем = "СписокРасширенныйПоискНоменклатураДоступно";
ОбщийОстатокКолонка = "СписокРасширенныйПоискНоменклатураВНаличииОстаток";
Элементы.СписокРасширенныйПоискНоменклатураВНаличииОстаток.Видимость = Ложь;
КонецЕсли;
ТекстЗапросаСтандарт = ЭтаФорма.СписокНоменклатура.ТекстЗапроса;
// получим таблицу складов, чтобы добавить заголовки в запрос
ТаблицаСкладов = КомпанияИНФОРМ_ПолучитьТаблицуСкладов();
// добавим поля для запроса склады
ТекущийТекстЗапроса = ЭтаФорма.СписокНоменклатура.ТекстЗапроса;
ВставляемыйТекстЗапроса = "
| ";
Для Каждого ТекСклад Из ТаблицаСкладов Цикл
ВставляемыйТекстЗапроса = ВставляемыйТекстЗапроса +""""""+" КАК " + ТекСклад.ИмяДляФормы+",
|";
КонецЦикла;
ВставляемыйТекстЗапроса = ВставляемыйТекстЗапроса +""""""+" КАК " + "ИтогоПоСкладам"+",
|";
// добавим в текст запроса новые поля после слова ВЫБРАТЬ
НовыйТекстЗапроса = "ВЫБРАТЬ"+ ВставляемыйТекстЗапроса + Сред(ТекущийТекстЗапроса,9);
// добавляю настройки по требованию заказчика:
НовыйТекстЗапроса = СтрЗАменить(НовыйТекстЗапроса,"НЕ СправочникНоменклатура.ЭтоГруппа","ИСТИНА");//уберем условие отбора элементов без групп
Элементы[ТаблицаФормыКудаДобавляем].Отображение = ОтображениеТаблицы.ИерархическийСписок; //сделаем подбор иерархическим, как было в 7.7
ЭтаФорма.ВариантНавигации = ПредопределенноеЗначение("Перечисление.ВариантыНавигацииВФормахНоменклатуры.ПоИерархии"); //включаем навигацию по иерархии
ЭтаФорма.Элементы.СтраницаФильтры.Видимость = Ложь; //отключаем фильтры,
ЭтаФорма.ИспользоватьФильтры = Ложь;
ИспользоватьФильтрыПриИзмененииНаСервере(); // вызов процедуры, чтобы все настройки вступисли в силу
// подменяю текст запроса на новый
ЭтаФорма.СписокНоменклатура.ТекстЗапроса = НовыйТекстЗапроса;
// теперь вставляем колонки со складами в поле списка
ПервыйПроход = Истина;
Для Каждого ТекСклад Из ТаблицаСкладов Цикл
Элемент = Элементы.Вставить(ТекСклад.ИмяДляФормы, Тип("ПолеФормы"), Элементы[ТаблицаФормыКудаДобавляем],Элементы[ПередКакойКолонкойДобавляем]);
Элемент.ПутьКДанным = "СписокНоменклатура."+ТекСклад.ИмяДляФормы;
Элемент.Заголовок = СокрЛП(ТекСклад.Склад);
Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
Если ПервыйПроход = Истина ТОгда
ПервыйПроход = Ложь;
ПередКем = Элемент;
КонецЕсли;
КонецЦикла;
Элемент = Элементы.Вставить("ИтогоПоСкладам", Тип("ПолеФормы"), Элементы[ТаблицаФормыКудаДобавляем],ПередКем);
Элемент.ПутьКДанным = "СписокНоменклатура."+"ИтогоПоСкладам";
Элемент.Заголовок = СокрЛП("Всего остаток");
Элемент.ГоризонтальноеПоложение = ГоризонтальноеПоложениеЭлемента.Право;
//саму колонку "доступности на складе" теперь можно сделать невидимой - она теряет смысл
Элементы[ПередКакойКолонкойДобавляем].Видимость =Ложь;
КонецПроцедуры
&НаСервереБезКонтекста
Функция КомпанияИНФОРМ_ПолучитьИмяСкладаДляФормы(СкладСсылка)
// убиреаем все ненужные символы из имени склада.
РазрешенныеСимволы = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ_1234567890";
ИмяСклада = СокрЛП(СкладСсылка);
ЧистыйВариант = "";
Для Поз = 1 По СтрДлина(ИмяСклада) Цикл
ТекСимвол = ВРЕГ(Сред(ИмяСклада,Поз,1));
Если СтрНайти(РазрешенныеСимволы,ТекСимвол) >0 Тогда
ЧистыйВариант = ЧистыйВариант+ТекСимвол;
КонецЕсли;
КонецЦикла;
Возврат "СКЛАД_"+ЧистыйВариант;
КонецФункции
&НаСервере
Функция КомпанияИНФОРМ_ПолучитьТаблицуСкладов() Экспорт
СписокСкладов = Новый СписокЗначений;
СписокСкладов.Добавить(Склад);
// список складов делаем по алфавиту, но по убыванию. Чтобы при вставке они встали наоборот по возрастанию
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Склады.Ссылка КАК Склад
|ИЗ
| Справочник.Склады КАК Склады
|ГДЕ
| Склады.ПометкаУдаления = ЛОЖЬ
| И Склады.ЭтоГруппа = ЛОЖЬ
| И Склады.Ссылка В ИЕРАРХИИ(&СписокСкладов)
|
|УПОРЯДОЧИТЬ ПО
| Склады.Ссылка УБЫВ
|АВТОУПОРЯДОЧИВАНИЕ" ;
Запрос.УстановитьПараметр("СписокСкладов",СписокСкладов);
ТаблицаСкладов = Запрос.Выполнить().Выгрузить();
ТаблицаСкладов.Колонки.Добавить("ИмяДляФормы");
Для Каждого ТекСклад Из ТаблицаСкладов Цикл
ТекСклад.ИмяДляФормы = КомпанияИНФОРМ_ПолучитьИмяСкладаДляФормы(ТекСклад.Склад);
КонецЦикла;
Возврат ТаблицаСкладов;
КонецФункции
И, обрабатываю получение остатков по нужным колонкам складов
&НаСервереБезКонтекста
Процедура КомпанияИНФОРМ_ЗаполнитьСтрокиСпискаОстатками(Строки)
// Тут можно задать формат.
// у меня клиент не хочет видеть лишнии нули
ФорматСтрокиБезНулей = "ЧФ=Ч";
ФорматСтрокиСНулями = "ЧЦ=15; ЧДЦ=3";
ФорматВыводаОстатков = ФорматСтрокиБезНулей;
// получааем список номенклатуры, по которому надо полкчить остатки
СписокНоменклатуры = Новый СписокЗначений;
Для Каждого СтрокаСписка Из Строки Цикл
СписокНоменклатуры.Добавить(СтрокаСписка.Значение.Данные.Ссылка);
КонецЦикла;
// получаем таблицу остатков
ТаблицаОстатков = КомпанияИНФОРМ_ПолучитьТаблицуОстатковПоСпискуНоменклатуры(СписокНоменклатуры);
// заполним Строки списка даннымии остатков
ЖирныйШрифт = Новый Шрифт(,,Истина);
Для Каждого СтрокаСписка Из Строки Цикл
ТекНоменклатура = СтрокаСписка.Значение.Данные.Ссылка;
// перебираем колонки
ИтогоПоСкладам = 0;
Для Каждого КолонкаОформления Из СтрокаСписка.Значение.Оформление Цикл
Если СтрНайти(КолонкаОформления.Ключ,"СКЛАД_") >0 Тогда // это колнока со складом
МассивСтрок = ТаблицаОстатков.НайтиСтроки(Новый Структура("Номенклатура,ИмяДляФормы",ТекНоменклатура,КолонкаОформления.Ключ));
Если МассивСтрок.Количество() >0 Тогда
КолонкаОформления.Значение.УстановитьЗначениеПараметра("Текст", Формат(МассивСтрок[0].Свободно,ФорматВыводаОстатков));
ИтогоПоСкладам = ИтогоПоСкладам+МассивСтрок[0].Свободно;
КонецЕсли;
КонецЕсли;
КонецЦикла;
//Подставим значение в общее
Если СтрокаСписка.Значение.Данные.Свойство("ИтогоПоСкладам") Тогда
СтрокаСписка.Значение.Оформление["ИтогоПоСкладам"].УстановитьЗначениеПараметра("Текст", Формат(ИтогоПоСкладам,ФорматВыводаОстатков));
СтрокаСписка.Значение.Оформление["ИтогоПоСкладам"].УстановитьЗначениеПараметра("Шрифт", ЖирныйШрифт);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция КомпанияИНФОРМ_ПолучитьТаблицуОстатковПоСпискуНоменклатуры(СписокНоменклатуры)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РаспределениеЗапасов.Номенклатура КАК Номенклатура,
| РаспределениеЗапасов.Склад КАК Склад,
| СУММА(РаспределениеЗапасов.Свободно) КАК Свободно
|ИЗ
| РегистрСведений.РаспределениеЗапасов КАК РаспределениеЗапасов
|ГДЕ
| РаспределениеЗапасов.Номенклатура В(&СписокНоменклатуры)
|
|СГРУППИРОВАТЬ ПО
| РаспределениеЗапасов.Склад,
| РаспределениеЗапасов.Номенклатура" ;
Запрос.УстановитьПараметр("СписокНоменклатуры",СписокНоменклатуры);
ТаблицаОстатков = Запрос.Выполнить().ВыГрузить();
ТаблицаОстатков.Колонки.Добавить("ИмяДляФормы");
Для Каждого ТекСтрока Из ТаблицаОстатков Цикл
ТекСтрока.ИмяДляФормы = КомпанияИНФОРМ_ПолучитьИмяСкладаДляФормы(ТекСтрока.Склад);
КонецЦикла;
Возврат ТаблицаОстатков;
КонецФункции
Готовое расширение прилагаю.
Тестировалось на Платформе 8.3.23.1865.
Конфигурация Управление торговлей, редакция 11 (11.5.12.87).