gifts2017

Дополнительные реквизиты без изменения конфигурации.

Опубликовал Mars (Tsprogrammist1) в раздел Программирование - Практика программирования

Данная статья предназначена для начинающих программистов 1с. Конфигурация Бухгалтерия предприятия, редакция 2.0 (2.0.14.5) . Платформа 8.2 (8.2.11.236).

В качестве примера рассмотрим документ «Счет на оплату покупателю». Просмотреть доп. реквизиты можно нажав кнопку на панели (см рис 1). Создадим реквизит с наименованием «Примечание к счету» и типом «Строка». Заполним значение произвольным текстом. В результате получим... (см рис 2).  Этот доп. реквизит будет во всех документах «Счет на оплату покупателю». Ниже приведен пример кода (скопирован из конфигурации) с помощью которого можно получить реквизит и его значение.

НазначениеСвойств      = ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(ДокументСсылка);
ОбъектОтбораЗначений   = ДокументСсылка;
ОбъектОтбораНазначений = ДокументСсылка;

Запрос = Новый Запрос();
 
Запрос.УстановитьПараметр("НазначениеСвойств",       ?(НазначениеСвойств = Неопределено, ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(ОбъектОтбораЗначений), НазначениеСвойств));
Запрос.УстановитьПараметр("ОбъектОтбораЗначений",    ОбъектОтбораЗначений);
 
 Запрос.Текст = "
 |ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ
 | СвойстваОбъектов.Наименование                               КАК СвойстваОбъектовНаименование,
 | СвойстваОбъектов.ПометкаУдаления                            КАК ПометкаУдаления,
 | СвойстваОбъектов.Ссылка                                     КАК Свойство,
 | РегистрСведений.ЗначенияСвойствОбъектов.Значение            КАК Значение
 |
 |ИЗ
 |// Отбираются свойства, предназначенные для заданного типа объектов.
 | (
 | ВЫБРАТЬ
 |  ПланВидовХарактеристик.СвойстваОбъектов.Ссылка          КАК Ссылка,
 |  ПланВидовХарактеристик.СвойстваОбъектов.Наименование    КАК Наименование,
 |  ПланВидовХарактеристик.СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления
 |
 | ИЗ
 |  ПланВидовХарактеристик.СвойстваОбъектов
 |
 | ГДЕ
 |  ПланВидовХарактеристик.СвойстваОбъектов.НазначениеСвойства В ( &НазначениеСвойств )
 |
 | )                                                           КАК СвойстваОбъектов
 |
 |ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
 |// Присоединяются значения свойств, назначенные для заданного объекта.
 | РегистрСведений.ЗначенияСвойствОбъектов
 |ПО
 | РегистрСведений.ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка
 | И
 | РегистрСведений.ЗначенияСвойствОбъектов.Объект = &ОбъектОтбораЗначений
 |
 |УПОРЯДОЧИТЬ ПО
 | СвойстваОбъектовНаименование
 |";
 
ТабЗн = Запрос.Выполнить().Выгрузить();
ТабЗн.Колонки.Удалить(0);
 
Для Каждого СтрокаТабЗнач  Из ТабЗн Цикл
    Сообщить(""+СтрокаТабЗнач.Свойство +"   "+ СтрокаТабЗнач.Значение);
КонецЦикла;

Записать значение программно

