Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как получить остатки по отдельным складам в 1с 8.1?
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.1 (8.0)
Ученик_Покачто
есть текст процедуры:

Процедура СписокНоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)

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

МассивНоменклатуры = Новый Массив; // для передачи в параметр запроса
Соответствие = Новый Соответствие; // для заполнения остатков в строках табличного поля

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

Запрос.УстановитьПараметр("МассивТоваров", МассивНоменклатуры);

Выборка = Запрос.Выполнить().Выбрать();

// Вывести остаток в строку, найденную в соответствии по номенклатуре
// из запроса.
Пока Выборка.Следующий() Цикл
Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток.Значение = Выборка.Остаток;
КонецЦикла;

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


надо добавить еще условие, с помощью какого в колонках Склад1 и остаток1 выводилось бы наименование склада и остаток по нему, как это можно сделать?
Zaval
И?
Будешь иметь по каждому товару несколько строк с остатками по разным складам? В теории - норм, а вот когда начнут работать юзеры, и появятся товары со сходными наименованиями.... порвут тебя в клочья за такую реализацию.

А технически - просто: выбираешь еще и склад, группируешь по товарам.
Ученик_Покачто
в смысле "выбираешь склад"? можно текст условия?
Zaval
Ну, сам же написал ВЫБРАТЬ? вооот, еще и склад...

Какого условия? Что, остатки нужны только по одному складу?
Ученик_Покачто
т.е.

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



и добавить в форму списка еще одно поле склад1?

