Как найти параметры по имени 1с

  1. здравствуйте. хотела спросить, как проверить, что параметр макета существует?

    ОбластьМакета.Параметры.Номер = …

    Если параметра Номер нету, то выдается ошибка, нужна какая-то проверка. Могу найти, перебирая все параметры макета. Нет ли варианта попроще?


  2. vartanet

    Offline

    vartanet
    Опытный в 1С
    Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.701
    Симпатии:
    15
    Баллы:
    29

    например, можно проигнорировать ошибку:

    Попытка
    ОбластьМакета.Параметры.Номер = 2131231;
    Исключение
    КонецПопытки;

  3. спасибо)) но это не очень хороший способ, правда работать будет. а другого нет, как-то напрямую?


  4. shurikvz

    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104

    Если ОбластьМакета.Параметры.Свойство("Номер") Тогда
    ОбластьМакета.Параметры.Номер =
    КонецЕсли;

    Хотя. Не пробовал, надо посмотреть. Там же не структура.


  5. Tiger86

    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    а зачем там выкручиваться? Универсальное что-то делаете?


  6. vartanet

    Offline

    vartanet
    Опытный в 1С
    Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.701
    Симпатии:
    15
    Баллы:
    29

    не работает ;) метод обЪекта на обнаружен..

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


  7. shurikvz

    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.547
    Симпатии:
    344
    Баллы:
    104

    агаА для чего такое?
    Чтобы не заполнять каждый параметр используйте ОбластьМакета.Параметры.Заполнить() например.


  8. vartanet

    Offline

    vartanet
    Опытный в 1С
    Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.701
    Симпатии:
    15
    Баллы:
    29

    ну вот хочется человеку узнать есть ли в табличном документе параметр с заданым именем.. вроде простое желание, а решения нет..


  9. 1cUserAndrew

    Offline

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

    Регистрация:
    27 май 2010
    Сообщения:
    5.151
    Симпатии:
    217
    Баллы:
    104

    Где-то я видел код перебора параметров макета. Сейчас уже не помню…
    Но что-то типа такого:

    Для Каждого Параметр Из ОбластьМакета.Параметры Цикл
    Если Параметр.Имя = ...
    ....
    КонецЦикла;

    Или как-то похоже…Попробуйте, может, получится, отладчик примените))


  10. Tiger86

    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    а посмотреть на макет? самое простое решение


  11. vartanet

    Offline

    vartanet
    Опытный в 1С
    Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.701
    Симпатии:
    15
    Баллы:
    29

    не работает. не знает что такое “имя”.


  12. Tiger86

    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    а в областьмакета что-то передано? приведите дословную ошибку


  13. mialord

    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.460
    Симпатии:
    53
    Баллы:
    54

    Либо перебирать все параметры и сверять есть такие по имени или нет, либо бросить затею, разработчики 1С не считают подобную задачу актуальной, т.к. разработка универсальных печатных форм, как минимум, задача не адекватная.


  14. 1cUserAndrew

    Offline

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

    Регистрация:
    27 май 2010
    Сообщения:
    5.151
    Симпатии:
    217
    Баллы:
    104

    Ну я точно не помню…
    Поэкспериментируйте :rolleyes:

  15. да ничего такого особого не делаю. просто есть 2 макета. в одном одни параметры, в другом немного другие. а процедура печати одна. заполнить() не подходит. там вычисляемое значение присваивается. да и не мной уже сделано, я вношу доработки. и если заполняются параметры нового макета, для печати старого документа – то ошибки летят. могу по дате документа отслеживать.


  16. mialord

    Offline

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

    Регистрация:
    31 июл 2009
    Сообщения:
    5.460
    Симпатии:
    53
    Баллы:
    54

    Оператор Попытка Вам в помощь, на этом все


  17. Tiger86

    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    дак раз у вас 2 разных макета, то собственно определить по ним разве нельзя??? если заполняете один макет – то такие параметры, а если заполняете второй макет – то такие-то параметры заполняются. Разве так не проще?

