новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Добавляем дополнительное поле в документ-список

  • Добавить свою публикацию
  • для этого требуется регистрация

Остатки в списке документов

Решим следующую задачу: в списке документов "Заказы поставщику" нам необходимо добавить новую колонку "Остаток по заказу", которая будет отображать остаток для документа в регистре накопления "Заказы поставщику" на текущую дату.

Изображение

Реализовать это нужно в конфигурации "Управление производственным предприятием" версии 1.3.

Неверный путь

Рассмотрим самый "очевидный" путь, он же самый простой. Большинство начинающих программистов делают именно так. У табличного поля формы, которое привязано к реквизиту формы с типом "ДокументСписок" есть событие "ПриВыводеСтроки". В нем напишем Запрос к остаткам по заказу для выводимой строки и полученный результат присвоим ячейке текущей строки в колонке "Остаток". Вот так будет выглядеть код обработчика события "ПриВыводеСтроки":

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

Дело сделано! Задача решена! Но! Событие "ПриВыводеСтроки" вызывается для каждой строки отдельно. То есть, если в список выводится 30 строк, то запрос будет формироваться столько же раз! Может есть другой путь?

Оптимальное решение

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

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

 Результат работы такой же, как и для варианта с использованием события "ПриВыводеСтроки", но есть одно НО!...

Обращайте внимание

Самое главное отличие заключается в скорости работы. Вот сравнение времени выполнения для обоих вариантов решения задачи:

Изображение

При использовании "ПриВыводеСтроки" время формирования списка выполняется дольше практически в четыре раза! Не смотря на это, не рекомендую добавлять подобные поля в список документов, поскольку, в любом случае, это потребует дополнительных ресурсов серверной машины. Лучше используйте отчеты.

 
0
Читайте также
Выпуск №4.Настройки отбора и управление формой списка в 1С 8.х
Новые возможности 1С 8 по сравнению с 1С 7.7
Пример перевода конфигурации на управляемый интерфейс
Когда количество изменений на предприятии превышает критический уровень в сторону необновляемых конфигураций - 1С предлагает создание управляемого приложения
Разработки
ТТН с автоматическим заполнением полей для УТ 10.3
Автоматическое заполнение полей в УТ 10.3
Анализ деятельности компании. Универсальный отчет для 1С (собери сам).
Отчет помогает анализировать деятельность компании, получить любую информацию из базы данных
агрузка данных из табличного документа от 1C. Нет ODF. Добавляем.
Как загрузить данные из табл. Док-та добавив ODF
Еще от автора
≡ к списку статей