извини, я еще зеленый в программировании, учусь, поэтому и задаю глупые вопросы(((
Zaval
Да. Вот только пользы от этого....

Посмотри на текст внимательно. Из выведенных на форму строк создается массив номенклатуры. По этому массиву выполняется запрос остатков.
Результат запроса перебирается, по Соответствию ищется нужная строка и в нее проставляется остаток.
Теперь у тебя в Выборке по каждому товару несколько строк с остатками по различным складам (и с самими складами). Причем не факт, что строки с одинаковым товаром расположены одна за другой...
И что со всем этим делать?
Ученик_Покачто
хмм... надо (( блин...


наверное

Пока Выборка.Следующий() Цикл
Соответствие.Получить(Выборка.Склад.Ссылка).Ячейки.Склад.Значение = Выборка.Остаток;
КонецЦикла;

??
Zaval
Нету у тебя Склад в Соответствии. Соответствие.Получить(Выборка.Товар.Ссылка)

В ячейку Склад(добавленную в табл) запишется остаток по складу Выборка.Склад.
Затем будет найдена другая строка с тем же товаром, но с другим складом и остатком по нему. И значение остатка будет записано в ту же ячейку поверх прежнего.
Ученик_Покачто
Процедура СписокНоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)

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

МассивНоменклатуры = Новый Массив; // для передачи в параметр запроса
МассивСкладов = Новый Массив;

Соответствие = Новый Соответствие;// для заполнения остатков в строках табличного поля
Для Каждого Строка из ОформленияСтрок Цикл
МассивНоменклатуры .Добавить(Строка.ДанныеСтроки.Ссылка);
Соответствие.Вставить(Строка.ДанныеСтроки.Ссылка, Строка);
КонецЦикла;

Для Каждого Строка из ОформленияСтрок Цикл
МассивСкладов .Добавить(Строка.ДанныеСтроки.Ссылка);
Соответствие.Вставить(Строка.ДанныеСтроки.Ссылка, Строка);
КонецЦикла;

Запрос.УстановитьПараметр("МассивТоваров", МассивНоменклатуры);
Запрос.УстановитьПараметр("МассивСкладов ", МассивСкладов );
Выборка = Запрос.Выполнить().Выбрать();

// Вывести остаток в строку, найденную в соответствии по номенклатуре
// из запроса.
Пока Выборка.Следующий() Цикл
Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток.Значение = Выборка.Остаток;
Соответствие.Получить(выборка.Склад.Ссылка).Ячейки.Склад.Значение = Выборка.Остаток;
КонецЦикла;

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



как-то так? или вообще не так?
Zaval
Запускай - экран покажет.
А лучше не теряй времени - садись читать умные книжки.

ЗЫ. Почему-то никто не пытается освоить вождение, сев в кабину и дергая за все подряд в произвольном порядке(
Ученик_Покачто
подскажи умную книгу, а то нигде не могу найти что-то подобное, что соответствует моему вопросу(((
Ученик_Покачто
а если сможешь - напиши текст, буду оооочень благодарен)) и на следующий раз буду знать ...
Zaval
Тебе нужно разобраться с языком запросов и самими запросами, работой с конфигуратором, конструктором запросов, отладкой...
Митичкин, Радченко, Руководство разработчика, Описание встроенного языка.

Извини, сам написал, что учишься... Писать готовый код - это моя работа.
У тебя есть код, приведенный в сабже - помогло?
Ученик_Покачто
через построитель запроса - выводит то-же, что и я писал(( в колонке склад отображается суммарный остаток(( сил моих уже нету((
Ученик_Покачто
сделал аналог прошлой процедуры, сейчас буду пробовать как-нить вывести остаток по складу((

Процедура СправочникНоменклатураОстатки(ОформленияСтрок)

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

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

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


ЗапросОстатка.УстановитьПараметр("Номенклатура",ТаблицаСтрок.ВыгрузитьКолонку("Номенклатура"));

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

Для каждого Строка Из ОформленияСтрок Цикл
ОтборПоиска = Новый Структура();
ОтборПоиска.Вставить("Номенклатура", Строка.ДанныеСтроки.Ссылка);
СтрокаПоиска = ТЗ.НайтиСтроки(ОтборПоиска);
Если СтрокаПоиска.Количество() > 0 Тогда
Остаток = СтрокаПоиска[0].КоличествоОстаток;

Иначе
Остаток = 0;
КонецЕсли;
Строка.Ячейки.Остаток.Значение=Формат(Остаток,"ЧЦ=15; ЧДЦ=0;");
Строка.Ячейки.Склад.Значение=Формат(Остаток,"ЧЦ=15; ЧДЦ=0;");
КонецЦикла;

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


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)

Если ЭлементыФормы.Список.Колонки.Остаток.Видимость = Истина Тогда
СправочникНоменклатураОстатки(ОформленияСтрок);
КонецЕсли;


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

только подскажи, вот сюда надо что-то впихнуть?

ЗапросОстатка.УстановитьПараметр("Номенклатура",ТаблицаСтрок.ВыгрузитьКолонку("Номенклатура"));

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

Для каждого Строка Из ОформленияСтрок Цикл
ОтборПоиска = Новый Структура();
ОтборПоиска.Вставить("Номенклатура", Строка.ДанныеСтроки.Ссылка);
СтрокаПоиска = ТЗ.НайтиСтроки(ОтборПоиска);
Zaval
Вот это

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


открылось Конструктором запросов??? так не бывает...

Что получить хочешь?
Товар1 Склад1 Остаток
Товар1 Склад2 Остаток
Товар2 Склад2 Остаток
Товар2 Склад3 Остаток
Так?
Zaval
Воспользуйся конструктором запросов в режиме предприятия - там есть просмотр результата, будет понятнее, что с этим делать дальше.
Ученик_Покачто
наименование суммарныйОстаток
главнСклад|ПроизвСкл
100UF 200
100 100


примерно чтоб так было
Ученик_Покачто
спасибо, извини, если разнервировал... больше не буду доставать(((
Ученик_Покачто
буду сам разбираться...
Zaval
Да нет, просто пора на выход...
Не используй форму списка справочника - возьми просто пустую таблицу(создай новый отчет) и добавляй туда строки.

В запрос добавь группровку Товар. При обходе тоавров будешь добавлять в таблицу итоговые строки, при переборе внутри группировки - строки расшифровок по складам.
Ученик_Покачто
нету сил моих на это((( щас головой буду об стол бится((( последний раз такой злой был, когда 103 или 105 миссию в первом андерграунде проходил, там где 7 кругов, 2 клавиатуры разбил(((

и тут снова одно расстройство!!! за что мне такое?(((
Zaval
Отставить истерики! Упрямство присутствует - это уже плюс smile.gif
Давай с самого начала... Это отчет в учебных целях или пытаешься ПодборНоменклатуры доработать? Если второе - опять таки для чего, эксперимента ради или на этом кто-то работать будет?
Ученик_Покачто
я переделываю конфигурацию УТ, для дальнейшей работы с ней... просто на нашем предприятии полно складов и продукция хранится на разных из них. Для облегчения набора накладных для менеджеров попросили сделать несколько ячеек, где б отображалось остатки по складам, не суммарный, а по отдельности... Вот и пробую сделать...
Ученик_Покачто
слушай, тут пересмотрел отчет Остатки товаров на складах, может запрос будет такой:

|ВЫБРАТЬ //РАЗЛИЧНЫЕ
| СУММА(КоличествоОстаток) КАК Количество,
| Склад КАК Склад,
| Номенклатура КАК Номенклатура,

|{ВЫБРАТЬ
| Склад.* КАК Склад,
| Номенклатура.* КАК Номенклатура,

| //СВОЙСТВА
|}
|ИЗ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКон,
| {Склад.* КАК Склад,
| Номенклатура.* КАК Номенклатура,
|//СОЕДИНЕНИЯ
|СГРУППИРОВАТЬ ПО
| Номенклатура,
| Склад
Batchir
Цитата(Ученик_Покачто @ 16.07.10, 10:12) необходимо зарегистрироваться для просмотра ссылки
я переделываю конфигурацию УТ, для дальнейшей работы с ней... просто на нашем предприятии полно складов и продукция хранится на разных из них. Для облегчения набора накладных для менеджеров попросили сделать несколько ячеек, где б отображалось остатки по складам, не суммарный, а по отдельности... Вот и пробую сделать...

В форме подбора? Если да, то попробуйте раздвинуть форму подбора, обычно заветная кнопка "Остатки и цены товаров" просто не помещается и скрывается в значек ">>" под шалоном поиска. Сколько уже людей видел изобретающих велосипед именно по причине недосмотра этой кнопки.
Zaval
Это уже ближе)

Цитата(Ученик_Покачто @ 16.07.10, 11:12) необходимо зарегистрироваться для просмотра ссылки
Для облегчения набора накладных для менеджеров попросили сделать несколько ячеек, где б отображалось остатки по складам, не суммарный, а по отдельности... Вот и пробую сделать...


Плин, перебор для новичка...

Думаю, по сложность+эффективность оптимально будет так.

1. Создаем новую обработку. Открывается она по новой кнопке в документе(РН, счет...)
На форме - Дерево. При открытии заполняется запросом примерно как последний приведенный.
По двойному щелчку на строке конкретного склада (на неитоговой по товару) обработка должна спросить количество и добавить строку в вызвавший ее документ. Как это делается - подсмотреть в ПодбореНоменклатуры.

Дерзай!:)
Ученик_Покачто
О, великий изобретатель и властелин мира сего,Batchir, мне надо в форме списка добавить колонки остаток1, остаток2, чтоб в них отдельно отображался остаток по складах 1 и 2, так как в вышеупомянутой процедуре отображается суммарный остаток, надо что-то переделать так, чтоб отображалось то, что сказано выше))
Zaval
Цитата(Batchir @ 16.07.10, 12:35) необходимо зарегистрироваться для просмотра ссылки
В форме подбора? Если да, то попробуйте раздвинуть форму подбора, обычно заветная кнопка "Остатки и цены товаров" просто не помещается и скрывается в значек ">>" под шалоном поиска. Сколько уже людей видел изобретающих велосипед именно по причине недосмотра этой кнопки.


Там вроде можно либо по всем, либо по одному складу... а тут хотят программой компенсировать бардак в складском хозяйстве, надо видеть все.
Ученик_Покачто
оу, а без кнопок можно, потому что так все-же есть готовый отчет, можно узнать по нему , а старпёры , работающие складовиками, не понимают этого... они хотят все готовое, плачут, что не запомнят всего этого... у них стояла 7ка, а там все отображалось, мол, но она полетела и сейчас насяльника надумал 8-ку поставить, для этого судьба выбрала меня, как я немного знаком с 1с 8, заставили учить и переделывать все под потребности сотрудников.... вот такая ситуация, как обыкновенный переводчик становится или пытается стать программистом 1с....
Zaval
Цитата(Ученик_Покачто @ 16.07.10, 13:01) необходимо зарегистрироваться для просмотра ссылки
в форме списка добавить колонки остаток1, остаток2, чтоб в них отдельно отображался остаток по складах 1 и 2, так как в вышеупомянутой процедуре отображается суммарный остаток, надо что-то переделать так, чтоб отображалось то, что сказано выше))


Забудь, Великий Реформатор.
Во-первых - запаришься обработку переделывать; во-вторых - при разворачивании по складам горизонтально получишь простыню, которую юзеры мотать вперед-назад запарятся, при разворачивании по вертикали юзеры будут ошибаться при выборе на товарах с похожими наименованиями, выведенных в список с разным числом повторений; в-третьих - (самый цимус!) - получишь неслабые тормоза, которые будут усугубляться при попытках преодолеть "во-вторых".

Там есть кнопки вызова существующей обработки. Сделай аналогично.
Ученик_Покачто
оу, слушай, тут в доке реал товаров и услуг нашел такую вот фигню :

Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)

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

Для каждого Строка Из ОформленияСтрок Цикл
НС = ТаблицаСтрок.Добавить();
НС.Номенклатура = Строка.ДанныеСтроки.Номенклатура;
НС.ХарактеристикаНоменклатуры = Строка.ДанныеСтроки.ХарактеристикаНоменклатуры;
НС.СерияНоменклатуры = Строка.ДанныеСтроки.СерияНоменклатуры;
НС.Склад = ?(ЗначениеНеЗаполнено(Строка.ДанныеСтроки.Склад), Склад, Строка.ДанныеСтроки.Склад);
НС.Качество = Строка.ДанныеСтроки.Качество;
КонецЦикла;

ЗапросОстатка = Новый Запрос;
ЗапросОстатка.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
| ТоварыНаСкладахОстатки.СерияНоменклатуры,
| ТоварыНаСкладахОстатки.Склад,
| ТоварыНаСкладахОстатки.Качество,
| ТоварыНаСкладахОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(,Номенклатура В (&Номенклатура)) КАК ТоварыНаСкладахОстатки";
ЗапросОстатка.УстановитьПараметр("Номенклатура",ТаблицаСтрок.ВыгрузитьКолонку("Номенклатура"));
//ЗапросОстатка.УстановитьПараметр("ХарактеристикиНоменклатуры",ТаблицаСтрок.ВыгрузитьКолонку("ХарактеристикаНоменклатуры"));
//ЗапросОстатка.УстановитьПараметр("СерииНоменклатуры",ТаблицаСтрок.ВыгрузитьКолонку("СерияНоменклатуры"));
//ЗапросОстатка.УстановитьПараметр("Склады",ТаблицаСтрок.ВыгрузитьКолонку("Склад"));
//ЗапросОстатка.УстановитьПараметр("Качества",ТаблицаСтрок.ВыгрузитьКолонку("Качество"));

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

Для каждого Строка Из ОформленияСтрок Цикл
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура", Строка.ДанныеСтроки.Номенклатура);
Отбор.Вставить("ХарактеристикаНоменклатуры", Строка.ДанныеСтроки.ХарактеристикаНоменклатуры);
Отбор.Вставить("СерияНоменклатуры", Строка.ДанныеСтроки.СерияНоменклатуры);
Отбор.Вставить("Склад",?(ЗначениеНеЗаполнено(Строка.ДанныеСтроки.Склад), Склад, Строка.ДанныеСтроки.Склад));
Отбор.Вставить("Качество", Строка.ДанныеСтроки.Качество);
СтрокаПоиска = ТЗ.НайтиСтроки(Отбор);
Если СтрокаПоиска.Количество() > 0 Тогда
ОстатокНаСкладе = СтрокаПоиска[0].КоличествоОстаток;
Иначе
ОстатокНаСкладе = 0;
КонецЕсли;
Строка.Ячейки.ОстатокНаСкладе.Значение=Формат(ОстатокНаСкладе,"ЧЦ=15; ЧДЦ=0;");
КонецЦикла;

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

может ее переделать как-нить ?
Zaval
Думаешь, я никогда не видел ФормуДокумента РТиУ?... Возьми голову в руки, и сделай написанное в #27. Там ничего особо сложного. Раньше начнешь - быстрее закончишь.
Ученик_Покачто
выдает ошибки:
{Справочник.Номенклатура.Форма.ФормаСписка(566,85)}: Переменная не определена (Склад)
НС.Склад = ?(ЗначениеНеЗаполнено(Строка.ДанныеСтроки.Склад), <<?>>Склад, Строка.ДанныеСтроки.Склад);
{Справочник.Номенклатура.Форма.ФормаСписка(588,76)}: Переменная не определена (Склад)
Отбор.Вставить("Склад",?(ЗначениеНеЗаполнено(Строка.ДанныеСтроки.Склад), <<?>>Склад, Строка.ДанныеСтроки.Склад));

надо добавить сверху поле ввода"склад" и выбирать по нему? просто не могу понять как прописать путь к какому-нить складу в регистре, может подскажешь?
Zaval
Переменная не определена, или определена в другой процедуре, а в модуле не обЪявлена.
Ученик_Покачто
Цитата(Zaval @ 16.07.10, 14:27) необходимо зарегистрироваться для просмотра ссылки
Переменная не определена, или определена в другой процедуре, а в модуле не обЪявлена.



так можно для добавленного поля, главный склад, прописать путь к регистру сведений- главный склад? если да - пожалуйста - скажи как...
Batchir
Цитата(Ученик_Покачто @ 16.07.10, 14:22) необходимо зарегистрироваться для просмотра ссылки
так можно для добавленного поля, главный склад, прописать путь к регистру сведений- главный склад? если да - пожалуйста - скажи как...

Не совсем понял что спрашиваете, какой регистр прописать. Но если имеете ввиду то что хотите получить основной склад из настроек прользователя (хранятся в регистре сведений), то советую изучить общий модуль УправлениеПользователями функцию ПолучитьЗначениеПоУмолчанию
Ученик_Покачто
Цитата(Batchir @ 16.07.10, 15:45) необходимо зарегистрироваться для просмотра ссылки
Не совсем понял что спрашиваете, какой регистр прописать. Но если имеете ввиду то что хотите получить основной склад из настроек прользователя (хранятся в регистре сведений), то советую изучить общий модуль УправлениеПользователями функцию ПолучитьЗначениеПоУмолчанию



в справочнике Номенклатура, к высшеупомянутому запросу надо прописать путь к регистру остатки номенклатуры, к отдельному складу, чтоб в поле Остаток выводило остаток по отдельным складам....
Zaval
Цитата(Ученик_Покачто @ 16.07.10, 15:22) необходимо зарегистрироваться для просмотра ссылки
так можно для добавленного поля, главный склад, прописать путь к регистру сведений- главный склад?


sad.gif Пока не изучишь хотя бы основные понятия и терминологию - дело абсолютно дохлое. Как говорят, "слепой лысого стрижет"
Ученик_Покачто
ты имеешь в виду ресурсу регистра?)) ладно, пошел Радченка читать...
Batchir
хм, будет производительность списка номенклатуры страдать, но если хотите этим жертвовать, то в событии ПриОткрытии программно добавляете колонки со складами. Для этого перебирите все склады и с помощью
.Колонки.Добавить(<ИмяСклада>,,<Заголовок>);
сформируйте дополнительные колонки по складам.
<ИмяСклада> - лучше брать так "Склад"+КодСклада, тогда вдальнейшем к нему можно легко обращаться (например, Склад000001,Склад000002)
<Заголовок> - Собственно наименование склада которое будет отображаться в таблице

Затем уже в событии ПриПолученииДанных выполняете

Для каждого Строка Из ОформленияСтрок Цикл

    Запрос = Новый Запрос;
    
    ТекстЗапроса = "
    |ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Склад.Код,
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |    
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Склад.Код,
    |    ТоварыНаСкладахОстатки.Номенклатура
    |    
    |";
    
    
    Запрос.УстановитьПараметр("Номенклатура",Строка.ТекущиеДанные.Ссылка );
    
    Запрос.Текст = ТекстЗапроса;
    РЗ = Запрос.Выполнить();
    Выборка = РЗ.Выбрать()
    Пока Выборка.Следующий() Цикл
        Строка.Ячейки["Склад+"Выборка.Код].Значение=Формат(Выборка.КоличествоОстаток,"ЧЦ=15; ЧДЦ=0;");
        // тут или Значение или Текст, точно не помню
    КонецЦикла;

КонецЦикла;


Результат запроса вернет сгрупированнуе по складам и номенклатуре остатки.
Колонки ао складам будут иметь вид "Склад000001,Склад000002 и т.д."
В обходе запроса прописываешь в ячейки остатки по складу.
т.к. список номенклатуры не содержит серий и характеристик, то выбирать их не нужно
Код писал от руки, не забудьте учесть группы. Но повторюсь это скажется на производительности.
В форме списка номенклатуры есть подобный функционал, только он расчитывает данные для текущей строки. (Действия/Остатки товаров на складах)
Batchir
Для увеличения быстродействия можно попробывать сначала сформировать запрос по всем номенклатурам и складам
а потом в обходе запихивать в нужные ячейки.
Ученик_Покачто
Цитата(Batchir @ 16.07.10, 17:03) необходимо зарегистрироваться для просмотра ссылки
хм, будет производительность списка номенклатуры страдать, но если хотите этим жертвовать, то в событии ПриОткрытии программно добавляете колонки со складами. Для этого перебирите все склады и с помощью
.Колонки.Добавить(<ИмяСклада>,,<Заголовок>);
сформируйте дополнительные колонки по складам.
<ИмяСклада> - лучше брать так "Склад"+КодСклада, тогда вдальнейшем к нему можно легко обращаться (например, Склад000001,Склад000002)
<Заголовок> - Собственно наименование склада которое будет отображаться в таблице

Затем уже в событии ПриПолученииДанных выполняете

Для каждого Строка Из ОформленияСтрок Цикл

    Запрос = Новый Запрос;
    
    ТекстЗапроса = "
    |ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Склад.Код,
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК КоличествоОстаток
    |    
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстатки
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Склад.Код,
    |    ТоварыНаСкладахОстатки.Номенклатура
    |    
    |";
    
    
    Запрос.УстановитьПараметр("Номенклатура",Строка.ТекущиеДанные.Ссылка );
    
    Запрос.Текст = ТекстЗапроса;
    РЗ = Запрос.Выполнить();
    Выборка = РЗ.Выбрать()
    Пока Выборка.Следующий() Цикл
        Строка.Ячейки["Склад+"Выборка.Код].Значение=Формат(Выборка.КоличествоОстаток,"ЧЦ=15; ЧДЦ=0;");
        // тут или Значение или Текст, точно не помню
    КонецЦикла;

КонецЦикла;


Результат запроса вернет сгрупированнуе по складам и номенклатуре остатки.
Колонки ао складам будут иметь вид "Склад000001,Склад000002 и т.д."
В обходе запроса прописываешь в ячейки остатки по складу.
т.к. список номенклатуры не содержит серий и характеристик, то выбирать их не нужно
Код писал от руки, не забудьте учесть группы. Но повторюсь это скажется на производительности.
В форме списка номенклатуры есть подобный функционал, только он расчитывает данные для текущей строки. (Действия/Остатки товаров на складах)



пишет поле обьекта не обнаржено Код и выдает ошибку

{Справочник.Номенклатура.Форма.ФормаСписка(585)}: Поле объекта не обнаружено (Код)
Строка.Ячейки.Склад["Склад"+Выборка.Код].Значение=Формат(Выборка.КоличествоОстаток,"ЧЦ=15; ЧДЦ=0;");
Batchir
Я говорю писал от руки, а такие ошибки и самому можно исправить, например так
| ТоварыНаСкладахОстатки.Склад.Код КАК Код,
Ученик_Покачто
огромнейшее спасибо!!! ураааа!! заработало!!))!)

приеду в Одессу - с меня причитается)) так как я сам Одессит по национальности, и бываю там очень часто - как нить отблагодарю!!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.