gifts2017

Использование свойств объектов при доработке типовых конфигураций

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

Часто при реализации небольших проектов по доработке типовых конфигураций второстепенным, но не менее важным выступает требование минимизации трудоемкости подготовки обновления на следующие релизы.

Статья является продолжением цикла статей:
Внешние печатные формы в восьмерке http://infostart.ru/blogs/157
Использование встроенного почтового клиента - http://infostart.ru/blogs/161/
Документ с печатью и подписью - http://infostart.ru/blogs/162/
Внешние печатные формы в восьмерке II - http://infostart.ru/blogs/324/
Заполнение табличных частей документов в восьмерке (внешние обработки) http://infostart.ru/blogs/345/
Использование свойств объектов при доработке типовых конфигураций http://infostart.ru/blogs/692/
Рассмотрим возможные доработки в порядке увеличения трудоемкости:
- использование существующих механизмов типовой конфигурации;
- использование внешних обработок и отчетов;
- создание новых объектов метаданных;
- изменение текстов модулей;
- изменение метаданных существующих объектов;
- изменение форм;
- изменение макетов;
- и т.д.

Для реализации требований минимизации трудоемкости подготовки необходимо ограничить или отказаться от наиболее трудоемких доработок в пользу менее трудоемких. В статье рассматривается использование свойств объектов вместо того чтобы изменять метаданные и формы объектов.
Задача #1.
В типовой конфигурации УТ ведется учет торговой деятельности нескольких юридических лиц холдинга. Юридические лица используют различные системы налогообложения – общую систему и УСН. Необходимо реализовать автоматическую установку флага УчитыватьНДС в документах в зависимости от выбранной фирмы.

Вариант #1. С использованием свойств объектов
Для решения задачи необходимо внести следующие изменения в модулях конфигурации:
В общем модуле «ЗаполнениеДокументов» в процедуре ЗаполнитьШапкуДокумента() добавить код:
УчитыватьНДС = Истина;
Если ОбщегоНазначения.ЕстьРеквизитДокумента("Организация", МетаданныеДокумента) Тогда

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


Изменить код:
ДокументОбъект.УчитыватьНДС     = Истина;

На код:
ДокументОбъект.УчитыватьНДС     = УчитыватьНДС; 


В общем модуле «ЗаполнениеДокументов» в процедуре ПриИзмененииЗначенияОрганизации() добавить код:
Если ОбщегоНазначения.ЕстьРеквизитДокумента("УчитыватьНДС", МетаданныеДокумента) Тогда
	СвойствоУчитыватьНДС = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("УчитыватьНДС");
	Если не СвойствоУчитыватьНДС.Пустая() Тогда
		Отбор = Новый Структура;
		Отбор.Вставить("Объект", ДокументОбъект.Организация);
		Отбор.Вставить("Свойство", СвойствоУчитыватьНДС);
		УчитыватьНДС = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Отбор).Значение;
		Если (не УчитыватьНДС = Неопределено) и (не ДокументОбъект.УчитыватьНДС = УчитыватьНДС) Тогда
			ДокументОбъект.УчитыватьНДС = УчитыватьНДС;

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

			ОбработкаТабличныхЧастей.УстановитьВидимостьКолонкиТабЧасти(мКолонкиУслуги.СтавкаНДС, УчитыватьНДС);
			ОбработкаТабличныхЧастей.УстановитьВидимостьКолонкиТабЧасти(мКолонкиУслуги.СуммаНДС, УчитыватьНДС);
		КонецЕсли;
	КонецЕсли;
КонецЕсли;


После того, как в рабочую базу внесены изменения в плане видов характеристик «Свойства объектов» в группе «Справочник "Организации"» создадим новое свойство.
Наименование = «УчитыватьНДС»; Тип значения = Булево.
У элементов справочника «Организации» установим значение созданного свойства:
 
