|
|||
TDex
08.10.04 — 10:31 |
В 77 можно было сделать так в цикле: |
||
TDex
1 — 08.10.04 — 11:27 |
причем нужны не реквизиты табличной части а именно реквизиты справочника |
||
Евгений
2 — 08.10.04 — 12:04 |
Примерно также: |
||
TDex
3 — 08.10.04 — 12:06 |
второе сработало, спасибо! |
||
Archon
4 — 18.10.04 — 16:36 |
А как перебрать реквизиты табличных частей? И сами табличные части? |
||
Rovan
5 — 18.10.04 — 16:38 |
v8: Регистрация изменений в справочнике |
||
Archon
6 — 18.10.04 — 16:38 |
Опс, поторопился. Все, не надо. |
||
ezh 7 — 18.10.04 — 16:48 |
(3) гениально. второе сработало, а первое — нет. |
Быстрый старт в Python для 1С Разработчиков | 1s-to-python.ru
&НаСервере Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере() /// Как создать новый элемент справочника в 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; // преобразуем документа обратно в данные формы ЗначениеВДанныеФормы(Еда, ДанныеФормы); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
+2
Получить список Справочников конфигурации
&НаКлиенте
Процедура ПоКнопкеЧтениеИзМетаданных(Команда)
// Вставить содержимое обработчика.
Перем СписокСправочников;
СписокСправочников = Новый СписокЗначений;
СписокСправочников = СправочникиИзМетаданных();
Для Сч = 0 По СписокСправочников.Количество() - 1 Цикл
Сообщить(СписокСправочников.Получить(Сч))
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СправочникиИзМетаданных()
Перем СписокСправочников, СправочникИзМетаданных;
СписокСправочников = Новый СписокЗначений;
Для Каждого СправочникИзМетаданных Из Метаданные.Справочники Цикл
СписокСправочников.Добавить(СправочникИзМетаданных.Имя);
КонецЦикла;
Возврат СписокСправочников;
КонецФункции
Код 1C v 8.х
//ЭлементыФормы.ОбъектПоиска - Поле Выбора на форме
СписокВыбора = ЭлементыФормы.ОбъектПоиска.СписокВыбора;
Для Каждого Справочник Из Метаданные.Справочники Цикл
//Проверим, есть ли права на просмотр? Да- добавляем, Нет - пропускаем
Если ПравоДоступа("Просмотр", Справочник) Тогда
ИмяСправочника = Справочник.Синоним;
Если ИмяСправочника = "" Тогда
ИмяСправочника = Справочник.Имя;
КонецЕсли;
Структура = Новый Структура;
Структура.Вставить("Тип", "Справочник");
Структура.Вставить("Объект", Справочник);
СписокВыбора.Добавить(Структура, ИмяСправочника, ,ЭлементыФормы.КартинкаСправочника.Картинка);
КонецЕсли;
КонецЦикла;
Код 1C v 7.x
//Выведем список всех справочников в окно сообщений
Для Индекс=1 По Метаданные.Справочник() Цикл
Значение = Метаданные.Справочник(Индекс).Идентификатор;
Представление = Метаданные.Справочник(Индекс).Представление();
Комментарий = Метаданные.Справочник(Индекс).Комментарий;
Сообщить(Значение+" "+Представление+" "+Комментарий);
КонецЦикла;
-
Пробовал кто нибудь запросом получить все реквизиты объекта, те. не значения реквизитов а наименование самих реквизитов? Возможно ли такое?
Принцип похожий на ЦиклДля каждого Реквизит Из Документ.Метаданные().Реквизиты Цикл Сообщить(Ревизит.Имя); КонецЦикла;
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Выбрать
*
из ВашДокумент. -
Offline
Thelearning
Профессионал в 1С
Команда форума- Регистрация:
- 9 сен 2010
- Сообщения:
- 701
- Симпатии:
- 72
- Баллы:
- 54
А разве такое возможно?
— Объединение сообщений, 16 май 2014 —
Так ведь через звездочку все равно будут выбраны именно значения реквизитов, а не сами имена
-
Offline
olegsemenov2005
Опытный в 1С- Регистрация:
- 5 май 2014
- Сообщения:
- 55
- Симпатии:
- 3
- Баллы:
- 29
&НаКлиенте
Процедура Команда1(Команда)НаСервере(«РеализацияТоваровУслуг»);
КонецПроцедуры
&НаСервере
Процедура НаСервере(ВидДокумента)Сообщение = Новый СообщениеПользователю;
Для каждого ТекущийРеквизит Из Метаданные.Документы[ВидДокумента].Реквизиты ЦиклСообщение.Текст = ТекущийРеквизит.Имя;
Сообщение.Сообщить();КонецЦикла;
КонецПроцедуры
———————
Запросом получаешь только значения реквизитов
Последнее редактирование: 16 май 2014 -
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
В обработчике нельзя разве использовать Имя ?
-
Здесь есть минусы.
Не все реквизиты документа можно получить способом описанном выше&НаКлиенте Процедура Команда1(Команда) НаСервере("РеализацияТоваровУслуг"); КонецПроцедуры &НаСервере Процедура НаСервере(ВидДокумента) Сообщение = Новый СообщениеПользователю; Для каждого ТекущийРеквизит Из Метаданные.Документы[ВидДокумента].Реквизиты Цикл Сообщение.Текст = ТекущийРеквизит.Имя; Сообщение.Сообщить(); КонецЦикла; КонецПроцедуры
Можете проверить например: — если в форме документа получать значения элементов формы методом
Для каждого Реквизит Из ЭтаФорма.Элементы Цикл Сообщить(Реквизит.Имя); КонецЦикла;
Мы получим больше элементов.
-
Offline
olegsemenov2005
Опытный в 1С- Регистрация:
- 5 май 2014
- Сообщения:
- 55
- Симпатии:
- 3
- Баллы:
- 29
В условии было реквизиты объекта « ……. получить все реквизиты объекта ……«, по этому сделал ч/з метаданные.
Это для общего развития нужно или стоит какая то конкретная задача? -
Вообще стоит задача проверка совпадений реквизитов одинаковых объектов например Поступление товаров и услуг у разных баз (нужно для обмена данными).
Через циклы не все реквизиты проверяются. Пробую реализовать запросом, но видимо запросом не возможно. -
Offline
Tiger86
Модераторы
Команда форума
Модератор- Регистрация:
- 24 мар 2011
- Сообщения:
- 6.407
- Симпатии:
- 108
- Баллы:
- 104
реквизит объекта и элемент формы — это могут быть разные вещи. Не все элементы формы связаны с реквизитами. Определитесь для начала что вам надо
-
Offline
mialord
Модераторы
Команда форума
Модератор- Регистрация:
- 31 июл 2009
- Сообщения:
- 5.460
- Симпатии:
- 53
- Баллы:
- 54
1. Запрос — это выборка ДАННЫХ. Вы хотите получить метаданные и запросом (Объект ЗАПРОС) метаданные выбрать нельзя.
2. При СОМ подключении Вы можете запросить объект Метаданные а там сверять в цикле все существующие метаданные.
Andrey102019 5 / 4 / 1 Регистрация: 21.10.2019 Сообщений: 194 |
||||||||
1 |
||||||||
Как обойти все реквизиты справочника?21.11.2019, 16:12. Показов 11894. Ответов 8 Метки 1с 8.3 оф (Все метки)
Мне нужно обойти все реквизиты справочника номенклатура, что бы найти реквизиты определенного типа.
Добавлено через 8 минут
проверить, что текущий ТекОбъект сам является ссылкой из Справочника Номенкалатура?
0 |
Tklwegsd 841 / 604 / 211 Регистрация: 24.07.2013 Сообщений: 2,101 |
||||
21.11.2019, 20:28 |
2 |
|||
1 |
Andrey102019 5 / 4 / 1 Регистрация: 21.10.2019 Сообщений: 194 |
||||
22.11.2019, 15:03 [ТС] |
3 |
|||
как из реквизита прочитать значение?
Добавлено через 14 минут Добавлено через 8 минут
0 |
Модератор 3708 / 2905 / 572 Регистрация: 10.03.2011 Сообщений: 11,442 Записей в блоге: 1 |
|
23.11.2019, 02:44 |
4 |
0 |
5 / 4 / 1 Регистрация: 21.10.2019 Сообщений: 194 |
|
25.11.2019, 13:07 [ТС] |
5 |
Как проверить есть ли в реквизитах справочника определенное наименование? Зачем вы меня отправили в мою тему?
0 |
Модератор 3708 / 2905 / 572 Регистрация: 10.03.2011 Сообщений: 11,442 Записей в блоге: 1 |
|
27.11.2019, 00:16 |
6 |
как из реквизита прочитать значение? вот так
Andrey102019, Как проверить есть ли в реквизитах справочника определенное наименование? Добавлено через 22 секунды
Зачем вы меня отправили в мою тему? Затем и отправил что вопрос повторяется…
0 |
5 / 4 / 1 Регистрация: 21.10.2019 Сообщений: 194 |
|
27.11.2019, 09:22 [ТС] |
7 |
Затем и отправил что вопрос повторяется… он не то что повторятся, я же его просто создал, что бы понятнее объяснить, что хочется получить в итоге) В последствии оказалось, что такой вариант не подойдет, время выполнения будет огромное)
0 |
Модератор 3708 / 2905 / 572 Регистрация: 10.03.2011 Сообщений: 11,442 Записей в блоге: 1 |
|
27.11.2019, 23:24 |
8 |
В последствии оказалось, что такой вариант не подойдет, время выполнения будет огромное) какой вариант, почему будет огромное время… Ничего не понял
0 |
5 / 4 / 1 Регистрация: 21.10.2019 Сообщений: 194 |
|
28.11.2019, 15:34 [ТС] |
9 |
какой вариант, почему будет огромное время… Ничего не понял Если в программе проверять вхождение Текущей ссылки в Справочник Номенклатура, по данной функции НайтиПоСсылкам(<СписокСсылок>, <ОбластьПоиска>, <ВключитьОбъекты>, <ИсключитьОбъекты>) Почему может не работать Пример из Синт.пом?, то это займет много времени , близкое к минуте. Извините я кажется сам уже сбился в своих темах где и что спрашивал, из за вашей ссылки на мою же тему —
Andrey102019, Как проверить есть ли в реквизитах справочника определенное наименование? сам уже зациклился.
0 |
Как получить доступ к реквизитам объекта?
Статья носит справочный характер. Предназначена для начинающих программистов.
Получить массив реквизитов объекта можно при помощи самого объекта:
ДокСсылка = СсылкаНаДокумент(ТипДокумента, НомерДок); ДокОбъект = ДокСсылка.ПолучитьОбъект(); МассивРеквизитовОбъекта = ДокОбъект.Метаданные().Реквизиты;
Получив массив реквизитов, можно организовать Цикл для просмотра имен реквизитов:
Для каждого Реквизит Из ДокОбъект.Метаданные().Реквизиты Цикл Сообщить(Реквизит.Имя + " :" + Реквизит.Представление()); КонецЦикла;
Для того, чтобы получить значения реквизитов объекта вообще говоря надо обратиться с запросом к БД, типа:
Запрос = "ВЫБРАТЬ | ИмяРеквизита, |ИЗ | Объект.ТипОбъекта КАК ОбъектТипОбъекта |ГДЕ | ОбъектТипОбъекта.Ссылка = &СсылкаНаОбъект Запрос.УстановитьПараметр("СсылкаНаОбъект", СсылкаНаОбъект);
В запрос надо передать ссылку на объект и имя реквизита. Запрос вернет таблицу или выборку со значением реквизита.
Удобнее конечно для поиска значений реквизитов воспользоваться готовыми решениями, например фунцией ПолучитьЗначенияРеквизитов() общего модуля ОбщегоНазначения.
// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы // по ссылке на объект. // // Если доступа к одному из реквизитов нет, возникнет исключение прав доступа. // Если необходимо зачитать реквизит независимо от прав текущего пользователя, // то следует использовать предварительный переход в привилегированный режим. // // Параметры: // Ссылка - ссылка на объект, - элемент справочника, документ, ... // ИменаРеквизитов - Строка или Структура - Если Строка, то имена реквизитов, // перечисленные через запятую, в формате требований к свойствам структуры. // Например, "Код, Наименование, Родитель". // Если Структура, то в качестве ключа передается псевдоним поля для // возвращаемой структуры с результатом, а в качестве значения (опционально) // - фактическое имя поля в таблице. // Если значение не определено, то имя поля берется из ключа. // // Возвращаемое значение: // Структура - содержит список свойств, как список имен в строке // ИменаРеквизитов, со значениям реквизитов, прочитанных // из информационной базы. // Функция ПолучитьЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт Если ТипЗнч(ИменаРеквизитов) = Тип("Структура") Тогда СтруктураРеквизитов = ИменаРеквизитов; ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда СтруктураРеквизитов = Новый Структура(ИменаРеквизитов);; Иначе ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("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
///Конец Функция ПоказатьТаблицу///
Имя таб части: СерийныеНомера
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: СерийныеНомераСоставНабора
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Имя таб части: ДокументыРасчетовСКонтрагентом
///Функция ПоказатьТаблицу///
///Конец Функция ПоказатьТаблицу///
Показывать по
10
20
40
сообщений
Новая тема
Ответить
Mur
Дата регистрации: 27.12.2004
Сообщений: 22
Уважаемые, подскажите пожалуйста, как программно можно перебрать реквизиты справочника Сотрудники и занести их в список!<br><br>В итоге нужно чтобы получился список с реквизитами справочника! Благодарю!
Olex
Дата регистрации: 04.02.2005
Сообщений: 198
«ТабРеквизиты = СоздатьОбъект(«ТаблицаЗначений»);<br><br>ТабРеквизиты.ВставитьКолонку(«Реквизит»);<br><br>ТабРеквизиты.ВставитьКолонку(«РеквИдентиф»);<br><br>Для Сч = 1 По Метаданные.Справочник(«Сотрудники»).Реквизит() Цикл<br><br> ИденМД = Метаданные.Справочник(«Сотрудники»).Реквизит(Сч).Идентификатор;<br><br> ПредМД = Метаданные.Справочник(«Сотрудники»).Реквизит(Сч).Представление();<br><br> ТабРеквизиты.НоваяСтрока();<br><br> ТабРеквизиты.Реквизит = ПредМД;<br><br> ТабРеквизиты.РеквИдентиф = ИденМД;<br><br>КонецЦикла;<br><br>//И не забыть про Код и Наименование!!!»
Показывать по
10
20
40
сообщений