Процедура ОсновныеДействияФормыЗаписатьНовоеЗначение(Кнопка)
    НазначениеСвойств      = ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(ДокументСсылка);
    ОбъектОтбораЗначений   = ДокументСсылка;
    ОбъектОтбораНазначений = ДокументСсылка;
 
    Запрос = Новый Запрос();
 
    Запрос.УстановитьПараметр("НазначениеСвойств",       ?(НазначениеСвойств = Неопределено, ОбщегоНазначения.ПолучитьСписокНазначенийСвойствКатегорийОбъектовПоСсылке(ОбъектОтбораЗначений), НазначениеСвойств));
    Запрос.УстановитьПараметр("ОбъектОтбораЗначений",    ОбъектОтбораЗначений);
 
    Запрос.Текст = "
    |ВЫБРАТЬ РАЗЛИЧНЫЕ РАЗРЕШЕННЫЕ
    | СвойстваОбъектов.Наименование                               КАК СвойстваОбъектовНаименование,
    | СвойстваОбъектов.ПометкаУдаления                            КАК ПометкаУдаления,
    | СвойстваОбъектов.Ссылка                                     КАК Свойство,
    | РегистрСведений.ЗначенияСвойствОбъектов.Значение            КАК Значение
    |
    |ИЗ
    |// Отбираются свойства, предназначенные для заданного типа объектов.
    | (
    | ВЫБРАТЬ
    |  ПланВидовХарактеристик.СвойстваОбъектов.Ссылка          КАК Ссылка,
    |  ПланВидовХарактеристик.СвойстваОбъектов.Наименование    КАК Наименование,
    |  ПланВидовХарактеристик.СвойстваОбъектов.ПометкаУдаления КАК ПометкаУдаления
    |
    | ИЗ
    |  ПланВидовХарактеристик.СвойстваОбъектов
    |
    | ГДЕ
    |  ПланВидовХарактеристик.СвойстваОбъектов.НазначениеСвойства В ( &НазначениеСвойств )
    |
    | )                                                           КАК СвойстваОбъектов
    |
    |ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
    |// Присоединяются значения свойств, назначенные для заданного объекта.
    | РегистрСведений.ЗначенияСвойствОбъектов
    |ПО
    | РегистрСведений.ЗначенияСвойствОбъектов.Свойство = СвойстваОбъектов.Ссылка
    | И
    | РегистрСведений.ЗначенияСвойствОбъектов.Объект = &ОбъектОтбораЗначений
    |
    |УПОРЯДОЧИТЬ ПО
    | СвойстваОбъектовНаименование
    |";
 
    ТабЗн = Запрос.Выполнить().Выгрузить();
    ТабЗн.Колонки.Удалить(0);
 
    Для Каждого СтрокаТабЗнач  Из ТабЗн Цикл
        //Сообщить(""+СтрокаТабЗнач.Свойство +"   "+ СтрокаТабЗнач.Значение);
        Если СтрокаТабЗнач.Свойство.Наименование = "Примечание к счету"  Тогда
            НаборЗаписейЗначенияСвойств = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
  
            Запись = НаборЗаписейЗначенияСвойств.Добавить();
  
            Запись.Объект   = ДокументСсылка;
            Запись.Свойство = СтрокаТабЗнач.Свойство;
            Запись.Значение = НовоеЗначение;
  
            НаборЗаписейЗначенияСвойств.Отбор.Объект.Установить(ОбъектОтбораЗначений);
  
            Попытка
                НаборЗаписейЗначенияСвойств.Записать();
                Сообщить("Успех!!!");
            Исключение
                #Если Клиент Тогда
                     Предупреждение("Не удалось записать значения свойств:" + Символы.ПС + ОписаниеОшибки());
                #КонецЕсли
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;
 
КонецПроцедуры

Доп. реквизиты можно использовать в стандартных отчетах.

Скачать файлы

Наименование Файл Версия Размер
ДопРеквизит.epf 112
.epf 7,46Kb
22.03.11
112
.epf 7,46Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Борис Нагорнов (БорисН) 30.09.10 15:56
А как можно программно создать свойство, если его нет, а также изменить существующее свойство документа?
Buntar79; Tsprogrammist1; +2 Ответить 1
2. Mars (Tsprogrammist1) 01.10.10 08:45
(1) В ближайшее время дополню статью. :D
3. Maxim Goncharov (maxx) 03.10.10 01:06
ввел в карточку "Номенклатура" новое свойство "Артикул", его в Бухгалтерии нет, заполнил, начал вводить документ а "ввод по строке" по артикулу (свойство) не работает , как в Управление торговлей (где он как реквизит). Разачорован в доп.свойствах!!!!
4. Mars (Tsprogrammist1) 06.10.10 07:30
(3) Зря :D .В 1с есть «Дополнительные внешние обработки табличных частей документов». Дает большие возможности... вот пример. Как Работает читай здесь - http://www.infostart.ru/public/17140/
Прикрепленные файлы:
ДополнительныеВнешниеОбработкиТабличныхЧастейДокументов.epf
5. Mars (Tsprogrammist1) 06.10.10 07:32
В 1с есть «Дополнительные внешние обработки табличных частей документов». Дает большие возможности... вот пример. Как Работает читать здесь - http://www.infostart.ru/public/17140/
Прикрепленные файлы:
ДополнительныеВнешниеОбработкиТабличныхЧастейДокументов.epf
6. Ermek S (Buntar79) 10.02.12 15:15
БорисН 30.09.10 15:56 URL ↓Ответить
А как можно программно создать свойство, если его нет, а также изменить существующее свойство документа?

хороший вопрос, тоже хочется услышать ответ либо дополнение статьи....
7. {ÐƦǑƝȊ} mx (dour-dead) 17.02.12 11:56
только в процедуре записи если необходимо записать несколько значений св-в надо создание "НаборЗаписейЗначенияСвойств" определять до цикла

НаборЗаписейЗначенияСвойств = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
8. Максим2 (Максим2) 10.08.12 17:17
Как раз из начинающих программистов, которым адресована публикация. Сделал запрос проще:
9. Максим2 (Максим2) 10.08.12 17:18
ЗапросДопРеквизитов.Текст = "ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Свойство.Наименование,
| ЗначенияСвойствОбъектов.Значение.Наименование
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект.Ссылка = &Ссылка";