Вариант #2. С использованием категорий объектов
Для решения задачи необходимо внести следующие изменения в модулях конфигурации:
В общем модуле «ЗаполнениеДокументов» в процедуре ЗаполнитьШапкуДокумента() добавить код:
УчитыватьНДС = Истина;
Если  ОбщегоНазначения.ЕстьРеквизитДокумента("Организация", МетаданныеДокумента) Тогда
	КатегорияУчитыватьНДС = Справочники.КатегорииОбъектов.НайтиПоНаименованию("УчитыватьНДС");
	Если  не КатегорияУчитыватьНДС.Пустая() Тогда
		Запрос = Новый Запрос();
		Запрос.Текст = "
		|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
		|	РегистрСведений.КатегорииОбъектов.Категория КАК Категория
		|ИЗ
		|	РегистрСведений.КатегорииОбъектов
		|
		|ГДЕ
		|	РегистрСведений.КатегорииОбъектов.Категория = &Категория и
		|	РегистрСведений.КатегорииОбъектов.Объект = &Объект
		|";
		Запрос.УстановитьПараметр("Объект", ДокументОбъект.Организация);
		Запрос.УстановитьПараметр("Категория", КатегорияУчитыватьНДС);
		УчитыватьНДС = НЕ Запрос.Выполнить().Пустой();
	КонецЕсли;
КонецЕсли;

Изменить код:
ДокументОбъект.УчитыватьНДС     = Истина;
На код:
ДокументОбъект.УчитыватьНДС     = УчитыватьНДС; 
В общем модуле «ЗаполнениеДокументов» в процедуре ПриИзмененииЗначенияОрганизации() добавить код:
Если ОбщегоНазначения.ЕстьРеквизитДокумента("УчитыватьНДС", МетаданныеДокумента) Тогда
	КатегорияУчитыватьНДС = Справочники.КатегорииОбъектов.НайтиПоНаименованию("УчитыватьНДС");
	Если не КатегорияУчитыватьНДС.Пустая() Тогда
		Запрос = Новый Запрос();
		Запрос.Текст =  "
		|ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1 
		|	РегистрСведений.КатегорииОбъектов.Категория КАК Категория 
		|ИЗ 
		|	РегистрСведений.КатегорииОбъектов 
		|
		|ГДЕ 
		|	РегистрСведений.КатегорииОбъектов.Категория = &Категория и 
		|	РегистрСведений.КатегорииОбъектов.Объект = &Объект 
		|"; 
		Запрос.УстановитьПараметр("Объект", ДокументОбъект.Организация); 
		Запрос.УстановитьПараметр("Категория", КатегорияУчитыватьНДС); 
		УчитыватьНДС = НЕ Запрос.Выполнить().Пустой();  
		Если не ДокументОбъект.УчитыватьНДС = УчитыватьНДС Тогда 
			ДокументОбъект.УчитыватьНДС = УчитыватьНДС;  
			мКолонкиТовары = ДокументОбъект.ПолучитьФорму().ЭлементыФормы.Товары.Колонки; мКолонкиУслуги = ДокументОбъект.ПолучитьФорму().ЭлементыФормы.Услуги.Колонки; // Колонки налога показываем только Тогда, когда его учитываем.
			ОбработкаТабличныхЧастей.УстановитьВидимостьКолонкиТабЧасти(мКолонкиТовары.СтавкаНДС, УчитыватьНДС);
			ОбработкаТабличныхЧастей.УстановитьВидимостьКолонкиТабЧасти(мКолонкиТовары.СуммаНДС, УчитыватьНДС);
			ОбработкаТабличныхЧастей.УстановитьВидимостьКолонкиТабЧасти(мКолонкиУслуги.СтавкаНДС, УчитыватьНДС);
 			ОбработкаТабличныхЧастей.УстановитьВидимостьКолонкиТабЧасти(мКолонкиУслуги.СуммаНДС, УчитыватьНДС);
		КонецЕсли;
	КонецЕсли;
КонецЕсли;

Установим принадлежность организаций к категории:
4
Задача #2
Несколько организаций холдинга отгружают товар с разных складов. Склады принадлежат разным организациям холдинга. Организацию-владельца склада необходимо указывать в качестве грузоотправителя в документах ТОРГ-12 и счет-фактура. Для этого необходимо заполнять реквизит «Грузоотправитель» документа «РеализацияТоваровУслуг» при выборе склада.

