1с записать дополнительный реквизит программно
В этой статье я хотел бы рассказать об архитектуре, использовании и особенностях реализации подсистемы «Свойства» из инструментария разработчика «1С:Библиотека стандартных подсистем» (1С БСП).
Для начала предлагаю разобраться с терминологией 1С БСП: согласно ИТС дополнительные реквизиты и сведения — это свойства. По моему мнению, подсистема «Свойства» (Управление свойствами) — это очень мощный функционал, который позволяет во многих случаях отказаться от снятия конфигурации с поддержки или внесения ненужных изменений и ошибок в конфигурацию.
Архитектура
Описание работы с подсистемой «Свойства» на сайте ИТС 1С является исчерпывающим для типовых конфигураций, но в любом случае, для того, чтобы начать работать со свойствами в любой конфигурации с внедрённым 1С БСП необходимо установить установить константу «Использовать дополнительные реквизиты и сведения» в значение «Истина». После этого мы можем открыть справочник «Наборы дополнительных реквизитов и сведений», который содержит список объектов для которых можно создавать дополнительные реквизиты и сведения. При добавлении через стандартные формы 1С БСП пользователь создаёт новый элемент «Плана видов характеристик», который добавляется в табличную часть элемента.
Дополнительные сведения отличаются от дополнительных реквизитов прежде всего расположением, дополнительные сведения содержатся в отдельном регистре с одноименным названием, а дополнительные реквизиты являются табличной частью объекта, к которому относятся. На рисунке ниже слева-направо изображены: элемент справочника «Наборы дополнительных реквизитов и свойств», элемент плана видов характеристик и список регистра сведений «Дополнительные сведения».
Следующий рисунок изображает пример дополнительного реквизита, слева-направо: элемент справочника «Наборы дополнительных реквизитов и свойств», элемент плана видов характеристик и элемент справочника, в который был добавлен дополнительный реквизит.
Также стоит учитывать, что большая часть объектов метаданных в справочнике «Наборы дополнительных реквизитов и сведений» является предопределённой:
Однако, заполнение этих данных происходит программно, при внедрении 1С БСП или обновлении информационной базы — для этого в общих модулях добавляют процедуру ПриПолученииПредопределенныхНаборовСвойств. Уникальный идентификатор задаётся в явном виде, в т.ч. для того чтобы облегчить процедуры обмена между базами.
С точки зрения интеграции с объектами механизм работы с формами не сильно отличается от аналогичных у других подсистем 1С БСП: из модуля УправлениеСвойствами вызываются процедуры и функции с названиями соответствующими названиям событий для которых они вызываются, например:
Полный список функций и процедур находится в общем модуле УправлениеСвойствами в блоке, озаглавленным: «Процедуры и функции для стандартной обработки дополнительных реквизитов».
Использование
Каждый дополнительный реквизит или свойство содержит поле «Имя», подразумевается, что для программного использования будет использоваться этот реквизит.
Пример использования имени для получения дополнительного реквизита:
Пример запроса для получения всех дополнительных свойств:
Примеры получения свойств без запроса:
Особенности реализации
Если с запросами и функциями всё более менее ясно неприятным сюрпризом может стать то, что дополнительный реквизит на форме содержит название, отличающееся от этого реквизита, например, такое:
Чтобы найти реквизит на форме 1С БСП создаёт новые реквизиты формы Свойства_ОписаниеДополнительныхРеквизитов и Свойства_ОписаниеЗависимыхДополнительныхРеквизитов, с помощью них можно установить однозначное соответствие между элементом и значением объекта:
Второй особенностью реализации можно выделить невозможность создания свойства с мутабельным типом, с одной стороны это очевидное ограничение, с другой тип «Список значений» вполне допустим, но только для дополнительного реквизита (у дополнительных сведений невозможность связана с архитектурными ограничениями, так как объект и свойство — это измерения регистра «Дополнительные сведения»). Возможно, отсутствие такого типа связано со сложностями при обмене, а возможно в скором времени это будет реализовано, предлагаю посмотреть на пример такой реализации ниже.
Добавим новый дополнительный реквизит для справочника физические лица «Номера счетов»
Добавляем программно, вторую запись в табличную часть «Дополнительные реквизиты» справочника «Физические лица» с тем же самым свойством:
Немного модифицируем код функции ЗначенияСвойств в общем модуле УправлениеСвойствамиСлужебный:
А также код процедуры ЗаполнитьДополнительныеРеквизитыВФорме в общем модуле УправлениеСвойствами:
Таким образом мы можем сохранять и восстанавливать значения реквизитов, которые, принимают множество значений.
Как мне программно при чтении Excel-файла записать в них данные.
Я могу из файла брать название номенклатуры на русск. языке, искать в справочнике нужный элемент. Как к данному найденному элементу записать соответствующие названия на англ. и эст. в соответствующие доп. реквизиты?
Legin; angur; kobayoshi; Valerianich; vladir; reshkra; SV6; beldinskiy; korpas; a1x; b00ker; myoker; Nikitos_NSK; nekit_rdx; jane_de_rio; kivals; Deslime; shaykhelov; alexandrmishinn; ekomova; bug256; neo-ti; milov.aleksey; botokash; MaiorovYury; Anton64; amaksimov; + 27 – Ответить
(7) УправлениеСвойствами.ЗначениеСвойства
// Возвращает значение дополнительного свойства объекта.
//
// Параметры:
// Объект - ЛюбаяСсылка - ссылка на объект, например, СправочникСсылка.Номенклатура,
// ДокументСсылка.ЗаказПокупателя, .
// Свойство - ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения - ссылка на
// дополнительный реквизит, значение которого нужно получить.
// - Строка - Имя дополнительного свойства.
//
// Возвращаемое значение:
// Произвольный - любое значение, допустимое для свойства.
//
(4) Подскажите , что не так в моем примере ?
Загружаем из Excel в Розницу2.2 номенклатуру, у которой ведены Дополнительные Реквизиты Допы с типом значения - Дополнительное значение
(14)
Внутри модуля УправлениеСвойствами
у меня ВладелецСвойств это НовыйЭл , его тип СправочникОбъект.Номенклатура - это правильно ?
(16) ЭлементНом=НовыйЭл.Ссылка;
Ошибок нет , но доп реквизиты не появились.
При передаче в модуль УправлениеСвойствами.ЗаписатьСвойстваУОбъекта
Значение заполнено , а свойство пустое поле.
Что-то не так заполняю ?
(18) В процедуру УправлениеСвойствами.ЗаписатьСвойстваУОбъекта нужно передать ссылку на объект и таблицу значений,
пример
(19) Спасибо , что отвечаете.
Вопрос еще в наименовании Доп Реквизита.
В Дополнительных реквизитах (Администрирование- Общие настройки) по Номенклатуре прописаны Доп. свойства справочника "Номенклатура" (Общий) , имя Допы.
Тогда строка выглядит так
НовСтр.Свойство=ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Допы (Доп. свойства справочника ""Номенклатура"" (Общий))");
С другой стороны в форме Допов (Дополнительный реквизит) есть Имя (Для разработчиков)
Допы_abe6502c17e640daaa03e18f232d87d4
Тогда строка должна быть такой
НовСтр.Свойство=ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Допы_abe6502c17e640daaa03e18f232d87d4)");
У меня не проходит ни первый , ни второй вариант . Свойство - пустое
Кстати, просто имя "Допы" тоже пробовала.
Что еще я пишу не так ?
Всем доброго дня УНФ 1.6 (1.6.17.123) . Подскажите пожалуйста, как программно добавить номенклатуре новый дополнительный реквизит. Т.е не заполнить тот, который вы руками создали, а для конкретной позиции создать новый доп реквизит (для каждой группы номенклатуры будет разный перечень реквизитов).
Сколько не пробовал добавлять постоянно появляются зачеркнутые доп реквизиты.
(1) Конфигурация УТ 11.4.
Для программной работы с доп.реквизитами типовые процедуры в общих модулях:
РаботаСНоменклатуройУТ
РаботаСНоменклатуройПереопределяемый
БСП злиться, что с ней работают не ручками, а пытаются грубо сломать полностью.
я не представляю зачем добавлять допреквизиты программно, время на отладку этого костыля
будет стоить дороже времени ручной работы опытного юзера по предоставленному списку.
///////////////////////Поиск созданного набораДопРеквизитов или использование созданного вручную(Если не найден)/////////////////
ЗапросНаборыДополнительныхРеквизитов = новый запрос;
ЗапросНаборыДополнительныхРеквизитов.Текст ;
ЗапросНаборыДополнительныхРеквизитов.УстановитьПараметр("Наим", струк.categoryId);
Результат = ЗапросНаборыДополнительныхРеквизитов.Выполнить().Выгрузить();
Если Результат.Количество()<>0 тогда
НаборыДополнительныхРеквиз = Результат[0].Ссылка.ПолучитьОбъект();
Иначе
НаборыДополнительныхРеквиз = РанееПодготовленныйНабор.ссылка;
КонецЕсли;
////////////////////////Поиск доп реквизитов в данном наборе совйсв///////////////////////////////
Запрос = новый запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
|ИЗ
| ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
|ГДЕ
| ДополнительныеРеквизитыИСведения.Наименование = &ЗнчНаименования
| И ДополнительныеРеквизитыИСведения.НаборСвойств = &ЗнчНабора";
Запрос.УстановитьПараметр("ЗнчНаименования",строчка.СвойствоХарак);
Запрос.УстановитьПараметр("ЗнчНабора",НаборыДополнительныхРеквиз.ссылка);
Результат1 = Запрос.Выполнить().Выгрузить();
////////////////////Создание доп реквизитов ///////////////////////////
Если Результат1.Количество()=0 тогда
НоваяХарактеристика = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
НоваяХарактеристика.Наименование = строчка.СвойствоХарак;
НоваяХарактеристика.ВыводитьВВидеГиперссылки=Ложь;
НоваяХарактеристика.ДополнительныеЗначенияИспользуются=Ложь;
НоваяХарактеристика.ДополнительныеЗначенияСВесом=Ложь;
НоваяХарактеристика.Заголовок = строчка.СвойствоХарак;
НоваяХарактеристика.НаборСвойств = НаборыДополнительныхРеквиз.ссылка;
НоваяХарактеристика.Виден=Истина;
Если строчка.СвойствоХарак = "Детальное описание" тогда
Новарак.ТипЗначения=ОбщегоНазначения.ОписаниеТипаСтрока(0);
Иначе
Новарак.ТипЗначения=ОбщегоНазначения.ОписаниеТипаСтрока(1024);
КонецЕсли;
НоваяХарактеристика.Записать();
ПолученноеСвойство = НоваяХарактеристика.Ссылка;
новыйРеквизит = НаборыДополнительныхРеквиз.ДополнительныеРеквизиты.Добавить();
новыйРеквизит.Свойство = ПолученноеСвойство;
новыйРеквизит.ИмяПредопределенногоНабора = строчка.СвойствоХарак;
Иначе
ПолученноеСвойство = Результат1[0].ссылка;
КонецЕсли;
Если строчка.ЗначениеСвойства<>"" тогда
НовыйРеквизитНоменклатуры = НоваяПозиция.ДополнительныеРеквизиты.Добавить();
НовыйРеквизитНоменклатуры.Свойство = ПолученноеСвойство;
НовыйРеквизитНоменклатуры.Значение = строчка.ЗначениеСвойства;
КонецЕсли;
Создать новый элемент в Плане видов характеристик "ДополнительныеРеквизитыИСведения", заполнить реквизиты:
обязательно НаборСвоств - или предопределенный элемент справочника "НаборыДополнительныхРеквизитовИСведений" "Общий" из группы "Номенклатура" или созданный по имени папки, Заполнить наименование созданного свойства, так, как наименование выглядит для созданного руками свойства, заполнить заголовок свойства (почти как наименование, но без постфикса), установить ТипЗначения. долго писать, вот пример из моей БДРС:
Многабукаф, ниасилил.
Нашел решение попроще вот здесь и немного универсализировал.
Пара полезных процедур для работы с дополнительными реквизитами на форме. Далее в статье: 1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме? 2. Как проверить до записи корректность заполнения пользователем дополнительного реквизита? 3. Как заполнить значение дополнительного реквизита по другому событию и обновить данные на форме? 4. Как расположить дополнительный реквизит в указанном месте на форме?
Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме?
Далее привожу решение этих задач - поковыряться с отладчиком пришлось изрядно…
Итак, вот решение:
- Для начала смотрим с отладчиком, появились ли Допреквизиты на форме после ПриСозданииНаСервере? Нет. А после ПриОткрытии? Тоже нет. А вот после активизации закладки «Дополнительно» - появились со страшными именами как на скриншоте. Это было создано типовой процедурой УправлениеСвойствами.ЗаполнитьДополнительныеРеквизитыВФорме(ЭтотОбъект), которая создала реквизиты на форме
После чего Система располагает реквизиты на форме
Добавление /изменение реквизитов на форме возможно благодаря следующей интересной конструкции.
Реквизит = Новый РеквизитФормы(ОписаниеСвойства.ИмяСсылочногоРеквизитаЗначение, ФорматированнаяСтрока, , ОписаниеСвойства.Наименование, Истина);
ДобавляемыеРеквизиты.Добавить(Реквизит);
Но это нам сейчас все не нужно, так, для любопытства.
А вот чтобы работать с реквизитами нужно научиться получать их имена на форме по имени дополнительного реквизита. На радость разработчикам при работе с допреквизитами на форме Система создает служебный реквизит «Свойства_ОписаниеДополнительныхРеквизитов» который содержит на форме коллекцию данных, где есть все необходимы нам данные, можно найти и по имени, и найти соответствующее свойство ПланаВидаХарактеристик
Далее дело техники. По имени дополнительного реквизита получаем Поле дополнительного реквизита, и делаем с ним что хотим
- Используя функцию из п1 - нужно проверить значение поля дополнительного реквизита на форме
3. Используя функцию из п1 - нужно установить значение поля дополнительного реквизита на форме
4. Используя функцию из п1 – нужно выполнить волшебную процедуру «Переместить» для коллекции Элементов формы
В итоге, можно управлять дополнительными реквизитами на форме – почти так же комфортно, как и собственными. И ничего менять в конфигурации – не пришлось – все управление находится в расширении
Вывод: таким образом, не меняя конфигурацию, и используя механизмы дополнительных реквизитов и расширений всех типовых конфигураций, мы управляем расположением реквизитов и программно контролируем их заполнение и содержание.
Проверено на КА 2.4.2.132, но вполне универсально для всех БСП неустановленной версии
В 1с дополнительные сведения представляют — это механизм позволяющий хранить дополнительные данные для различных объектов метаданных (справочник, документ и т.п.). Это удобно тем, что не требуется вносить изменений в конфигурацию. В конфигурациях использующих управляемое приложение (Бухгалтерия 3.0, Управление торговлей 11 и т.п.) дополнительные сведения хранятся в регистре ДополнительныеСведения, у него два измерения: Объект — ссылка на объект к которому относится дополнительное сведение, Свойство — идентификатор конкретного сведения, тип план видов характеристик ДополнительныеРеквизитыИСведения.
1с дополнительные сведения в режиме Предприятие
Рассмотрим, как добавить в документе дополнительное сведение. Для примера возьмем конфигурацию Управление торговлей 11, документ Авансовый отчет.
- Откроем любой документ для которого необходимо дополнительное сведение;
- На форме документа нажмем кнопку Открыть дополнительные сведения;
- Откроется форма дополнительных сведений;
- Нажимаем кнопку Все действия -> Изменить состав дополнительных сведений;
- Нажимаем кнопку Добавить -> Новое;
- В открывшемся окне заполняем Наименование свойства и его Тип;
- Жмем Записать и закрыть;
- Теперь снова откроем наш документ и нажмем кнопку Открыть дополнительные сведения;
- В форме 1с дополнительные сведения появится строчка с добавленным свойством. Ему можно задать любое значение заданного типа;
- Данное свойство будет доступно во всех документах Авансовый отчет, для каждого документа можно задать свое значение.
Функция получающая в 1с дополнительные сведения
- Ссылка. Тип: Любая ссылка. Ссылка на объект имеющий дополнительные сведения;
- Свойство. Тип: План видов характеристик ДополнительныеРеквизитыИСведения. Свойство, значение которого для данного объекта мы хотим получить.
1с дополнительные сведения функция программной записи
Данная функция осуществляет программную запись значения в дополнительные сведения объекта по переданному свойству. Предназначена для конфигурации Управление торговлей 11. Возвращает значение Истина в случае успешной записи и Ложь в случае ошибки.
- Объект Тип: Любая ссылка. Ссылка на объект для которого записывается сведение;
- Свойство Тип: План видов характеристик ДополнительныеРеквизитыИСведения. Дополнительное свойство;
- Значение Тип: Произвольный(Задается при создании (редактировании) свойства в плане видов характеристик ДополнительныеРеквизитыИСведения). Значение, которое будет записано в дополнительные сведения.
Если вы еще не знаете, как правильно работать с механизмом дополнительных реквизитов в 1с 8, то прочтите об этом в статье Получить / записать дополнительные реквизиты программно.
Читайте также: