...

Динамический список

Тема в разделе "Вопросы по платформе", создана пользователем Svvopp, 10 мар 2022.

  1. Svvopp

    Svvopp Новичок

    Здравствуйте! Имитирую пример, который описан в справке https://elma365.com/ru/help/dynamic-list.html
    Разница в том, что в моей таблице данные заполняю из другого приложения. Соответственно к виджету Надпись не могу прикрутить столбец так как тип данных приложение, а не строка. Подскажите решение. Спасибо.
  2. sultanov

    sultanov Техническая поддержка

    Добрый день.
    Подскажите, почему вы не хотите добавить столбец с данными типа "Строка"?
  3. Overdrive_84

    Overdrive_84 Новичок

    Доброго времени суток.
    Пытаюсь решить близкую задачу, также все начиналось с указанного примера.
    Формирую динамический список из элементов приложения у которого несколько полей также являются приложения.
    Приведу часть скрипта для понимания
    Спойлер: Код
    const itemslist = await Namespace.app.sluzhebnye_zapiski_kassa.search().size(10000).all();
    for(const item of itemslist){
    if(!item.data.__deletedAt){
    if(item.data.__status?.name == "Согласована"){
    const row = Context.data.spisok_zayavok.insert();
    row.naimenovanie = item.data.__name;
    row.ssylka = item;
    if(!item.data.summa){
    row.summa_1 = 0;
    }else{
    row.summa_1 = item.data.summa.cents/100;
    }
    if(!item.data.tema){
    row.predmet_zayavki = String("Пусто");
    }else{
    row.predmet_zayavki = item.data.tema;
    }
    if(!item.data.ssylka){
    row.ssylka_tekst = String("Пусто");
    }else{
    row.ssylka_tekst = item.data.ssylka;
    }
    }
    if(item.data.__status?.name == "Утверждена"){
    const row = Context.data.zayavki_na_ispolnenii.insert();
    row.naimenovanie = item.data.__name;
    row.ssylka = item;
    if(!item.data.summa){
    row.summa = new Money(0, 'RUB');
    }else{
    row.summa = item.data.summa;
    }
    if(!item.data.tema){
    row.predmet_zayavki = String("Пусто");
    }else{
    row.predmet_zayavki = item.data.tema;
    }
    }
    }
    }
    Context.data.spisok_zayavok = Context.data.spisok_zayavok;
    Context.data.zayavki_na_ispolnenii = Context.data.zayavki_na_ispolnenii;
    }
    Есть несколько затруднений:
    1. Не понимаю как получить значение поля являющегося приложением, как я понял из описания - если полем является приложение, то оно содержит ссылку на это приложение. Чтобы получить объект использую fetch()
    row.napravlenie = item.data.napravlenie.fetch(); получилось чтото не понятное
    row.napravlenie = item.fields.napravlenie.name; и
    row.napravlenie = item.fields.napravlenie.app.name; возвращает название приложения
    пробовал варианты стобцов и текстовый и приложение, но ожидаемого результата так и не получил, уже несколько дней туплю над этой задачей

    2. Еще была мысль сделать как в связанной таблице чтобы те поля кв которых используются приложениями, работали как ссылки на элементы приложений (например тоже поле Направление которое является приложением, при нажатии открывало окно с соответствующим элементом приложения Направление).
    Решил начать с малого и реализовать чтобы хотябы по нажатию на кнопку привязанную к строке динамического списка открывался элемент приложения из которого и формируется динамический список.
    Реализовывать решил через ссылки, по примеру вот ТУТ даже удалось сформировать ссылку,
    Спойлер: Код
    let baseLink = Application.params.data.url;
    let NS = Context.data.sluzhebnye_zapiski_kassa!.namespace;
    let MyCode = Context.data.sluzhebnye_zapiski_kassa!.code;
    let MyId = Context.data.sluzhebnye_zapiski_kassa!.id;
    let createLink = baseLink + '/(p:item/' + NS + '/' + MyCode + '/'+ MyId+ ')';
    Context.data.ssylka = createLink;
    но она не работает.
    Может я в обоих вопросах вообще не тем путем иду и есть гораздо более простой, подскажите пожалуйста
  4. dskuznetcov

    dskuznetcov Участник

    Добрый день!
    1. Для получения данных приложения из ссылки недостаточно вызвать fetch(), нужно использовать ключевое слово await, т.к. функция асинхронная (вот ссылка на статью):
      Код:
      
      const napravlenie await item.data.napravlenie.fetch();
      row.napravlenie napravlenie.data.__name;
    2. Все делаете правильно, но сперва нужно получить ссылку на саму ELMA вида https://...:

      Код:
      
      // Если скрипт клиентский, то обращаемся к браузеру пользователя.
      // Сперва за пределами функции объявим переменную location - в браузерах она
      // хранит данные по url текущей страницы
      declare const locationany;

      /**
      /* Пример функции составление URL.
      */
      function createUrl() {
          
      let NS Context.data.sluzhebnye_zapiski_kassa!.namespace;
          
      let MyCode Context.data.sluzhebnye_zapiski_kassa!.code;
          
      let MyId Context.data.sluzhebnye_zapiski_kassa!.id;

          
      // Подставляем ссылку текущей страницы.
          
      let createLink location.href '(p:item/' NS '/' MyCode '/'MyId')';

          
      // Теперь должна получится ссылка (вместо ... будет url текущей страницы):
          // https://my-elma.ru/.../(p:item/moidokumenti/sluzhebnye_zapiski_kassa/019091d0-899c-7a93-9dc0-749e828f7661)
          
      Context.data.ssylka createLink;
      }