Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 07:38

Авто подстановка из запроса в табличную часть документа

Автор dmitrydonskoiy, 04 мая 2018, 16:49

0 Пользователей и 1 гость просматривают эту тему.

dmitrydonskoiy

Доброго дня! Не могу решить проблему, есть документ в который нужно при выборе реквизита (артикул) табличной части автоматом заполнить некоторые данные, сырье и оборудование, которые находятся в справочнике, оборудование - реквизит, сырье - реквизит табличной части... пробую это реализовать таким способом:
&НаСервере
Функция Подбор(Параметр)
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   ЮИ_АртикулыТрикотажныхПолотен.Ссылка КАК НормативАртикул,
      |   ЮИ_АртикулыТрикотажныхПолотен.Оборудование,
      |   ЮИ_АртикулыТрикотажныхПолотенТЧСырье.Сырье
      |ИЗ
      |   Справочник.ЮИ_АртикулыТрикотажныхПолотен.ТЧСырье КАК ЮИ_АртикулыТрикотажныхПолотенТЧСырье
      |      ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЮИ_АртикулыТрикотажныхПолотен КАК ЮИ_АртикулыТрикотажныхПолотен
      |      ПО ЮИ_АртикулыТрикотажныхПолотенТЧСырье.Ссылка = ЮИ_АртикулыТрикотажныхПолотен.Ссылка
      |ГДЕ
      |   ЮИ_АртикулыТрикотажныхПолотен.Ссылка = &НормативАртикул";
   
   Запрос.УстановитьПараметр("НормативАртикул", Параметр);
   
   Результат = Запрос.Выполнить();
   
   Объект.Норматив.Загрузить(Результат.Выгрузить());
      
   
   
КонецФункции

&НаКлиенте
Процедура НормативАртикулПриИзменении(Элемент)

   Подбор(Элементы.НормативАртикул.ТекстРедактирования);
   
КонецПроцедуры

При выборе артикула ничего не подставляет и не выбирает, подскажите в чем косяк... Оборудование подставляется легко через (ПутьКДанным), а вот сырье...

asmut

1. Потому что в запрос передаешь параметр "Строка" а сравниваешь с "Ссылка"
2. Не нужно Функция ты ничего не возвращаешь


&НаСервере
Процедура Подбор(Параметр)
   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   ЮИ_АртикулыТрикотажныхПолотен.Ссылка КАК НормативАртикул,
      |   ЮИ_АртикулыТрикотажныхПолотен.Оборудование,
      |   ЮИ_АртикулыТрикотажныхПолотенТЧСырье.Сырье
      |ИЗ
      |   Справочник.ЮИ_АртикулыТрикотажныхПолотен.ТЧСырье КАК ЮИ_АртикулыТрикотажныхПолотенТЧСырье
      |      ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЮИ_АртикулыТрикотажныхПолотен КАК ЮИ_АртикулыТрикотажныхПолотен
      |      ПО ЮИ_АртикулыТрикотажныхПолотенТЧСырье.Ссылка = ЮИ_АртикулыТрикотажныхПолотен.Ссылка
      |ГДЕ
      |   ЮИ_АртикулыТрикотажныхПолотен.Ссылка.Наименование = &НормативАртикул";
   
   Запрос.УстановитьПараметр("НормативАртикул", Параметр);
   
   Результат = Запрос.Выполнить();
   
   //** У тебя всего одна строка в ТЧ? При таком подходе все предыдущие записи удалятся
   Объект.Норматив.Загрузить(Результат.Выгрузить());
     
   
   
КонецПроцедуры

dmitrydonskoiy

Может кому пригодиться: В документе создал форму подбора (рис1) код формы подбора
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
   СтруктураПараметров   = ЗначениеИзСтрокиВнутр(Параметры.ДокОбъект);
   ЗаполнитьОстатки();
   
   Таб = СтруктураПараметров.Норматив;
   
   Для Каждого Строка Из ТаблицаПодбор Цикл   
      Если Не Таб.Найти(Строка.Артикул,"Артикул")= Неопределено Тогда
         Строка.Подобрать=Истина;   
      КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры

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

&НаКлиенте
Процедура ДобавитьВДокумент(Команда)
   ЭтаФорма.Закрыть(ПолучитьСтруктуруПараметров());
КонецПроцедуры

&НаСервере
Функция ПолучитьСтруктуруПараметров()
   
   Отбор = Новый Структура("Подобрать",Ложь);
   Результат = ТаблицаПодбор.НайтиСтроки(Отбор);
   
   Для Каждого СтрокаРезультат Из Результат Цикл
      ТаблицаПодбор.Удалить(СтрокаРезультат);
   КонецЦикла;
   
   Возврат ТаблицаПодбор;
   
КонецФункции

&НаКлиенте
Процедура ОтметитьВсе(Команда)
   
   Для каждого СтрокаТаблицы Из ТаблицаПодбор Цикл
      СтрокаТаблицы.Подобрать = Истина;
   КонецЦикла;
   
КонецПроцедуры


В форму документа добавляем процедуры
&НаКлиенте
Процедура Подбор(Команда)
   
   РезультатОткрытия = ОткрытьФормуМодально("Документ.дНормативСортностиДляВ.Форма.Подбор",  СтуктураПараметров());
      
      Если НЕ РезультатОткрытия = Неопределено Тогда
         ПроверитьСтруктуру(РезультатОткрытия);
      КонецЕсли;
      
   
   
   СформироватьСводнуюТаблицу();   
   
КонецПроцедуры

&НаСервере
Функция СтуктураПараметров()
   
   СтруктураПараметров = Новый Структура;
   Для каждого Реквизит Из Объект.Ссылка.Метаданные().ТабличныеЧасти Цикл
      СтруктураПараметров.Вставить(Сокрлп(Реквизит.Имя), Объект[Реквизит.Имя].Выгрузить());
   КонецЦикла;
   Возврат Новый  Структура("ДокОбъект",ЗначениеВСтрокуВнутр(СтруктураПараметров));   

КонецФункции

&НаСервере
Функция ПроверитьСтруктуру(РезультатОткрытия)
   
   Объект.Норматив.Очистить();
   ТаблицаЗачений   = РезультатОткрытия.Выгрузить();
   Объект.Норматив.Загрузить(ТаблицаЗачений);   

КонецФункции

&НаСервере
Процедура СформироватьСводнуюТаблицу()
   
   ВрТаблица.Очистить();
   ВрТаблица0 = Объект.Норматив.Выгрузить();
   ВрТаблица0.Свернуть("Артикул,Сырье,Оборудование");
   ВрТаблица.Загрузить(ВрТаблица0);
   
КонецПроцедуры

рис2, тема закрыта!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск