Шаблоны кода 1С


Добавить новый Назад

Запрос с нумерацией строк

хитрый запрос с нумерацией строк

запрос

ВЫБРАТЬ
	                 |	ШтрихкодыНоменклатуры.Штрихкод,
	                 |	ШтрихкодыНоменклатуры.Номенклатура,
	                 |	ШтрихкодыНоменклатуры.Характеристика,
	                 |	ШтрихкодыНоменклатуры.Упаковка
	                 |ПОМЕСТИТЬ Нач
	                 |ИЗ
	                 |	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
	                 |;
	                 |
	                 |////////////////////////////////////////////////////////////////////////////////
	                 |ВЫБРАТЬ
	                 |	Нач.Штрихкод,
	                 |	КОЛИЧЕСТВО(Нач1.Штрихкод) КАК ПорядковыйНомер
	                 |ИЗ
	                 |	Нач КАК Нач
	                 |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Нач КАК Нач1
	                 |		ПО Нач.Штрихкод >= Нач1.Штрихкод
	                 |
	                 |СГРУППИРОВАТЬ ПО
	                 |	Нач.Штрихкод
	                 |
	                 |УПОРЯДОЧИТЬ ПО
	                 |	ПорядковыйНомер
Добавить комментарий

Средневзвешенный курс валюты за указанный период

Средневзвешенный курс валюты за указанный период (запрос для 8.0)

8.0 Средневзвешенный курс

Добавил: Dmitry Zhurbenko
////////////////////////////////////////////////////////////////////////////////
//
// Функция ПолучитьСреднийКурсВалюты
//
// Описание: Возвращает средневзвешенный курс за период
//
//
// Параметры (название, тип, дифференцированное значение)
//
// Возвращаемое значение: 
//
Функция ПолучитьСреднийКурсВалюты(НачПериода, КонПериода, Валюта) Экспорт
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("НачалоПериода", НачПериода);
	Запрос.УстановитьПараметр("КонецПериода", КонПериода);
	Запрос.УстановитьПараметр("Валюта", Валюта);
	Запрос.Текст = "ВЫБРАТЬ
	               |	ЕСТЬNULL(ВЫРАЗИТЬ(СУММА(ВложенныйЗапрос.Курс) / КОЛИЧЕСТВО(ВложенныйЗапрос.Период) КАК ЧИСЛО(15, 4)), 0) КАК СреднийКурс
	               |ИЗ
	               |	(ВЫБРАТЬ
	               |		ВложенныйЗапрос.Период КАК Период,
	               |		КурсыВалют.Курс КАК Курс
	               |	ИЗ
	               |		(ВЫБРАТЬ
	               |			МАКСИМУМ(КурсыВалют.Период) КАК ПериодКурса,
	               |			ВложенныйЗапрос.Период КАК Период
	               |		ИЗ
	               |			(ВЫБРАТЬ
	               |				ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d) КАК Период
	               |			ИЗ
	               |				(ВЫБРАТЬ
	               |					0 КАК a
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					1
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					2
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					3
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					4
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					5
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					6
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					7
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					8
	               |				
	               |				ОБЪЕДИНИТЬ
	               |				
	               |				ВЫБРАТЬ
	               |					9) КАК aa
	               |					ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	               |						0 КАК b
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						1
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						2
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						3
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						4
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						5
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						6
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						7
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						8
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						9) КАК bb
	               |					ПО (ИСТИНА)
	               |					ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	               |						0 КАК c
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						1
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						2
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						3
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						4
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						5
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						6
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						7
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						8
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						9) КАК cc
	               |					ПО (ИСТИНА)
	               |					ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	               |						0 КАК d
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						1
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						2
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						3
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						4
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						5
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						6
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						7
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						8
	               |					
	               |					ОБЪЕДИНИТЬ
	               |					
	               |					ВЫБРАТЬ
	               |						9) КАК dd
	               |					ПО (ИСТИНА)
	               |			ГДЕ
	               |				aa.a * 1000 + bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)) КАК ВложенныйЗапрос
	               |				ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
	               |				ПО КурсыВалют.Период <= ВложенныйЗапрос.Период
	               |					И (КурсыВалют.Валюта = &Валюта)
	               |		
	               |		СГРУППИРОВАТЬ ПО
	               |			ВложенныйЗапрос.Период) КАК ВложенныйЗапрос
	               |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
	               |			ПО ВложенныйЗапрос.ПериодКурса = КурсыВалют.Период
	               |				И (КурсыВалют.Валюта = &Валюта)) КАК ВложенныйЗапрос";
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат 0;
	Иначе
		Выборка = Результат.Выбрать();
		Выборка.Следующий();
		Возврат Выборка.СреднийКурс ;		
	КонецЕсли; 
    
КонецФункции //ПолучитьСреднийКурсВалюты
Добавить комментарий