Похожие темы

  1. Galich
    Ответов:
    5
    Просмотров:
    770


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Параметры табличного длокумента

Я
   LenaAt

18.06.13 – 16:40

Подскажите, пожалуйста, как к параметру табличного документа обратиться по строковому имени?

Например:

ИмяПараметра = “мойУникальныйПараметр”;

В макете таб. документа у меня есть ячейка типа параметр и с именем “мойУникальныйПараметр”. Как мне в коде получить параметр по строковому имени?

   zladenuw

1 – 18.06.13 – 16:42

   mikecool

2 – 18.06.13 – 16:44

Если Не ТабДок.Параметры.Найти(ИмяПараметра) = Неопределено Тогда

 ТабДок.Параметры[ТабДок.Параметры]

   mikecool

3 – 18.06.13 – 16:45

вернее так ТабДок.Параметры[ИмяПараметра]

   mikecool

4 – 18.06.13 – 16:45

а вооще ЗаполнитьЗначенияСвойств

   LenaAt

5 – 18.06.13 – 16:59

(2) Не работает 🙁

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

   ДенисЧ

6 – 18.06.13 – 17:01

всё работает.

Значит, имена не совпадают. См (4)

   LenaAt

7 – 19.06.13 – 09:27

(6)Процедура ЗаполнитьЗначенияСвойств() позволяет копировать значения свойств объекта-источника в свойства объекта-приемника.

Одним из применений данной процедуры может являться заполнение реквизитов одного документа реквизитами другого. Если объекты имеют сходную структуру, то использование процедуры встроенного языка ЗаполнитьЗначенияСвойств() позволит скопировать значения одноименных реквизитов из одного объекта в другой.

============================================================

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

   LenaAt

8 – 19.06.13 – 09:33

Я извиняюсь, я неправильно написала: поле ТЕКСТОВОГО документа, а не табличного. Прошу прощения. Я формирую внешний отчёт и мне нужно тем параметрам макета, имена которых занесены в список значений, присвоить некие значения. То есть у меня есть имя параметра и по имени нужно присвоить параметру значение.

   salvator

9 – 19.06.13 – 09:35

(7) Например, так:

Для Каждого Стр Из ТвояТаблица Цикл

 ОбластьМакета.Параметры.Заполнить(Стр);

 ТабДок.Вывести(ОбластьМакета);

КонецЦикла;

   vicof

10 – 19.06.13 – 09:39

(8) Интересно, какие у текстового документа параметры

   LenaAt

11 – 19.06.13 – 09:39

(9) А откуда возьмутся значения, которые нужно присвоить параметрам? В списке значений только некоторое подмножество имен параметров на макете.

   vicof

12 – 19.06.13 – 09:40

(10) хотя вру, параметры есть

   LenaAt

13 – 19.06.13 – 09:40

(10)У макета текстового документа.

   salvator

14 – 19.06.13 – 09:40

(11) Это вопрос уже к Вам, чем заполнять параметры.

   LenaAt

15 – 19.06.13 – 09:46

(14) Нет, речь все же идет о табличном документе, вернее, макете табличного документа.

http://hostingkartinok.com/show-image.php?id=1a732e1b653432ba70cec7390e895baf

   salvator

16 – 19.06.13 – 09:47

(15) И где у него параметры?

   LenaAt

17 – 19.06.13 – 09:48

15+ И вот у меня есть список значений, в котором только 2 строки: “пар1” и “пар2”. Как мне параметру 1 присвоить значение 7, к примеру, а параметру 2 значение 8?

   LenaAt

18 – 19.06.13 – 09:49

(16) пар1, пар2, пар3 и так далее… просто я в конфигураторе не меняла тип ячейки, и так понятно о чем речь идет.

   salvator

19 – 19.06.13 – 09:49

(17) В макете сначала для “пар1” и “пар2” сделай тип “Параметр”.

