Мне надо было решить аналогичную задачу. При прямом редактировании поля ТП необходимо поместить в него значение, получаемое сложным функционалом - выбором из другой ТП, провайдер данных для которой является ИТ, формируемая прямым запросом из справочника Номенклатура или из Номенклатуры, находящейся на складе в данное время. Сложно описывать алгоритм (программу) обычным языком. Поэтому: префикс кнп... - Кнопка, ит... - Индексированная Таблица, тп... - Табличное Поле, кнп...ТП_ - Носитель табличного поля
//-- Обработка события кнпПеремещенияТП_ПриРедактированииЗначения Процедура кнпПеремещенияТП_ПриРедактированииЗначения(ТП,стр,кол,рег,x) Если (кол.Имя="Количество") И (Форма.АктивныйЭлемент()="пвКоличество")Тогда str=тпПеремещения.ТекущиеДанные.Получить("ск"); n=f_итПеремещения_ПоискСтроки(str); //-- Номер строки без сортировки ); //-- Количество // тпПеремещения.ОбновитьСтроки(); КонецЕсли; Если (кол.Имя="Номенклатура") И (Форма.АктивныйЭлемент()="пвНоменклатура") Тогда str_Номенклатура=x; Сервис.ВнешнееСобытие("","f_ВыборНоменклатуры",""); КонецЕсли; КонецПроцедуры
Функционал выбора реализуется методом f_ВыборНоменклатуры. Если вызываю прямо в обработчике - крах. Использую старинный прием - завершаю работу обработчика события и вызываю функционал в другом элементе. Удобно использовать сервис FormEx. Процедура ОбработкаВнешнегоСобытия(x,y,z) УстановитьСостояниеЭлементовДиалога(a_Элемент); Сбросить_b_Элемент(); Если ПустаяСтрока(x)=0 Тогда Активизировать(x); Иначе Если y="f_ВыборНоменклатуры" Тогда f_ВыборНоменклатуры(); КонецЕсли; КонецЕсли; Форма.Обновить(0); КонецПроцедуры
... и первая часть самого функционала:
//******* Метод выбора номенклатуры ******** Процедура f_ВыборНоменклатуры() итНоменклатура.УдалитьСтроки(); b_Элемент[05]=1; //-- Табличное поле тпНоменклатура доступно УстановитьСостояниеЭлементовДиалога(b_Элемент);
//-- Построим таблицу значений для выбора номенклатуры Select = "SELECT DISTINCT | спрНоменклатура.Id as id, | спрНоменклатура.Descr as Номенклатура";
//-- Анализ на сторно Если mid_СкладВ=mid_СкладИз Тогда //-- Сторно From = " FROM $Справочник.Номенклатура as спрНоменклатура"; Where = " WHERE спрНоменклатура.ISFOLDER=2 AND спрНоменклатура.ISMARK <> '*' "; Иначе //-- Перемещение From = " FROM | $Документ.СкладПеремещения as h_СкладПеремещения | INNER JOIN | $ДокументСтроки.СкладПеремещения as t_СкладПеремещения | ON | h_СкладПеремещения.IdDoc = t_СкладПеремещения.IdDoc, | $Справочник.Номенклатура as спрНоменклатура"; Where = " WHERE | $h_СкладПеремещения.id_СкладИз=:id_СкладИз AND | спрНоменклатура.Id=$t_СкладПеремещения.id_Номенклатура"; cmdOLEDB.УстановитьТекстовыйПараметр("id_СкладИз", mid_СкладИз); КонецЕсли;
//-- Текстовый фрагмент идентификатора номенклатуры определён ? str_Номенклатура=СокрЛП(str_Номенклатура); Если str_Номенклатура<>"" Тогда Where=Where+" AND UPPER(спрНоменклатура.Descr) LIKE """+ Врег(str_Номенклатура)+"%"""; КонецЕсли;
ТекстЗапроса =Select+From+Where+" ORDER BY Номенклатура"; Попытка cmdOLEDB.ВыполнитьИнструкцию(ТекстЗапроса,итНоменклатура,1); Исключение Предупреждение("Ошибка построения таблицы для Выбора номенклатуры"); Сервис.ВнешнееСобытие("кнпПеремещенияТП_"," "," "); КонецПопытки; Если итНоменклатура.КоличествоСтрок()=0 Тогда Предупреждение("Нет информации для Выбора номенклатуры*"); Сервис.ВнешнееСобытие("кнпПеремещенияТП_"," "," "); КонецЕсли;
тпНоменклатура.StartView=0; тпНоменклатура.ОбновитьСтроки(); тпНоменклатура.ТекущаяСтрока=1; Активизировать("кнпНоменклатураТП_"); //-- Показ ТП для выбора КонецПроцедуры
|