ТаблицаЗначенийВМассив

Преобразует таблицу значений в массив.

Коллекции

Добавил: Поддержка TurboConf
//	Преобразует таблицу значений в массив.
//	Может использоваться для передачи на клиента данных, полученных
//	на сервере в виде таблицы значений в том случае, если таблица
//	значений содержит только такие значения, которые могут  быть переданы на клиента
//
//	Полученный массив содержит структуры, каждая из которых повторяет
//	структуру колонок таблицы значений.
//
//	Не рекомендуется использовать для преобразования таблиц значений
//	с большим количеством строк.
//
//	Параметры: ТаблицаЗначений
//	Возвращаемое значение: Массив
//
Функция ТаблицаЗначенийВМассив(ТаблицаЗначений) Экспорт
	
	Массив = Новый Массив();
	СтруктураСтрокой = "";
	НужнаЗапятая = Ложь;
	Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
		Если НужнаЗапятая Тогда
			СтруктураСтрокой = СтруктураСтрокой + ",";
		КонецЕсли;
		СтруктураСтрокой = СтруктураСтрокой + Колонка.Имя;
		НужнаЗапятая = Истина;
	КонецЦикла;
	Для Каждого Строка Из ТаблицаЗначений Цикл
		НоваяСтрока = Новый Структура(СтруктураСтрокой);
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
		Массив.Добавить(НоваяСтрока);
	КонецЦикла;
	Возврат Массив;

КонецФункции
Добавить комментарий

Перенести отбор СКД

Перенести отбор СКД из одного компоновщика в другой

СКД

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

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

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

СКД

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

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

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

СКД

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

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

Структура подчиненности

Эта функция возвращает список документов в структуре подчиненности

Структура подчиненности

Функция ПолучитьРодительскиеДокументы(ДокументСсылка, СписокСвязанныхДокументов = Неопределено, мУжеВСписке = Неопределено) Экспорт
	Если СписокСвязанныхДокументов = Неопределено Тогда
		СписокСвязанныхДокументов = Новый СписокЗначений;
	КонецЕсли;
	Если мУжеВСписке = Неопределено Тогда
		мУжеВСписке = Новый Соответствие;
	КонецЕсли;
	МетаданныеДокумента = ДокументСсылка.Метаданные();
	СписокРеквизитов = Новый СписокЗначений;
	Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
		ТипыРеквизита = Реквизит.Тип.Типы();
		Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
			МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
			Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
				И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
				Попытка
					ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
				Исключение
					Прервать;
				КонецПопытки;
				ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
					И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
					Попытка
						СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
					Исключение
						ОтладкаТекстОшибки = ОписаниеОшибки();
					КонецПопытки;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
		СтрРеквизитов = "";
		Попытка
			СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
		Исключение
			Прервать;
		КонецПопытки;
		Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
			ТипыРеквизита = Реквизит.Тип.Типы();
			Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
				МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
				Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
					И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
					СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		СодержимоеТЧ.Свернуть(СтрРеквизитов);
		Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
			Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
				Попытка
					ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
				Исключение
					Продолжить;
				КонецПопытки;
				МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
				Если МетаданныеЗначения = Неопределено Тогда
					// базовый тип
					Продолжить;
				КонецЕсли;
				ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
					И Метаданные.Документы.Содержит(МетаданныеЗначения)
					И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
					Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
						Попытка
							СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
						Исключение
							ОтладкаТекстОшибки = ОписаниеОшибки();
						КонецПопытки;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	мУжеВСписке.Вставить(ДокументСсылка, Истина);
	Для Каждого СтрСЗ Из СписокРеквизитов Цикл
		СписокСвязанныхДокументов = ПолучитьРодительскиеДокументы(СтрСЗ.Значение, СписокСвязанныхДокументов, мУжеВСписке);
	КонецЦикла;
	Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка
	| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	Выборка = Запрос.Выполнить().Выбрать();
	ЕСли Выборка.Следующий() Тогда
		СписокСвязанныхДокументов.Добавить(Выборка.Ссылка);
	Иначе
		СписокСвязанныхДокументов.Добавить(ДокументСсылка);
	КонецЕсли;
	Возврат СписокСвязанныхДокументов;
