Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
14 фев 2025, 17:41

Заполнение реквизита типа ТаблицаЗначений

Автор Глеб Шахов, 24 янв 2025, 19:06

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

Глеб Шахов

Всем, привет. Я снова запутался в трех соснах, подскажите, пожалуйста. У меня есть реквизит формы типа ТаблицаЗначений "Исполнители". Есть выборка, которой я хочу заполнять данный реквизит "ИСполнители". Если я просто при отладке смотрю, то тип "Исполнители" это ДанныеФормыКоллекция. Т.е. по идее, мне можно выгрузить и результат запроса в ТЗ и мой реквизит Исполнители.Выгрузить(). А как данные из запроса поместить в ТЗ Исполнители. Или какой-то более легкий способ есть?

antoneus

Исполнители.Очистить();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ЗаполнитьЗначенияСвойств(Исполнители.Добавить(), Выгрузка)//если имена колонок в таблице и выборке совпадают
КонецЦикла;

Глеб Шахов

antoneus, а если не совпадают??? Вообще, сложно понимать синтакс-помощник. Вот, например,указано, что возможен обход в цикле. Но получается, если значений нет, то надо добавлять строку Исполнители.Добавить() и на ИТС написано:
При копировании строк между различными таблицами значений (табличными частями и т.п.) со схожим составом колонок следует использовать метод глобального контекста ЗаполнитьЗначенияСвойств.

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

Правильно:
 

Для каждого СтрокаТаблицыИсточника Из ТаблицаИсточник Цикл
  СтрокаТаблицыПриемника = ТаблицаПриемник.Добавить();
  ЗаполнитьЗначенияСвойств(СтрокаТаблицыПриемника, СтрокаТаблицыИсточника);
КонецЦикла;

Неправильно:

Для каждого СтрокаТаблицыИсточника Из ТаблицаИсточник Цикл
  СтрокаТаблицыПриемника = ТаблицаПриемник.Добавить();
  Для каждого Колонка Из ТаблицаПриемник.Колонки Цикл
    КолонкаТаблицыИсточника = ТаблицаИсточник.Колонки.Найти(Колонка.Имя);
    Если КолонкаТаблицыИсточника <> Неопределено Тогда
      СтрокаТаблицыПриемника[Колонка.Имя] = СтрокаТаблицыИсточника[Колонка.Имя];
    КонецЕсли;
  КонецЦикла;
КонецЦикла;

Но у меня допустим, надо выбирать исполнителей и наблюдателей, каждый из которых это таблица значений и из свойств у них только пользователи совпадают с выборкой в зависимости от роли

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| сп_УчастникиЗадачСрезПоследних.Пользователь КАК Пользователь,
| сп_УчастникиЗадачСрезПоследних.Роль КАК Роль
|ИЗ
| РегистрСведений.сп_УчастникиЗадач.СрезПоследних(, Задача = &ТекущаяЗадача) КАК сп_УчастникиЗадачСрезПоследних";


Запрос.УстановитьПараметр("ТекущаяЗадача", ТекущаяЗадача);



Глеб Шахов


Глеб Шахов

antoneus, еще вопрос по запросу, подскажите, пожалуйста.
  Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    сп_УчастникиЗадачСрезПоследних.Пользователь КАК Пользователь,
        |    сп_УчастникиЗадачСрезПоследних.Роль КАК Роль
        |ИЗ
        |    РегистрСведений.сп_УчастникиЗадач.СрезПоследних(, Задача = &ТекущаяЗадача) КАК сп_УчастникиЗадачСрезПоследних";

Исполнители.Очистить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Роль = "Исполнитель" Тогда
СтрокаИсполнителей = Исполнители.Добавить();
СтрокаИсполнителей.Пользователь = Выборка.Пользователь;
ИначеЕсли Выборка.Роль = "Наблюдатель" Тогда
СтрокаИсполнителей = Наблюдатели.Добавить();
СтрокаИсполнителей.Пользователь = Выборка.Пользователь;
Иначе
Сообщить("Что-то пошло не так");
КонецЕсли;
КонецЦикла;



 Почему у меня не проходит проверка по роли, ну т.е. Выборка.Роль = Иполнитель ЛОЖЬ, хотя значение у роли либо наблюдатель, либо исполнитель

antoneus


Глеб Шахов

antoneus, нет, перечисление. и как тогда сравнивать?

antoneus

Ну так и сравнивать

Если Выборка.Роль = Перечисления.Роли.Исполнитель Тогда//или как оно там называется

Afinogen

 B) я бы все что загружать нужно в ТЗ для начала в запросе обработал, тем более у вас закрос к регсирру сведений срез последних, при условии что "Роль" это измерение в рс, оно и быстрее тогда бы работало

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

antoneus

Не, там надо в две таблицы грузить, можно пакетом

Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    сп_УчастникиЗадачСрезПоследних.Пользователь КАК Пользователь
        |ИЗ
        |    РегистрСведений.сп_УчастникиЗадач.СрезПоследних(, Задача = &ТекущаяЗадача
        |                                                         И Роль = ЗНАЧЕНИЕ(Перечисление.Роли.Исполнитель))
        |КАК сп_УчастникиЗадачСрезПоследних;
        |////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    сп_УчастникиЗадачСрезПоследних.Пользователь КАК Пользователь
        |ИЗ
        |    РегистрСведений.сп_УчастникиЗадач.СрезПоследних(, Задача = &ТекущаяЗадача
        |                                                         И Роль = ЗНАЧЕНИЕ(Перечисление.Роли.Наблюдатель))
        |КАК сп_УчастникиЗадачСрезПоследних";
   
   
    Запрос.УстановитьПараметр("ТекущаяЗадача", ТекущаяЗадача);
    Результат = Запрос.ВыполнитьПакет();
    Исполнители.Загрузить(Результат[0].Выгрузить());
    Наблюдатели.Загрузить(Результат[1].Выгрузить());

Теги:

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

Рейтинг@Mail.ru

Поиск