Потом перебирай список значений и смотри (3)

   vicof

20 – 19.06.13 – 09:51

(18) можешь мне на почту написать, вечером расскажу и покажу что и как делать, если не поймешь.

  

LenaAt

21 – 19.06.13 – 10:01

Спасибо всем большоё, всё получилось.

Как получить параметры из запроса.

Автор vdn, 30 сен 2010, 17:00

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

Здравствуйте!

Необходимо получить параметры из текста запроса.
Запрос.НайтиПараметры  дает список параметров. Как потом оттуда вытащить имя параметра и его тип? Запрос.НайтиПараметры.ИмяПараметра не работает, метод Получить тоже.

Пишется модуль на Делфи, подключаюсь с помощью COM, простые запросы работают(правда что-то долго, буду переделывать), не могу с параметрами сделать.

Анализ текста запроса не подходит(поиск &ИмяПараметра), т.к. в последствии может поменяться синтаксис запросов в 1С.

Помогите пожалуйста.


А где формируется текст запроса? Если на Делфи, то порви его и засунь параметры, какие надо. А вобще конкретней опиши, что делаешь.


Запрос либо ручками пишется, либо вставляется как текст.
Например: ВЫБРАТЬ Банки.Наименование, Банки.Город, Банки.Адрес ИЗ Справочник.Банки КАК Банки ГДЕ Банки.Город = &Город

Дальше запрос отправляется в 1С там обрабатывается, возвращается результат запроса, и результаты уже выводятся в другом приложении.

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

Рвать не получится, желательно использовать команды 1С т.к. синтаксис запроса в 1С может поменяться он же вроде не утвержден.


Из текста запроса на выборку из другого приложения ты не получишь типы данных. Ибо это запрос на выборку и в этом случае предполагается, что тип данных известен просителю.  :D Это касается всех видов реляционных БД. Для выяснения структуры БД и типов данных таблиц следует оперировать другим языком запросов – запросами по структуре. В любом языке запросов к любой БД язык делится на две части. Одна занимеестя данными, а другая структурой. В 1С это зовется таинственным словом – метаданные. Так вот текстового языка запросов по работе с метаданными (структурой) в 1С нет.  :fdbsdfbsd: Но к метаданным можно достучаться. В 1С это делается средствами языка 1С. Если надо получить структуру БД 1С извне, то следует использовать, что-то вроде ADO.
В общем для твоего проекта, следует структуру 1С ч/з ADO сохранить в БД с которой работает твое Делфи – приложение. А потом соорудить мастер запросов для 1С, в котором пользователь не пишет ручками, а выбирает из сохраненной структуры.


Чет тогда я не пойму…

Есть такой тип в 1С:
ОписаниеПараметраЗапроса (QueryParameterDescription)
Свойства:
Имя (Name)
ТипЗначения (ValueType)

Описание:
Содержит описание параметра запроса.
Сериализуется.

У него есть имя и тип значения. Мне вот это и надо, то что со структурой БД в 1С через АДО работать это тоже понятно.

По идеи же в 1С есть Запрос.НайтиПараметры – эта функция работает, видно по количеству и если осуществить поиск по названию параметра тоже все проходит. Да вот только в том и проблема что имен параметров я могу не знать.

Если разбирать текст запроса, то он не стандартизован и неизвестно что с ним будет дальше. Хотя я тоже другого выхода не вижу. На данный момент необходимо отправлять запросы к 1С и вырывать из запросов параметры.


Сейчас пишется класс который обрабатывает запросы к 1С. Работать должен примерно так:
Получил запрос – Обработал – Вывел список параметров и тип(можно как строку все равно в тексте запроса это будет строка) – получил значения параметров – подставил значения в запрос – отправил 1С – получил ответ. Все


Цитата: vdn от 30 сен 2010, 18:19
Чет тогда я не пойму…

ОписаниеПараметраЗапроса (QueryParameterDescription)