КонецФункции
Функция ПолучитьПодчиненныеДокументы(ДокументСсылка, СписокСвязанныхДокументов = Неопределено, мУжеВСписке = Неопределено) Экспорт
	Если СписокСвязанныхДокументов = Неопределено Тогда
		СписокСвязанныхДокументов = Новый СписокЗначений;
	КонецЕсли;
	Если мУжеВСписке = Неопределено Тогда
		мУжеВСписке = Новый Соответствие;
	КонецЕсли;
	Таблица = ПолныеПрава.ПолучитьВыборкуПоКритериюОтбора("СвязанныеДокументы", ДокументСсылка);
	КэшПоТипамДокументов = Новый Соответствие;
	Для Каждого СтрокаТаблицы ИЗ Таблица Цикл
		МетаданныеДокумента = СтрокаТаблицы.Ссылка.Метаданные();
		Если Не ПравоДоступа("Чтение", МетаданныеДокумента) Тогда
			Продолжить;
		КонецЕсли;
		ИмяДокумента = МетаданныеДокумента.Имя;
		СинонимДокумента = МетаданныеДокумента.Синоним;
		СтруктураТипа = КэшПоТипамДокументов[ИмяДокумента];
		Если СтруктураТипа = Неопределено Тогда
			СтруктураТипа = Новый Структура("Синоним, МассивСсылок", СинонимДокумента, Новый Массив);
			КэшПоТипамДокументов.Вставить(ИмяДокумента, СтруктураТипа);
		КонецЕсли;
		СтруктураТипа.МассивСсылок.Добавить(СтрокаТаблицы.Ссылка);
	КонецЦикла;
	ЕСли КэшПоТипамДокументов.Количество() = 0 Тогда
		Возврат СписокСвязанныхДокументов;
	КонецЕсли;
	ТекстЗапросаНачало = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ (";
	ТекстЗапросаКонец = ") КАК ПодчиненныеДокументы ";
	Запрос = Новый Запрос;
	Для Каждого КлючИЗначение ИЗ КэшПоТипамДокументов Цикл
		Запрос.Текст = Запрос.Текст + ?(Запрос.Текст = "", "
		|ВЫБРАТЬ ", "
		|ОБЪЕДИНИТЬ ВСЕ
		|ВЫБРАТЬ") + "
		|Ссылка
		|ИЗ Документ." + КлючИЗначение.Ключ + "
		|ГДЕ Ссылка В (&" + КлючИЗначение.Ключ + ")";
		Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение.МассивСсылок);
	КонецЦикла;
	Запрос.Текст = ТекстЗапросаНачало + Запрос.Текст + ТекстЗапросаКонец;
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
			СписокСвязанныхДокументов.Добавить(Выборка.Ссылка);
			мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
			СписокСвязанныхДокументов = ПолучитьПодчиненныеДокументы(Выборка.Ссылка, СписокСвязанныхДокументов, мУжеВСписке);
		КонецЕсли;
	КонецЦикла;
	Возврат СписокСвязанныхДокументов;
КонецФункции
Добавить комментарий

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

Проверка существание ссылки в базе, объект не найден типовая функция БСП

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

Запрос через COM из .NET

Создает и выполняет запрос 1С через COM соединение

.NET С# COM

class Program
    {
        static void Main(string[] args)
        {
            var v8comConnector = Type.GetTypeFromProgID("V83.ComConnector");
            var v8 = Activator.CreateInstance(v8comConnector);
            Object[] arguments = { @"File=""C:\Users\user\Documents\InfoBase2\"";" };
            var x = v8comConnector.InvokeMember("Connect", BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, v8, arguments);
            var query = InvokeObjectMethod(v8, x, "NewObject", new Object[] { "Запрос" });
            SetObjectProperty(v8, query, "Текст", new Object[] { "ВЫБРАТЬ Справочник1.Наименование ИЗ Справочник.Справочник1 КАК Справочник1" });
            var result = InvokeObjectMethod(v8, query, "Выполнить", new Object[] { });
            var selection = InvokeObjectMethod(v8, result, "Выбрать", new Object[] { });
            while ((bool)InvokeObjectMethod(v8, selection, "Следующий", new Object[] { }))
            {
                var name = GetObjectProperty(v8, selection, "Наименование");
                Console.WriteLine("Наименование: " + name);
            }
        }

        public static object GetObjectProperty(object v8, object refObject, string propertyName)
        {
            return v8.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, refObject, null);
        }

        public static object SetObjectProperty(object v8, object refObject, string propertyName, Object[] value)
        {
            return v8.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, refObject, value);
        }

        public static object InvokeObjectMethod(object v8, object refObject, string methodName, Object[] parameters)
        {
            return v8.GetType().InvokeMember(methodName, BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, refObject, parameters);
        }
    }
Добавить комментарий

Преобразование строки в число

Преобразование строки в число без выбрасывания исключений при получении числа в виде строи из внешних источников

вЧисло

Функция вЧисло(Знач Парам)
	
	Парам = СтрЗаменить(Парам, Символы.НПП, "");
	Парам = СтрЗаменить(Парам, " ", "");
	Парам = СтрЗаменить(Парам, ",", ".");
	
	Попытка
		Возврат Число(Парам);
	Исключение
		Возврат 0;
	КонецПопытки;	
	
КонецФункции
Добавить комментарий

TurboConf

Удобный поиск шаблонов кода

прямо в Конфигураторе

Узнать подробнее