Консультация № 176993
01.03.2010, 18:31
0.00 руб.
0 12 2
Здравствуйте уважаемые эксперты! 8.1. Подскажите пожалуйста как в форме списка справочника добавить колонку в которой при открытии показывается значение из регистра сведений, где измерение Объект = текущий элемент справочника?

Обсуждение

Неизвестный
01.03.2010, 19:06
общий
это ответ
Здравствуйте, Darina9.

разу хочу сказать, что помещать в табличную часть справочника информацию из регистра - не лучшее решение,
так как с ростом объема справочника каждый раз при отрытии формы списка или формы выбора справочника
нужно будет просчитывать все растущий объем информации - будет торможение. Гораздо лучше вывести внизу
формы справочника информационную панель, куда помещать всю нужную информацию по выбранному элементу справочника.

По Вашему вопросу:
Добавьте в форму справочника колонку, дайте ей имя, например, Количество. (Данные оставляете пустыми)

Далее активируете обработчик события табличного поля ПриПолученииДанных()

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

Далее процедура общего модуля:
Код:

Процедура дкТовариПриПолученииДанных(ЭтотОбъект, ЭтаФорма, Товари, Элемент, ОформленияСтрок) Экспорт
Для Каждого СтрокаТабличнойЧасти Из ОформленияСтрок Цикл
ДанныеСтроки = СтрокаТабличнойЧасти.ДанныеСтроки;
Если Не ДанныеСтроки.Номенклатура.Пустая() Тогда
Попытка
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", ДанныеСтроки.Номенклатура);
Отбор.Вставить("СкладКомпании", ЭтотОбъект.СкладКомпании);
ТаблицаОстатокНаСкладе = РегистрыНакопления.ОстаткиТоваровКомпании.Остатки(ТекущаяДата(), Отбор);
Попытка
//остатка может не быть
Остаток = ТаблицаОстатокНаСкладе.Получить(0).Количество;
Исключение
Остаток = 0;
КонецПопытки;
СтрокаТабличнойЧасти.Ячейки.Количество.УстановитьТекст(Формат(Остаток,"ЧЦ=15;ЧДЦ=3"));
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

4
Неизвестный
02.03.2010, 09:09
общий
М.Денис:
Цитата: 186471
помещать в табличную часть справочника информацию из регистра - не лучшее решение, так как с ростом объема справочника каждый раз при отрытии формы списка или формы выбора справочника нужно будет просчитывать все растущий объем информации - будет торможение.

Вы правы, не следует загромождать список справочника.
Уточню. В списке справочника расчет формул будет происходить только для отображаемых строк. Кроме того, пересчет строк будет происходить при обновлении данных (при записи документа) или по таймауту.
Неизвестный
02.03.2010, 09:37
общий
Владимир Лазурко:
А как определить, какие строки сейчас отображены, а какие - нет?
Код, приведенный мною выше, не предусматривает привязки вывода информации к какому-нибудь событию (запись документа, таймаут), кроме открытия формы справочника.
В свою защиту скажу следующее: у меня на предприятии стоит 1С:Рарус Торговый комплекс, и в документах есть форма подбора номенклатуры, где отображается текущий остаток товара по складу. Раньше, когда номенклатуры было мало - все было хорошо. Теперь же тормозит при открытии формы.
Неизвестный
02.03.2010, 09:52
общий
это ответ
Здравствуйте, Darina9.
Допустим есть форма вывода с табличной частью ТЧ. Нужно добавить колонку НовКолонка.
В табличную часть добавляем колонку "НовКолонка". Для выведения в эту колонку нужного значения используем метод табличной части ТЧ "ПриВыводеСтроки".

Процедура ТЧПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
НовЗначение = РегистрыСведений.НашРегистр.ПолучитьПоследнее(НашаДата, Новый Структура("Объект", ДанныеСтроки.Ссылка));
Если НЕ НовЗначение = Неопределено Тогда
Оформлениестроки.Ячейки.НовКолонка.Текст = НовЗначение.НовКолонка;
КонецЕсли;
КонецПроцедуры
4
Неизвестный
02.03.2010, 11:00
общий
М.Денис:
Цитата: 186471
Раньше, когда номенклатуры было мало - все было хорошо. Теперь же тормозит при открытии формы.
У нас УПП на SQL 2008, база больше 4 Гб, тормозов пока не отмечается.

Вы используете ЭтотОбъект в цикле Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл/ Но меня смущает обработчик дкТовариПриПолученииДанных. Где он вызывается?

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

МассивНоменклатуры = Новый Массив;

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

ТаблицаОстатков = ОбщегоНазначения.ПолучитьТаблицуОстатков(МассивНоменклатуры, СкладПоУмолчанию);

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

НайденнаяСтрока = ТаблицаОстатков.Найти(ОформлениеСтроки.ДанныеСтроки.Ссылка, "Номенклатура");
Если НайденнаяСтрока <> Неопределено Тогда

ОформлениеСтроки.Ячейки.СвободныйОстаток.УстановитьТекст(Формат(НайденнаяСтрока.СвободныйОстаток,"ЧДЦ=3; ЧО="));
ОформлениеСтроки.Ячейки.ОбщийОстаток.УстановитьТекст(Формат(НайденнаяСтрока.КоличествоОстаток,"ЧДЦ=3; ЧО="));

// Выделим цветом минимальный остаток из свободного остатка и остатка по организации
Если НайденнаяСтрока.СвободныйОстаток < НайденнаяСтрока.КоличествоОстаток Тогда
ОформлениеСтроки.Ячейки.СвободныйОстаток.ЦветТекста = WebЦвета.ТемноСиний;
ИначеЕсли НайденнаяСтрока.СвободныйОстаток > НайденнаяСтрока.КоличествоОстаток Тогда
ОформлениеСтроки.Ячейки.ОбщийОстаток.ЦветТекста = WebЦвета.ТемноСиний;
КонецЕсли;

