Top.Mail.Ru

Как в 1С позиционироваться в уже открытой форме списка (и не плодить окна)

Задача: В форме документа для табличной части «Товары»  нужно сделать так, чтобы при клике на колонку «Артикул» открывался справочник «Номенклатура» ровно на той позиции, которую выбрал пользователь.

Суть проблемы: почему стандартный метод не работает?

Частая задача при разработке в 1С: сделать так, чтобы при клике на ячейку табличной части (например, по артикулу) открывался справочник «Номенклатура», а курсор автоматически вставал на этот товар.

Обычно разработчики используют параметр ТекущаяСтрока:

ПараметрыФормы = Новый Структура("ТекущаяСтрока", ИскомаяСсылка);
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы);

С чем сталкиваются на практике?

При первом клике всё работает идеально.

При втором клике по другому товару (если форму списка не закрыли) платформа 1С просто делает активным старое окно. Параметр ТекущаяСтрока игнорируется, курсор остается на старом месте.

Если попытаться заставить 1С обновлять позицию, передавая каждый раз новый параметр уникальности, система начнет каждый раз открывать новое окно.

Как использовать только одно окно и при этом заставить курсор перемещаться?

Оптимальное решение: Ключ уникальности + прямое управление списком

Мне кажется, изящный способ решить задачу — использовать статический «Ключ уникальности» для переиспользования окна, а курсор сдвигать программно, обратившись к элементам уже открытой формы.

Ниже представлен готовый код, который реализован через расширение, перехватывающее событие выбора в документе «Заказ клиента», но его легко адаптировать и для основной конфигурации:

&НаКлиенте
Процедура Расш1_ТоварыВыборВместо(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Если Поле = Элементы.ТоварыНоменклатураАртикул Тогда
				ТекущаяНоменклатура = Элементы.Товары.ТекущиеДанные.Номенклатура;		
		// Проверим, что номенклатура вообще заполнена в строке
		Если Не ЗначениеЗаполнено(ТекущаяНоменклатура) Тогда
			Возврат;
		КонецЕсли;		
		// Параметры нужны для первого открытия формы
		ПараметрыФормы = Новый Структура("ТекущаяСтрока", ТекущаяНоменклатура);		
		// Задаем жесткий ключ уникальности (любая строка), 
		// чтобы всегда использовалось одно окно, а не плодились новые.
		КлючУникальности = "ОкноСпискаНоменклатурыИзЗаказа";		
		// Открываем форму и получаем сам объект управляемой формы
		ФормаСписка = ОткрытьФорму(
		"Справочник.Номенклатура.ФормаСписка", 
		ПараметрыФормы, 
		ЭтаФорма,
		КлючУникальности
		); 		
		// Если форма УЖЕ была открыта ранее, параметр "ТекущаяСтрока" платформой проигнорируется.
		// Поэтому мы обращаемся к реквизитам формы и принудительно ставим курсор на нужную позицию:
		Если ФормаСписка <> Неопределено Тогда
			ФормаСписка.Элементы.Список.ТекущаяСтрока = ТекущаяНоменклатура;
		КонецЕсли;		
	КонецЕсли;	    
КонецПроцедуры

Пояснения к коду:

  1. КлючУникальности. Передавая в функцию ОткрытьФорму константную строку ("ОкноСпискаНоменклатурыИзЗаказа"), мы гарантируем, что платформа 1С выделит под эту задачу ровно одно окно. Ключ можно придумать любой, ну или брать строку от уникального идентификатора формы-владельца
  2. Получение объекта формы. Частенько забывают, что  функция ОткрытьФорму не просто показывает интерфейс, она возвращает ссылку на открытую управляемую форму. И дальше мы с ней можем программно взаимодействовать.
  3. Прямое позиционирование. Свойство Элементы.Список.ТекущаяСтрока доступно для записи на клиенте. Мы просто берем форму и программно «кликаем» по нужной строке.

В принципе, этот паттерн универсален и подходит для любых конфигураций на базе управляемых форм (УТ 11, ERP, КА, БП 3.0 и ЗУП 3.1 и др.).

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *