0 / 0 / 0 Регистрация: 29.05.2014 Сообщений: 3 |
|
1 |
|
1C 8.x (тонкий) Получение значения реквизита справочника в документ29.05.2014, 12:17. Показов 64905. Ответов 22
Добрый день, есть вопрос Есть справочник Сотрудники, реквизиты «Должность», «Дата рождения» Есть документ в нем табличная часть «Налоги» и его реквизиты «ФИО» «Должность» «ДатаРождения» если просто ссылаться через форму на значения справочника то в документе выводится визуально и ДатаРождения, и Должность, но на печати эти поля пустые и при установке условий они ни как не считываются, а как будто пустые Прошу в поиск не посылать, т.к. пробывал уже много вариантов в т.ч. программно через функции платформа 8.2
0 |
GreenkA 3051 / 1998 / 524 Регистрация: 25.06.2009 Сообщений: 6,964 |
||||
29.05.2014, 12:34 |
2 |
|||
Mujinin, пропишите заполнение этих полей при изменении ФИО. Какая форма? Если управляемая, то значения получать придется на клиенте. Иначе — можно все в одной процедуре.
2 |
Mujinin 0 / 0 / 0 Регистрация: 29.05.2014 Сообщений: 3 |
||||
29.05.2014, 12:41 [ТС] |
3 |
|||
о мой спаситель….почему мне раньше этого никто не мог подсказать….я начал пол года назад и все время обходил это автозаполнение. делал все тоже самое только «ФИО» в
не выставлял
0 |
Anmut 0 / 0 / 0 Регистрация: 27.08.2015 Сообщений: 12 |
||||
27.08.2015, 09:09 |
4 |
|||
Не подскажите, а как сделать все тоже самое, но только у меня это не строки в ТЧ а реквизиты дока.
0 |
SonicQ 286 / 186 / 18 Регистрация: 20.02.2012 Сообщений: 925 |
||||
27.08.2015, 10:12 |
5 |
|||
Anmut, я бы лучше изменял реквизиты объекта на сервере. Думаю так будет правильнее
1 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
27.08.2015, 15:06 |
6 |
Думаю так будет правильнее нет не правильнее и ведет к снижению производительности. Вы туда сю форму спакуете и отправите, добавите и потом все это полетит назад по сети. Лучше серверный вызов делать в один раз, получать маленькие данные и заполнить на клиенте. Т.к. объет на форме уже заблокирован вами.
0 |
286 / 186 / 18 Регистрация: 20.02.2012 Сообщений: 925 |
|
27.08.2015, 17:28 |
7 |
1c-k,
0 |
286 / 186 / 18 Регистрация: 20.02.2012 Сообщений: 925 |
|
27.08.2015, 17:41 |
8 |
1c-k, бесспорно, вариант с объект.Реквизит = на клиенте быстрее…. Миниатюры
1 |
1c-k 340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
||||
27.08.2015, 17:43 |
9 |
|||
SonicQ, это с чего такие выводы?
Добавлено через 1 минуту
Но зачастую нужно не просто изменить один объект… за код ниже от меня программеры получают нагоняй.
1 |
286 / 186 / 18 Регистрация: 20.02.2012 Сообщений: 925 |
|
27.08.2015, 17:45 |
10 |
1c-k, а клиент при этом плачет, что при заполнении одного реквизита все остальные не заполнились автоматом…
1 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
27.08.2015, 17:47 |
11 |
SonicQ, ахахаха. Срочно учить матчасть вызовов в управляемом приложении и что и как там происходит с контекстами. Добавлено через 1 минуту
1 |
286 / 186 / 18 Регистрация: 20.02.2012 Сообщений: 925 |
|
27.08.2015, 17:48 |
12 |
1c-k, я специально для примера так сделал
1 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
27.08.2015, 17:50 |
13 |
SonicQ, этот пример как грится делают все программеры которые переходят с обычного приложения в управляемое.
1 |
SonicQ 286 / 186 / 18 Регистрация: 20.02.2012 Сообщений: 925 |
||||||||
27.08.2015, 17:58 |
14 |
|||||||
1c-k, однако именно
реализовано в типовых конфигурациях, только там продолжения типа
1 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
27.08.2015, 18:05 |
15 |
SonicQ, однако надо давать себе отчёт, почему и что в типовых конфигурациях сделано. Добавлено через 45 секунд
1 |
286 / 186 / 18 Регистрация: 20.02.2012 Сообщений: 925 |
|
27.08.2015, 18:09 |
16 |
1c-k, палка двух концов =)
1 |
340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
|
27.08.2015, 18:19 |
17 |
SonicQ, нет. Тут надо подходить из разумности вызовов, дёрганья сервера, и т.п.
1 |
0 / 0 / 0 Регистрация: 27.08.2015 Сообщений: 12 |
|
28.08.2015, 11:32 |
18 |
Читаю переписку «ассов» и чувствую себя полнейшим дураком в этих вопросах))). Я в програмировании 1с еще, если можно так сказать, новорожденный. Делаю себе индивидуальную конфу «с нуля» и понимаю, если бы вы ее увидели, то сто пудов я бы выслушал кучу слов не входящих в словарь русского языка.)))).
0 |
1c-k 340 / 315 / 43 Регистрация: 20.08.2014 Сообщений: 1,242 Записей в блоге: 1 |
||||
28.08.2015, 11:34 |
19 |
|||
Подскажите, пожалуйста, так правильно будет?
Это как вариант. Увидел бы написал как надо.
1 |
Anmut 0 / 0 / 0 Регистрация: 27.08.2015 Сообщений: 12 |
||||
28.08.2015, 11:44 |
20 |
|||
Спасибо огромное!!! сделал!!!
Добавлено через 2 минуты
0 |
Тема: Получение значения реквизита элемента из справочника в документ
-
17.05.2019, 09:54
#1
Гость форума
Получение значения реквизита элемента из справочника в документ
Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.
-
17.05.2019, 10:38
#2
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
Какая конфигурация? на какой платформе?
-
17.05.2019, 10:54
#3
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от MasterLoma
Доброго времени суток! У меня возникли некоторые трудности с получением значения реквизита из справочника в документ. Мне нужно, чтобы когда я в табличной части (документа) в реквизите «Номенклатура» выбирал какую-то номенклатуру, то в реквизит «Цена» табличной части, записывалась её цена из справочника. Для того, чтобы получить значение из справочника, как я понял, нужно создать функцию….А вот как прописать в функции то, что она должна возвращать цену какой-то номенклатуры?
В справочнике «Номенклатура» у меня хранятся книги. Через предопределённые данные я создал группы (Жанры книг) и в каждом из жанров находятся элементы (книги) с информацией об авторе и тд.Цена — это реквизит справочника «Номенклатура»?
Тогда можно обращаться без функции: Цена=Номенклатура.Цена;
Это должно быть прописано в процедуре «ПриВыбореНоменклатуры», которая назначается колонке «Номенклатура»вашей табличной части
-
17.05.2019, 11:07
#4
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
на клиенте он заполняет табличную часть….. не обратиться он объектно!
-
17.05.2019, 11:10
#5
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункции
-
Пользователь сказал cпасибо:
-
17.05.2019, 11:20
#6
Пришел за помощью
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункциичасть
-
17.05.2019, 12:23
#7
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункцииМожно так:
&НаКлиенте
Процедура ТабличнаяЧасть1Номенклату� �аПриИзменении(Элемент)
ТекущиеДанные = Элементы.ТабличнаяЧасть1.Т� �кущиеДанные;
УИ=ТекущиеДанные.Номенклат ура.УникальныйИдентификат� �р();
ТекущиеДанные.Цена=НайтиЦе ну(УИ);
КонецПроцедуры
&Насервере
Функция НайтиЦену(Реквизит)
ТекН=Справочники.Номенклат ура.ПолучитьСсылку(Реквизи т);
Возврат ТекН.Цена;КонецФункции
-
Пользователь сказал cпасибо:
-
17.05.2019, 14:03
#8
Гость форума
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
Какая конфигурация? на какой платформе?
1С:Предприятие 8.3, учебная версия (8.3.6.2014)
-
17.05.2019, 14:04
#9
Гость форума
Re: Получение значения реквизита элемента из справочника в документ
Сообщение от Margofs
&НаКлиенте
**************
Для каждого стр из Объект.Товары Цикл /// к примеру, либо получать текущую строку табличной части
Цена =ВернутьЦену(стр.Номенклат� �ра);
**************************&НаСервере
Функция ВернутьЦену(Товар)
Если Не ЗНачениеЗаполнено(Товар) Тогда
Возврат 0;
КонецЕсли;Возврат Товар.Цена;
КонецФункцииСпасибо попозже попробую таким образом сделать.
Похожие темы
-
Ответов: 16
Последнее сообщение: 24.03.2017, 10:41
-
Ответов: 0
Последнее сообщение: 14.01.2014, 12:53
-
Ответов: 1
Последнее сообщение: 24.04.2012, 13:36
-
Ответов: 0
Последнее сообщение: 28.01.2012, 12:20
-
Ответов: 4
Последнее сообщение: 11.11.2011, 08:35
Социальные закладки
Социальные закладки
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
- BB коды Вкл.
- Смайлы Вкл.
- [IMG] код Вкл.
- [VIDEO] код Вкл.
- HTML код Выкл.
Правила форума
Получить значение реквизита справочника
Автор ab30ru, 27 июл 2017, 19:08
0 Пользователей и 1 гость просматривают эту тему.
Здравствуйте. Есть справочник Книги. В нем реквизит ИнвентарныйНомер. Есть документ ВыдачаКниг реквизит Книга ссылка на справочник Книги. Нужно чтобы при выборе книги в переменную НомерКниги записывался инвентарный номер из справочника. Помогите пожалуйста с кодом
Цитата: ab30ru от 27 июл 2017, 19:08Нужно чтобы при выборе книги в переменную НомерКниги записывался инвентарный номер из справочника
Я правильно понял? В форме документа?
&НаКлиенте
Процедура КнигаПриИзменении(Элемент)
НомерКниги = ПолучитьНомер(Объект.Книга);
КонецПроцедуры
&НаСервере
Функция ПолучитьНомер(Книга)
Возврат Книга.ИнвентарныйНомер
КонецФункции
Спасибо за Сказать спасибо
Цитата: ab30ru от 27 июл 2017, 19:08
Здравствуйте. Есть справочник Книги. В нем реквизит ИнвентарныйНомер. Есть документ ВыдачаКниг реквизит Книга ссылка на справочник Книги. Нужно чтобы при выборе книги в переменную НомерКниги записывался инвентарный номер из справочника. Помогите пожалуйста с кодом
Если ЗначениеЗаполнено(Объект.ВыдачаКниг) Тогда
Объект.НомерКниги = Объект.ВыдачаКниг.ИнвентарныйНомер;
Иначе
Объект.НомерКниги = "";
КонецЕсли;
Прописать при изменение реквизита Книга
Помог, нажми спасибо. Не помог, нажми спасибо
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google
Все верно, только проверь на
ЗначениеЗаполнено(Объект.Книга)
, и функцию выполняй
&НаСервереБезКонтекста
_))
Имеется справочник «Контрагенты» и документ «ЗаписьНаТестДрайв».
«Контрагенты» имеет реквизиты: ФИО, «Паспортные данные», мобильный телефон.
Как мне при выборе клиента на форме документа «ЗаписьНаТестДрайв» заполнить автоматически поля ФИО, «Паспортные данные», мобильный телефон?
Я смог поставить ссылку на справочник, но как оттуда взять все данные, а не только имя?
задан 2 мая 2017 в 19:41
kot_mapku3kot_mapku3
1,1751 золотой знак13 серебряных знаков32 бронзовых знака
Двойной щелчок по полю ФИО (то, что выделено сейчас на скриншоте), откроется панель свойств, внизу ищем событие ПриИзменении, нажимаем на увеличительное стекло справа. Откроется модуль формы с заготовкой процедуры. Нам нужно написать в ней код, который заполнит нам нужные поля. Т.к. событие выполняется на клиенте, реквизиты других объектов (в данном случае элемента спр-ка Контрагенты) нам недоступны, поэтому мы должны написать функцию, выполняющуюся на сервере и вызвать её. В итоге будет вот так:
&НаКлиенте
Процедура ФИОПриИзменении(Элемент)
ЗаполнитьДанныеКонтрагентаНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеКонтрагентаНаСервере()
Объект.СерияПаспорта = Объект.ФИО.СерияПаспорта;
Объект.НомерПаспорта = Объект.ФИО.НомерПаспорта;
// и так далее, все нужные поля
КонецПроцедуры
ответ дан 4 мая 2017 в 12:28
|
|||
myr4ik07
02.09.14 — 21:00 |
Привет. Нахожусь в модуле формы документа, хочу в переменную получить значения Реквизита со Справочника, для того, что бы при открытии формы документа автозаполнялся один из реквизитов в документе.
Что то не могу понять принцип работы со Справкой 1С. Вот если я хочу обратиться к какому то типу (например Справочник.НазваниеСправочника) то мне в Справке нужно двигаться Прикладные объекты — Справочники или нужно глядеть в Справке на то откуда ты хочешь обратиться к реквизиту?! (Прикладные объекты — Документы например) ? |
||
myr4ik07
1 — 02.09.14 — 21:02 |
Что я не делаю с модуля формы документа я постоянно получаю Тип Справочника как Справочник.Менеджер |
||
myr4ik07
2 — 02.09.14 — 23:23 |
Ссылка = Справочники.НашиКонтакты.НайтиПоКоду(«000000001»); почему «Элемент не выбран»? |
||
vicof
3 — 03.09.14 — 05:33 |
А что у тебя в переменной ссылка? и вообще, некошерно так переменные называть |
||
Рэйв
4 — 03.09.14 — 05:53 |
(2) |
||
DrZombi
5 — 03.09.14 — 06:04 |
Каша, надо так. И поменьше используй в переменных такие название, как Ссылка, Владелец, Родитель, Дата, Номер…
СсылкаКонтрагент = Справочники.НашиКонтакты.НайтиПоКоду(«000000001»); |
||
DrZombi
6 — 03.09.14 — 06:05 |
+(5) Если НЕ Объект.НашиКонтакты.Пустая() Тогда изменить на Если НЕ СсылкаКонтрагент.Пустая() Тогда |
||
Рэйв
7 — 03.09.14 — 06:58 |
(6)Да, точно:-) Не проснулся еще |
||
chelentano 8 — 03.09.14 — 07:32 |
не надо заполнять реквизит документа при открытии |
Компьютер — устройство разработанное для ускорения и автоматизации человеческих ошибок.
&НаСервере Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере() /// Как создать новый элемент справочника в 1с 8.3, 8.2 // создадим новый элемент справочника Города // с именем Владивосток Владивосток = Справочники.Города.СоздатьЭлемент(); Владивосток.Наименование = "Владивосток"; Владивосток.Записать(); /// Как создать новую группу справочника в 1с 8.3, 8.2 // создадим новую группу справочника Города ГородаУМоря = Справочники.Города.СоздатьГруппу(); ГородаУМоря.Наименование = "Города у моря"; ГородаУМоря.Записать(); /// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2 // перенесём созданный Владивосток в группу "Города у моря" Владивосток.Родитель = ГородаУМоря.Ссылка; Владивосток.Записать(); /// Как внести изменения в элемент справочника по ссылке /// в 1с 8.3, 8.2 // найдём город Калькутта КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта"); Если Не КалькуттаСсылка.Пустая() Тогда // изменим и запишем численность жителей в городе Калькутта = КалькуттаСсылка.ПолучитьОбъект(); Калькутта.Численность = 1000000; Калькутта.Записать(); КонецЕсли; /// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2 ПустаяСсылка = Справочники.Города.ПустаяСсылка(); Если ПустаяСсылка.Пустая() Тогда Сообщить("Ссылка действительно пустая."); КонецЕсли; /// Как узнать принадлежность элемента справочника группе /// с учетом уровней иерархии в 1с 8.3, 8.2 ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь"); РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия"); // проверим принадлежит ли город Пермь группе Россия Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда Сообщить("Элемент Пермь находится в группе Россия."); КонецЕсли; /// Как скопировать существующий элемент справочника в 1с 8.3, 8.2 // скопируем элемент Пермь КопияПерми = ПермьСсылка.Скопировать(); КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ"; КопияПерми.УстановитьНовыйКод(); КопияПерми.Записать(); /// Как выяснить уровень вложенности элемента справочника /// в 1с 8.3, 8.2 Сообщить(КопияПерми.Уровень()); // 1 /// Как заблокировать элемент справочника перед изменениями /// в 1с 8.3, 8.2 // выполним блокировку элемента справочника // от изменения другими режимами или пользователями Пермь = ПермьСсылка.ПолучитьОбъект(); Если Не Пермь.Заблокирован() Тогда Пермь.Заблокировать(); // тут идёт какой-то долгий алгоритм // в результате которого мы меняем // заблокированный элемент Пермь.Численность = 5000; Пермь.Записать(); // и только потом освобождаем его // для других режимов и пользователей Пермь.Разблокировать(); КонецЕсли; /// Как заполнить новый элемент справочника на основании /// в 1с 8.3, 8.2 // в модуле справочника Города я определил процедуру // ОбработкаЗаполнения, которая обрабатывает ситуации // когда мы заполняем один элемент на основании // данных другого (см. в базе для скачивания) Хабаровск = Справочники.Города.СоздатьЭлемент(); Хабаровск.Заполнить( Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро") ); Хабаровск.Наименование = "Хабаровск"; Хабаровск.Записать(); /// Как пометить на удаление элемент справочника в 1с 8.3, 8.2 // пометим на удаление только что созданный Хабаровск Хабаровск.УстановитьПометкуУдаления( Истина, // пометка удаления Ложь // включая подчиненные (если речь о группе справочника) ); // метод Записать вызывать не нужно КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьКлиентаПоИмени(Имя) Возврат Справочники.Клиенты.НайтиПоНаименованию(Имя); КонецФункции /// Как открыть форму существующего элемента справочника /// по ссылке в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда) СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей"); ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент); ОткрытьФорму( "Справочник.Клиенты.ФормаОбъекта", // имя формы ПараметрыФормы // параметры для формы ); КонецПроцедуры /// Как открыть форму существующей группы справочника /// по ссылке в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда) СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip"); ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу); ОткрытьФорму( "Справочник.Клиенты.ФормаГруппы", // имя формы ПараметрыФормы // параметры для формы ); КонецПроцедуры /// Как открыть форму выбора элемента справочника и /// отследить её закрытие в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента", ЭтотОбъект); ОткрытьФорму( "Справочник.Клиенты.ФормаВыбора",,,,,,ОповещениеОЗакрытии ); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт Если Результат <> Неопределено Тогда Сообщить("Был выбран элемент " + Результат); КонецЕсли; КонецПроцедуры /// Как открыть форму выбора группы справочника и /// отследить её закрытие в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда) ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы", ЭтотОбъект); ОткрытьФорму( "Справочник.Клиенты.ФормаВыбораГруппы",,,,,,ОповещениеОЗакрытии ); КонецПроцедуры &НаКлиенте Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт Если Результат <> Неопределено Тогда Сообщить("Была выбрана группа " + Результат); КонецЕсли; КонецПроцедуры /// Как открыть форму списка справочника и /// установить отбор по реквизиту в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда) // откроем список клиентов, оставив // только мужчин ПараметрыОтбора = Новый Структура; ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской()); ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора); ОткрытьФорму( "Справочник.Клиенты.ФормаСписка", ПараметрыФормы ); КонецПроцедуры &НаСервереБезКонтекста Функция ПолучитьПеречислениеМужской() Возврат Перечисления.Пол.Мужской; КонецФункции /// Как открыть форму списка справочника с нужным отображением /// в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда) // откроем список клиентов с отображением "Список" ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка"); ФормаСписка.Открыть(); ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список; КонецПроцедуры /// Как открыть форму только что созданного, но ещё /// не записанного элемента справочника в 1с 8.3, 8.2 &НаКлиенте Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда) // получаем форму нового справочника ФормаНовогоСправочника = ПолучитьФорму( "Справочник.Еда.ФормаОбъекта",,, Истина); // делаем копию её данных (так как напрямую их менять // нельзя) КопияДанныхФормы = ФормаНовогоСправочника.Объект; // заполняем эти данные на сервере ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы); // копируем заполненные данные в исходную форму КопироватьДанныеФормы(КопияДанныхФормы, ФормаНовогоСправочника.Объект); // показываем форму нового заполненного // элемента справочника пользователю ФормаНовогоСправочника.Открыть(); КонецПроцедуры &НаСервере Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы) // преобразуем данные формы в документ Еда = ДанныеФормыВЗначение(ДанныеФормы, Тип("СправочникОбъект.Еда")); Еда.Наименование = "Груша"; Еда.Калорийность = 500; // преобразуем документа обратно в данные формы ЗначениеВДанныеФормы(Еда, ДанныеФормы); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Как получить доступ к реквизитам объекта?
Статья носит справочный характер. Предназначена для начинающих программистов.
Получить массив реквизитов объекта можно при помощи самого объекта:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); МассивРеквизитовОбъекта = ДокОбъект.Метаданные().Реквизиты;
Получив массив реквизитов, можно организовать Цикл для просмотра имен реквизитов:
Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл Сообщить(Реквизит.Имя + " :" + Реквизит.Представление()); КонецЦикла;
Для того, чтобы получить значения реквизитов объекта вообще говоря надо обратиться с запросом к БД, типа:
Запрос = "ВЫБРАТЬ | ИмяРеквизита, |ИЗ | Объект.ТипОбъекта КАК ОбъектТипОбъекта |ГДЕ | ОбъектТипОбъекта.Ссылка = &СсылкаНаОбъект Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект);
В запрос надо передать ссылку на объект и имя реквизита. Запрос вернет таблицу или выборку со значением реквизита.
Удобнее конечно для поиска значений реквизитов воспользоваться готовыми решениями, например фунцией ПолучитьЗначенияРеквизитов() общего модуля ОбщегоНазначения.
// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы // по ссылке на объект. // // Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. // Если необходимо зачитать реквизит независимо от прав текущего пользователя, // то следует использовать предварительный переход в привилегированный режим. // // Параметры: // Ссылка - ссылка на объект, - элемент справочника, документ, ... // ИменаРеквизитов - Строка или Структура - Если Строка, то имена реквизитов, // перечисленные через запятую, в формате требований к свойствам структуры. // Например, "Код, Наименование, Родитель". // Если Структура, то в качестве ключа передается псевдоним поля для // возвращаемой структуры с результатом, а в качестве значения (опционально) // - фактическое имя поля в таблице. // Если значение не определено, то имя поля берется из ключа. // // Возвращаемое значение: // Структура - содержит список свойств, как список имен в строке // ИменаРеквизитов, со значениям реквизитов, прочитанных // из информационной базы. // Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда СтруктураРеквизитов = ИменаРеквизитов; ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"), Строка(ТипЗнч(ИменаРеквизитов))); КонецЕсли; ТекстПолей = ""; Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ)); Псевдоним = СокрЛП(КлючИЗначение.Ключ); ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " | " + ИмяПоля + " КАК " + Псевдоним; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ |" + ТекстПолей + " |ИЗ | " + Ссылка.Метаданные().ПолноеИмя() + " КАК ПсевдонимЗаданнойТаблицы |ГДЕ | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка |"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Результат = Новый Структура; Для каждого КлючИЗначение Из СтруктураРеквизитов Цикл Результат.Вставить(КлючИЗначение.Ключ); КонецЦикла; ЗаполнитьЗначенияСвойств(Результат, Выборка); Возврат Результат; КонецФункции
Значение реквизитов в этой функции получено через запрос к БД. Возвращаемое значение — структура (ключ-значение). Пример использования:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); СтруктураНастроек = Новый Структура; //инициируем структуру настроек именами реквизитов Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя); КонецЦикла; ЗначенияРеквизитов = ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек); СканПростойСтруктуры(ЗначенияРеквизитов); //вывести структуру для просмотра
Поскольку в функцию ПолучитьЗначенияРеквизитов() во второй параметр надо передать структуру, то мы создали структуру и организовали Цикл ее инициализации данными из массива имен реквизитов объекта. Возвращает функция так же структуру (ключ-значение), с которой удобно работать. Для просмотра этой структуры можно воспользоваться циклом, либо вызвать функцию СканПростойСтруктуры(), которой передать структуру для просмотра.
Функция СканПростойСтруктуры(Структура) Для каждого Элемент из Структура Цикл Сообщить(Элемент.Ключ + ": " + Элемент.Значение); КонецЦикла; КонецФункции
Если исследуемый объект использует так же еще и общие реквизиты, и их необходимо найти, то можно воспользоваться функцией МассивИменРеквизитовОбъекта(), которая находит не только реквизиты объекта но и общие и даже стандартные реквизиты, которые использует объект:
// Возвращает массив имен всех реквизитов переданного объекта // Функция МассивИменРеквизитовОбъекта(Объект) Экспорт МассивИменРеквизитов = Новый Массив; Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда МетаданныеОбъекта = Объект; Иначе МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект)); Если МетаданныеОбъекта = Неопределено Тогда Возврат МассивИменРеквизитов; КонецЕсли; КонецЕсли; Для индекс = 0 по 1 Цикл // КоллекцияРеквизитов = ?(индекс = 0, МетаданныеОбъекта.СтандартныеРеквизиты, МетаданныеОбъекта.Реквизиты); КоллекцияРеквизитов = МетаданныеОбъекта.Реквизиты; Для каждого Реквизит Из КоллекцияРеквизитов Цикл МассивИменРеквизитов.Добавить(Реквизит.Имя); КонецЦикла; КонецЦикла; Для каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл Если ИспользуетсяОбщийРеквизит(ОбщийРеквизит, МетаданныеОбъекта) Тогда МассивИменРеквизитов.Добавить(ОбщийРеквизит.Имя); КонецЕсли; КонецЦикла; Возврат МассивИменРеквизитов; КонецФункции
Тогда программа будет выглядеть так:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); мМассивИмен = МассивИменРеквизитовОбъекта(ДокОбъект); СтруктураНастроек = Новый Структура; Для каждого эл Из мМассивИмен Цикл СтруктураНастроек.Вставить(эл, эл); КонецЦикла; ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек); СканПростойСтруктуры(ЗначенияРеквизитов);
Вспомогательная функция:
// Проверяет используется ли в Объекте указанный общий реквизит // Функция ИспользуетсяОбщийРеквизит(ОбщийРеквизит, Объект) Экспорт Если ТипЗнч(Объект) = Тип("ОбъектМетаданных") Тогда МетаданныеОбъекта = Объект; Иначе МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Объект)); Если МетаданныеОбъекта = Неопределено Тогда Возврат Ложь; КонецЕсли; КонецЕсли; Если ТипЗнч(ОбщийРеквизит) = Тип("ОбъектМетаданных") Тогда МетаданныеОбщегоРеквизита = ОбщийРеквизит; Иначе МетаданныеОбщегоРеквизита = Метаданные.ОбщиеРеквизиты.Найти(ОбщийРеквизит); Если МетаданныеОбщегоРеквизита = Неопределено Тогда Возврат Ложь; КонецЕсли; КонецЕсли; ЭлементСостава = МетаданныеОбщегоРеквизита.Состав.Найти(МетаданныеОбъекта); Если ЭлементСостава = Неопределено Тогда Возврат Ложь; КонецЕсли; пИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита; Если ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.Использовать Тогда Возврат Истина; ИначеЕсли ЭлементСостава.Использование = пИспользованиеОбщегоРеквизита.НеИспользовать Тогда Возврат Ложь; Иначе пАвтоИспользованиеОбщегоРеквизита = Метаданные.СвойстваОбъектов.АвтоИспользованиеОбщегоРеквизита; Если МетаданныеОбщегоРеквизита.АвтоИспользование = пАвтоИспользованиеОбщегоРеквизита.Использовать Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецЕсли; КонецФункции
Как получить значение отдельного реквизита объекта?
Иногда необязательно получать значения всего массива реквизитов. Программист как правило знает имя реквизита, значение которого необходимо получить. К отдельному реквизиту объекта можно обратиться просто по его имени:
Поставщик = ДокОбъект.Метаданные().Реквизиты.Поставщик;
Получить значение этого реквизита можно так же через запрос, написанный специально для этого реквизита. Но можно воспользоваться все той же функцией ПолучитьЗначенияРеквизитов(). Цикл для настройки структуры в этом случае не нужен, так как нам надо найти значение всего одного элемента:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); Организация = Строка(ДокОбъект.Метаданные().Реквизиты.Организация); СтруктураНастроек = Новый Структура; СтруктураНастроек.Вставить(Организация, Организация); ЗначенияРеквизитов = ОбщегоНазначения.ПолучитьЗначенияРеквизитов(ДокСсылка , СтруктураНастроек); СканПростойСтруктуры(ЗначенияРеквизитов);
Обратите внимание что здесь реквизит который необходимо найти преобразовывается к типу Строка, потому, что в структуру настроек надо передать именно строку.
Как найти имена реквизитов в таб части объекта?
Функция определяет есть ли реквизит в таб части документа:
// Позволяет определить есть ли среди реквизитов табличной части документа // реквизит с переданным именем. // // Параметры: // ИмяРеквизита - строковое имя искомого реквизита, // МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск. // ИмяТабЧасти - строковое имя табличной части документа, среди реквизитов которого производится поиск // // Возвращаемое значение: // Истина - нашли реквизит с таким именем, Ложь - не нашли. // Функция ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Экспорт ТабЧасть = МетаданныеДокумента.ТабличныеЧасти.Найти(ИмяТабЧасти); Если ТабЧасть = Неопределено Тогда // Нет такой таб. части в документе Возврат Ложь; Иначе Возврат НЕ (ТабЧасть.Реквизиты.Найти(ИмяРеквизита) = Неопределено); КонецЕсли; КонецФункции
Пример использования:
ИмяРеквизита = "Номенклатура"; МетаданныеДокумента = ДокОбъект.Метаданные(); ИмяТабЧасти = "Товары"; Если ЕстьРеквизитТабЧастиДокумента(ИмяРеквизита, МетаданныеДокумента, ИмяТабЧасти) Тогда Сообщить("Реквизит есть!"); Иначе Сообщить("Реквизита нет"); КонецЕсли;
Сообщить имя реквизитов таб части:
Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти("Товары").Реквизиты Цикл Собщить(Реквизит.Имя); КонецЦикла;
Как найти значение всех реквизитов всех таб частей документа через запрос
Чтобы найти значения всех реквизитов всех табличных частей объекта через запрос воспользуемся функцией
ПолучитьЗначенияРеквизитовТабЧасти().
Функция ПолучитьЗначенияРеквизитовТабчасти(Ссылка, ИменаРеквизитов, ИмяТабЧасти) Экспорт ИмяТЧ = ИмяТабЧасти; ПолноеИмя = Ссылка.Метаданные().ПолноеИмя(); Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда СтруктураРеквизитов = ИменаРеквизитов; ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Неверный тип второго параметра ИменаИлиСтруктураРеквизитов: %1'"), Строка(ТипЗнч(ИменаРеквизитов))); КонецЕсли; ТекстПолей = ""; Для Каждого КлючИЗначение Из СтруктураРеквизитов Цикл ИмяПоля = ?(ЗначениеЗаполнено(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Значение), СокрЛП(КлючИЗначение.Ключ)); Псевдоним = СокрЛП(КлючИЗначение.Ключ); ТекстПолей = ТекстПолей + ?(ПустаяСтрока(ТекстПолей), "", ",") + " | " + ИмяПоля + " КАК " + Псевдоним; КонецЦикла; Запрос = Новый Запрос( "ВЫБРАТЬ |" + ТекстПолей + " |ИЗ | " + ПолноеИмя + "." + ИмяТЧ + " КАК ПсевдонимЗаданнойТаблицы |ГДЕ | ПсевдонимЗаданнойТаблицы.Ссылка = &Ссылка |"); Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить().Выгрузить(); Возврат Результат; КонецФункции
Пример использования:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); МассивТабЧастей = Новый Массив; Для каждого ТабЧасть Из ДокОбъект.Метаданные().ТабличныеЧасти Цикл МассивТабЧастей.Добавить(ТабЧасть.Имя); КонецЦикла; Для Каждого ТабЧасть Из МассивТабЧастей Цикл СтруктураНастроек = Новый Структура; Для каждого Реквизит Из ДокОбъект.Метаданные().ТабличныеЧасти.Найти(ТабЧасть).Реквизиты Цикл СтруктураНастроек.Вставить(Реквизит.Имя, Реквизит.Имя); КонецЦикла; Сообщить("Имя таб части: " + ТабЧасть); ТабЗнач = ПолучитьЗначенияРеквизитовТабЧасти(ДокСсылка , СтруктураНастроек, ТабЧасть); ПоказатьТаблицу(ТабЗнач); КонецЦикла;
Вспомогательная функция:
функция ПоказатьТаблицу(Табл) Сообщить("///Функция ПоказатьТаблицу///"); Количество = Табл.Колонки.Количество(); Для каждого Строка из Табл Цикл Для Индекс = 0 По Количество-1 Цикл Сообщить(СокрЛП(Индекс)+" "+СокрЛП(Табл.Колонки[Индекс].Имя)+ ": " + Строка[СокрЛП(Табл.Колонки[Индекс].Имя)]); КонецЦикла; КонецЦикла; Сообщить("///Конец Функция ПоказатьТаблицу///"); КонецФункции
Результат для документа «Реализация товаров услуг»:
Имя таб части: Товары
///Функция ПоказатьТаблицу///
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Вентилятор настольный
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры: Н-908, С-890 от 01.01.2003
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 445,5
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 450
15 Склад: Магазин «Бытовая техника»
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 3
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
0 ЕдиницаИзмерения: шт
1 ЕдиницаИзмеренияМест:
2 Качество: Новый
3 Количество: 1
4 КоличествоМест: 0
5 Коэффициент: 1
6 Номенклатура: Набор вентиляторов
7 ПроцентСкидкиНаценки: 0
8 СерияНоменклатуры:
9 СпособСписанияОстаткаТоваров: Со склада
10 СтавкаНДС: Без НДС
11 Сумма: 1948,32
12 СуммаНДС: 0
13 ХарактеристикаНоменклатуры:
14 Цена: 1968
15 Склад: Магазин «Бытовая техника»
16 ПроцентАвтоматическихСкидок: 1
17 УсловиеАвтоматическойСкидки: По виду дисконтных карт
18 ЗначениеУсловияАвтоматическойСкидки: Серебряная карта
19 КлючСтроки: 4
20 КлючСвязи: 0
21 ЗаказПокупателя: Заказ покупателя ТД000000001 от 08.06.2008 12:00:00
///Конец Функция ПоказатьТаблицу///
Имя таб части: ВозвратнаяТара
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: Услуги
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: СоставНабора
///Функция ПоказатьТаблицу///
0 Номенклатура: Вентилятор BINATONE ALPINE 160вт, напольный ,
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 01234/11020/7654321, БОЛГАРИЯ
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин «Бытовая техника»
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 1068
10 КлючСвязи: 0
0 Номенклатура: Вентилятор JIPONIC (Тайв.),
1 ХарактеристикаНоменклатуры:
2 СерияНоменклатуры: 11234/11020/7654321, ТАЙВАНЬ (КИТАЙ)
3 Количество: 1
4 ЕдиницаИзмерения: шт
5 Склад: Магазин «Бытовая техника»
6 Качество: Новый
7 СпособСписанияОстаткаТоваров: Со склада
8 КлючСтроки: 4
9 Цена: 900
10 КлючСвязи: 0
///Конец Функция ПоказатьТаблицу///
Имя таб части: СерийныеНомера
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: СерийныеНомераСоставНабора
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: ДокументыРасчетовСКонтрагентом
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///