Ага  :D Так вот эта штука работает, когда у тебя есть объект в оперативке из 1С под названием Запрос.
Т.е. этот объект должен быть создан в 1С. А у тебя, как я понимаю все иначе…  :D


Ole1C := CreateOleObject(Edit1.Text);
Resopen := Ole1C.Connect(Edit2.Text);
Ole1C.visible := true;
query := Ole1C.NewObject(‘Запрос’);
vv := query.FindParameters;
ShowMessage(vv.Count) показывает число равное количеству параметров.
Если сделать так:
vv1 := vv.find(‘параметр1’);
то
ShowMessage(vv1.name); выдает параметр1

У меня вот так  :mellow:


Цитата: vdn от 30 сен 2010, 18:27
Сейчас пишется класс который обрабатывает запросы к 1С. Работать должен примерно так:
Получил запрос – Обработал – Вывел список параметров и тип(можно как строку все равно в тексте запроса это будет строка) – получил значения параметров – подставил значения в запрос – отправил 1С – получил ответ. Все

Ну вот ты сам и пишешь. “Получил запрос”. Получил от кого – от создателя! А создатель и определяет типы данных. Если средствами ADO создаешь объект в 1С – Запрос. То и параметры с типами прийдется создавать. А из голого текста запроса, без стравнения со структурой и подавно не получишь типы данных.


Цитата: vdn от 30 сен 2010, 18:36
Ole1C := CreateOleObject(Edit1.Text);
Resopen := Ole1C.Connect(Edit2.Text);
Ole1C.visible := true;
query := Ole1C.NewObject(‘Запрос’);
vv := query.FindParameters;
ShowMessage(vv.Count) показывает число равное количеству параметров.
Если сделать так:
vv1 := vv.find(‘параметр1’);
то
ShowMessage(vv1.name); выдает параметр1

У меня вот так  :mellow:

Ключевая фраза – query := Ole1C.NewObject(‘Запрос’);
Ты создал объект.
vv := query.FindParameters; – эта штука в тексте смотрит значки &Параметр
Т.о. ты получаешь количество параметров.
Однако создав объект ты не задал значения параметров.
Поэтому их тип не известен.
НЕТУ ТУТ ТИПОВ ПАРАМЕТРОВ
В конце концов ты можешь ошибочно задать не тот параметр и во
время выполнения запроса получишь ошибку…


Теги:

  • Форум 1С

  • Форум 1С – ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • Как получить параметры из запроса.

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

Рейтинг@Mail.ru

Rambler's Top100

Поиск

У справочников в 1С есть встроенные функции для поиска в них элементов, к ним относится НайтиПоКоду, НайтиПоНаименованию и НайтиПоРеквизиту;

В данном случае рассмотрим поиск по наименованию.

Синтаксис:

Справочники.<НазваниеСправочника>.НайтиПоНаименованию (<Значение>, <ПоискПоПолномуСоответсвию>, <Родитель>, <Владелец>)

Параметры:

НазваниеСправочника — наименование справочника, к примеру Сотрудники.

Значение— значение в реквизите Наименование.

ПоискПоПолномуСоответсвию — По умолчанию установлен в значении Ложь, т.е. ищется соответствие левой части (пример: ищем Алекс то найдем Алексей). Но если установить в истину то поиск будет вестись по полному значению, кроме пробелов в конце строки.  (необязательный)

Родитель — Ссылка на родителя. Поиск будет вестись только по тем элементам где указан данный родитель. (необязательный)

Владелец — Ссылка на элемент владельца справочника, указанного на закладке Владельцы. (необязательный)

Результат:

Если элемент не найден возвращается ПустаяСсылка, иначе ссылка на элемент.

Если существует несколько элементов, возвращается только 1.

Пример:

НаименованиеЭлемента = "Иванов Иван Иванович";
ТекСправочник = Справочники.Преподаватели;
РезультатПоискаПоНаименованию = ТекСправочник.НайтиПоНаименованию(НаименованиеЭлемента);
Если РезультатПоискаПоНаименованию = ТекСправочник.ПустаяСсылка() Тогда
  Сообщить("Не найден");
