7.7 Юбращение к метаданным во внешних обработках

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем fs99, 6 дек 2007.

  1. TopicStarter Overlay
    fs99
    Offline

    fs99

    Регистрация:
    6 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Доброго времени суток.

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

    Например:

    Есть текстовая переменная "Рекв", которая содержит имя реквизита ( Рекв = "Клиент"; )
    Как задать или прочитать значение этого реквизита зная только его название в виде текстовой строки.

    Есть вот такое: Метаданные.Обработка(Инд).
    Все бы ничего, но как быть со внешними обработками???
    Пробовал все! Даже подставлял в поле "Инд" путь к файлу! Но не работает.

    Подскажите пожалуйста как быть?
  2. †omynoker
    Offline

    †omynoker

    Регистрация:
    17 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Можно воспльзоваться недокументированной возможностью функции шаблон, прочитать можно так
    ИскомоеЗначение = Шаблон("[Рекв]");

    а можно подключить внешнюю компоненту FormEx.dll она позволяет обращаться к реквизитам формы по имени.

    версия не самая свежая, посвежее здесь

    успехов

    Вложения:

    • FormEx.zip
      Размер файла:
      402,2 КБ
      Просмотров:
      350
  3. TopicStarter Overlay
    fs99
    Offline

    fs99

    Регистрация:
    6 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    огромное спасибо :)

    Данная функция отлично работает.

    но есть еще один вопрос: Как задать значение реквизиту???

    т.к. Шаблон("[Рекв]") = "Значение"; - не задает, и пишет ошибку

    Зарание благодарен :)
  4. †omynoker
    Offline

    †omynoker

    Регистрация:
    17 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    и будет давать ошибку - Шаблон -это функция для вывода информации в таблице (в печатной форме) и то, что он позволяет читать с формы - просто глюк - нередвиденный разработчиками подарок программерам.

    для установки значения рекомендую воспользоваться ВК FormEx - прекрасная компонента - там много полезного
  5. TopicStarter Overlay
    fs99
    Offline

    fs99

    Регистрация:
    6 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    То ли лыжи не едут, то ли я ...


    Скачал компоненту. Подключил.
    Написал процедуру во внешней обработке:

    Код:
    /////////////////////////////////////////////////
    // Заполнение полей формы значениями из таблицы
    //
    Процедура ЗаполнитьРеквизитыИзТаблицы()
    Перем Конт;
    Сервис = СоздатьОбъект("Сервис");
    Сервис.АктивныйКонтекст(Конт);
    ТабЗнач.ВыбратьСтроки();
    Пока (ТабЗнач.ПолучитьСтроку() = 1) цикл
    ИмяПеременной = СокрЛП(ТабЗнач.Реквизит_Наменование);
    ЗначПеременной = ТабЗнач.Реквизит_Значение;
    Если (Сервис.УстановитьПеременнуюКонтекста(Конт,ИмяПеременной,ЗначПеременной) = 0) тогда
    Сообщить("Реквизит " + ИмяПеременной + " не установлен.");
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры
    
    В итоге обрабатывается Сообщить("Реквизит " + ИмяПеременной + " не установлен.");
    Вид таблицы для примера: [​IMG]

    Ниже можно скачать пример самой базы.
    Посмотреть вложение 510

    Вложения:

    • csau.rar
      Размер файла:
      256,4 КБ
      Просмотров:
      175
  6. †omynoker
    Offline

    †omynoker

    Регистрация:
    17 авг 2006
    Сообщения:
    41
    Симпатии:
    0
    Баллы:
    1
    Сори за долгий ответ - работы много...
    Если обращаешься к атрибуту формы - используешь функции объекта АтрибутФормы.
    Код процедуры должен выглядеть так:
    Код:
    АтрФормы = СоздатьОбъект("АтрибутФормы"); 
    ТабЗнач.ВыбратьСтроки();
    Пока (ТабЗнач.ПолучитьСтроку() = 1) цикл
    ИмяПеременной = СокрЛП(ТабЗнач.Реквизит_Наменование);
    ЗначПеременной = ТабЗнач.Реквизит_Значение;
    Попытка //на случай мусора в переменной - неправильного имени
    АтрФормы.УстановитьАтрибут(Форма, ИмяПеременной);
    Исключение
    Продолжить;
    КонецПопытки;
    АтрФормы.Значение = ЗначПеременной;
    КонецЦикла;
    
    Работает стопроцентно.
    Успехов.
  7. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Если нужно только читать/записать значения реквизитов формы (не обязательно отчетов/обработок, но документов) можно использовать не хитрую комбинацию

    Код:
    //_______________________________________________________
    Функция УстАтрибут(Атр,Зн)
    Атр = Зн;
    Возврат "";
    КонецФункции// УстАтрибут(Атр,Зн)
    Процедура УстановитьАтрибут(Атр,Зн);
    Шаблон("[УстАтрибут("+ Атр + ",Зн)]");
    КонецПроцедуры    // УстановитьАтрибут(Атр,Зн);
    
    //_________________________________________________________
    Функция ПолАтрибут(Атр,Зн)
    Зн = Атр;
    Возврат "";
    КонецФункции// УстАтрибут(Атр,Зн)
    Процедура ПолучитьАтрибут(Атр,Зн);
    Шаблон("[ПолАтрибут("+ Атр + ",Зн)]");
    КонецПроцедуры    // УстановитьАтрибут(Атр,Зн);
    
    Вставляешь этот кусочек в начало модуля а потом пользуешься процедурами: УстановитьАтрибут и ПолучитьАтрибут (можно прописать в глобальный модуль, добавив к этим процедурам слово "Экспорт" и юзать их "везде")
  8. TopicStarter Overlay
    fs99
    Offline

    fs99

    Регистрация:
    6 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Код:
    /////////////////////////////////////////////////
    // Заполнение значений таблицы из полей формы
    //
    Функция глЗаполнитьРеквизитыИзПолей(вхФорма, вхТабЗнач) Экспорт
    
    вхТабЗнач.ВыбратьСтроки();
    Пока (вхТабЗнач.ПолучитьСтроку() = 1) цикл
    ИмяПеременной = СокрЛП(вхТабЗнач.Реквизит_Наменование);
    ЗначПеременной = "";
    Попытка //на случай мусора в переменной - неправильного имени
    ИмяПеременной = ("[" + ИмяПеременной + "]");
    ЗначПеременной = Шаблон(ИмяПеременной);
    Исключение
    Продолжить;
    КонецПопытки;
    вхТабЗнач.Реквизит_Значение = ЗначПеременной;
    КонецЦикла;
    КонецФункции
    
    Выше написанный код работает на ура, вот только одна проблема: Козвращает она в переменную ЗначПеременной обычный текст. Даже если Поле является не текстовым, а допустим элементом справочника.

    Попробовал написать по другому:

    Код:
    /////////////////////////////////////////////////
    // Заполнение значений таблицы из полей формы
    //
    Функция глЗаполнитьРеквизитыИзПолей(вхФорма, вхТабЗнач) Экспорт
    
    АтрФормы = СоздатьОбъект("АтрибутФормы"); 
    вхТабЗнач.ВыбратьСтроки();
    Пока (вхТабЗнач.ПолучитьСтроку() = 1) цикл
    ИмяПеременной = СокрЛП(вхТабЗнач.Реквизит_Наменование);
    ЗначПеременной = "";
    Попытка //на случай мусора в переменной - неправильного имени
    ЗначПеременной = АтрФормы.ПолучитьАтрибут(ИмяПеременной);
    Исключение
    Продолжить;
    КонецПопытки;
    ЗначПеременной = АтрФормы.Значение;
    вхТабЗнач.Реквизит_Значение = ЗначПеременной;
    КонецЦикла;
    
    Возврат(вхТабЗнач);
    
    КонецФункции
    
    Не работает. Подскажите как быть.

    Зарание благодарен, а так же благодарен за решения которые приводили ранее :)
  9. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Функция Шаблон возвращает строку, сформированную по определенным правилам (читай справку).
    Посмотри как ведет себя код в сообщении "20.12.2007, 11:04"
  10. TopicStarter Overlay
    fs99
    Offline

    fs99

    Регистрация:
    6 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Всем спасибо за ответы. Задуманное выполненно :)

    Но вот ни с того ни с чего появилась новая проблема.

    В один прекрасный момент программа стала выдавать такую вот ошибку (раньше не выдавала):

    Код:
    АтрФрм = СоздатьОбъект("АтрибутФормы");
    {D:DB1CCSAUANKFORMSANKSKANKETA.ERT(42)}: Неудачная попытка создания объекта (АтрибутФормы)
    
    
    Заранее благодарен за ответ
  11. TopicStarter Overlay
    fs99
    Offline

    fs99

    Регистрация:
    6 дек 2007
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Причина найдена.

    Забыл в глобально модуле написать следующий код:

    Код:
    Если ЗагрузитьВнешнююКомпоненту("ADD_COMFormEx.dll") = 0 Тогда
    Предупреждение("Неудачная попытка загрузить FormEx.dll");
    СтатусВозврата(0);
    Возврат;
    КонецЕсли;
    
    
    
    Как только его вставил, то ошибка исчезла. :)
  12. Seeker
    Offline

    Seeker

    Регистрация:
    10 апр 2008
    Сообщения:
    19
    Симпатии:
    0
    Баллы:
    1
    А как насчет:
    ЗначениеВыражения = ЗначениеИзСтроки(Шаблон("[ЗначениеВСтроку("+Выражение+")]"));
    :unsure:

Поделиться этой страницей