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

30.09.10

Разработка - Механизмы типовых конфигураций

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ДопРеквизит.epf
.epf 7,46Kb
115
115 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

См. также

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Расчет себестоимости в типовых конфигурациях 1С – для многих «черный ящик», работающий по жестко зашитым в него алгоритмам. Реализация этого «черного ящика» может меняться в зависимости от конкретной конфигурации – УПП, БП 3.0, ERP. Но принцип работы везде одинаковый. Расскажем о том, как устроен расчет себестоимости, как его дорабатывать, и какие методы могут быть эффективны и без доработок.

27.12.2024    11405    Begemoth80    32    

85

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    2428    PROSTO-1C    0    

21

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:Комплексная автоматизация 2.х Россия Бесплатно (free)

Эта ошибка была обнаружена мной в типовой конфигурации 1С:Комплексная автоматизация 2 (2.5.16.115), БСП версия 3.1.9.302. Возникает она после того, как вы добавляете в расширение бизнес-процесс или задачу, выполняете обновление идентификаторов метаданных расширений, но ошибка при записи любого элемента справочника "Профили групп доступа" всё равно остаётся.

01.07.2024    2542    Vidz    0    

12

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Бесплатно (free)

Очень часто в написании кода требуется обращаться к предопределённым значениям. Если идёт обращение к типовым предопределённым значениям, то проблем не возникает.

24.06.2024    1412    olja-ljaaa    0    

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

хороший вопрос, тоже хочется услышать ответ либо дополнение статьи....
7. dour-dead 272 17.02.12 11:56 Сейчас в теме
только в процедуре записи если необходимо записать несколько значений св-в надо создание "НаборЗаписейЗначенияСвойств" определять до цикла

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

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

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



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


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

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

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

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

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