Механизм "быстрых констант"

19.02.15

Разработка - Универсальные функции

Механизм создания в любой конфигурации определенных пар Синоним - Значение для использования в модулях вместо предопределенных данных. Может быть использован как в обычном, так и в управляемом приложениях.

Скачать исходный код

Наименование Файл Версия Размер
Выгрузка базы БыстрыеКонстанты
.dt 114,09Kb
5
.dt 114,09Kb 5 Скачать

Описание проблемы.

Довольно часто встречаются ситуации, когда при разработке функционала приложения некоторые элементы справочников, ПВХ, документы, становятся своего рода константами. Как правило такие элементы не заводятся в качестве предопределенных данных.

Например, такая ситуация:

Торговая конфигурация, элементом номенклатуры заведена "Упаковка", по мере необходимости добавляется в документы реализации. Далее правила меняются, ставится задача включать упаковку во ВСЕ документы реализации, сделать это программно. Нужно в коде программы инициализировать упаковку как, своего рода, константу. Как поступить? 

  1. Добавить ссылку на упаковку в константы.
  2. Завести предопределенный элемент номенклатуры (еще одна упаковка).
  3. Искать по коду, наименованию, реквизиту.

Все это не то. Для случая (1) - а если таких будет много? Плодить константы? Для случая (2) - явное дублирование сущностей, некрасиво. Для случая (3) - ненадежно. Отрезать пользователям возможность редактирования кода/наименования/реквизитов нельзя.

Методика решения.

Завести отдельный от основного функционала конфигурации механизм для хранения информации имеющей для разработчика характер констант. Доступ к изменению этой информации ограничить явно. Всем читать, только разработчику писать/изменять.

Сопоставление в коде можно производить по коду/наименованию элемента соответствующего ПВХ.

Объекты и процедуры метода.

  1. Создаем ПВХ, в типизацию которого включаем все нужное из конкретной конфигурации. Код в этом ПВХ уникален и является "синонимом" как константы.
  2. Создаем регистр сведений который будет хранить конкретные значения (в том числе множественные) для элементов ПВХ. Делаем его периодическим.
  3. Определяем механизм проверок для изменения кода ПВХ и записей регистра на предмет некорректного изменения. Можно, конечно, этого и не делать, ведь полный доступ будет иметь только разработчик. Он, конечно, знает что делает, но все ошибаются.
  4. Достаточно только одной функции для получения данных в модули:
