Запрос дополнительных реквизитов справочника |
Я |
23.12.15 — 14:21
Здравствуйте! Очень нужна помощь! 1С 8.3, УТ 11.1. Как запросом получить дополнительные реквизиты добавленные справочнику через режим предприятия?
1 — 23.12.15 — 14:21
а как вы пытались?
2 — 23.12.15 — 14:21
+ доп реквизиты скорее через ТЧ объекта.
3 — 23.12.15 — 14:22
Значения сидят в ТЧ каждого объекта, а сами реквизиты (их описание) — в соответствующем ПВХ и в справочнике «Наборы значений реквизитов»
4 — 23.12.15 — 14:36
(1) вот именно, что никак, потому что первый раз с этим сталкиваюсь
5 — 23.12.15 — 14:37
(3) вижу у объекта ТЧ доп. реквизиты, но что из нее взять, чтоб работать с нужным мне доп. реквизитами? Под описанием реквизитов имеется ввиду их название из предприятия? Не нашел ничего подобного.
6 — 23.12.15 — 15:14
(5) Реквизит Значение из ТЧ — это значение доп.реквизита.
7 — 23.12.15 — 15:46
(5) ИР тебе в помощь — там увидишь стркутуру ТЧ и данные, в ней хранящиеся
8 — 23.12.15 — 15:50
(0)
ВЫБРАТЬ * ИЗ Документ.Мегадокумент.ТЧ_Допреквизитов
9 — 24.12.15 — 09:27
В общем у меня получилось достать данные доп. реквизитов.
Вот код запроса:
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«МассивОбъектов»,МассивОбъектов);
Запрос.Текст = «ВЫБРАТЬ
| ЗаказКлиента.Номер,
| ЗаказКлиента.Дата КАК ДатаДоговора,
| ЗаказКлиента.Контрагент.Наименование КАК ПокупательКратко,
| ЗаказКлиента.Контрагент.НаименованиеПолное КАК ОрганизацияПокупатель,
| ЗаказКлиента.Контрагент.ИНН КАК ИННПокупателя,
| ЗаказКлиента.Контрагент.КПП КАК КПППокупателя,
| ЗаказКлиента.СуммаДокумента,
| ЗаказКлиента.БанковскийСчетКонтрагента.НомерСчета,
| ЗаказКлиента.БанковскийСчетКонтрагента.БанкДляРасчетов,
| ЗаказКлиента.БанковскийСчетКонтрагента.БИКБанкаДляРасчетов,
| ЗаказКлиента.Контрагент.ДополнительныеРеквизиты.(
| Свойство.Ссылка КАК Название,
| Значение КАК Значение
| ),
| ЗаказКлиента.Товары.(
| НомерСтроки,
| Номенклатура.Наименование,
| Упаковка.ЕдиницаИзмерения,
| КоличествоУпаковок,
| Цена,
| Сумма
| )
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|ГДЕ
| ЗаказКлиента.Ссылка В(&МассивОбъектов)»;
Запрос.Выполнить().Выгрузить();
Как теперь достать из массива нужные мне доп. реквизиты по отдельности?
10 — 24.12.15 — 09:59
Ну пожалуйста, помогите! Нигде в гугле не могу найти как это сделать.
11 — 24.12.15 — 10:04
(10) ты же в (9) все уже сделал
12 — 24.12.15 — 10:06
(11) не все. У меня доп. реквизиты в массиве кучей. Теперь мне нужно вычленить их по отдельности.
13 — 24.12.15 — 10:07
Вычленяй
14 — 24.12.15 — 10:07
У тебя в результате есть поле «ДополнительныеРеквизиты»
15 — 24.12.15 — 10:07
Это таблица значений из двух колонок «Название» и «Значение»
16 — 24.12.15 — 10:08
Свойство.Ссылка КАК Название, замени на Свойство КАК Название,
17 — 24.12.15 — 10:10
(15) ну да, я знаю, я как бэ в курсе) В этой таблице 3 доп. реквизита. Теперь мне нужно их по отдельности заполучить.
18 — 24.12.15 — 10:13
(16) заменил. Так что мне это даст?
19 — 24.12.15 — 10:14
(17) У тебя три реквизита. Значит в таблице 3 строки. Что именно ты хочешь?
20 — 24.12.15 — 10:14
Отдельно получаю:
СтрокаТЧ.ДополнительныеРеквизиты[0].Значение — 1 реквизит
СтрокаТЧ.ДополнительныеРеквизиты[1].Значение — 2 реквизит
СтрокаТЧ.ДополнительныеРеквизиты[2].Значение — 3 реквизит
21 — 24.12.15 — 10:15
Отдельно? Отдельно
22 — 24.12.15 — 10:17
(0) А запрос где ты писать будешь?
23 — 24.12.15 — 10:19
(22) запрос уже написан, смотри выше
24 — 24.12.15 — 10:21
(19) нужно получить значение доп. реквизита и присвоить его отдельной переменной, для дальнейшего использования.
25 — 24.12.15 — 10:21
(20) этот код не работает
26 — 24.12.15 — 10:22
(23) я понял, что написан. ты его в конфигураторе пишешь или где?
27 — 24.12.15 — 10:23
(23)Что именно у тебя не получается?
28 — 24.12.15 — 10:23
Спорим работает?
29 — 24.12.15 — 10:23
(26) эм, ну да, через конфигуратор, в модуле внешней обработки.
30 — 24.12.15 — 10:24
ТЗ = Запрос.Выполнить().Выгрузить();
СтрокаТЧ = ТЗ[0];
СтрокаТЧ.ДополнительныеРеквизиты[0].Значение; // 1 реквизит
СтрокаТЧ.ДополнительныеРеквизиты[1].Значение; // 2 реквизит
СтрокаТЧ.ДополнительныеРеквизиты[2].Значение; // 3 реквизит
31 — 24.12.15 — 10:24
И почему у меня то все получается?
32 — 24.12.15 — 10:26
(31) вылетает ошибка: неопознанный оператор.
33 — 24.12.15 — 10:26
В какой строке?
34 — 24.12.15 — 10:26
(30) так должно работать)
35 — 24.12.15 — 10:29
(33) в этих трех:
СтрокаТЧ.ДополнительныеРеквизиты[0].Значение;// 1 реквизит
СтрокаТЧ.ДополнительныеРеквизиты[1].Значение;// 2 реквизит
СтрокаТЧ.ДополнительныеРеквизиты[2].Значение;// 3 реквизит
36 — 24.12.15 — 10:30
1) точку с запятой пропустил
2) Это просто пример. Ну сделай так:
Реквизит1 = СтрокаТЧ.ДополнительныеРеквизиты[0].Значение;
Реквизит2 = СтрокаТЧ.ДополнительныеРеквизиты[1].Значение;
Реквизит3 = СтрокаТЧ.ДополнительныеРеквизиты[2].Значение;
37 — 24.12.15 — 10:32
(36) Ошибок нет. Теперь этим реквизиту 1,2 и 3 присвоено значение тех доп. реквизитов?
Nolan
38 — 24.12.15 — 10:34
(37) Посмотри как пользоваться отладчиком. Тогда ты сможешь сам проверять значения.
Опубликовано в Статьи по 1С 27.10.2018
В библиотеке стандартных подсистем 1С дополнительные реквизиты и сведения включены и активно применяются. Эти механизмы позволяют добавить дополнительный реквизит к объекту метаданных без изменения типовой конфигурации. Принцип работы дополнительных реквизитов и сведений, их добавление и получение значений.
Отличие дополнительного реквизита от дополнительного сведения в том, что
- Дополнительные реквизиты – список реквизитов, доступных в форме документа или справочника; причем эти реквизиты хранятся в табличной части объекта, к которому они добавлены;
- Дополнительные сведения – список значений доступных по дополнительной кнопке; причем доп. сведения хранятся в отдельном регистре.
После ввода дополнительного реквизита или сведения 1С, можно создать подключаемую обработку, где считать введенные дополнительные данные и задать необходимую логику обработки данных, в которой использовать этот реквизит или сведение.
Как получить 1С дополнительные реквизиты и сведения программно:
Для получения дополнительных данных используем запрос, в котором получим значение дополнительных реквизитов и сведений:
////
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ДополнительныеСведения.Свойство,
| ДополнительныеСведения.Значение
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &Объект»;
Запрос.УстановитьПараметр(«Объект», СсылкаДокумент);
////
Для получения дополнительного реквизита использую код вида:
////
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| НоменклатураДополнительныеРеквизиты.Свойство,
| НоменклатураДополнительныеРеквизиты.Значение
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Свойство = &Свойство
| И НоменклатураДополнительныеРеквизиты.Ссылка = &Ссылка»;
Запрос.УстановитьПараметр(«Ссылка», СсылкаДокумент);
Запрос.УстановитьПараметр(«Свойство», ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«Коэффициент бруто»));
////
Теперь вы без труда сможете добавить и получить необходимые дополнительные 1С данные без снятия конфигурации 1С с поддержки и изменения типовой конфигурации. Без сомнения, такой инструмент должен быть в арсенале 1С программиста и активно использоваться в работе.
На чтение 2 мин. Просмотров 635 Опубликовано 15.12.2019
Примеры работы с дополнительными реквизитами.
Как получить значение дополнительного реквизита:
Пример: мы делаем печатную форму документа «Заказ клиента» и хотим вывести на неё значение определённого дополнительного реквизита — «Должность покупателя».
Используем вложенный запрос, в котором соединяем левым соединением таблицу «Дополнительные реквизиты» документа «Заказ клиента» с Планом видов характеристик «Дополнительные реквизиты и сведения». Устанавливаем условие: заголовок дополнительного реквизита должен быть таким – «Должность покупателя». Таблицы соединяем по ссылке на «Заказ клиента».
Получается вот такой запрос:
Также можно использовать метод НайтиПоНаименованию ( «***» ) .
Переменная Ссылка – это ссылка на «Договор контрагента».
Проверка на предмет того, что дополнительный реквизит заполнен:
Как изменить значения дополнительных реквизитов:
Задействуем общий модуль УправлениеСвойствами , который входит в состав БСП.
Юзайте на здоровья!
3 thoughts on “Получить значение дополнительных реквизитов 1С 8”
Спасибо, очень помогло.
К сожалению, на строчке
Запрос.УстановитьПараметр(«Объект», Объект);
спотыкается и отказывается дальше работать
Как редактировать доп реквизиты:
редактировать их состав можно тут:
хранятся они тут:
где типы реквизитов:
получить их в запросе можно так:
НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
НоменклатураДополнительныеРеквизиты.Ссылка.Код КАК Код,
НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
НоменклатураДополнительныеРеквизиты.Значение КАК Значение
Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
Разберем что откуда берется.
Дополнительные реквизиты заводятся в «ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения» и там же указан тип значений допРеквизитов:
ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка,
ДополнительныеРеквизитыИСведения.ТипЗначения КАК ТипЗначения
ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
Для справки: Кроме ссыка и типЗначения в «ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения» хранится куча свойств этих реквизитов
Если указан типЗначеня «ДополнительноеЗначение», то виды этих доп значений можем посмотреть тут:
ЗначенияСвойствОбъектов.Владелец КАК Владелец,
ЗначенияСвойствОбъектов.Ссылка КАК Ссылка,
ЗначенияСвойствОбъектов.Владелец.ТипЗначения КАК ВладелецТипЗначения
Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
а сами значения дополнительных реквизитов хранятся тут:
Google+
Как редактировать доп реквизиты:
редактировать их состав можно тут:
хранятся они тут:
где типы реквизитов:
получить их в запросе можно так:
ВЫБРАТЬ ПЕРВЫЕ 100
НоменклатураДополнительныеРеквизиты.Ссылка КАК Ссылка,
НоменклатураДополнительныеРеквизиты.Ссылка.Код КАК Код,
НоменклатураДополнительныеРеквизиты.Свойство КАК Свойство,
НоменклатураДополнительныеРеквизиты.Значение КАК Значение
ИЗ
Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
Разберем что откуда берется.
Дополнительные реквизиты заводятся в «ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения» и там же указан тип значений допРеквизитов:
ВЫБРАТЬ
ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка,
ДополнительныеРеквизитыИСведения.ТипЗначения КАК ТипЗначения
ИЗ
ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
Для справки: Кроме ссыка и типЗначения в «ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения» хранится куча свойств этих реквизитов
Если указан типЗначеня «ДополнительноеЗначение», то виды этих доп значений можем посмотреть тут:
ВЫБРАТЬ
ЗначенияСвойствОбъектов.Владелец КАК Владелец,
ЗначенияСвойствОбъектов.Ссылка КАК Ссылка,
ЗначенияСвойствОбъектов.Владелец.ТипЗначения КАК ВладелецТипЗначения
ИЗ
Справочник.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
а сами значения дополнительных реквизитов хранятся тут:
В библиотеке стандартных подсистем 1С дополнительные реквизиты и сведения включены и активно применяются. Эти механизмы позволяют добавить дополнительный реквизит к объекту метаданных без изменения типовой конфигурации. В публикации хочу продемонстрировать работу дополнительных реквизитов и сведений, их добавление и получение значений.
Краткое описание механизма дополнительных реквизитов и сведений
Пример добавление дополнительного реквизита вручную вы можете посмотреть в публикации Брутто в ТОРГ12, где добавляется новый реквизит «Коэффициент брутто» в справочнике «Номенклатура». Таким образом можно добавлять реквизиты всех известных типов (число, строка, булево, список значений, ссылки на справочники и т.д.) к распространенным справочникам и документам 1С.
Отличие дополнительного реквизита от дополнительного сведения в том, что
- Дополнительные реквизиты – список реквизитов, доступных в форме документа или справочника; причем эти реквизиты хранятся в табличной части объекта, к которому они добавлены;
- Дополнительные сведения – список значений доступных по дополнительной кнопке; причем доп. сведения хранятся в отдельном регистре.
После ввода дополнительного реквизита или сведения 1С, можно создать подключаемую обработку, где считать введенные дополнительные данные и задать необходимую логику обработки данных, в которой использовать этот реквизит или сведение.
Для получения дополнительных данных приведу примеры запросов, в которых получу 1С дополнительные реквизиты и сведения.
Для получения дополнительного сведения использую запрос вида:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | ДополнительныеСведения.Свойство, | ДополнительныеСведения.Значение |ИЗ | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения |ГДЕ | ДополнительныеСведения.Объект = &Объект"; Запрос.УстановитьПараметр("Объект", СсылкаДокумент);
Для получения дополнительного реквизита использую код вида (пример получения коэффициента брутто в ТОРГ12):
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НоменклатураДополнительныеРеквизиты.Свойство, | НоменклатураДополнительныеРеквизиты.Значение |ИЗ | Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты |ГДЕ | НоменклатураДополнительныеРеквизиты.Свойство = &Свойство | И НоменклатураДополнительныеРеквизиты.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", СсылкаДокумент); Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Коэффициент бруто"));
Теперь вы без труда сможете добавить и получить необходимые дополнительные 1С данные без снятия конфигурации 1С с поддержки и изменения типовой конфигурации. Без сомнения, такой инструмент должен быть в арсенале 1С программиста и активно использоваться в работе.
Ном = Справочники.Номенклатура.НайтиПоРеквизиту("Гарантия", ЗначениеРеквизита);
Этот способ подходит для поиска по реквизитам справочника. И он ищет только первый элемент и не годится, если их несколько.
Но, поскольку вы пишете что вам нужно осуществить поиск по дополнительному реквизиту, то вам прийдеться писать запрос, и решение зависит от того, как в вашей конфигурации реализованы дополнительные реквизиты.
Например, в конфигурации УНФ, дополнительные реквизиты, это элементы табличной части справочника Номенклатура. При этом «свойство», т.е. имя реквизита, в вашем случае «Гарантия», это план видов характеристик ДополнительныеРеквизитыИСведения. Запрос будет выглядеть примерно так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| НоменклатураДополнительныеРеквизиты.Ссылка КАК НоменклатураСсылка
|ИЗ
| Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
|ГДЕ
| НоменклатураДополнительныеРеквизиты.Свойство = &Свойство
| И НоменклатураДополнительныеРеквизиты.Значение = &Значение";
Запрос.УстановитьПараметр("Значение", ЗначениеГарантии);
Запрос.УстановитьПараметр("Свойство", СсылкаНаПВХ_Гарантия);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
Примеры работы с дополнительными реквизитами.
Как получить значение дополнительного реквизита:
Пример: мы делаем печатную форму документа «Заказ клиента» и хотим вывести на неё значение определённого дополнительного реквизита — «Должность покупателя».
Используем вложенный запрос, в котором соединяем левым соединением таблицу «Дополнительные реквизиты» документа «Заказ клиента» с Планом видов характеристик «Дополнительные реквизиты и сведения». Устанавливаем условие: заголовок дополнительного реквизита должен быть таким – «Должность покупателя». Таблицы соединяем по ссылке на «Заказ клиента».
Получается вот такой запрос:
"ВЫБРАТЬ | ДополнительныеРеквизиты.ДолжностьПокупателя КАК ДолжностьПокупателя |ИЗ | Документ.ЗаказКлиента КАК Заказ | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ЗаказДополнительныеРеквизиты.Значение КАК ДолжностьПокупателя, | ЗаказДополнительныеРеквизиты.Ссылка КАК Ссылка | ИЗ | Документ.ЗаказКлиента.ДополнительныеРеквизиты КАК ЗаказДополнительныеРеквизиты | ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ПВХДополнительныеРеквизитыИСведения | ПО ЗаказДополнительныеРеквизиты.Свойство = ПВХДополнительныеРеквизитыИСведения.Ссылка | ГДЕ | ПВХДополнительныеРеквизитыИСведения.Заголовок = ""Должность покупателя"") КАК ДополнительныеРеквизиты | ПО (ДополнительныеРеквизиты.Ссылка = Заказ.Ссылка) |ГДЕ | Заказ.Ссылка В(&МассивОбъектов)";
Также можно использовать метод НайтиПоНаименованию(«***»).
Пример запроса:
"ВЫБРАТЬ | ДоговорыКонтрагентовДополнительныеРеквизиты.Значение, | ДоговорыКонтрагентовДополнительныеРеквизиты.Свойство |ИЗ | Справочник.ДоговорыКонтрагентов.ДополнительныеРеквизиты КАК ДоговорыКонтрагентовДополнительныеРеквизиты |ГДЕ | ДоговорыКонтрагентовДополнительныеРеквизиты.Ссылка = &Ссылка | И ДоговорыКонтрагентовДополнительныеРеквизиты.Свойство = &Свойство"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("КПП", Истина); Запрос.УстановитьПараметр("Свойство", Свойство);
Переменная Ссылка – это ссылка на «Договор контрагента».
Проверка на предмет того, что дополнительный реквизит заполнен:
ДопРеквизитСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата отправки", Истина); ЕстьСтроки = ЗаказПоставщикуСсылка.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура("Свойство", ДопРеквизитСвойство)); Если ЕстьСтроки.Количество() = 0 Тогда // Обработка условия КонецЕсли;
Как изменить значения дополнительных реквизитов:
Задействуем общий модуль УправлениеСвойствами, который входит в состав БСП.
ДопРеквизитДатаОтправки = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата отправки", Истина); ДопРеквизитДоставка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Доставка", Истина); МассивСтруктур = Новый Массив; МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитДатаОтправки, ТекущаяДата())); МассивСтруктур.Добавить(Новый Структура("Свойство, Значение", ДопРеквизитДоставка, Истина)); УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ЗаказКлиентаСсылка, МассивСтруктур);