Иначе
  Сообщить(РезультатПоискаПоНаименованию.код);
КонецЕсли;

Поиск с учетом родителя:

Университет = Справочники.Университеты.НайтиПоНаименованию("МГИМО");
Преподователь = ТекСправочник.НайтиПоНаименованию("Иванов Иваон Иванович",,Университет);
// Получить структуру параметров табличного документа
// РС Консалт: Трофимов Евгений 27.07.2022
//
// Параметры:
//  ТабДок	 - ТабличныйДокумент - Табличный документ
// 
Функция ПолучитьСтруктуруПараметровТабличногоДокумента(ТабДок) Экспорт

	Если Ложь Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли;
	СтруктМакета = Новый Структура;
	
	Для Каждого ОбластьЯчеек Из ТабДок.Области Цикл
		ОбластьМакета = ТабДок.ПолучитьОбласть(ОбластьЯчеек.Имя);
	    Для НомерСтроки = 1 По ОбластьМакета.ВысотаТаблицы Цикл
	        Для НомерКолонки = 1 По ОбластьМакета.ШиринаТаблицы Цикл
	            Ячейка = ОбластьМакета.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
				Если Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр Тогда
					Если НЕ ПустаяСтрока(Ячейка.Параметр) Тогда
						Попытка
							СтруктМакета.Вставить(Ячейка.Параметр,"");
						Исключение
							ТекстОшибки = СтрШаблон(
								"Имя области: %5
								|Строка: %1
								|Столбец: %2
								|Параметр: %3
								|%4",
								НомерСтроки, НомерКолонки, Ячейка.Параметр, ОписаниеОшибки(), ОбластьЯчеек.Имя
							);
							ВызватьИсключение ТекстОшибки;
						КонецПопытки;
					КонецЕсли;
	            ИначеЕсли Ячейка.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Шаблон Тогда
	               //выделим все параметры в шаблоне в отдельные строки
	 
	                ТекстШаблона = Ячейка.Текст;
	                ТекстШаблона = СтрЗаменить(ТекстШаблона, "[", Символы.ПС + "[");
	                ТекстШаблона = СтрЗаменить(ТекстШаблона, "]", Символы.ПС);
	                Для Счетчик = 1 По СтрЧислоСтрок(ТекстШаблона) Цикл
	                    ТекСтрока = СтрПолучитьСтроку(ТекстШаблона, Счетчик);
	                    Если Лев(ТекСтрока, 1) = "[" тогда
	                        ИмяПараметра = Сред(ТекСтрока, 2);
							Попытка
								СтруктМакета.Вставить(ИмяПараметра,"");
							Исключение
								ТекстОшибки = СтрШаблон(
									"Имя области: %5
									|Строка: %1
									|Столбец: %2
									|Параметр: %3
									|%4",
									НомерСтроки, НомерКолонки, ИмяПараметра, ОписаниеОшибки(), ОбластьЯчеек.Имя
								);
								ВызватьИсключение ТекстОшибки;
							КонецПопытки;
								
	                    КонецЕсли;
	                КонецЦикла; 
	            КонецЕсли//конец проверки, что в ячейке - текст, параметр или шаблон
	 
	        КонецЦикла//конец обхода по колонкам
	 
	    КонецЦикла//конец обхода по строкам		
	КонецЦикла;
	
	Возврат СтруктМакета;

КонецФункции // ПолучитьСтруктуруПараметровТабличногоДокумента()

Сделать даты без времени

Процедура СделатьДатыБезВремени(СтруктМакета)

	Для Каждого Параметр Из СтруктМакета Цикл
		Если ТипЗнч(Параметр.Значение) = Тип("Дата") Тогда
			СтруктМакета.Вставить(Параметр.Ключ, Формат(Параметр.Значение, "ДФ=dd.MM.yyyy"));
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

Добавить комментарий