Для решения задачи необходимо внести следующие изменения в модулях конфигурации:
В модуле формы документа «РеализацияТоваровУслуг», в процедуре СкладПриИзменении() добавить код:
СвойствоГрузоотправитель = ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Грузоотправитель");
Если не СвойствоГрузоотправитель.Пустая() Тогда
	Отбор = Новый Структура;
	Отбор.Вставить("Объект", Склад);
	Отбор.Вставить("Свойство", СвойствоГрузоотправитель);
	ЗначениеСвойства = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Отбор).Значение;
	Если не ЗначениеСвойства = Неопределено Тогда
		Если не Грузоотправитель = ЗначениеСвойства Тогда
			Грузоотправитель = ЗначениеСвойства;
		КонецЕсли;
	КонецЕсли;
КонецЕсли;

В прцедуре ПриОткрытии() внутри условия Если ЭтоНовый() Тогда добавить код:
СкладПриИзменении(Неопределено); 

Аналогично первой задаче добавляем свойство «Грузоотправитель» справочнику «Склады».

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Brr (brr) 05.11.08 09:58
Плюс, однозначно. Я примерно также использую свойства контрагентов и номенклатуры в клюшках.
2. fabrikant (fabrikant) 06.11.08 05:11
Имхо, такие вещи у нормального спеца отрабатываются спинным мозгом. Без подключения головы. Зачем данная статья? Непонятно.
3. Сергей Лунев (luns) 06.11.08 07:36
(2) Не у всех к сожалению. Вещь действительно очевидная, но! Как изложено. Отличный методический материал для начинающих.
Продолжай Poppy
А то иногда лень очевидное расказывать начинающему, а так, носом в статью ткнул и красота.
Так что +
Михаська; DenisF8; +2 Ответить
4. Андрей Скляров (coder1cv8) 06.11.08 09:50
Хорошая статья для новичков.
5. Роман Петров (PeRom) 06.11.08 16:02
+3 Тут и придраться некчему. Однозначно полезно. Ждём продолжения.
6. Роман Петров (PeRom) 06.11.08 16:09
Были похожие вопросы на форуме, да и самому скоро придётся с разными организациями и складами разбираться, поможет, чтоб поменьше в типовой копаться.
Есть ещё задача: у одного заказчика по разным договорам разные адреса доставки. Могу выслать своё решение.
7. Сhe Burashka (CheBurator) 06.11.08 19:31
> Плюс, однозначно. Я примерно также использую свойства контрагентов и номенклатуры в клюшках.
а то!
только многие почему-то не удосуживаются проверять/отрабатывать ветку когда своство отсутсвует как класс...
8. Andrey Андрей (PointAnd) 21.11.08 18:21
А что здесь нового? Если конфа не снята с поддержки, то только таким способом и выкручиваются. Но здесь есть одно "НО" - если в базе работает около 30-40 пользователей, то с этим методом надо быть осторожнее, т.к. чем больше свойст вводишь в базу, тем больше возникает транзакций, а так же возникают ситуации с порчей СсылокНаОбъекты (ссылка одного объекта присваивается другому) в следствии чего идет недостоверная информация.
Все это взято не спотолка, а при работе с типовой УПП в течении года.
9. Poppy (poppy) 24.11.08 01:07
(8)
> А что здесь нового?

По сравнению с чем?

> Если конфа не снята с поддержки, то только таким способом и выкручиваются.

Я бы сказала по-другому. Таким способом выкручиваются для того, чтобы не снимать с поддержки.

> т.к. чем больше свойст вводишь в базу, тем больше возникает транзакций

О каких транзакциях идет речь?

> а так же возникают ситуации с порчей СсылокНаОбъекты

Причина порчи? Мною приведены примеры чтения свойств. Как чтение может испортить ссылки?

> Все это взято не спотолка, а при работе с типовой УПП в течении года.

Может поделишься своим опытом? А то складывается впечатление, что все это взято с потолка...
10. Сергей Лунев (luns) 24.11.08 07:24
(8) У нас более 40 свойств использовано (УПП) проблем особых нет. Не удобно только в некоторых отчетах, что "служебные" своиства мешают, но это можно решить, например: http://infostart.ru/profile/10590/projects/1993/
Ценность этой статьи, не в том что она описывает что то новое, а в том что это сделано подробно и понятно. Насчет транзакций вообще непонятно.. что имется ввиду? Какие таблицы? А про порчу ссылок вообще ересь, свойства они только называются страшно )))))) на деле обычный регистр сведений да ПВХ..
11. v_id (v_id) 24.12.08 11:11
Спасибо!

