Помощь - Поиск - Пользователи - Календарь
Полная версия: Юбращение к метаданным во внешних обработках
1C-PRO - Форум по 1С > Форумы по платформе "1С:Предприятие 7.7" > (7.7) Отчеты и обработки для платформы "1С:Предприятие 7.7"
fs99
Доброго времени суток.

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

Например:

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

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

Подскажите пожалуйста как быть?
†omynoker
Можно воспльзоваться недокументированной возможностью функции шаблон, прочитать можно так
ИскомоеЗначение = Шаблон("[Рекв]");

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

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

успехов
fs99
Цитата(†omynoker @ 10.12.2007, 22:53) *

Можно воспльзоваться недокументированной возможностью функции шаблон, прочитать можно так
ИскомоеЗначение = Шаблон("[Рекв]");


огромное спасибо :)

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

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

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

Зарание благодарен :)
†omynoker
Цитата(fs99 @ 11.12.2007, 11:00) *

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

и будет давать ошибку - Шаблон -это функция для вывода информации в таблице (в печатной форме) и то, что он позволяет читать с формы - просто глюк - нередвиденный разработчиками подарок программерам.

для установки значения рекомендую воспользоваться ВК FormEx - прекрасная компонента - там много полезного
fs99
То ли лыжи не едут, то ли я ...


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

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


В итоге обрабатывается Сообщить("Реквизит " + ИмяПеременной + " не установлен.");
Вид таблицы для примера: Изображение

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

Работает стопроцентно.
Успехов.
WaRDeR
Если нужно только читать/записать значения реквизитов формы (не обязательно отчетов/обработок, но документов) можно использовать не хитрую комбинацию

Код
//_______________________________________________________
Функция УстАтрибут(Атр,Зн)
Атр = Зн;
Возврат "";
КонецФункции// УстАтрибут(Атр,Зн)
Процедура УстановитьАтрибут(Атр,Зн);
Шаблон("[УстАтрибут("+ Атр + ",Зн)]");
КонецПроцедуры // УстановитьАтрибут(Атр,Зн);

//_________________________________________________________
Функция ПолАтрибут(Атр,Зн)
Зн = Атр;
Возврат "";
КонецФункции// УстАтрибут(Атр,Зн)
Процедура ПолучитьАтрибут(Атр,Зн);
Шаблон("[ПолАтрибут("+ Атр + ",Зн)]");
КонецПроцедуры // УстановитьАтрибут(Атр,Зн);


Вставляешь этот кусочек в начало модуля а потом пользуешься процедурами: УстановитьАтрибут и ПолучитьАтрибут (можно прописать в глобальный модуль, добавив к этим процедурам слово "Экспорт" и юзать их "везде")
fs99
Код
/////////////////////////////////////////////////
// Заполнение значений таблицы из полей формы
//
Функция глЗаполнитьРеквизитыИзПолей(вхФорма, вхТабЗнач) Экспорт

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


Выше написанный код работает на ура, вот только одна проблема: Козвращает она в переменную ЗначПеременной обычный текст. Даже если Поле является не текстовым, а допустим элементом справочника.

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

Код
/////////////////////////////////////////////////
// Заполнение значений таблицы из полей формы
//
Функция глЗаполнитьРеквизитыИзПолей(вхФорма, вхТабЗнач) Экспорт

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

Возврат(вхТабЗнач);

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


Не работает. Подскажите как быть.

Зарание благодарен, а так же благодарен за решения которые приводили ранее :)
WaRDeR
Функция Шаблон возвращает строку, сформированную по определенным правилам (читай справку).
Посмотри как ведет себя код в сообщении "20.12.2007, 11:04"
fs99
Всем спасибо за ответы. Задуманное выполненно :)

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

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

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



Заранее благодарен за ответ
fs99
Цитата(fs99 @ 21.1.2008, 17:55) *

Всем спасибо за ответы. Задуманное выполненно :)

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

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

Код
АтрФрм = СоздатьОбъект(\\"АтрибутФормы\\");
{D:DB1CCSAUANKFORMSANKSKANKETA.ERT(42)}: Неудачная попытка создания объекта (АтрибутФормы)




Заранее благодарен за ответ


Причина найдена.

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

Код

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




Как только его вставил, то ошибка исчезла. :)
Seeker
Цитата(WaRDeR @ 28.12.2007, 15:09) *

Функция Шаблон возвращает строку, сформированную по определенным правилам (читай справку).
Посмотри как ведет себя код в сообщении "20.12.2007, 11:04"


А как насчет:
ЗначениеВыражения = ЗначениеИзСтроки(Шаблон("[ЗначениеВСтроку("+Выражение+")]"));
biggrin.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2009 Invision Power Services, Inc.