Публикации

БСП
Разработки

Найдено публикаций: 22

acsent 78 13

Открыть отчет с пользовательскими настройками

2 acsent 78 13
    Настройки = Новый НастройкиКомпоновкиДанных;
    Элемент = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар");
    Элемент.ИдентификаторПользовательскойНастройки = "Идентификатор";
    
    ПараметрыФормы = Новый Структура("Вариант", Настройки);
    ОткрытьФорму("Отчет.ОстаткиТоваровНаСкладах.Форма", ПараметрыФормы);

Поиск по ГУИД в COM

2 acsent 78 13
Функция НайтиСсылкуНаСправочникПоУИД(СсылкаВБазе, ИмяСправочника, Соединение)
	
	Если НЕ ЗначениеЗаполнено(СсылкаВБазе) Тогда
		Возврат Соединение.Справочники[ИмяСправочника].ПустаяСсылка();
	КонецЕсли;	
	
	УИДСтрокой = Строка(СсылкаВБазе.УникальныйИдентификатор());
	УИД = Соединение.NewObject("УникальныйИдентификатор", УИДСтрокой);
	
	СсылкаНаСправочник = Соединение.Справочники[ИмяСправочника].ПолучитьСсылку(УИД);
	Если Соединение.ОбщегоНазначения.СсылкаСуществует(СсылкаНаСправочник) = Ложь тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Возврат СсылкаНаСправочник; 
	
КонецФункции

Получить ссылку по типу и гуид

1 acsent 78 13
Тип = Тип(ПоследняяОткрытаяСтрока.ТипЗначенияXML);
УИД = Новый УникальныйИдентификатор(ПоследняяОткрытаяСтрока.ЗначениеXML);
Массив = Новый Массив;
Массив.Добавить(УИД);
Значение = Новый (Тип, Массив);

Добавить отбор в списке, в пользовательских настройках

1 acsent 78 13
Процедура УстановитьПользовательскийОтбор(КомпоновщикНастроек, Поле, ВидСравнения, Значение) Экспорт
	
	// Сначала найдем выделенный элемент отбора
	Для каждого ЭлементНастроек из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
		
		Если ТипЗнч(ЭлементНастроек) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
			
			ТекПоле = "";
			Для каждого ЭлементОтбора из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
				
				Если ЭлементНастроек.ИдентификаторПользовательскойНастройки = ЭлементОтбора.ИдентификаторПользовательскойНастройки Тогда
					ТекПоле = ЭлементОтбора.ЛевоеЗначение;
					Прервать;
				КонецЕсли;	
				
			КонецЦикла;
			
			Если Строка(ТекПоле) = Поле Тогда
				ЭлементНастроек.ВидСравнения   = ВидСравнения;
				ЭлементНастроек.ПравоеЗначение = Значение;
				ЭлементНастроек.Использование  = Истина;
				Возврат;
			КонецЕсли;	
			
		КонецЕсли;	
		
	КонецЦикла;
	
	// Найдем отбор
	Для каждого ЭлементНастроек из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
		
		Если ТипЗнч(ЭлементНастроек) = Тип("ОтборКомпоновкиДанных") Тогда
			
			ТекОтборП = ТиповыеОтчеты_УправляемыйРежим.УстановитьОтбор(ЭлементНастроек, Поле, ВидСравнения, Значение);
			Прервать;
			
		КонецЕсли;	
		
	КонецЦикла;
	
КонецПроцедуры

Изменение формы справочника в зависимости от папки

2 acsent 78 13
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	
	Если ВидФормы = "ФормаОбъекта" Тогда
		
		Если Параметры.Свойство("Ключ") 
			И ОбщегоНазначенияСервер.ВходитВИерархию(Параметры.Ключ, Справочники.Проекты.ИнвестиционныеПроекты) Тогда
			
			СтандартнаяОбработка = Ложь;
			ВыбраннаяФорма       = "ФормаЭлементаУправляемая";
			
		ИначеЕсли Параметры.Свойство("ЗначенияЗаполнения")
			И Параметры.ЗначенияЗаполнения.Свойство("Родитель")
			И ОбщегоНазначенияСервер.ВходитВИерархию(Параметры.ЗначенияЗаполнения.Родитель, Справочники.Проекты.ИнвестиционныеПроекты) Тогда
			
			СтандартнаяОбработка = Ложь;
			ВыбраннаяФорма       = "ФормаЭлементаУправляемая";
			
		ИначеЕсли Параметры.Свойство("ЗначениеКопирования")
			И ОбщегоНазначенияСервер.ВходитВИерархию(Параметры.ЗначениеКопирования.Родитель, Справочники.Проекты.ИнвестиционныеПроекты) Тогда
			
			СтандартнаяОбработка = Ложь;
			ВыбраннаяФорма       = "ФормаЭлементаУправляемая";
			
		КонецЕсли;	
		
	КонецЕсли;
	
КонецПроцедуры

