1 C 8.0 вопрос такой, кто прогает

UAV27

такая вот задачка: в справочнике "материалы" в форме списка надо добавить колноку, которая будет отображать остатки материалов из регистра накоплений "остаткиМатериалов". запрос я написал, но как результат запроса отобразить в этой колонке?
пробовал так:
Строка=ЭлементыФормы.ФормаСписка.ТекущиеДанные;
НЗ=Новый запрос;
нз.текст="здесь текст запроса"
рез=НЗ.выполнить;
Строка.Остаток=рез;
ошибка в этой строке, что не нравится?

Alena_08_11

сам не шарю, но наверняка ещё что то должно быть типа
Выборка = Рез.Выбрать;
Для каждого строкаВыборки из Выборка Цикл
Строка.Остаток = строкаВыборки.Остаток;
КонецЦикла;
Это при том что Запрос должен возвращать Остаток и при этом только по нужной тебе номенклатуре (по идее в выборке должна быть только одна строка, но обратицца к ней можно и через цикл).
И всё это дело нужно поместить в процедуру что то типа ПриВыводеСтроки причём обработчик стандартным путём может и нельзя создать.
А хотя вообще то для каждой строки выполнять запрос - неправильно. Правильнее будет уже после Открытия сделать запрос на остатки, сгруппировать по номенклатуре, создать списокзначений с номенклатурой в форме списка, передать его в качестве параметра запросу и потом двойным циклом оббежать всю номенклатуру в списке сравнивая с номенклатурой в выборке и при совпадении доставать остаток из выборки.
Хотя мб и это неправильно :)
Ща 1с-ники увидят и чочонить напишут.

peter1dav

Видимо потому что какая то фигня :)
более правильно будет
1. "При открытии" формы получать остатки в таблицу значений
2. "При выводе строки" уже писать тект в конкретную ячейку

UAV27

спасибо всем. просто главный вопрос - это как результат запроса записать в ячейку табличного поля.
запос состоит из одного элемента, с помощью выборки тоже пробовал. 1 с жутко ругается.
обращение к ячейке: а=Элементыформы.СправочникСписок.текущие данные;
ячейкаОстатки=а.остаток;

peter1dav

Я же тебе говорю, что надо смотреть событие "ПриВыводеСтроки", там передается все что тебе нужно.
И твоя задача решается что где то в подобном русле:


ОформлениеСтроки.Ячейки.НужнаяЯчейка.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.НужнаяЯчейка.Текст = "Остаток";

UAV27

УРРРРРРРРРРРРААААААААА! работает!
спасибо всем!

Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
сн=справочники.Номенклатура;
тн=элементыформы.СправочникСписок.ТекущиеДанные;
эсн=сн.НайтиПоНаименованию(тн);
если эсн.ЭтоГруппа=Ложь тогда
пер1=эсн.Наименование;
новыйзапрос= новый запрос;
новыйзапрос.текст=
"ВЫБРАТЬ
| ОстаткиМатериаловОстатки.материал.Наименование как наим,
| ОстаткиМатериаловОстатки.количествоОстаток как ост
|ИЗ
| РегистрНакопления.ОстаткиМатериалов.Остатки КАК ОстаткиМатериаловОстатки";
рез=новыйзапрос.Выполнить;
выборка=рез.Выбрать;
пока выборка.Следующий цикл
если выборка.наим=пер1 тогда
тн.Остаток=Выборка.ост;
break;
иначе
продолжить;
конецесли;
конеццикла;
конецесли;
КонецПроцедуры

peter1dav

Поздравляю!
Удаление гланд через задницу успешно выполнено :o :o :o
Нельзя так делать! Представь что у тебя номенклатуры тысяч 5, хотя бы и одновременно в базе работает человек 10-15, и они надумают полистать твой справочник. Что будет?
Если ты готовишься к экзамену по 1С, то там тебя за такой алгоритм поимеют :crazy:
Причем некоторые дьдьки это сделают без вазилина :crazy: :crazy: :crazy:

UAV27

надо двойной цикл по таблице запросов делать?

peter1dav

Вот так было бы лучше:
 

Перем ТаблицаОстатков;

Процедура ПриОткрытии

ЗапросПоОстаткам = Новый Запрос;

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

ТаблицаОстатков = ЗапросПоОстаткам.Выполнить.Выгрузить;

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

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

ТекНоменклатура = ДанныеСтроки.Номенклатура;

РезПоиска = ТаблицаОстатков.Найти(ТекНоменклатура, "Номенклатура");

ОформлениеСтроки.Ячейки.НужнаяЯчейка.ОтображатьТекст = Истина;

Если РезПоиска = Неопределено Тогда

ОформлениеСтроки.Ячейки.НужнаяЯчейка.Текст = "-";

Иначе

ОформлениеСтроки.Ячейки.НужнаяЯчейка.Текст = РезПоиска.Количество;

КонецЕсли;

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

ЗЫ. в 8.1 еще можно проиндексировать таблицу значений.

ANATOL54

На момент открытия тоже выборку делать не совсем верно..
Допустим за время просмотра кто-то взял да поставил резерв или продал часть товара.. а справочник может быть открыт и 10 и 20 минут, вероятность увеличивается..
Самое оптимальное на мой взгляд сделать горячую кнопку типа F12 по которой где-нить снизу будет выдаваться информация об остатках, или кнопку с подобным действием..
А вешать на каждый элемент справочника справочника запрос - реально очень ресурсоёмко.
Эх, жаль нет в 8-ке функции "СводныйОстаток".

peter1dav

Для этого можно сделать кнопочку "Обновить", а делать полновесный запрос для обновления каждой строки - это нехорошо, даже если добавить фильтр по номенклатуре.

ANATOL54

:) ну да, можно и так...
и время последнего обновления...

VVLLive

ЗЫ. в 8.1 еще можно проиндексировать таблицу значений.
А можно с этого места поподробнее? :)

peter1dav

ТаблицаЗначений (ValueTable)
Элементы коллекции:
СтрокаТаблицыЗначений
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора [...]. В качестве аргумента передается индекс строки.
Свойства:
Индексы (Indexes)
Колонки (Columns)
Методы:
Вставить (Insert)
ВыбратьСтроку (ChooseRow)
ВыгрузитьКолонку (UnloadColumn)
Добавить (Add)
ЗагрузитьКолонку (LoadColumn)
ЗаполнитьЗначения (FillValues)
Индекс (IndexOf)
Итог (Total)
Количество (Count)
Найти (Find)
НайтиСтроки (FindRows)
Очистить (Clear)
Получить (Get)
Свернуть (GroupBy)
Сдвинуть (Move)
Скопировать (Copy)
СкопироватьКолонки (CopyColumns)
Сортировать (Sort)
Удалить (Delete)
Конструкторы:
По умолчанию
Описание:
Таблица значений предназначена для хранения значений в табличном виде. Все основные операции с таблицей производятся именно через этот объект. Он позволяет манипулировать строками таблицы значений и предоставляет доступ к коллекции колонок. Колонки могут быть различных типов (в том числе множественных).
Возможен обмен с сервером. Сериализуется.

peter1dav

ИндексыКоллекции (CollectionIndexes)
Элементы коллекции:
ИндексКоллекции
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются ИндексКоллекции.
Методы:
Добавить (Add)
Количество (Count)
Очистить (Clear)
Удалить (Delete)
Описание:
Список индексов коллекции.
См. также:
ИндексКоллекции
ТаблицаЗначений, свойство Индексы

VVLLive

ОК. Спасибо, попробую. Осталось найти какую-нибудь громадную ТЗ :)
Оставить комментарий
Имя или ник:
Комментарий: