8.х УТ Найти доп. реквизит на форме

Тема в разделе ""1С:Управление торговлей УТ"", создана пользователем ЧКДзержинский, 5 дек 2018.

  1. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    536
    Симпатии:
    3
    Баллы:
    29
    Всем доброго дня. Как найти на форме элемент доп. реквизита, даже если значение для него не задано?
  2. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    536
    Симпатии:
    3
    Баллы:
    29
    В общем, на форму элементы доп. реквизитов помещаются с замороченными именами. Чтобы их получить написал вот такую функцию:
    Код:
    &НаСервере
    Функция ПолучитьТЗИдентификаторовДопРеквизитов()
        //Дополнительные реквизиты имеют имена (которые для разработчиков). Помещаете имена ваших реквизитов в массив.
        МассивДопРеквизитов = Новый Массив;
        МассивДопРеквизитов.Добавить("ИмяРеквизита1_%");
        МассивДопРеквизитов.Добавить("ИмяРеквизита2_%");
      
        ТекстЗапроса = "";
        Для каждого ЭлементМассива Из МассивДопРеквизитов Цикл
            Если ТекстЗапроса = "" Тогда
                ТекстЗапроса = "ВЫБРАТЬ """ + ЭлементМассива + """ КАК ИмяДопРеквизита
                |ПОМЕСТИТЬ ВТДопРеквизиты";
            Иначе
                ТекстЗапроса = ТекстЗапроса + "
                |ОБЪЕДИНИТЬ ВСЕ
                |ВЫБРАТЬ """ + ЭлементМассива + """ КАК ИмяДопРеквизита";
            КонецЕсли;
        КонецЦикла;
        ТекстЗапроса = ТекстЗапроса + "
        |;
        |ВЫБРАТЬ
        |    ДопРеквизиты.Ссылка КАК СсылкаНаборДР, ДопРеквизитыСвойства.Ссылка КАК СсылкаПВХ_ДР
        |ИЗ
        |    Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДопРеквизиты
        |    ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДопРеквизитыСвойства
        |        ПО  ДопРеквизитыСвойства.Ссылка = ДопРеквизиты.Свойство
        |    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДопРеквизиты ПО (ДопРеквизитыСвойства.Имя ПОДОБНО ВТДопРеквизиты.ИмяДопРеквизита)
        |ГДЕ
        |    //в моем случае нужны были доп. реквизиты справочника Номенклатура, соответственно если у вас другой элемент метаданных, то подставляете его
        |    ДопРеквизиты.Ссылка В ИЕРАРХИИ(ЗНАЧЕНИЕ(Справочник.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура))  
        |";
      
        Запрос = Новый Запрос;  
        Запрос.Текст = ТекстЗапроса;
      
        Результат = Запрос.Выполнить();
        ТЗ = Результат.Выгрузить();
      
        КС = Новый КвалификаторыСтроки(150);
        Массив = Новый Массив;
        Массив.Добавить(Тип("Строка"));
        ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
      
        ТЗ.Колонки.Добавить("ГУИД",ОписаниеТиповС);
      
        Для каждого СтрокаТЗ Из ТЗ Цикл      
            СтрокаТЗ.ГУИД = "ДополнительныйРеквизитЗначение_"
            + СтрЗаменить(Врег(Строка(СтрокаТЗ.СсылкаНаборДР.УникальныйИдентификатор())), "-", "x")
            + "_"      
            + СтрЗаменить(ВРег(Строка(СтрокаТЗ.СсылкаПВХ_ДР.УникальныйИдентификатор())), "-", "x");
        КонецЦикла;
    
        Возврат ТЗ;
    КонецФункции
    

    А потом уже можно используя результат этой функции работать с элементами доп. реквизитов.
    Код:
    ТЗИдентификаторы = ПолучитьТЗИдентификаторовДопРеквизитов();
    Для каждого СтрокаТЗДоп Из ТЗИдентификаторы Цикл
        ЭлементДоп = Элементы.Найти(СтрокаТЗДоп.ГУИД);      
        Если ЭлементДоп <> Неопределено Тогда
            ЭлементДоп.ТолькоПросмотр = Истина;
        КонецЕсли;
    КонецЦикла;  
    
  3. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.153
    Симпатии:
    217
    Баллы:
    104
    По-моему, сейчас в настройках доп. реквизитов можно настраивать его видимость/доступность в формах (если, конечно, все ради этого задумывалось).
  4. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    536
    Симпатии:
    3
    Баллы:
    29
    Я привел для примера часть кода, на самом деле кому-то реквизиты видны, а кому-то нет и состав пользователей, которым можно видеть эти реквизиты, может динамично меняться.
  5. TopicStarter Overlay
    ЧКДзержинский
    Offline

    ЧКДзержинский Опытный в 1С

    Регистрация:
    7 дек 2006
    Сообщения:
    536
    Симпатии:
    3
    Баллы:
    29
    Еще более простой способ. Далее функция, возвращающая имя элемента формы, ссылающегося на доп. реквизит. Нужно только передать имя для разработчика, которое может быть задано каждому доп. реквизиту:
    Код:
    Функция ПолучитьГУИДДопРеквизита(ИмяДопРеквизита) Экспорт
    
       ТекстЗапроса = "
        |ВЫБРАТЬ
        |    ДопРеквизиты.Ссылка КАК СсылкаНаборДР, ДопРеквизитыСвойства.Ссылка КАК СсылкаПВХ_ДР
        |ИЗ
        |    Справочник.НаборыДополнительныхРеквизитовИСведений.ДополнительныеРеквизиты КАК ДопРеквизиты
        |    ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДопРеквизитыСвойства
        |        ПО  ДопРеквизитыСвойства.Ссылка = ДопРеквизиты.Свойство
        |ГДЕ
        |    ДопРеквизитыСвойства.Имя = """ + ИмяДопРеквизита + """
        |УПОРЯДОЧИТЬ ПО
        |    ДопРеквизиты.Ссылка ИЕРАРХИЯ
        |";
       
        Запрос = Новый Запрос;   
        Запрос.Текст = ТекстЗапроса;
       
        Результат = Запрос.Выполнить();
        Выборка = Результат.Выбрать();   
       
        //Если имеется иерархия для доп. реквизитов (например как в справочнике Номенклатура), то в этом
        //случае в выборке будет больше одного элемента и нас интересует последний элемент в выборке (в нашем случае это последний элемент в иерархии)
        ГУИД = "";
        Пока Выборка.Следующий() Цикл
            ГУИД = "ДополнительныйРеквизитЗначение_"
                + СтрЗаменить(Врег(Строка(Выборка.СсылкаНаборДР.УникальныйИдентификатор())), "-", "x")
                + "_"       
                + СтрЗаменить(ВРег(Строка(Выборка.СсылкаПВХ_ДР.УникальныйИдентификатор())), "-", "x");
        КонецЦикла;
           
        Возврат ГУИД;
    
      
    КонецФункции
    
    Последнее редактирование: 31 окт 2019