Запрет выгрузки в КД по дате запрета редактирования

ПередКонвертациейОбъекта, глобальное событие
3 acsent 78 13
// Выгружаем документы только по списку организаций.
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипЗнч(Источник));
Если МетаданныеОбъекта <> Неопределено
	И Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
	
	Если МетаданныеОбъекта.Реквизиты.Найти("Организация") <> Неопределено Тогда	 
		
		ДатаЗапретаРедактирования = Параметры.ДатыЗапретаРедактирования[Источник.Организация.Код];
		Если ЗначениеЗаполнено(ДатаЗапретаРедактирования) Тогда
			
			Если Источник.Дата <= ДатаЗапретаРедактирования Тогда
				НеЗамещатьОбъектПриЗагрузке = Истина;
				ТолькоПолучитьУзелСсылки    = Истина;
			КонецЕсли;	
			
		КонецЕсли;	
		
	КонецЕсли;
	
КонецЕсли;

Значение полей в расшифровке СКД

Значение полей в расшифровке СКД
2 acsent 78 13
&НаСервереБезКонтекста 
Функция ПолучитьЗначениеПоляРасшифровкиНаСервере(ИдентификаторРасшифровки, АдресДанныхРасшифровки)
	
    ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресДанныхРасшифровки);
	ЭлементРасшифровки = ДанныеРасшифровки.Элементы[ИдентификаторРасшифровки];
	
	МассивРодителей = Новый Массив;
	МассивРодителей.Добавить(ЭлементРасшифровки.ПолучитьПоля());
	
	Родители = ЭлементРасшифровки.ПолучитьРодителей();
	ЗаполнитьМассивРодителей(МассивРодителей, Родители);
	
	Результат = Новый Соответствие;
	Для Счетчик = 1 по МассивРодителей.Количество() Цикл 
		
		// Обойдем в обратном порядке, чтобы поставить условия в порядке группировок			
		ПоляКомпоновки = МассивРодителей[МассивРодителей.Количество() - Счетчик];
		Для каждого ПолеКомпоновки из ПоляКомпоновки Цикл
			
			//Если ПолеКомпоновки.Иерархия Тогда
			//	Продолжить;
			//КонецЕсли;	
			
			Результат.Вставить(ПолеКомпоновки.Поле, ПолеКомпоновки.Значение);
			
		КонецЦикла;	
		
	КонецЦикла;	
	
	Возврат Результат;
	
КонецФункции