// Получение значений пользовательских констант
//
// Параметры:
//  Параметры  - Структура - запрос каких значений. Неопределено тогда все последние.
//                 Ключи:
//					НаДату 	- ДатаВремя - на срез значения (до дня). Пустая, вообще нет или неопределено это последнее.
//					Имена 	- Массив 	- строки с именами ПВХ значений. Вообще нет или неопределено тогда все.
//
// Возвращаемое значение:
//   Структура   	- Ключ 		- ИмяКонстанты.
//					- Значение 	- единичное или массив
//
// Пример вызова:
//
//	Имена = Новый Массив;
//	Имена.Добавить("ПользователиГлавногоОтчета");
//	Имена.Добавить("Ответственный_РНК");
//	Имена.Добавить("Доставка");
//	// Выборочно последние
//	Параметры = Новый Структура("Имена", Имена);
//	// Выборочно на 30-05-2014
//	Параметры = Новый Структура("Имена, НаДату", Имена, Дата('20140530'));
//	// Все на 30-05-2014
//	Параметры = Новый Структура("НаДату", Дата('20140530'));
//	// Все последние
//	Параметры = Неопределено; // тоесть можно не передавать
//
Функция БК_ПолучитьЗначенияКонстант(Параметры = Неопределено) Экспорт
	
	Если Параметры = Неопределено Тогда
		НаДату 		= Неопределено;
		Имена 		= Неопределено;
		ВыбратьВсе 	= Истина;
	Иначе	
	
		Если Параметры.Свойство("НаДату") Тогда
			Если ЗначениеЗаполнено(Параметры.НаДату) Тогда
				НаДату = Параметры.НаДату;
			Иначе
				НаДату = Неопределено;
			КонецЕсли;
		Иначе
			НаДату = Неопределено;
		КонецЕсли;
		
		Если НЕ Параметры.Свойство("Имена") Тогда
			Имена 		= Неопределено;
			ВыбратьВсе 	= Истина;
		Иначе
			Имена 		= Параметры.Имена;
			ВыбратьВсе 	= Ложь;
		КонецЕсли;
		
	КонецЕсли;	
		
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	ХранимыеЗначенияКонстантСрезПоследних.ЗначимаяКонстанта.Код КАК Код,
	               |	ХранимыеЗначенияКонстантСрезПоследних.Значение,
	               |	ХранимыеЗначенияКонстантСрезПоследних.ЗначимаяКонстанта.ИспользоватьСписком КАК ИспользоватьСписком,
	               |	ХранимыеЗначенияКонстантСрезПоследних.ЗначениеСписка
	               |ИЗ
	               |	РегистрСведений.БК_ХранимыеЗначенияКонстант.СрезПоследних(
	               |			&НаДату,
	               |			ВЫБОР
	               |				КОГДА &ВыбратьВсе
	               |					ТОГДА ИСТИНА
	               |				ИНАЧЕ ЗначимаяКонстанта.Код В (&Имена)
	               |			КОНЕЦ) КАК ХранимыеЗначенияКонстантСрезПоследних";
				   
	Запрос.УстановитьПараметр("НаДату", 	НаДату);				   
	Запрос.УстановитьПараметр("Имена", 		Имена);
	Запрос.УстановитьПараметр("ВыбратьВсе", ВыбратьВсе);
	
	СтруктураВозврата = Новый Структура;
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат СтруктураВозврата;
	КонецЕсли;
	
	Выборка = Результат.Выбрать();
	Пока Выборка.Следующий() Цикл
		
		Если Выборка.ИспользоватьСписком Тогда
			ЗначениеВыборки = Выборка.ЗначениеСписка.Получить();
		Иначе
			ЗначениеВыборки = Выборка.Значение;
		КонецЕсли;	
		
		СтруктураВозврата.Вставить(Выборка.Код, ЗначениеВыборки);		
	КонецЦикла;	

	// Если выбираем все следует проверить заполненость всех имен
	// Не найденные заполняем пустым значением типа
	Если НЕ ВыбратьВсе Тогда
		
		Если Имена.Количество()>СтруктураВозврата.Количество() Тогда
			
			Для Каждого ИмяКонстанты Из Имена Цикл
				Если НЕ СтруктураВозврата.Свойство(ИмяКонстанты) Тогда
					
					СсылкаКонстанта = ПланыВидовХарактеристик.БК_ЗначенияКонстант.НайтиПоКоду(ИмяКонстанты);
					ТипКонстанты 	= СсылкаКонстанта.ТипЗначения;
					
					Если СсылкаКонстанта.ИспользоватьСписком Тогда
						ЗначениеКонстанты = Новый Массив;
					Иначе
						ЗначениеКонстанты = ПолучитьПустуюСсылкуТипа(ТипКонстанты);
					КонецЕсли;	
					
					СтруктураВозврата.Вставить(ИмяКонстанты, ЗначениеКонстанты);		
					
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
	Возврат СтруктураВозврата;

КонецФункции // БК_ПолучитьЗначенияКонстант()

 Описание примера.

В выгрузке ИБ содержится два примера работы с механизмом:

  1. Для отчета "ГлавныйОтчет" при открытии формы выводится список пользователей, которые имеют право на его использование. Это пример константы имеющей списочный тип (массив).
  2. Для документа "РасходнаяНакладная" при записи получаем и записываем значения ответственного, доставку и упаковку.

Механизм простой, поэтому более детального описания не привожу.

 

сопоставление значений

См. также

Вставляем картинку из буфера обмена (платформа 1С 8.3.24)

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    2896    2    John_d    11    

56

GUID в 1С 8.3 - как с ними быть

Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    5055    atdonya    22    

51

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    4105    ke.92@mail.ru    16    

62

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    9395    YA_418728146    6    

143

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2239    25    progmaster    8    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    16361    142    sapervodichka    112    

130

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7356    quazare    8    

110
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. zqzq 23 20.02.15 09:08 Сейчас в теме
Сделал у себя похожее решение достаточно давно, хотел выложить на инфостарт, но всё лень...

Принципиальные отличия от данного:
1. 2 разных ПВХ для констант-элементов и констант-массивов. Т.к. работа с ними в коде принципиально разная и при смене "типа" константы в прикладном коде будут ошибки. (Оба вида периодические как и тут).
2. Значения констант-массивов хранятся в табличной части справочника. Плюсы: есть типизация ТЧ по элементу ПВХ "из коробки", есть контроль ссылочной целостности (хранилище значений - зло). Для простоты для констант-массивов регистр сведений не используется, в том же справочнике и ссылка на ПВХ, и период.
3. Элементы ПВХ создаются только предопределённые. Никаких поисков по коду/наименованию. Почему - разработка ведётся в тестовых базах, и иначе будет хаос и г0внокод.
4. Для миграции значений "констант" в рабочую базу, есть выгрузка значений в текстовый документ, далее этот текст вставляется в общий макет конфигурации, далее при запуске рабочей базы незаполненные значения заполняются из этого макета. Естественно, ссылочные значения должны совпадать по ссылкам в рабочей и тестовой базе (элементы ПВХ сопоставляются по имени предопределенного).
5. Так же как и тут, получения значения через функцию общего модуля.
Оставьте свое сообщение