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

19.02.15

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

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

Файлы

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

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

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Вступайте в нашу телеграмм-группу Инфостарт

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

См. также

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

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

14.05.2025    3106    DeerCven    8    

42

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

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    40005    dimanich70    83    

156

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

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

1 стартмани

18.03.2024    5910    6    John_d    11    

57

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

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

12.02.2024    47596    atdonya    30    

65

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

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

30.11.2023    7667    ke.92@mail.ru    17    

66

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

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

28.08.2023    20630    YA_418728146    8    

174

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

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

2 стартмани

22.08.2023    5918    92    progmaster    15    

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

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