&НаСервереБезКонтекста 
Процедура ЗаполнитьМассивРодителей(МассивРодителей, Родители)
	
	Для каждого Родитель из Родители Цикл
		
		Если ТипЗнч(Родитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
			МассивРодителей.Добавить(Родитель.ПолучитьПоля());
			
		ИначеЕсли ТипЗнч(Родитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
			
		КонецЕсли;	
		
		Родители = Родитель.ПолучитьРодителей();
		Если Родители.Количество() > 0 Тогда
			ЗаполнитьМассивРодителей(МассивРодителей, Родители);
		КонецЕсли;	
		
	КонецЦикла;	

КонецПроцедуры	

Программное создание схемы СКД

Пример программного создания схемы СКД
9 acsent 78 13
Функция СоздатьСхемуКомпоновки() Экспорт
	
	СхемаСКД = Новый СхемаКомпоновкиДанных;
	ИсточникДанных = СхемаСКД.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя                = "ИсточникДанных";
	ИсточникДанных.ТипИсточникаДанных = "local";
	
	НаборДанных = СхемаСКД.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
	НаборДанных.Имя        = "Данные";
	НаборДанных.ИмяОбъекта = "Данные";
	НаборДанных.ИсточникДанных = "ИсточникДанных";
	
	Настройки   = СхемаСКД.НастройкиПоУмолчанию;
	
	Группировка = Настройки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	Группировка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
	
	Параметр = СхемаСКД.Параметры.Добавить();
	Параметр.Имя         = "Период";
	Параметр.ТипЗначения = Новый ОписаниеТипов("СтандартныйПериод");
	
	Для каждого СтрокаТЗ из Поля Цикл
		
		ТипЗначения = ЗначениеИзСтрокиВнутр(СтрокаТЗ.ТипЗначения);
		
		Если СтрокаТЗ.Ресурс Тогда
			
			Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
			Поле.Поле        = СтрокаТЗ.Имя + "Тек";
			Поле.ТипЗначения = ТипЗначения;
			Поле.Заголовок   = Представление(СтрокаТЗ) + " (тек)";
			Поле.ПутьКДанным = СтрокаТЗ.Имя + "Тек";
			
			Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
			Поле.Поле        = СтрокаТЗ.Имя + "Др";
			Поле.ТипЗначения = ТипЗначения;
			Поле.Заголовок   = Представление(СтрокаТЗ) + " (др)";
			Поле.ПутьКДанным = СтрокаТЗ.Имя + "Др";
			
			ВычисляемоеПоле = СхемаСКД.ВычисляемыеПоля.Добавить();
			ВычисляемоеПоле.ПутьКДанным = "Разница" + СтрокаТЗ.Имя;
			ВычисляемоеПоле.Выражение   = "ЕстьNULL(" + СтрокаТЗ.Имя + "Тек, 0) - ЕстьNULL(" + СтрокаТЗ.Имя + "Др, 0)";
			ВычисляемоеПоле.ТипЗначения = ТипЗначения;
			ВычисляемоеПоле.Заголовок   = "Разница (" + Представление(СтрокаТЗ) + ")";
			
			ПолеИтога = СхемаСКД.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = СтрокаТЗ.Имя + "Тек";
			ПолеИтога.Выражение   = "Сумма(" + СтрокаТЗ.Имя + "Тек)";
			
			ПолеИтога = СхемаСКД.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = СтрокаТЗ.Имя + "Др";
			ПолеИтога.Выражение   = "Сумма(" + СтрокаТЗ.Имя + "Др)";
			
			ПолеИтога = СхемаСКД.ПоляИтога.Добавить();
			ПолеИтога.ПутьКДанным = "Разница" + СтрокаТЗ.Имя;
			ПолеИтога.Выражение   = "Сумма(Разница" + СтрокаТЗ.Имя + ")";
			
			Группа = Настройки.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
			Группа.Расположение  = РасположениеПоляКомпоновкиДанных.Горизонтально;
			Группа.Заголовок     = Представление(СтрокаТЗ);
			Группа.Использование = Истина;
			
			ВыбранноеПоле = Группа.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
			ВыбранноеПоле.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Тек");
			ВыбранноеПоле.Заголовок     = "Текущая";
			ВыбранноеПоле.Использование = Истина;
			
			ВыбранноеПоле = Группа.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
			ВыбранноеПоле.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Др");
			ВыбранноеПоле.Заголовок     = "Другая";
			ВыбранноеПоле.Использование = Истина;
			
			ЭлементОформления = Настройки.УсловноеОформление.Элементы.Добавить();
			ЭлементОформления.Использование = Истина;
			УстановитьОформления(ЭлементОформления.Оформление);
			
			ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Разница" + СтрокаТЗ.Имя);
			ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.НеРавно;
			ЭлементОтбора.ПравоеЗначение = 0;
			ЭлементОтбора.Использование  = Истина;
			
			ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
			ПолеОформления.Использование = Истина;
			ПолеОформления.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Тек");
			
			ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
			ПолеОформления.Использование = Истина;
			ПолеОформления.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя + "Др");
			
		Иначе	
			
			Поле = НаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
			Поле.Поле        = СтрокаТЗ.Имя;
			Поле.Заголовок   = Представление(СтрокаТЗ);
			Поле.ПутьКДанным = СтрокаТЗ.Имя;
			Поле.ТипЗначения = ТипЗначения;
			
			ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
			ВыбранноеПоле.Поле          = Новый ПолеКомпоновкиДанных(СтрокаТЗ.Имя);
			ВыбранноеПоле.Использование = Истина;
			
		КонецЕсли;	
		
	КонецЦикла;	
	
	Возврат СхемаСКД;
	
КонецФункции

Проверка существание ссылки в базе

Проверка существование ссылки в базе, объект не найден типовая функция БСП
5 acsent 78 13
Функция СсылкаСуществует(ЛюбаяСсылка) Экспорт
	
	ТекстЗапроса = "
	|ВЫБРАТЬ
	|	Ссылка КАК Ссылка
	|ИЗ
	|	[ИмяТаблицы]
	|ГДЕ
	|	Ссылка = &Ссылка
	|";
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "[ИмяТаблицы]", ЛюбаяСсылка.Метаданные().ПолноеИмя());
	
	Запрос = Новый Запрос;
	Запрос.Текст = ТекстЗапроса;
	Запрос.УстановитьПараметр("Ссылка", ЛюбаяСсылка);
	
	УстановитьПривилегированныйРежим(Истина);
	
	Возврат НЕ Запрос.Выполнить().Пустой();
	
КонецФункции

Изменение событий в отборе СКД

Изменение событий в отборе СКД (обычные формы)
3 acsent 78 13
ЭлементыФормы.Отбор.Колонки.ПравоеЗначениеДляКраткогоОтображенияЭлемента.ЭлементУправления.УстановитьДействие("НачалоВыбора", Новый Действие("ОтборНачалоВыбора"));

Процедура ОтборНачалоВыбора(Элемент, СтандартнаяОбработка)
	
	ТекущиеДанные = ЭлементыФормы.Отбор.ТекущиеДанные;
	Если Строка(ТекущиеДанные.ЛевоеЗначение) = "Родитель" Тогда
		
		СтандартнаяОбработка = Ложь;
		Форма = Справочники.Номенклатура.ПолучитьФормуВыбораГруппы(, Элемент);
		Форма.Открыть();
		
	КонецЕсли;	
	
КонецПроцедуры