Как получить имя реквизита 1с
Есть документ.
Например "Календарь".
К нему добавляем дополнительное сведение типа строка.
У дополнительного сведения есть 2 поля: 1. Наименование "Событие", 2. Имя "СведСобытия".
Ссылку по наименованию получаю через поиск. ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Событие");
Вопрос?
А как обратиться к сведению по имени "СведСобытия"?
И если можно, второй вопрос.
Почему при параметры точного поиска истина "НайтиПоНаименованию" пытается запросить "Событие (Календарь)", хотя в наименовании свойства слова "Календарь" нет?
Можно ли в отборе сразу указать к какому документу относится данное поле? По полученному сведению пытаюсь получить родителя и владельца - возвращает пустые значения.
- Вопрос задан более трёх лет назад
- 3473 просмотра
Простите за резкость, но это не вопрос, а несвязная мешанина горячечного бреда!
Добавлен реквизит? Добавлено значение в регистр сведений в разрезе характеристики?
Наименование - предопределенный реквизит справочников, счетов, расчетов, обменов, характеристик и задач. Имя - это предопределенное свойство множества элементов метаданных и некоторых объектов встроенного языка. Какое все это имеет отношение к вашему документу "Календарь" не понятно!
В документах поиск по Наименованию не предусмотрен - только по номеру и по реквизиту. Если вы своему документу дали реквизит "Имя", то так и ищите - Документы.Календарь.НайтиПоРеквизиту("Имя", "СведСобытия"). Если у вас несколько документов с таким реквизитом, то получите только первый случайно попавшийся из них.
НайтиПоНаименованию при параметры точного поиска истина, поиск пытается запросить "Событие (Календарь)"?
"Событие (Календарь)" - это новый документ связанный с Календарем? К чему это все? Если ищете в списке документов "Календарь", то найдете документы только этого вида; если ищете среди Событий, то и получите событие. При чем тут точность? Точность просто сигнализирует, что нам не интересна часть наименования за первой половиной, которая совпала с поисковой строкой.
Менеджер документа связан только со своим видом документов - даже если сильно захотеть, то его методами все равно никогда не получить данные из чужих видов документов.
Что за сведения? Какой-то реквизит вашего документа? Вы пока говорили, что у вас реквизиты строкового типа - у вас свойства родителя и владельца просто не существуют и при попытке к ним обратится должна генерироваться ошибка. Если вы взяли какой-то ссылочный реквизит, то эти свойства пустые у пустых ссылок. Еще вариант, что у ваших объектов просто нет владельца и группы.
Дмитрий, у вас 1С головного мозга.
Я вот так же документацию читал, и ни черта не понял.
1. Добавлено сведение. Не реквизит.
Оно добавляется в режиме предприятия - "Дополнительные сведения".
2. Добавляя дополнительное сведение к документы ты сам задаешь и Наименование и есть возможность задать Имя (если не задал, оно генерируется автоматически)
3. Я ищу не документ по наименованию, я ищу Дополнительное сведение по наименованию и нахожу, но хочу обращаться напрямую по имени, т.е. без поиска.
Т.к. упустили важную деталь что работаем НЕ с документом, НЕ с реквизитом, А с дополнительным сведением документа, то все остальные 90% ответа - не в тему и какая-то мешанина.
Возможно вас запутало слово "свойство". Извините.
НО эта строка и основной вопрос должны были однозначно дать понять о чем идет речь: ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию
1С. Как обращаться по имени к дополнительным сведениям документов?
З.Ы.:
Исправлю в тексте
"К нему добавляем дополнительное свойство типа строка.
У дополнительного свойства имени 2: 1. Наименование "Событие", 2. Имя "СведСобытия"."
Что тут не свойство, а сведение.
Круто вы же общаетесь с теми, кто вас не проигнорил, а попытался помочь, не смотря на то что вы не знаете ни 1С, ни русский язык. Для верности еще скажите вашему врачу, что у него запор головного мозга, вызванному электрику - про замыкание головы, работнику СТО - про тормозную жидкость в мозгах, а жене вообще про отсутствие каких-либо мозгов. Ваша жизнь точно наладится и все верно получится!
Напоследок и без дальнейших комментариев:
1С Предприятие - это многофункциональная платформа для программирования. Задавая вопросы по "1С" вы получите ответы по платформе. Если вас интересует конкретно Бухгалтерия, Зарплата, Общепит или Управление ЖКХ - то задавайте вопросы с указанием конфигурации.
А зачем читать документацию для профессионалов? Вы даже терминами не владеете.
Регистр сведений? Других "сведений" в платформе 1С не существует (разработчики конфигураций свои элементы могут называть как хотят).
В режиме предприятия "проигрывается" некоторая конфигурация. В некоторых древних типовых конфах была связка ПВХ+РегистрСведений, которые позволяли описать новые свойства для половины справочников и документов, с возможностью выводить данную информацию в отчеты.
2. Добавляя дополнительное сведение к документы ты сам задаешь и Наименование и есть возможность задать Имя (если не задал, оно генерируется автоматически)
Какая-то ваша доработка. Обычно только имя свойства и его значение.
3. Я ищу не документ по наименованию, я ищу Дополнительное сведение по наименованию и нахожу, но хочу обращаться напрямую по имени, т.е. без поиска.
Для этого создают предопределенные элементы в конфигураторе. Иначе только поиски по Наименованию или реквизиту.
Снова здравствуйте. Имеется следующая ситуация: есть документ, реквизиты которого выгружаются в текстовый файл. С простыми типами проблем нет, но не могу понять, как получить полное имя объекта реквизита, и есть ли вообще такая возможность? То есть, к примеру, имеется реквизит с именем " СчетНаОплатуПокупателю " и типом " Документ.СчетНаОплатуПокупателю ". При попытке получить его значение возвращается лишь его наименование (синоним?) вида Счет покупателю 0000-000602 от 19.12.2016 12:00:00 , в то время как хотелось бы получить значение в таком виде, чтобы потом можно было бы получить документ при помощи Документ.СчетНаОплатуПокупателю[значение] .
На данный момент необходимо написать универсальную перегрузку документа без использования XML, JSON и функций выгрузки универсальных идентификаторов. Есть реализация, но приходится парсить строки, вытягивая из них номер и дату документов, дабы потом по ним найти документ; искать нужный элемент перечисления по его синониму, а поиск элемента справочника осуществлять ПоНаименованию. Это единственный вариант в условиях задачи или есть более рациональное решение?
(1) у справочников наименования могут и одинаковые быть.
по гуиду надо искать, а перечисление по индексу
(2) К сожалению, в условии прописано, что нельзя использовать функции, выгружающие уникальные идентификаторы объектов. А возможно как-то получить индекс элемента перечисления из реквизита?
(3) а что это за задача такая ? Учебная ?
Потому что условия - выгружать в текстовый документ, но при этом нельзя использовать XML..или искать объекты, но нельзя использовать гуиды - мягко говоря, несколько странные.
тогда, и остается парсить, и искать по наименованиям, номерам и датам. но так делать, это последнее дело
(6) постановка задачи, провокационная ))) может там специально проверяют, на говнокодирование. За одну только постановку такой задачи, самого экзаменатора надо оттуда гнать в шею
(8) Задача вроде бы не новая, по крайней мере, о ней есть некоторые упоминания в интернете:
Разработать внешнюю обработку "Перегрузка документа". В самом верхнем поле должна быть возможность выбрать любой документ из базы данных, в нижнем - путь к файлу и имя файла выгрузки. При нажатии кнопки "Выгрузить" - информация выгружается в указанный файл. Информация должна быть исчерпывающей , т.е выгружаться должны данные ,чтобы при нажатии "Загрузить " - в базе создавалась бы копия исходного документа (за искл. номера т.к он уникален для каждого документа).
Необходимо использовать метаданные,запрещено использовать ф-ии "ЗначениеВСтрокуВнутр()" ,"Уникальные Идентификатор()" и подобные ф-ии ,выгружающие уник. идентификаторы объектов , запрещается использовать выгрузку и загрузку в XML и JSON,строго txt.
(15) В качестве тестовой задачи это либо издевательство (ибо решение в общем виде будет достаточно геморным), либо предполагается куча ограничений, которые явно в задаче не оговорены. Что тоже издевательство.
(8) Я бы не был так категоричен. :) Возможно, проверяют навыки алгоритмизации. Если использовать стандартные процедуры выгрузки/загрузки, то код получится в 3 строчки на каждую из операций. Особо не развернешься.
(16) Буду надеяться на это, ибо, например, проблема одинаковых наименований справочников, в реализованном мной алгоритме, не решена (пока что), и как-то даже стыдно идти с таким кодом на собеседование ;)
В общем говоря, есть подозрение, что условие задачи действительно подразумевает костыли и, как следствие, нестабильную работу. Однако, время еще есть, буду пытаться)
(18) Проблему дублей и не решить без уникальных идентификаторов. Не мучайтесь. Просто ищите по коду (если есть) и/или наименованию (если есть). И помните о недостатках решения, когда будете представлять свою работу.
Попытка решить эту проблему анализом прочих реквизитов через чур усложнит вашу разработку без всякой на то надобности. Думаю, это чисто академическая задача, решение никто применять не будет.
Возможно, проверяют навыки алгоритмизации. Если использовать стандартные процедуры выгрузки/загрузки, то код получится в 3 строчки на каждую из операций. Особо не развернешься.
Я бы на этом, и закончил общение с потенциальным работодателем, поместив его в черный список )))
Строго txt - ага, xml и json - это тоже txt, только структура данных, давно придумана и общепринята. А тут , получается, изобрести велосипед надо чтоли. запятыми, и двоеточиями разделять данные файла, массив и структуру квадратными и фигурными скобками - так это итак почти json получается.
Тут хоть с практической, хоть с теоретической стороны посмотри - изврат какой то, а не проверка. Чисто, поржать над кандидатами, как они будут это делать.
(21) Вероятнее всего они и нанимают же джуна. Думаю, это чисто академическая задача. Судить о полезности такого тестового задания не стану, не компетентен. Быть может самое важное - это не решение, а то, как его представит автор.
(5) Я такого же мнения. Решил задачу и подумал, что такого говнокода быть не должно, а оказывается еще как должно(
(1) Что касается поиска объектов, то если запрещено сопоставление по ссылкам, то остается только сопоставление по реквизитам.
Если тебе поставили задачу полностью универсального механизма обмена с рекурсивной выгрузкой данных по ссылкам и поиска объектов по реквизитам, то поздравляю - тебя просят написать КД, пусть и в несколько урезанном варианте.
Мне приходилось подобное реализовать (между 1С и внешними системами). Между 1С и 1С - это мартышкин труд, учитывая наличие готовых решений.
Проблема с сопоставлением данных по реквизитам в том, что невозможно написать полностью универсальную систему, которая будет автоматически определять по каким реквизитам синхронизировать. Ибо возможны хитрые краевые случаи. Например, ничего не мешает создать справочник без кодов и наименований.
Вариантов три - или настройка реквизитов синхронизации для каждого объекта вручную, или "закладывание" на типовые случаи (справочники с уникальными кодами - по кодам, документы - по комбинации номера и даты документа и так далее). И комбинация обоих вариантов.
Ну, либо выгрузка не будет универсальной и будет иметь список оговорок по применению.
Платформа 1С 8 не позволяет получать информацию о реквизитах обычной формы. Эти функции позволят вам получать из любой обычной формы 1С 8.X массив имен ее реквизитов, а также имя ее основной реквизит.
Если будете применять в реальном времени, делайте кэширование ДокументDOM.
Функция ЛксСтрокаВнутрВХМЛТело ( вхСтрока , выхХМЛТело = Неопределено) Экспорт
// < Получение одной длинной строки
выхХМЛТело = СтрЗаменить ( вхСтрока , СИМВОЛЫ . ПС , "" );
выхХМЛТело = СтрЗаменить ( выхХМЛТело , СИМВОЛЫ . ВК , "" );
//>
// < Замена одинарных символов
выхХМЛТело = СтрЗаменить ( выхХМЛТело , "," , "" );
выхХМЛТело = СтрЗаменить ( выхХМЛТело , " выхХМЛТело = СтрЗаменить ( выхХМЛТело , ">" , "" );
//>
// < Удаляем лишние блоки и
выхХМЛТело = СтрЗаменить ( выхХМЛТело , "" , "" );
выхХМЛТело = СтрЗаменить ( выхХМЛТело , "" , "" );
//>
// < Добавляем перенос строки к и к для удобства поиска различий
выхХМЛТело = СтрЗаменить ( выхХМЛТело , "" , "" + СИМВОЛЫ . ПС );
выхХМЛТело = СтрЗаменить ( выхХМЛТело , "" , "" + СИМВОЛЫ . ПС );
//>
Функция ЛксПолучитьДокументDOMФормы ( Форма ) Экспорт
СтрокаФормы = ЗначениеВСтрокуВнутр ( Форма );
XMLСтрокаФормы = ЛксСтрокаВнутрВХМЛТело ( СтрокаФормы );
ЧтениеXML = Новый ЧтениеXML ;
ЧтениеXML . УстановитьСтроку ( XMLСтрокаФормы );
ПостроительDOM = Новый ПостроительDOM ;
ДокументDOM = ПостроительDOM . Прочитать ( ЧтениеXML );
Возврат ДокументDOM ;
Функция ЛксПолучитьXPathИмениРеквизитаВОписанииРеквизита ( ИДВерсииПлатформы = "81" )
Если ИДВерсииПлатформы = "81" Тогда
Результат = "/data[3]" ;
ИначеЕсли ИДВерсииПлатформы = "82" Тогда
Результат = "/data[4]" ;
КонецЕсли;
Возврат Результат ;
Функция ЛксПолучитьМассивИменРеквизитовФормы ( Форма , ИДВерсииПлатформы = "81" ) Экспорт
Массив = Новый Массив ;
ДокументDOM = ЛксПолучитьДокументDOMФормы ( Форма );
РазыменовательПИ = Новый РазыменовательПространствИменDOM ( ДокументDOM );
СтрокаXPath = "/elem[1]/elem[1]/elem[2]/elem[2]/elem" + ЛксПолучитьXPathИмениРеквизитаВОписанииРеквизита ( ИДВерсииПлатформы ) + "/text()" ;
РезультатXPath = ДокументDOM . ВычислитьВыражениеXPath ( СтрокаXPath , ДокументDOM ,
РазыменовательПИ , ТипРезультатаDOMXPath . НеупорядоченныйИтераторУзлов );
Пока 1 = 1 Цикл
Узел = РезультатXPath . ПолучитьСледующий ();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
Текст = Узел . ТекстовоеСодержимое ;
Длина = СтрДлина ( Текст );
Текст = Сред ( Текст , 2 , Длина - 2 );
Массив . Добавить ( Текст );
КонецЦикла;
Возврат Массив ;
Функция ЛксПолучитьИмяОсновногоРеквизитаФормы ( Форма , ИДВерсииПлатформы = "81" ) Экспорт
ДокументDOM = ЛксПолучитьДокументDOMФормы ( Форма );
РазыменовательПИ = Новый РазыменовательПространствИменDOM ( ДокументDOM );
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[1]/data[1]/text()" ;
РезультатXPath = ДокументDOM . ВычислитьВыражениеXPath ( ИмяЭлемента , ДокументDOM , РазыменовательПИ , ТипРезультатаDOMXPath . Строка );
КлючОсновногоРеквизита = РезультатXPath . СтроковоеЗначение ;
ИмяЭлемента = "/elem[1]/elem[1]/elem[2]/elem[2]/elem/elem[1]/data[1]/text()" ;
РезультатXPath = ДокументDOM . ВычислитьВыражениеXPath ( ИмяЭлемента , ДокументDOM , РазыменовательПИ ,
ТипРезультатаDOMXPath . УпорядоченныйИтераторУзлов );
Счетчик = 1 ;
Пока 1 = 1 Цикл
Узел = РезультатXPath . ПолучитьСледующий ();
Если Узел = Неопределено Тогда
Прервать;
КонецЕсли;
Если Узел . ТекстовоеСодержимое = КлючОсновногоРеквизита Тогда
Прервать;
КонецЕсли;
Счетчик = Счетчик + 1 ;
КонецЦикла;
Если Узел = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
СтрокаXPath = "/elem[1]/elem[1]/elem[2]/elem[2]/elem[" + Счетчик + "]" + ЛксПолучитьXPathИмениРеквизитаВОписанииРеквизита ( ИДВерсииПлатформы ) + "/text()" ;
РезультатXPath = ДокументDOM . ВычислитьВыражениеXPath ( СтрокаXPath , ДокументDOM , РазыменовательПИ , ТипРезультатаDOMXPath . Строка );
Длина = СтрДлина ( РезультатXPath . СтроковоеЗначение );
Возврат Сред ( РезультатXPath . СтроковоеЗначение , 2 , Длина - 2 );
Как получить имя реквизита табличной части, а именно выбранной колонки.
Задача обойти все элементы табличной части по определенному реквизиту.
Простой 1 комментарий
Пока буду использовать такой изврат.
Надеюсь что вскоре появится правильный ответ.
Ответ зависит от варианта разрабатываемого интерфейса.
Обычный интерфейс:
Элемент формы связанный с табличной частью "ТаблицаДанных" - ЭлементыФормы.ТаблицаДанных
Текущая колонка - ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка
Имя реквизита формы для колонки - ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Имя
Имя реквизита табличной части, который связан с колонкой - ЭлементыФормы.ТаблицаДанных.ТекущаяКолонка.Данные
Управляемый интерфейс
Элемент формы связанный с табличной частью "ТаблицаДанных" - Элементы.ТаблицаДанных
Текущая колонка - Элементы.ТаблицаДанных.ТекущийЭлемент
Имя реквизита формы для колонки - Элементы.ТаблицаДанных.ТекущийЭлемент.Имя
Имя реквизита табличной части, который связан с колонкой - Элементы.ТаблицаДанных.ТекущийЭлемент.ПутьКДанным (доступно только на сервере)
Но имя реквизита находится в конце данного пути, то есть необходимо разбить строку что бы получить имя реквизита. Другого варианта нет?
Верно. В обоих блоках это именно имя элемента формы.
Но имя реквизита находится в конце данного пути, то есть необходимо разбить строку что бы получить имя реквизита. Другого варианта нет?
А в чем сложность? Однотипные строки типа Таблица.Реквизит - разбивать БСП-шной функцией на массив или самостоятельно сделать поиск точки и взять подстроку от следующего за точкой символа.
А в чем сложность? Однотипные строки типа Таблица.Реквизит - разбивать БСП-шной функцией на массив или самостоятельно сделать поиск точки и взять подстроку от следующего за точкой символа.
Дмитрий Кинаш, честно говоря я считал что это костыль, а нет, видимо это фишка 1С.
Значит буду использовать свой вариант доступа, он как раз такой же как вы описали.
В обычном приложении у элемента формы 1С 8.3 было свойство "Значение", доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?
Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.
Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.
Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».
Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:
Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя.
2. Как получить значения из элементов формы 1С
Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:
Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:
…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:
Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.
Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.
Еще хочется разобрать момент, когда нам возможно увидеть состояние различающихся значений в элементе форме 1С и в объекте. Это возможно в событии элемента ОбработкаВыбора.
Например, при значении поля Контрагент - Ассоль, мы выбрали контрагента Бакалея:
Новое значение доступно как параметр процедуры ВыбранноеЗначение.
Система дает шанс что-то сделать в этой ситуации.
Специалист компании ООО «Кодерлайн»
Вас могут заинтересовать следующие статьи:
94 [PROP_CODE] => TAGS2 [TITLE] => Вас могут заинтересовать следующие семинары: ) --> 95 [PROP_CODE] => TAGS [TITLE] => Вас могут заинтересовать следующие вебинары: ) -->
Вас могут заинтересовать следующие вебинары:
Читайте также: