Так ведь вроде как у БСП есть соответствующий программный интерфейс.
https://its.1c.ru/db/bsp317doc#content:1875:hdoc
ЗаписатьСвойстваУОбъекта
Записывает дополнительные реквизиты и сведения владельцу свойств.
Изменения происходят в транзакции.
Синтаксис
Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт
Параметры
ВладелецСвойств - ЛюбаяСсылка - например, СправочникСсылка.Номенклатура, ДокументСсылка.ЗаказПокупателя и т.д.
ТаблицаСвойствИЗначений - ТаблицаЗначений:
* Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - свойство владельца.
* Значение - Произвольный - любое значение, допустимое для свойства (указано в элементе свойства).
Пример вызова
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений)
Доступность
Сервер, Толстый клиент, Внешнее соединение
По материалам документации БСП 2.4
Данная статья написана по материалам документации библиотеки стандартных подсистем 2.4.
Подсистема «Свойства» позволяет создавать и редактировать в режиме 1С:Предприятие дополнительные свойства произвольных объектов конфигурации (не внося изменения в саму конфигурацию).
Для того чтобы использовать дополнительные свойства, необходимо включить флажок Дополнительные реквизиты и сведения в разделе Администрирование – Общие настройки.
Дополнительные свойства объектов могут быть двух видов:
- дополнительные реквизиты – это свойства, которые хранятся в самом объекте (в специализированной табличной части). Дополнительные реквизиты являются неотъемлемой частью объекта, вводятся при его редактировании и доступны для редактирования тем же пользователям, которым доступен и сам объект со свойствами. Например, реквизиты вес, размеры, цвет справочника товары.
- дополнительные сведения – не являются неотъемлемыми свойствами объекта. Они, как правило, доступны для редактирования тем пользователям, которые не имеют доступа к самому объекту. При внедрении подсистемы совместно с подсистемой «Управление доступом» имеется возможность ограничивать доступ пользователей к отдельным дополнительным сведениям. Например, дата ближайшей поставки товара.
Входящие объекты в подсистему “свойства”
Общие модули
- УправлениеСвойствами
- УправлениеСвойствамиКлиент
- УправлениеСвойствамиПереопределяемый
- УправлениеСвойствамиСлужебный
Роли
- Добавление и изменение дополнительных реквизитов и сведений
- Изменение дополнительных сведений
- Чтение дополнительных сведений
Подписки на событие
- СвойстваПередУдалениемСсылочногоОбъекта – Обработчик события выполняет поиск ссылок на удаляемые объекты в таблице зависимостей дополнительных реквизитов
Функциональные опции ( Константы)
- ИспользоватьДополнительныеРеквизитыИСсведения
- ИспользоватьОбщиеДополнительныеЗначения
- ИспользоватьОбщиеДополнительныеРеквизитыИСведения
Определяемые типы данных
- ВладелецДополнительныхСведений
Общие формы
- РедактированиеГиперссылки
- РедактированиеДополнительныхСведений – Предназначен для просмотра и ввода значений дополнительных сведений. Ввод значений дополнительных сведений, как правило, осуществляется в отдельном окне, в отличие от дополнительных реквизитов. Открывается с помощью кнопки Дополнительные сведения из окон объектов программы, для которых были настроены дополнительные сведения..В списке выводится Наименование и Значение дополнительного сведения.
Общие команды ( Командная панель)
- ДополнительныеСведенияКоманднаяПанель
Справочники
- ЗначенияСвойствОбъектов ( Дополнительные значения )-В списке задаются значения дополнительных реквизитов и сведений.
- ЗначенияСвойствОбъектовИерархия (Дополнительные значения иерархия)- В списке можно использовать иерархию значений. Элементы в таком списке имеют одинаковые свойства, но могут иметь подчиненные элементы. При этом иерархия может быть довольно сложной. Можно выбрать любой элемент иерархии, в отличие от сгруппированного списка дополнительных значений, в котором наименования групп выбрать в качестве значения невозможно.
- НаборыДополнительныхРеквизитовИСведений – Предназначен для настройки наборов дополнительных свойств. Можно настроить наборы дополнительных свойств для определенных объектов программы.
Планы видов характеристик
- ДополнительныеРеквизитыИСведения
Регистры сведений
- ДополнительныеСведения – Для некоторых объектов конфигурации можно указать дополнительные сведения, состав и тип которых настраивается администратором. В регистре хранятся свойства и значений этих объектов
Программный интерфейс подсистемы “Свойства”
Программный интерфейс БСП включает в себя все экспортные процедуры и функции, которые размещены в областях кода ПрограммныйИнтерфейс.
Для удобства поиска и изучения программный интерфейс сгруппирован по подсистемам и разделен на две основные категории:
Интерфейс – экспортные процедуры и функции, которые предназначены для вызова из прикладного кода;
Переопределение – экспортные процедуры переопределяемых модулей, содержимое которых может или должно быть изменено в конфигурации-потребителе. С их помощью решаются задачи изменения поведения библиотечной функциональности, ее параметризации спецификой конфигурации-потребителя, а также для подключения библиотечной функциональности к объектам конфигурации-потребителя. Они не предназначены для вызова из прикладного кода.
Экспортные процедуры и функции, которые предназначены для вызова из прикладного кода
- ВыполнитьКоманду – Обработчик команд с форм, к которым подключены дополнительные свойства.
- ЗаписатьСвойстваУОбъекта – Записывает дополнительные реквизиты и сведения владельцу свойств. Изменения происходят в транзакции
- ЗаполнитьДополнительныеРеквизитыВФорме – Создает/пересоздает дополнительные реквизиты и элементы в форме владельца свойств.
- ЗначениеСвойства – Возвращает значение дополнительного свойства объекта.
- ЗначенияСвойств – Возвращает значения дополнительных свойств объектов.
- ИспользоватьДопРеквизиты – Проверяет, используются ли дополнительные реквизиты с объектом.
- ИспользоватьДопСведения – роверяет, используются ли дополнительные сведения объектом.
- ОбновитьЗависимостиДополнительныхРеквизитов –
Обновляет видимость, доступность и обязательность заполнения дополнительных реквизитов - ОбновитьНаименованияНаборовИСвойств – Обновляет наименования предопределенных наборов свойств, если они отличаются от текущих представлений соответствующих им объектам метаданных со свойствами. . Обновляет наименования не общих свойств, если у них уточнение отличается от наименования их набора. Устанавливает пометку удаления у не общих свойств, если установлена пометка удаления их наборов.
- ОбновитьЭлементыДополнительныхРеквизитов – Обновляет отображаемые данные на форме объекта со свойствами.
- ОбрабатыватьОповещения – Определяет, что указанное событие – это событие об изменении набора свойств.
- ОбработкаПроверкиЗаполнения – Проверяет заполненность реквизитов обязательных для заполнения.
- ПередЗаписьюВидаОбъекта – Обновляет наборы дополнительных реквизитов и сведений для вида объектов со свойствами. Используется при записи элементов справочников, которые являются видами объектов со свойствами. Например, если есть справочник Номенклатура к которому применяется подсистема Свойства, для него создан справочник ВидыНоменклатуры, то при записи элемента ВидНоменклатуры необходимо вызывать эту процедуру
- ПередЗаписьюНаСервере – Заполняет объект из реквизитов, созданных в форме. Вызывается из обработчика ПередЗаписьюНаСервере формы объекта со свойствами.
- ПеренестиЗначенияИзРеквизитовФормыВОбъект – Переносит значения свойств из реквизитов формы в табличную часть объекта
- ПослеЗагрузкиДополнительныхРеквизитов – Проверяет наличие зависимых дополнительных реквизитов на форме и, при необходимости, подключает обработчик ожидания проверки зависимостей реквизитов.
- ПриСозданииНаСервере – Создает основные реквизиты и поля формы, необходимые для работы. Заполняет дополнительные реквизиты, если используются. Вызывается из обработчика ПриСозданииНаСервере формы объекта со свойствами.
- ПриЧтенииНаСервере – Заполняет объект из реквизитов, созданных в форме. Вызывается из обработчика ПередЗаписьюНаСервере формы объекта со свойствами.
- ПроверитьСвойствоУОбъекта — Проверяет, есть ли у объекта свойство.
- СвойстваОбъекта – Возвращает дополнительные реквизиты и сведения у указанного объекта.
- СтруктураПараметровНабораСвойств – Получает структуру параметров для набора свойств.
- УдалитьСтарыеРеквизитыИЭлементы – Удаляет старые реквизиты и элементы формы.
- УстановитьПараметрыНабораСвойств – Устанавливает параметры набора свойств.
Экспортные процедуры переопределяемой модули
- ЗаполнитьНаборыСвойствОбъекта – Заполняет наборы свойств объекта. Обычно требуется, если наборов более одного.
Порядок настройки объектов с дополнительными реквизитами
1. Создать табличную часть ДополнительныеРеквизиты с реквизитами:
Имя | Тип | Подсказка |
Свойство | ПланВидовХарактеристикСсылка. Дополнительные РеквизитыИ Сведения | Дополнительный реквизит |
Значение | Характеристика. Дополнительные Реквизиты И Сведения | Значение дополнительного реквизита |
ТекстоваяСтрока | Строка неограниченной длины | Полный текст строкового дополнительного реквизита |
2. Реквизиту Значение в свойстве Связи параметров выбора установить связь: Отбор.Владелец(ДополнительныеРеквизиты.Свойство).
3 . В форме объекта рекомендуется создать специальную группу полей или страницу с наименованием ГруппаДополнительныеРеквизиты для размещения элементов управления, редактирующих свойства объекта.
4. В обработчике события ПриСозданииНаСервере формы объекта необходимо выполнить вызов:
// СтандартныеПодсистемы.Свойства
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты");
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
// Конец СтандартныеПодсистемы.Свойства
где ГруппаДополнительныеРеквизиты – имя группы формы, созданной на шаге 3, в которой будут располагаться поля формы, предназначенные для редактирования дополнительных реквизитов. Если этот параметр не указывать, то элементы управления для редактирования свойств будут размещаться в нижней части формы.
5. В некоторых случаях возникает необходимость размещать дополнительные реквизиты в разных местах формы, например, когда в форме с несколькими страницами на каждой из них выводится свой набор свойств. В таком случае в параметр ИмяЭлементаДляРазмещения необходимо передать список значений, где значение – ссылка на предопределенный набор свойств, а представление – имя группы формы, в которую выводить его реквизиты. Например, в форме объекта справочника _ДемоКонтрагенты:
Вот фрагмент программного кода обработчика события ПриСозданииНаСервере в этой форме объекта :
СправочникНаборы = Справочники.НаборыДополнительныхРеквизитовИСведений;
ГруппыДляРазмещения = Новый СписокЗначений;
ГруппыДляРазмещения.Добавить(СправочникНаборы.СправочникДемоКонтрагентыОсновное, Элементы.ГруппаОсновное.Имя);
ГруппыДляРазмещения.Добавить("ВсеОстальные", Элементы.ГруппаПрочее.Имя);
ДополнительныеПараметры = Новый Структура;
ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", ГруппыДляРазмещения);
УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект,ДополнительныеПараметры);
Значение ВсеОстальные в группах для размещения указывает, куда выводить дополнительные реквизиты тех наборов, которые не перечислены в данном списке.
При использования формы для работы с разными объектами следует передать параметр ПроизвольныйОбъект со значением Истина и в дальнейшем вызывать процедуру ОбновитьЭлементыДополнительныхРеквизитов для разных объектов.
6. В модуле формы каждого объекта со свойствами необходимо добавить процедуру:
#Область ОбработчикиКомандФормы
...
// СтандартныеПодсистемы.Свойства
&НаКлиенте
Процедура Подключаемый_СвойстваВыполнитьКоманду(ЭлементИлиКоманда, НавигационнаяСсылка = Неопределено, СтандартнаяОбработка = Неопределено) УправлениеСвойствамиКлиент.ВыполнитьКоманду(ЭтотОбъект, ЭлементИлиКоманда, СтандартнаяОбработка);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства #КонецОбласти
7. В обработчике события ОбработкаОповещения добавить код:
// СтандартныеПодсистемы.Свойства
Если УправлениеСвойствамиКлиент.ОбрабатыватьОповещения(ЭтотОбъект, ИмяСобытия, Параметр) Тогда
ОбновитьЭлементыДополнительныхРеквизитов(); УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
8. В обработчике события ПриОткрытии добавить код:
// СтандартныеПодсистемы.Свойства УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект); // Конец СтандартныеПодсистемы.Свойства
9. Добавить вспомогательные процедуры:
#Область СлужебныеПроцедурыИФункции
// СтандартныеПодсистемы.Свойства
&НаСервере Процедура ОбновитьЭлементыДополнительныхРеквизитов() УправлениеСвойствами.ОбновитьЭлементыДополнительныхРеквизитов(ЭтотОбъект); КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗависимостиДополнительныхРеквизитов() УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриИзмененииДополнительногоРеквизита(Элемент) УправлениеСвойствамиКлиент.ОбновитьЗависимостиДополнительныхРеквизитов(ЭтотОбъект);
КонецПроцедуры
// Конец СтандартныеПодсистемы.Свойства
11111111111111111111 #КонецОбласти
10. В обработчике события ПриЧтенииНаСервере добавить код:
// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПриЧтенииНаСервере(ЭтотОбъект, ТекущийОбъект);
// Конец СтандартныеПодсистемы.Свойства
11. В обработчике события ОбработкаПроверкиЗаполненияНаСервере добавить код:
// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ОбработкаПроверкиЗаполнения(ЭтотОбъект, Отказ, ПроверяемыеРеквизиты); // Конец СтандартныеПодсистемы.Свойства
12. В обработчике события ПередЗаписьюНаСервере добавить код:
// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПередЗаписьюНаСервере(ЭтотОбъект, ТекущийОбъект);
// Конец СтандартныеПодсистемы.Свойства
Порядок настройки отложенной инициализации дополнительных реквизитов
Дополнительные реквизиты, расположенные на отдельной странице (закладке) формы, необходимо загружать отложенно. Это позволит существенно ускорить открытие форм.
Важно! При отложенной инициализации будет невозможно выполнить перемещение дополнительных реквизитов при помощи команды Изменить форму из группы, в которой они расположены.
1. В обработчике события ПриСозданииНаСервере формы объекта, в блоке кода:
// СтандартныеПодсистемы.Свойства
ДополнительныеПараметры = Новый Структура; ДополнительныеПараметры.Вставить("ИмяЭлементаДляРазмещения", "ГруппаДополнительныеРеквизиты"); УправлениеСвойствами.ПриСозданииНаСервере(ЭтотОбъект, ДополнительныеПараметры);
// Конец СтандартныеПодсистемы.Свойства
дополнить структуру новым параметром ОтложеннаяИнициализация:
ДополнительныеПараметры.Вставить("ОтложеннаяИнициализация", Истина);
2. В обработчике ПриСменеСтраницы группы страниц, в которой выводятся дополнительные реквизиты, добавить код:
// СтандартныеПодсистемы.Свойства
Если ЭтотОбъект.ПараметрыСвойств.Свойство(ТекущаяСтраница.Имя) И Не ЭтотОбъект.ПараметрыСвойств.ВыполненаОтложеннаяИнициализация Тогда СвойстваВыполнитьОтложеннуюИнициализацию(); УправлениеСвойствамиКлиент.ПослеЗагрузкиДополнительныхРеквизитов(ЭтотОбъект);
КонецЕсли;
// Конец СтандартныеПодсистемы.Свойства
3. Добавить вспомогательную процедуру:
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура СвойстваВыполнитьОтложеннуюИнициализацию() УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект); КонецПроцедуры
#КонецОбласти
Порядок настройки объектов с дополнительными сведениями
- Достаточно перечислить типы объектов с дополнительными сведениями в составе определяемого типа ВладелецДополнительныхСведений. Поддерживаемые типы объектов – документы, справочники, планы видов характеристик, планы счетов, планы видов расчета, бизнес-процессы и задачи.
Порядок настройки динамических списков
Для возможности отображения дополнительных реквизитов и сведений в формах списков объектов со свойствами необходимо добавить поле Ссылка из запроса динамического списка в таблицу формы, связанную с этим динамическим списком. При этом добавленное поле Ссылка следует по умолчанию скрыть от пользователей, сняв флаг Видимость в свойстве Пользовательская видимость.
Порядок настройки наборов свойств объектов
В большинстве случаев достаточно одного набора свойств для объекта метаданных, например, у всех элементов справочника товаров должны быть такие свойства, как вес, размеры, цвет и т.д. Для этого необходимо:
1. В справочнике НаборыДополнительныхРеквизитовИСведений создать предопределенный элемент с именем Справочник_<ИмяОбъекта>, если объект – справочник, например:
Справочник__ДемоКонтрагенты, или Документ_<ИмяОбъекта>, если объект – документ, например : Документ_АвансовыйОтчет. Наименование элемента при этом заполнять не требуется (оно будет заполнено автоматически на основании представления списка того объекта, к которому относится данный элемент).
2. Добавить в обработчике обновления информационной базы вызов процедуры УстановитьПараметрыНабораСвойствобщего модуля УправлениеСвойствами для заполнения настроек добавленного набора свойств.
3. В обработчике ПередЗаписью модуля объекта этого справочника выполнить вызов УправлениеСвойствами.ПриЗаписиВидаОбъекта и передать туда в качестве параметров записываемый объект и имя набора свойств, например:
// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПередЗаписьюВидаОбъекта(ЭтотОбъект, "Справочник_ДемоНоменклатура");
// Конец СтандартныеПодсистемы.Свойства
Если справочник группирует объекты более чем одного типа, следует сделать два или более вызова, указав имена используемых реквизитов, например:
// СтандартныеПодсистемы.Свойства УправлениеСвойствами.ПередЗаписьюВидаОбъекта(ЭтотОбъект, "Справочник_ДемоОшибки","НаборСвойствОшибок"); УправлениеСвойствами.ПередЗаписьюВидаОбъекта(ЭтотОбъект, "Справочник_ДемоЗадачи","НаборСвойствЗадач");
// Конец СтандартныеПодсистемы.Свойства
4. В объекте – владельце свойств создать реквизит, значения которого определяют применение того или иного набора свойств для конкретного экземпляра объекта. Для справочника _ДемоНоменклатура это реквизит ВидНоменклатуры типа СправочникСсылка._ДемоВидыНоменклатуры.
5. В модуле формы объекта реализовать обработчик ПриИзменении для элемента формы, редактирующего этот реквизит. Для справочника _ДемоНоменклатура это обработчик:
&НаКлиенте
Процедура ВидНоменклатурыПриИзменении(Элемент) ОбновитьЭлементыДополнительныхРеквизитов();
КонецПроцедуры
6. В процедуре ЗаполнитьНаборыСвойствОбъекта общего модуля УправлениеСвойствамиПереопределяемый вставить условие, заполняющее набор свойств для конкретного объекта. Например, для _ДемоНоменклатура это следующее условие:
Процедура ЗаполнитьНаборыСвойствОбъекта(Объект, ТипСсылки, НаборыСвойств, СтандартнаяОбработка, КлючНазначения) Экспорт
Если ТипСсылки = Тип("СправочникСсылка._ДемоНоменклатура") Тогда ЗаполнитьНаборСвойствПоВидуНоменклатуры( Объект, ТипСсылки, НаборыСвойств);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьНаборСвойствПоВидуНоменклатуры(Номенклатура, ТипСсылки, НаборыСвойств)
Если ТипЗнч(Номенклатура) = ТипСсылки Тогда Номенклатура = ОбщегоНазначения.ЗначенияРеквизитовОбъекта( Номенклатура, "ЭтоГруппа, ВидНоменклатуры");
КонецЕсли;
Если Номенклатура.ЭтоГруппа = Ложь Тогда
Строка = НаборыСвойств.Добавить();
Строка.Набор = ОбщегоНазначения.ЗначениеРеквизитаОбъекта( Номенклатура.ВидНоменклатуры, "НаборСвойств");
КонецЕсли;
КонецПроцедуры
Если справочник группирует объекты более чем одного типа, следует вписать в условие несколько типов, например:
Если ТипСсылки = Тип("СправочникСсылка._ДемоОшибки") ИЛИ ТипСсылки = Тип("СправочникСсылка._ДемоЗадачи") Тогда ЗаполнитьНаборСвойствПоПроекту( Объект, ТипСсылки, НаборыСвойств); КонецЕсли;
7. В справочнике НаборыДополнительныхРеквизитовИСведений создать предопределенную группу с именем Справочник_<ИмяОбъекта>, если объект – справочник: Документ_<ИмяОбъекта>, если объект – документ, и т. д. Например, для справочника _ДемоНоменклатура создана предопределенная группа Справочник__ДемоНоменклатура. Наименование элемента при этом заполнять не требуется (оно будет заполнено автоматически на основании представления списка того объекта, к которому относится данный элемент).
8. Добавить в обработчике обновления информационной базы вызов процедуры УстановитьПараметрыНабораСвойствобщего модуля УправлениеСвойствами для заполнения настроек добавленного набора свойств.
Порядок настройки объектов с несколькими объединяющимися наборами свойств
Наборы свойств при этом должны объединяться в зависимости от тех или иных реквизитов объекта. Например, в справочнике партнеры могут быть введены клиенты, поставщики, конкуренты и партнеров, с которыми связывают прочие отношения. При этом один и тот же партнер может одновременно быть и тем, и другим, и третьим, а его дополнительные свойства должны динамически выводиться в зависимости от того, каких он типов.
В демонстрационной конфигурации этот вариант показан на справочнике _ДемоПартнеры. В нем введены реквизиты Клиент, Поставщик, Конкурент, ПрочиеОтношения типа Булево, которые и определяют применение одного или сразу нескольких наборов свойств.
При этом подходе справочник имеет один предопределенный набор свойств для всех экземпляров объектов, а также несколько предопределенных наборов свойств, которые могут применяться к экземплярам данного объекта по тем или иным условиям.
Последовательность настройки такого объекта:
1. Принять решение по поводу наборов свойств объекта. Например, для справочника _ДемоПартнеры демонстрационной конфигурации это четыре набора свойств: реквизиты Клиент, Поставщик, Конкурент, ПрочиеОтношения.
2. Выявить реквизиты объекта, значения которых определяют применение того или иного набора свойств для конкретного экземпляра объекта. Например, для справочника _ДемоПартнеры демонстрационной конфигурации это реквизиты Клиент,Поставщик, Конкурент, ПрочиеОтношения.
3. В справочнике НаборыДополнительныхРеквизитовИСведений создать предопределенную группу с именем Справочник_<ИмяОбъекта>, если объект – справочник; Документ_<ИмяОбъекта>, если объект – документ, и т. д. Например, Справочник_Контрагенты. Наименование элемента при этом заполнять не требуется (оно будет заполнено автоматически на основании представления списка того объекта, к которому относится данный элемент).
4. В этой предопределенной группе для каждого из наборов свойств создать предопределенный элемент с именами Справочник_<ИмяОбъекта>_<ИмяНабораСвойств>, например Справочник_Партнеры_Клиенты. Прим этом наименование элемента следует задавать краткое, например Клиенты; оно не должно содержать имя и тип объекта метаданных.
5. В этой предопределенной группе создать предопределенный элемент с именем Справочник_<ИмяОбъекта>_Общие и наименованием Общие, который будет содержать общие свойства для всех объектов.
6. В общем модуле УправлениеСвойствамиПереопределяемый в процедуре ЗаполнитьНаборыСвойствОбъекта следует вписать условие для данного типа объектов. Для справочника _ДемоПартнеры это код вида:
Процедура ЗаполнитьНаборыСвойствОбъекта(Объект, ТипСсылки, НаборыСвойств, СтандартнаяОбработка) Экспорт
Если ТипСсылки = Тип("СправочникСсылка._ДемоПартнеры") Тогда ЗаполнитьНаборыСвойствПартнера(Объект, ТипСсылки, НаборыСвойств); КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьНаборыСвойствПартнера(Партнер, ТипСсылки, НаборыСвойств) Если ТипЗнч(Партнер) = ТипСсылки Тогда
Объект = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Партнер, "Клиент, Конкурент, Поставщик, ПрочиеОтношения, ЭтоГруппа");
Иначе
Объект = Партнер;
КонецЕсли;
Если Объект.ЭтоГруппа = Ложь Тогда
Строка = НаборыСвойств.Добавить();
Строка.Набор = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Партнеры_Общие;
Строка.Отображение = ОтображениеОбычнойГруппы.Линия; Строка.ОтображатьЗаголовок = Истина;
Строка.Заголовок = НСтр("ru = 'Для всех партнеров'");
Если Объект.Клиент Тогда
Строка = НаборыСвойств.Добавить();
Строка.Набор = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Партнеры_Клиенты;
Строка.Отображение = ОтображениеОбычнойГруппы.Линия; Строка.ОтображатьЗаголовок = Истина;
Строка.Заголовок = НСтр("ru = 'Для клиентов'");
КонецЕсли;
КонецПроцедуры
В приведенном примере проверяются значения реквизитов справочника Клиент, Поставщик, Конкурент, ПрочиеОтношения и наборы свойств добавляются в таблицу НаборыСвойств. В поле Набор устанавливается ссылка на набор свойств, а в остальные поля могут быть установлены значения оформления набора в форме.
7. В форме объекта необходимо реализовать обработчики ПриИзменении для тех реквизитов, которые определят состав наборов свойств, применяемых для данного экземпляра объекта. Например, для формы справочника _ДемоПартнеры это обработчики вида:
&НаКлиенте
Процедура КлиентПриИзменении(Элемент)
// СтандартныеПодсистемы.Свойства ОбновитьЭлементыДополнительныхРеквизитов();
// Конец СтандартныеПодсистемы.Свойства
КонецПроцедуры
Как программно записать свойство в доп. реквизит?
Имеется доп. реквизит X. Тип — «Дополнительное значение». Необходимо проверить, есть ли у реквизита свойство. Если такого нет, то автоматически создается.
СвойствоДляЗаписи = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("X");
Дальше пытался найти методы для записи — не нашел.
-
Вопрос заданболее года назад
-
1450 просмотров
НовЗнчСв = Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
НовЗнчСв.Владелец = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Название");
НовЗнчСв.Наименование = "Значение";
НовЗнчСв.Записать();
Пригласить эксперта
Если типовые конфигурации, как рекомендация использовать возможности БСП
ЗаписатьСвойстваУОбъекта
Записывает дополнительные реквизиты и сведения владельцу свойств.
Изменения происходят в транзакции.
Синтаксис
Процедура ЗаписатьСвойстваУОбъекта(ВладелецСвойств, ТаблицаСвойствИЗначений) Экспорт
-
Показать ещё
Загружается…
24 мар. 2023, в 01:16
500 руб./за проект
24 мар. 2023, в 01:12
1000 руб./за проект
24 мар. 2023, в 00:28
2000 руб./за проект
Минуточку внимания
Код процедуры следующий:
ВидНом = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(«Товар»);
ЕдИзм = Справочники.ЕдиницыИзмерения.НайтиПоКоду(«796»);
Для НомерСтроки = 1 По Объект.ДанныеДляСоздания.ВысотаТаблицы Цикл
ОбластьНаименованиеАнгл = Объект.ДанныеДляСоздания.Область(НомерСтроки, 1); //1.Наименование для закупщикв
НаименованиеАнгл = ОбластьНаименованиеАнгл.Текст;
ОбластьНаименованиеВРозн = Объект.ДанныеДляСоздания.Область(НомерСтроки, 3); //3.Наименование в рознице
НаименованиеВРозн = ОбластьНаименованиеВРозн.Текст;
ОбластьКлючСинхронизации = Объект.ДанныеДляСоздания.Область(НомерСтроки, 4); //4. Ключ синхронизации м/у базами
КлючСинхронизации = ОбластьКлючСинхронизации.Текст; //4. Код номенклатуры в другой базе
СпрНом = Справочники.Номенклатура.СоздатьЭлемент();
СпрНом.Наименование = НаименованиеАнгл;
СпрНом.НаименованиеПолное = НаименованиеАнгл;
СпрНом.ВидНоменклатуры = ВидНом;
СпрНом.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
СпрНом.ЕдиницаДляОтчетов = ЕдИзм;
СпрНом.ЕдиницаИзмерения = ЕдИзм;
СпрНом.Записать();
НаимРеквРозн = «Наменование в рознице (Справочник «»Номенклатура»» (Общие))»;
НаимКлючСинх = «Ключ синхронизации с другой базой (Справочник «»Номенклатура»» (Общие))»;
// Получаем ссылку на документ
СпрНомДопРекв = СпрНом.Ссылка;
//Получаем ссылку на доп реквизит
//ДопРеквизитПроверено = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«Заголовок», «Проверено»);
//ДопРеквизитВремяРазбора = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«Заголовок», «Время разбора»);
ДопРеквНаимРозн = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НаимРеквРозн);
ДопНаимКлючСинх = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(НаимКлючСинх);
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить(«Свойство», Новый ОписаниеТипов(«ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения»));
ТаблицаДопРеквизитов.Колонки.Добавить(«Значение»);
НовыйРекизит = ТаблицаДопРеквизитов.Добавить();
НовыйРекизит.Свойство = ДопРеквНаимРозн;
НовыйРекизит.Значение = НаименованиеВРозн;
НовыйРекизит = ТаблицаДопРеквизитов.Добавить();
НовыйРекизит.Свойство = ДопНаимКлючСинх;
НовыйРекизит.Значение = КлючСинхронизации;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СпрНомДопРекв,ТаблицаДопРеквизитов);
Создавать то он создает элементы номенклатуры, а вот доп реквизиты не создает и не записыват…
Процедура ЗаписатьСвойстваУОбъекта(…) из общего модуля УТ
ТаблицаДопРеквизитов = Новый ТаблицаЗначений;
ТаблицаДопРеквизитов.Колонки.Добавить(«Свойство», Новый ОписаниеТипов(«ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения»));
ТаблицаДопРеквизитов.Колонки.Добавить(«Значение»);
ТаблицаДопСведений = ТаблицаДопРеквизитов.СкопироватьКолонки();
Для Каждого СтрокаТаблицыСвойств Из ТаблицаСвойствИЗначений Цикл
Если СтрокаТаблицыСвойств.Свойство.ЭтоДополнительноеСведение Тогда
НоваяСтрока = ТаблицаДопСведений.Добавить();
Иначе
НоваяСтрока = ТаблицаДопРеквизитов.Добавить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицыСвойств, «Свойство,Значение»);
КонецЦикла;
ЕстьДопРеквизиты = ТаблицаДопРеквизитов.Количество() > 0;
ЕстьДопСведения = ТаблицаДопСведений.Количество() > 0;
МассивСвойств = ПолучитьСписокСвойств(ВладелецСвойств);
МассивДопРеквизитов = Новый Массив;
МассивДопСведений = Новый Массив;
Для Каждого ДопСвойство Из МассивСвойств Цикл
Если ДопСвойство.ЭтоДополнительноеСведение Тогда
МассивДопСведений.Добавить(ДопСвойство);
Иначе
МассивДопРеквизитов.Добавить(ДопСвойство);
КонецЕсли;
КонецЦикла;
НачатьТранзакцию(РежимУправленияБлокировкойДанных.Управляемый);
Если ЕстьДопРеквизиты Тогда
ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект();
ЗаблокироватьДанныеДляРедактирования(ВладелецСвойствОбъект.Ссылка);
Для Каждого ДопРеквизит Из ТаблицаДопРеквизитов Цикл
Если МассивДопРеквизитов.Найти(ДопРеквизит.Свойство) = Неопределено Тогда
Продолжить;
КонецЕсли;
МассивСтрок = ВладелецСвойствОбъект.ДополнительныеРеквизиты.НайтиСтроки(Новый Структура(«Свойство», ДопРеквизит.Свойство));
Если МассивСтрок.Количество() Тогда
СтрокаСвойства = МассивСтрок[0];
Иначе
СтрокаСвойства = ВладелецСвойствОбъект.ДополнительныеРеквизиты.Добавить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(СтрокаСвойства, ДопРеквизит, «Свойство,Значение»);
КонецЦикла;
ВладелецСвойствОбъект.Записать();
КонецЕсли;
Если ЕстьДопСведения Тогда
Для Каждого ДопСведение Из ТаблицаДопСведений Цикл
Если МассивДопСведений.Найти(ДопСведение.Свойство) = Неопределено Тогда
Продолжить;
КонецЕсли;
МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Объект = ВладелецСвойств;
МенеджерЗаписи.Свойство = ДопСведение.Свойство;
МенеджерЗаписи.Значение = ДопСведение.Значение;
МенеджерЗаписи.Записать(Истина);
КонецЦикла;
КонецЕсли;
ЗафиксироватьТранзакцию();
Что я не так сделал, подскжите пожалуйста…
Использование дополнительных реквизитов и сведений¶
Использование дополнительных реквизитов и сведений в БП 2.0¶
- Справочник ЗначенияСвойствОбъектов
- План видов характеристик НазначенияСвойствКатегорийОбъектов
- План видов характеристик СвойстваОбъектов
- Регистр сведений ЗначенияСвойствОбъектов
Использование дополнительных реквизитов и сведений в БП 3.0, УТ11,..¶
- План видов характеристик ДополнительныеРеквизитыИСведения
- Справочник ЗначенияСвойствОбъектов (Дополнительные значения)
- Справочник ЗначенияСвойствОбъектовИерархия (Дополнительные значения (иерархия))
- Справочник НаборыДополнительныхРеквизитовИСведений
- Регистр сведений ДополнительныеСведения
- Табличная часть «Дополнительные реквизиты» справочников и документов
Использование для разных доп.реквизитов единого набора Значений дополнительных реквизитов.
Для этого для дополнительного реквизита (ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения) установить реквизит ВладелецДополнительныхЗначений = [ПВХ.ДРС владелец Значениий доп.реквизитов]
Примеры работы¶
//Получение доп.реквизита при выгрузке ЗначениеДопРеквизита = УправлениеСвойствами.ЗначениеСвойства(ДанныеИБ.Ссылка, "ДокументПолучен_1571e91ee3854e3e93c31762011f3a4d"); AdditionalInfoВставить(ДанныеXDTO, "ОригиналПолучен", ЗначениеЗаполнено(ЗначениеДопРеквизита));
//получение доп.реквизита для объекта "Источник" ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Серия", Истина); НайденнаяСтрока = Источник.ДополнительныеРеквизиты.Найти(ЭлементПВХ, "Свойство");
//УТ11 //Доп.сведение ЭлементПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Тип", Истина); МассивСвойств = новый массив; МассивСвойств.Добавить(ЭлементПВХ); ТаблицаСвойств = УправлениеСвойствами.ПолучитьЗначенияСвойств(Источник, ложь, истина, МассивСвойств); НайденнаяСтрока = ТаблицаСвойств.Найти(ЭлементПВХ, "Свойство"); Если не НайденнаяСтрока = Неопределено Тогда Значение = НайденнаяСтрока.Значение; КонецЕсли;
//Проверим и создадим строковый доп. реквизит к справочнику Номенклатура &НаСервере функция ПроверитьДобавитьСтроковыйДопРеквизитДляНоменклатуры(ИмяРеквизита, ДлинаСтроки=0) //ищем доп. реквизит по заголовку ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита); Если ЭлПВХ_Ссылка.Пустая() Тогда //если не найдено, то создадим новый ЭлПВХ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент(); ЭлПВХ.Заголовок = ИмяРеквизита; ЭлПВХ.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура; ЭлПВХ.Наименование = ЭлПВХ.Заголовок+" ("+ЭлПВХ.НаборСвойств+")"; ЭлПВХ.ТипЗначения = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(ДлинаСтроки)); ЭлПВХ.Записать(); ЭлПВХ_Ссылка = ЭлПВХ.Ссылка; КонецЕсли; //проверим, что реквизит указан в наборе доп. реквизитов заказа покупателя НаборОб = Справочники.НаборыДополнительныхРеквизитовИСведений.Справочник_Номенклатура.ПолучитьОбъект(); Если НаборОб.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство") = Неопределено Тогда //добавим реквизит в набор СтрНаборОб = НаборОб.ДополнительныеРеквизиты.Добавить(); СтрНаборОб.Свойство = ЭлПВХ_Ссылка; КонецЕсли; Если НаборОб.Модифицированность() Тогда //запишем при необходимости НаборОб.Записать(); КонецЕсли; Возврат ЭлПВХ_Ссылка; КонецФункции
//Установка доп.реквизита Объекта &НаСервере Процедура УстановитьДополнительныйРеквизитОбъекта(Объект, ИмяРеквизита, ЗначениеРеквизита) ЭлПВХ_Ссылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок",ИмяРеквизита); Если ЭлПВХ_Ссылка.Пустая() Тогда Сообщить("Не найден доп. реквизит "+ИмяРеквизита+", значение не установлено!"); Возврат; КонецЕсли; СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Найти(ЭлПВХ_Ссылка, "Свойство"); Если СтрДопРеквизиты = Неопределено Тогда СтрДопРеквизиты = Объект.ДополнительныеРеквизиты.Добавить(); КонецЕсли; СтрДопРеквизиты.Свойство = ЭлПВХ_Ссылка; СтрДопРеквизиты.Значение = ЗначениеРеквизита; КонецПроцедуры
Установка доп.сведения Объекта¶
&НаСервереБезКонтекста Функция ЗаписатьЗначениеДополнительногоСведения(Объект, Свойство, Значение) Попытка УстановитьПривилегированныйРежим(Истина); НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Объект.Установить(Объект); НаборЗаписей.Отбор.Свойство.Установить(Свойство); НоваяСтрокаНабора = НаборЗаписей.Добавить(); НоваяСтрокаНабора.Объект = Объект; НоваяСтрокаНабора.Свойство = Свойство; НоваяСтрокаНабора.Значение = Значение; НаборЗаписей.Записать(); Возврат Истина; Исключение Возврат Ложь; КонецПопытки; КонецФункции
Поиск Объекта по значению доп.сведения¶
&НаСервереБезКонтекста Функция НайтиОбъектПоДопСведениюСервере(Свойство, Значение) Рез = неопределено; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ДополнительныеСведения.Объект КАК Объект |ИЗ | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения |ГДЕ | ДополнительныеСведения.Свойство = &Свойство | И ДополнительныеСведения.Значение = &Значение"; Запрос.УстановитьПараметр("Значение", Значение); Запрос.УстановитьПараметр("Свойство", Свойство); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Если ВыборкаДетальныеЗаписи.Следующий() Тогда Рез = ВыборкаДетальныеЗаписи.Объект; КонецЕсли; Возврат Рез; КонецФункции
Снятие ограничения в 150 символов на длину наименования для дополнительных значений (Справочник.ЗначенияСвойствОбъектов)¶
https://its.1c.ru/db/v8std#content:746:hdoc
#Область ОбработчикиСобытий Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка) Поля.Добавить("Наименование"); Поля.Добавить("ПолноеНаименование"); СтандартнаяОбработка = Ложь; КонецПроцедуры Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) //ЛокализацияКлиентСервер.ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка); // 1cmanager.ru Снимаем ограничение на длину наименования в 150 символов Представление = ?(ПустаяСтрока(Данные.ПолноеНаименование), Данные.Наименование, Данные.ПолноеНаименование); СтандартнаяОбработка = Ложь; КонецПроцедуры #КонецОбласти
Запись дополнительных реквизитов (БСП)¶
ТаблицаСвойств = Новый ТаблицаЗначений; ТаблицаСвойств.Колонки.Добавить("Свойство"); ТаблицаСвойств.Колонки.Добавить("Значение"); НоваяСтрока = ТаблицаСвойств.Добавить(); НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "СерияДатаУтилизацииОбразца"); НоваяСтрока.Значение = ТекущаяДатаСеанса(); НоваяСтрока = ТаблицаСвойств.Добавить(); НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "СерияОтветственныйЗаУтилизацию"); НоваяСтрока.Значение = ПараметрыСеанса.ТекущийПользователь; Для каждого СерияСсылка из МассивСерий Цикл УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(СерияСсылка, ТаблицаСвойств); КонецЦикла;
-
здравствуйте! Есть справочник — «Номенклатура». В виде номенклатуры добавлен дополнительный реквизит — «ГОСТ». Нужно из поля — «Описание» перенести данные в доп. реквизит.
делаю так:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Код КАК Код, | Номенклатура.Наименование КАК Наименование, | Номенклатура.Описание КАК Описание |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Описание <> &Описание"; Запрос.УстановитьПараметр("Описание", ""); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование).ПолучитьОбъект(); МояНоменклатура.Описание = ""; МояНовыйРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ГОСТ"); МояНовыйРеквизит.Значение = ВыборкаДетальныеЗаписи.Описание; МояНоменклатура.Записать(); Сообщить(МояНоменклатура.Наименование + " " + ВыборкаДетальныеЗаписи.Описание) КонецЦикла;
ругается вот так:
Значение не является значением объектного типа (Значение)
МояНовыйРеквизит.Значение = ВыборкаДетальныеЗаписи.Описание;подскажите, как обратиться к доп. реквизиту и записать в него данные?
-
Offline
1cUserAndrew
Профессионал в 1С
Команда форума- Регистрация:
- 27 май 2010
- Сообщения:
- 5.151
- Симпатии:
- 217
- Баллы:
- 104
Значения дополнительных реквизитов хранятся в табличной части справочника.
Т.е. для того, чтобы установить значение доп.реквизита элементу номенклатуры, Вам надо в табличную часть «ДополнительныеРеквизиты» добавить строку (или изменить значение в имеющейся строке, если она уже есть).Лучше всего, воспользоваться процедурами общих модулей.
Для установки значения доп. реквизита я не нашел в свое время процедуры, которая бы просто установила переданное значение доп.реквизита. Нашел только такую, которая принимает на вход специально подготовленную таблицу. Ее и использовал, предварительно написав свою:Процедура УстановитьЗначениеДопСвойства(ВладелецСвойства, Свойство, ЗначениеСвойства) Экспорт Если ТипЗнч(Свойство) = Тип("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения") Тогда ДопСвойство = Свойство; Иначе ДопСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", Свойство); КонецЕсли; Если НЕ ЗначениеЗаполнено(ДопСвойство) Тогда Возврат; КонецЕсли; ТаблицаСвойствИЗначений = Новый ТаблицаЗначений; ТаблицаСвойствИЗначений.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); ТаблицаСвойствИЗначений.Колонки.Добавить("Значение"); СтрокаСвойств = ТаблицаСвойствИЗначений.Добавить(); СтрокаСвойств.Свойство = ДопСвойство; СтрокаСвойств.Значение = ЗначениеСвойства; УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ВладелецСвойства, ТаблицаСвойствИЗначений); КонецПроцедуры
Вызываете эту процедуру, передав соответствующие параметры:
ВладелецСвойства — ваша номенклатура;
Свойство — доп.реквизит, который хотите установить (передать можно либо ссылку на элемент плана видов характеристик, либо имя для разработчика, которое указано в пользовательском режиме для данного доп.реквизита);
ЗначениеСвойства — значение доп.реквизита.Т.е. в Вашем случае вместо строки
МояНовыйРеквизит.Значение = ВыборкаДетальныеЗаписи.Описание;
напишите
УстановитьЗначениеДопСвойства(МояНоменклатура, МояНовыйРеквизит, ВыборкаДетальныеЗаписи.Описание)
Последнее редактирование: 16 июн 2019 -
ругается в Общем модуле УправлениеСвойствами.
{ОбщийМодуль.УправлениеСвойствами.Модуль(1168)}: Метод объекта не обнаружен (ПолучитьОбъект) ВладелецСвойствОбъект = ВладелецСвойств.ПолучитьОбъект();
-
Offline
1cUserAndrew
Профессионал в 1С
Команда форума- Регистрация:
- 27 май 2010
- Сообщения:
- 5.151
- Симпатии:
- 217
- Баллы:
- 104
Точно ссылку на номенклатуру передаете?
-
вот так:
МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование).ПолучитьОбъект();
МояНовыйРеквизит = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«ГОСТ»);
УстановитьЗначениеДопСвойства(МояНоменклатура, МояНовыйРеквизит, ВыборкаДетальныеЗаписи.Описание); -
Offline
1cUserAndrew
Профессионал в 1С
Команда форума- Регистрация:
- 27 май 2010
- Сообщения:
- 5.151
- Симпатии:
- 217
- Баллы:
- 104
Ну да, я не заметил сразу, что Вы передаете не ссылку, а объект.
Уберите получение объекта номенклатуры.МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование);
— Объединение сообщений, 16 июн 2019 —
Вообще, поиск номенклатуры по наименованию — это лишнее.
Вместо наименования в Вашем запросе можно саму ссылку выбирать. -
теперь ругается на МояНоменклатура.Записать();
{Обработка.ЗаполнениеГОСТизОписания.Форма.Форма.Форма(53)}: Метод объекта не обнаружен (Записать) МояНоменклатура.Записать();
а если закоментить, то процедура выполняется, но ни чего не сохраняется
-
Offline
1cUserAndrew
Профессионал в 1С
Команда форума- Регистрация:
- 27 май 2010
- Сообщения:
- 5.151
- Симпатии:
- 217
- Баллы:
- 104
Верно, записывать не надо. Запись выполнится в той процедуре.
Почему не сохраняется, сложно сказать.
Проверьте настройки вашего доп.реквизита (в пользовательском режиме). В частности его тип значения. Я так понимаю, тип должен быть строковый, раз вы туда описание записываете. -
проверил — доп реквизит — строка
нашел вот такую процедуру в общих модулях, которая записывает доп реквизиты — УправлениеСвойствами.ЗаписатьСвойстваУОбъекта
сделал так:
Процедура ЗаполнитьНаСервере() // Вставить содержимое обработчика. //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Код КАК Код, | Номенклатура.Наименование КАК Наименование, | Номенклатура.Описание КАК Описание |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Описание <> &Описание"; Запрос.УстановитьПараметр("Описание", ""); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи МояНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Наименование); ДопРеквизитГОСТ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Заголовок", "ГОСТ"); ТаблицаДопРеквизитов = Новый ТаблицаЗначений; ТаблицаДопРеквизитов.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения")); ТаблицаДопРеквизитов.Колонки.Добавить("Значение", Новый ОписаниеТипов("Строка")); НовыйРекизит = ТаблицаДопРеквизитов.Добавить(); НовыйРекизит.Свойство = ДопРеквизитГОСТ; НовыйРекизит.Значение = ВыборкаДетальныеЗаписи.Описание; УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(МояНоменклатура, ТаблицаДопРеквизитов); Сообщить(МояНоменклатура.Наименование + " " + ВыборкаДетальныеЗаписи.Описание) КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры
ошибок тоже нет, и тоже ни чего не сохраняется.
-
Offline
1cUserAndrew
Профессионал в 1С
Команда форума- Регистрация:
- 27 май 2010
- Сообщения:
- 5.151
- Симпатии:
- 217
- Баллы:
- 104
Ну, по сути да, это тот же код, что и в моей процедуре.
Еще есть мысль, почему не работает, — возможно, не находится доп.реквизит (хотя по наименованию должен был найтись).Вообще, есть же специальный реквизит, по которому в конфигураторе предполагается обращаться к этому доп.реквизиту.
Посмотрите, какое имя для разработчика задано для этого доп.реквизита.
Это имя строкой и передавайте в мою процедуру в параметр «Свойство».
И в запросе выбирайте ссылку вместо поиска по наименованию.Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Ссылка, | Номенклатура.Описание КАК Описание |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Описание <> &Описание"; Запрос.УстановитьПараметр("Описание", ""); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл УстановитьЗначениеДопСвойства(ВыборкаДетальныеЗаписи.Ссылка, "ТутНапишитеИмяДляРазработчика", ВыборкаДетальныеЗаписи.Описание); КонецЦикла;
-
1cUserAndrew,спасибо за помощь
все получилось— Объединение сообщений, 19 июн 2019 —
1cUserAndrew, а программно имя для разработчика можно вытаскивать?
Последнее редактирование: 19 июн 2019 -
Offline
1cUserAndrew
Профессионал в 1С
Команда форума- Регистрация:
- 27 май 2010
- Сообщения:
- 5.151
- Симпатии:
- 217
- Баллы:
- 104
Да, у плана вида характеристик «ДополнительныеРеквизитыИСведения» есть реквизит «Имя«. Вот это оно и есть.
-
реквизит с именем «ГОСТ» один, имя разработчика у него — ГОСТ_ccbd71b2f88c42cfb5333bea2d7f9c26
а когда я пытаюсь его вытащить так:
ДопРеквизитГОСТ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(«ГОСТ»);
или так
ДопРеквизитГОСТ = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту(«Заголовок», «ГОСТ»);имя вытаскивается вот такое:
ДопРеквизитГОСТ.Имя — ГОСТ_17c47abfbf144039a22ede9eb7931d79.поэтому видимо раньше и не сохранялось, пока явно не прописали имя разработчика, потому что вытаскивается совсем другое имя
Последнее редактирование: 20 июн 2019 -
1cUserAndrew, спасибо
задача решена
Автор fsa, 17 апр 2016, 19:14
0 Пользователей и 1 гость просматривают эту тему.
Доброго времени.
В справочник Вид Номенклатуры добавлен Дополнительный реквизит, Диаметр.
Как програмно можно обратиться к этому реквизиту?
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Диаметр")
так не ищет, потому что Наименование у него уже другое: «Диаметр (ВидНоменклатуры1)».
Дополнительные реквизиты — это строки табличной части элемента справочника, а не план видов характеристик
На форуме есть волшебная кнопка «Сказать СПАСИБО»
Цитата: Hedinnk от 17 апр 2016, 19:22
Дополнительные реквизиты — это строки табличной части элемента справочника, а не план видов характеристик
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Свойство");
Таблица.Колонки.Добавить("Значение");
Элемент = Справочники.Номенклатура.НайтиПоКоду("00-00044758");
Строка = Таблица.Добавить();
Строка.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Диаметр");
Строка.Значение = 88;
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Элемент, Таблица);
Посмотрите, что происходит вот в этой процедуре.
Цитата: fsa от 17 апр 2016, 19:27
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(Элемент, Таблица);
Думаю после этого все станет ясно.
На форуме есть волшебная кнопка «Сказать СПАСИБО»
В общем, если вы все в первом сообщении описали правильно, то свойство Ваше будет называться «Диаметр (Вид номенклатуры)». То есть:
...Свойство = "Диаметр (Вид номенклатуры)";
...Значение = 88;
На форуме есть волшебная кнопка «Сказать СПАСИБО»
Цитата: Hedinnk от 17 апр 2016, 19:53
В общем, если вы все в первом сообщении описали правильно, то свойство Ваше будет называться «Диаметр (Вид номенклатуры)». То есть:...Свойство = "Диаметр (Вид номенклатуры)";
...Значение = 88;
Понятное дело, что можно вот так:
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Диаметр (" + Элемент.ВидНоменклатуры + ")")
А более рационально нельзя записать значение Доп реквизита Номенклатуры?
Создать свой собственный реквизит в конфигураторе ;P
Добавлено: 17 апр 2016, 20:18
Или использовать характеристики вместо дополнительных реквизитов
На форуме есть волшебная кнопка «Сказать СПАСИБО»
Цитата: Hedinnk от 17 апр 2016, 20:15
Создать свой собственный реквизит в конфигураторе ;PДобавлено: 17 апр 2016, 20:18
Или использовать характеристики вместо дополнительных реквизитов
Оба не вариант. Заказчик уже пошел по пути Допов в спр ВидНоменклатуры, так еще и вместо реального вида номенклатуры (например дверь межкомнатная) влупил туда производителя (завод дсп1, 2, и т д)….
Тогда мучаться с тем что есть.
Попытайтесь переубедить заказчика и,пока не много информации, переделать.
Добавлено: 17 апр 2016, 20:45
С точки зрения пользователя, дополнительные реквизиты — это очень удобно, но потом,и если понадобятся доработки — куча геморроя. Плюс, какой-нибудь нерадивый пользователь изменит имя дополнительного реквизита и все сразу сломается в написанных вами доработках, которые относятся к этому реквизиту.
На форуме есть волшебная кнопка «Сказать СПАСИБО»