1. Почему в первом примере не стали использовать Категории, и собственно...
2. Если не сложно дополните статью способами отбора по Категориям.
12. Poppy (poppy) 05.01.09 17:52
13. Денис Лихошерстов (Hans) 11.04.09 09:37
Что то я не понял... Как не снимать с поддержки если общий модуль изменен?
14. Poppy (poppy) 13.04.09 00:05
(13) Ты, Hans, о чем? В статье описан способ не изменять общий модуль.

По твоему вопросу смотри мои комментарии здесь http://infostart.ru/blogs/892/
15. Денис Лихошерстов (Hans) 29.04.09 11:21
а я что то попутал... Плохо прочитал... Подумал что в статье писывается решение без изменения конфы ваще... а тут только без изменения метаданных и форм.
16. Nick (NickKom) 25.08.09 20:53
Да, предлагаемая методика может быть полезна во многих случаях. Но как быть в ситуации, когда нужно использовать свойства документа?
Например, после проведения документа необходимо установить некий признак в одно из нескольких фиксированных значений. Установленный признак - свойство именно текущего документа. Но это второстепенный признак, в регистрах не прописан, и из-за него перепроводить документ не стоит. Напрашивается использование свойства документа. Но типовая конфигурация УТ этого не позволяет. Как быть?
17. Poppy (poppy) 26.08.09 20:03
(16) В типовой УТ10.3 свойства у документов есть.
18. Nick (NickKom) 26.08.09 20:45
(17) Действительно, есть. Поторопился, не разобрался.
Спасибо.
19. Артур Аюханов (artbear) 12.02.10 15:07
(17) В своей публикации http://www.infostart.ru/public/65526/
сослался на некоторые Ваши работы, т.к. сам использую практически те же самые технологии :)
20. bulpi bulpi (bulpi) 17.02.10 17:05
И фсе это только для того, чтобы не добавить один реквизит в метаданные ??? А потом долбаться с выводом в отчеты информации по условию, накладываемому на свойство... Да ну вас, окститесь.
Михаська; Tciban; krosaf4eg; +3 Ответить 1
21. Александр Медведев (anig99) 17.02.10 20:39
есть свои плюсы и минусы у способа... у статьи тоже... в результате пока "0"
22. Poppy (poppy) 18.02.10 11:55
(20) Не надо все возводить в абсолют. Многие отчеты типовых конфигураций поддерживают механизм свойств.
Как говорится - кто на что учился. Проще добавить реквизит? Добавляй. Это твое решение, как архитектора ИС.

(21) Спасибо, что обратил внимание...
23. Poppy (poppy) 18.02.10 11:59
(19) Спасибо, artbear! Для меня важно твое мнение.
24. Александр Медведев (anig99) 18.02.10 14:42
хотя за подробность описания поставлю +
25. rasswet (rasswet) 28.02.10 18:05
нужно это обдумать..может и пригодится.. :)
26. Alexey Pak (Alexey55) 16.09.11 12:38
27. ketana-v (infosoft-v) 13.10.11 10:16
Здравствуйте.
Полезная статья для тех кто осваивает возможности 1С. Это знание - кирпичик в копилку профессионала.
Я попробовал применить эту идею в 1С Бухгалтерия для регистрации менеджера который сделал продажу в документе реализации. Окончательно задачу реализовал по другому, но возможность работать со свойствами заняло своё место в копилке.
28. Еlen Jatsenko (alenakrr) 28.10.11 15:42
если создать непериодический регистр сведений "ТекущиеКонстанты" и добавить в него все используемые свойства, то не придется писать в модуле "НайтиПоНаименованию" и обеспечит однозначность использования))
heavymetal; +1 Ответить
30. andrey dyak (dyak84) 04.04.13 12:25
Спасибо очень полезно и познавательно.Про такую возможность работать со свойствами даже не догадивался. Так держать
31. Сергей Сазонов (sns-bizon) 07.04.13 09:12