ЗапросДопРеквизитов.УстановитьПараметр("Ссылка", СсылкаНаОбъект);

и так тоже всё работает (реквизиты и их значения получались для внешней печатной формы). Может я что и не учитываю, но сильно проще...
10. Алекс Ю (AlexO) 21.09.12 11:54
(9) Максим2,
этим запросом вы получаете только ЗАПОЛНЕННЫЕ свойства объекта (называемые 1с и здесь, в данной статье, реквизитами - хотя это совсем не так: с настоящему реквизиту даже в 1С можно обращаться напрямую, и его значения не ограничены значениями типов ПВХ).
Чтобы получить все ВОЗМОЖНЫЕ свойства объекта (и заполненные, и не заполненные) - то надо обратится и к пвхСвойстваОбъектов.
Т.е. сравнение данных из РС и из ПВХ между собой дает максимальную информацию о свойствах объекта.
11. Валерий Буданов (buval) 30.03.13 11:45
Поддерживаю автора в использовании свойств объект. Результат простейшее обновление конфигурации у пользователя в дальнейшем.
12. andrey dyak (dyak84) 04.04.13 12:05
Спасибо за Вашу работу она меня натолкнула на одну очень и очень нужную вещь. Так держать
13. WWWolfy (WWWolfy) 28.11.16 04:24
В качестве ответа на вопрос:
А как можно программно создать свойство?



// -- примеры вызова --
1. Запрос.УстановитьПараметр("Свойство1", НайтиСоздатьКатегорию( "ЕстьДокументКопия" ) );
2. УстановитьКатегориюОбъекта("ЕстьДокументКопия", текФл_Копия, текДок);


// -- вспомогательные процедуры --

// Устанавливает доп.реквизит  Документа
//
// Параметры
//  НазвКат  – – Наименование устанавливаемой Категории
//  ТекЗнКат  – – Значение устанавливаемой Категории
//
Процедура УстановитьКатегориюОбъекта(НазвКат, ТекЗнКат=Истина, текОбъект, флСоздавать=Истина, текНазначениеКатегории=Неопределено ) Экспорт
		ТекСвойство = НайтиСоздатьКатегорию(НазвКат, флСоздавать, текНазначениеКатегории );
		Если Не ЗначениеЗаполнено(ТекСвойство) Тогда
			Возврат;
		КонецЕсли;

	КатОбъ=РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьНаборЗаписей();
	КатОбъ.Отбор.Объект.Значение=текОбъект.Ссылка;
	КатОбъ.Отбор.Объект.Использование = Истина;
	КатОбъ.Отбор.Свойство.Значение=ТекСвойство;
	КатОбъ.Отбор.Свойство.Использование = Истина;
	КатОбъ.Прочитать();
	// когда есть запись - значит Истина
	Если КатОбъ.Количество()>0 И Не ТекЗнКат Тогда// Категория Установлена, надо удалить
		КатОбъ.Очистить();
		КатОбъ.Записать();
	ИначеЕсли КатОбъ.Количество()=0 И ТекЗнКат Тогда // Категория отсутствует, надо создать
		НовЗапись=КатОбъ.Добавить();
		НовЗапись.Объект=текОбъект.Ссылка;
		НовЗапись.Свойство=ТекСвойство;
		НовЗапись.Значение=Истина;
		КатОбъ.Записать();
	Иначе// Категория актуальна
		//Ничего не меняем
	КонецЕсли;
КонецПроцедуры// Установка Категории

Функция НайтиСоздатьКатегорию( НазвКат, флСоздавать=Истина, текНазначениеКатегории=Неопределено ) Экспорт
	пвхСвойство = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(НазвКат,Истина); 
	Если ЗначениеЗаполнено(пвхСвойство) Тогда
		Возврат пвхСвойство;
	КонецЕсли;
	
	Если Не флСоздавать Тогда
		Возврат ПланыВидовХарактеристик.СвойстваОбъектов.ПустаяСсылка();
	Иначе
		// создаём 
		пвхСвойство = ПланыВидовХарактеристик.СвойстваОбъектов.СоздатьЭлемент(); 
		пвхСвойство.Наименование			= НазвКат; 
		пвхСвойство.НазначениеСвойства	= ?(текНазначениеКатегории<>Неопределено, текНазначениеКатегории, ПланыВидовХарактеристик.НазначенияСвойствКатегорийОбъектов.Документы );

		пвхСвойство.ТипЗначения = Новый ОписаниеТипов("Булево");
		пвхСвойство.Категория = Истина;
		
		пвхСвойство.Записать();
		Возврат пвхСвойство.Ссылка;
	КонецЕсли;
КонецФункции //НайтиСоздатьКатегорию
...Показать Скрыть