КонецЕсли;

КонецЦикла;

КонецПроцедуры
Неизвестный
02.03.2010, 11:17
общий
М.Денис:
Если обработчик дкТовариПриПолученииДанных, который сам по себе обрабатывает все отображаемые строки списка справочника. Возможно, этот обработчик дополнительно вызывается в формуле каждой строки, т.е. сколько строк, столько раз перебирается каждая строка, отсюда тормоза.
Неизвестный
02.03.2010, 13:28
общий
Владимир Лазурко:
Наш Рарус также стоит на SQL 2008. В нем порядка 15000 номенклатурных позиций. И в упомянутой форме подбора просчитывается не только остатки товара, но и его цена. Поэтому подтормаживает
Касательно дкТовариПриПолученииДанных - возможно имя не слишком удачное. Давайте назовем ее спПриПолученииДанных(). Приставка сп указывает на то, это процедура общего модуля спСправочники. А А так, по сути, то же что и у Вас.
Неизвестный
02.03.2010, 13:52
общий
М.Денис:
Ага, указанній обработчик присвоен событию списка ПриПолученииДанных?
Неизвестный
02.03.2010, 14:49
общий
Владимир Лазурко:
Да, именно так. Локальная процедура ПриПолученииДанных() ссылается на общую спПриПолученииДанных() и передает управление туда. Это удобно хотя бы по двум причинам:
1. Если в форму разных справочников нужно выводить одне и те же данные - код уже готов, нужно лишь послаться на общую процедуру
2. Если в форме разных справочников нужно выводить разную информацию - все находится в одном месте, и не нужно шастать по справочникам. А разделение провести очень просто - передавать в общую процедуру имя справочника.

Локальная процедура справочника Номенклатура
Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)
ИмяСправочника = "Номенклатура";
спПриПолученииДанных(Элемент, ОформленияСтрок, ИмяСправочника)
КонецПроцедуры

Локальная процедура справочника Сотрудники
Процедура СправочникСписокПриПолученииДанных(Элемент, ОформленияСтрок)
ИмяСправочника = "Сотрудники";
спПриПолученииДанных(Элемент, ОформленияСтрок, ИмяСправочника)
КонецПроцедуры

Общая процедура
Процедура спПриПолученииДанных(Элемент, ОформленияСтрок, ИмяСправочника = Неопределено) Экспорт
Если ИмяСравочника = "Номенклатура" Тогда

ИначеЕсли ИмяСправочника = "Сотрудники" Тогда

ИначеЕсли ИмяСправочника = Неопределено Тогда //Общий случай

КонецЕсли
КонецПроцедуры
Неизвестный
02.03.2010, 18:44
общий
М.Денис:
Странно. Если конфигурация типовая или "1С:Совместимо!", то должна быстро отрабатывать.
Неизвестный
04.03.2010, 10:04
общий
Получается и обработчиком ПриВыводеСтроки и ПриПолученииДанных. Каким лучше воспользоваться? Справочник у меня небольшой, и если и будет добавляться то немного.

Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
НакладныеРасходы = РегистрыСведений.УК_ВидыРаботНакладныеРасходы.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("Ссылка", ДанныеСтроки.Ссылка));
ОформлениеСтроки.Ячейки.НР.УстановитьТекст(НакладныеРасходы.Величина);
ОформлениеСтроки.Ячейки.НР_Коэф.УстановитьТекст(Формат(НакладныеРасходы.Коэф,"ЧН="));
ОформлениеСтроки.Ячейки.НР_ПопрКоэф.УстановитьТекст(?(НакладныеРасходы.ПопрКоэф>0,НакладныеРасходы.ПопрКоэф,""));
ОформлениеСтроки.Ячейки.ПЗ.УстановитьФлажок(НакладныеРасходы.ПЗ);
ОформлениеСтроки.Ячейки.ЗП.УстановитьФлажок(НакладныеРасходы.ЗП);
ОформлениеСтроки.Ячейки.ЭМ.УстановитьФлажок(НакладныеРасходы.ЭМ);
ОформлениеСтроки.Ячейки.ЗПМ.УстановитьФлажок(НакладныеРасходы.ЗПМ);
ОформлениеСтроки.Ячейки.МАТ.УстановитьФлажок(НакладныеРасходы.МАТ);

КонецПроцедуры
Неизвестный
04.03.2010, 18:12
общий
Darina9:
При использовании обработчика события ПриВыводеСтроки нужно быть крайне внимательным и всегда стараться минимизировать обращения к данным, которые не содержатся в параметре ДанныеСтроки.

Обработчик ПриВыводеСтроки вызывается каждый раз при возникновении необходимости перерисовки видимой области табличного поля и отрабатывает столько раз, сколько строк содержит видимая область. Необходимость перерисовки видимой области табличного поля возникает в результате многих событий, связанных как с самим табличным полем, так и с формой. Если проанализировать работу обработчиков событий формы и табличного поля, можно увидеть, что простое добавление новой строки в табличное поле вызовет, скорее всего, не одну, а несколько перерисовок табличного поля.

Поэтому обращение в этом обработчике не к данным строки, а к данным, содержащимся в базе данных (получение значений через точку, обращение к итогам регистров и т. д.), может сильно замедлить вывод формы на экран.

(C) М.Г.Радченко. 1С:Предприятие 8.1. Практическое пособие разработчика. Часть III, гл. 2, раздел Вычисляемые колонки в списках.
Форма ответа