ОбъединитьТаблицыЗначений

Ищет в таблице значений строки, соответсвующие значениям колонок Измерения и складывает значения колонок Ресурсы. Если строка не найдена, то добавляется новая.
ТаблицаЗначений Таблица значений
3 Добавил: prog1c
Функция ОбъединитьТаблицыЗначений(Знач Таблица1, Таблица2, Измерения, Ресурсы) Экспорт
	
	МассивРесурсов = СтрРазделить(Ресурсы, ",");
	СтруктураОтбора = Новый Структура(Измерения);
	Для Каждого СтрокаТЗ Из Таблица2 Цикл
		
		ЗаполнитьЗначенияСвойств(СтруктураОтбора, СтрокаТЗ);
		
		РезультатОтбора = Таблица1.НайтиСтроки(СтруктураОтбора);
		Если РезультатОтбора.Количество() > 0 Тогда
			СтрокаОтбора = РезультатОтбора[0];
			Для Каждого Колонка Из МассивРесурсов Цикл
				СтрокаОтбора[Колонка] = СтрокаОтбора[Колонка] + СтрокаТЗ[Колонка];
			КонецЦикла;
		Иначе
			СтрокаОтбора = Таблица1.Добавить();
			ЗаполнитьЗначенияСвойств(СтрокаОтбора, СтрокаТЗ);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Таблица1;
	
КонецФункции

ОставитьСтрокиТаблицыЗначений

Оставляет строки ТаблицыЗначений, соответсвующие структуре отбора (удаляет не соответсвующие)
ТаблицаЗначений Таблица значений
2 Добавил: prog1c
Функция ОставитьСтрокиТаблицыЗначений(Знач Таблица, СтруктураОтбора) Экспорт
	
	МассивСтрок = Новый Массив;
	РезультатОтбора = Таблица.НайтиСтроки(СтруктураОтбора);
	Для каждого СтрокаОтбора Из РезультатОтбора Цикл
		МассивСтрок.Добавить(СтрокаОтбора);
	КонецЦикла;
	
	МассивУдаления = Новый Массив;
	Для Каждого СтрокаТЗ Из Таблица Цикл
		Если МассивСтрок.Найти(СтрокаТЗ) = Неопределено Тогда
			МассивУдаления.Добавить(СтрокаТЗ);
		КонецЕсли;
	КонецЦикла;
	
	Для Каждого СтрокаТЗ Из МассивУдаления Цикл
		Таблица.Удалить(СтрокаТЗ);
	КонецЦикла;
	
    Возврат Таблица;
    
КонецФункции // ОставитьСтрокиТаблицыЗначений()

УдалитьСтрокиТаблицыЗначений

Удаляет строки ТЗ, соответсвующие структуре отбора
Таблица значений ТаблицаЗначений
3 Добавил: prog1c
Функция УдалитьСтрокиТаблицыЗначений(Знач Таблица, СтруктураОтбора) Экспорт
	
	МассивСтрок = Новый Массив;
	РезультатОтбора = Таблица.НайтиСтроки(СтруктураОтбора);
	Для каждого СтрокаОтбора Из РезультатОтбора Цикл
		МассивСтрок.Добавить(СтрокаОтбора);
	КонецЦикла;
	
	Для Каждого СтрокаТЗ Из МассивСтрок Цикл
		Таблица.Удалить(СтрокаТЗ);
	КонецЦикла;
	
    Возврат Таблица;
    
КонецФункции // УдалитьСтрокиТаблицыЗначений()

Срез на даты за период. Шаблон запроса

Один запрос, который довольно часто пригождался. Введение Довольно часто возникает задача в запросе получить актуальное значение ресурса на каждую дату выбранного периода. Вот несколько таких случаев: Курс валюты на дату каждого документа за выбранный период Цену товара на дату реализации по всем реализациям за период Должность сотрудника на каждую дату периода
1 Добавил: Yashar
//1)Традиционный подход

/// первый запрос - выбирает все даты документов

ВЫБРАТЬ РАЗЛИЧНЫЕ
	НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) КАК ДатаДокумента
ПОМЕСТИТЬ 
	ВТ_ДатыДокументов
ИЗ
	Документ.Реализация.Товары КАК Товары
ГДЕ
	Товары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода
;

/// второй запрос - выбирает из нашего регистра сведений измерения и максимальный период на каждую дату
ВЫБРАТЬ
	ВТ_ДатыДокументов.ДатаДокумента,
	Цены.Номенклатура,
	МАКСИМУМ(Цены.Период) КАК ДатаЦены
ПОМЕСТИТЬ 
	ВТ_ДатыНачалаДействия
ИЗ 
	ВТ_ДатыДокументов КАК ВТ_ДатыДокументов
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК Цены
    	ПО Цены.Период <= ВТ_ДатыДокументов.ДатаДокумента
	
ГДЕ
	Цены.ТипЦены = &ТипЦены // например, такой отбор, или какой-нибудь другой

СГРУППИРОВАТЬ ПО
	ВТ_ДатыДокументов.ДатаДокумента,
	Цены.Номенклатура
;

/// третий запрос - выбирает из нашего регистра актуальные значения ресурсов на каждую дату документа
ВЫБРАТЬ
	ВТ_ДатыНачалаДействия.ДатаДокумента,
	Цены.Номенклатура,
	Цены.Цена
	
ПОМЕСТИТЬ 
	ВТ_ЗначенияРесурсов
ИЗ 
	РегистрСведений.ЦеныНоменклатуры КАК Цены
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ДатыНачалаДействия КАК ВТ_ДатыНачалаДействия
    	ПО ВТ_ДатыНачалаДействия.Период = Цены.Период
    	И ВТ_ДатыНачалаДействия.Номенклатура = Цены.Номенклатура
ГДЕ
	Цены.ТипЦены = &ТипЦены // не забываем еще раз указать тот же отбор
;

/// четвертый запрос - основной, который получает нужные данные из временной таблицы, полученной на предыдущем шаге
ВЫБРАТЬ
	Товары.Ссылка КАК Документ,
	Товары.Номенклатура,
	ВТ_ЗначенияРесурсов.Цена * Товары.Количество КАК Сумма // тут делаем что-то нужное нам с полученными значениями
ИЗ 
	Документ.Реализация.Товары КАК Товары
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЗначенияРесурсов КАК ВТ_ЗначенияРесурсов
    	ПО Товары.Номенклатура = ВТ_ЗначенияРесурсов.Номенклатура
    	И НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) = ВТ_ЗначенияРесурсов.ДатаДокумента


//2)Подход со слабой связностью 

/// первый запрос - вытаскиваем из регистра сведений все что нужно за один раз
ВЫБРАТЬ
    Период,
    Номенклатура,
    Цена
ПОМЕСТИТЬ ВТ_Срез
ИЗ 
    РегистрСведений.ЦеныНоменклатуры КАК Движения
ГДЕ 
    Период > &НачалоПериода
    И Период <= &КонецПериода
    И ТипЦены = &ТипЦены // например, такой отбор, или какой-нибудь другой

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Период,
    Номенклатура,
    Цена
ИЗ 
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&НачалоПериода, ТипЦены = &ТипЦены // тут надо повторить отбор
		) КАК Срез
ИНДЕКСИРОВАТЬ ПО
    Движения.Номенклатура,
    Движения.Период

;
/// второй запрос - собираем таблицу с периодами действия ресурса
ВЫБРАТЬ
    НачалоПериода.Номенклатура,
    НачалоПериода.Цена,
    НачалоПериода.Период КАК НачалоПериода,
    ЕСТЬNULL(ДОБАВИТЬКДАТЕ(МИНИМУМ(КонецПериода.Период), СЕКУНДА, -1), &КонецПериода) КАК КонецПериода
ПОМЕСТИТЬ ВТ_ЗначенияРесурсов
ИЗ
    ВТ_Срез КАК НачалоПериода
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Срез КАК КонецПериода
        ПО НачалоПериода.Номенклатура = КонецПериода.Номенклатура
        И НачалоПериода.Период < КонецПериода.Период

СГРУППИРОВАТЬ ПО
    НачалоПериода.Период,
    НачалоПериода.Номенклатура,
    НачалоПериода.Цена
;

/// третий запрос - основной, который получает нужные данные из временной таблицы, полученной на предыдущем шаге
ВЫБРАТЬ
	Товары.Ссылка КАК Документ,
	Товары.Номенклатура,
	ВТ_ЗначенияРесурсов.Цена * Товары.Количество КАК Сумма // тут делаем что-то нужное нам с полученными значениями
ИЗ 
	Документ.Реализация.Товары КАК Товары
	ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_ЗначенияРесурсов КАК ВТ_ЗначенияРесурсов
    	ПО Товары.Номенклатура = ВТ_ЗначенияРесурсов.Номенклатура
    	И Товары.Ссылка.Дата МЕЖДУ ВТ_ЗначенияРесурсов.НачалоПериода И ВТ_ЗначенияРесурсов.КонецПериода


Прибавить рабочие дни к дате

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

Передача таблицы значений в запрос

Передача таблицы значений в запрос. В качестве внешнего источника могут выступать: Таблица значений, Табличная часть, Результат запроса.
Запрос Внешний источник Таблица значений
6 Добавил: prog1c
Товары = Новый ТаблицаЗначений;	
Товары.Колонки.Добавить("Наименование");	
Товары.Колонки.Добавить("Количество");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
			   |	ВнешнийИсточник.Наименование,
			   |	ВнешнийИсточник.Количество
			   |ПОМЕСТИТЬ ВТ_ВнешнийИсточник
			   |ИЗ
			   |	&ВнешнийИсточник КАК ВнешнийИсточник
			   |;
			   |
			   |////////////////////////////////////////////////////////////////////////////////
			   |ВЫБРАТЬ
			   |	ВТ_ВнешнийИсточник.Наименование,
			   |	ВТ_ВнешнийИсточник.Количество КАК Количество
			   |ИЗ
			   |	ВТ_ВнешнийИсточник КАК ВТ_ВнешнийИсточник
			   |ГДЕ
			   |	ВТ_ВнешнийИсточник.Количество > 0
			   |
			   |УПОРЯДОЧИТЬ ПО
			   |	Количество";

Запрос.УстановитьПараметр("ВнешнийИсточник", Товары);			   
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл
	
	// Обработка данных
	
КонецЦикла; 

Таблица значений из списка колонок

Создает объект ТаблицаЗначений из списка колонок (строка с разделителями или массив)
Добавил: prog1c
Функция ТаблицаЗначений(Колонки)

	Если ТипЗнч(Колонки) = Тип("Строка") Тогда
		Колонки = СтрРазделить(Колонки, ",");
	КонецЕсли;
	
	ТабЗнач = Новый ТаблицаЗначений;
	Для каждого Колонка Из Колонки Цикл
		ТабЗнач.Колонки.Добавить(Колонка);
	КонецЦикла;
	
	Возврат ТабЗнач;

КонецФункции // ТаблицаЗначений()

Колонки в строку

Возвращает строку с названиями колонок коллекции (ТаблицаЗначений, РезультатЗапроса)
1 Добавил: prog1c
Функция КолонкиВСтроку(Коллекция, Разделитель=",")

	СтрКоллекция = "";
	
	Для каждого Колонка Из Коллекция.Колонки Цикл
		Если Не ПустаяСтрока(СтрКоллекция) Тогда
			СтрКоллекция = СтрКоллекция + Разделитель;
		КонецЕсли;
		СтрКоллекция = СтрКоллекция + Колонка.Имя;
	КонецЦикла;
	
	Возврат СтрКоллекция;

КонецФункции // КолонкиВСтроку()

Структура метаданных регистра сведений

Возвращает структуру метаданных регистра сведений. В параметр функции можно передать строковое название регистра, или объект РегистрСведений, МенеджерЗаписи, НаборЗаписей
1 Добавил: prog1c
Функция СтруктураМетаданныхРегистраСведений(РегистрСведений) Экспорт
	
	СтруктураРегистра         = Неопределено;
	РегистрСведенийМетаданные = Неопределено;
	
	Если ТипЗнч(РегистрСведений) = Тип("Строка") Тогда
		РегистрСведенийМетаданные = Метаданные.НайтиПоПолномуИмени("РегистрСведений." + РегистрСведений);
	Иначе
		
		РегистрСведенийМетаданные = Метаданные.НайтиПоТипу(ТипЗнч(РегистрСведений));
		Если РегистрСведенийМетаданные <> Неопределено Тогда
			РегистрСведенийМетаданные = Метаданные.НайтиПоПолномуИмени("РегистрСведений." + РегистрСведенийМетаданные.Имя);
		КонецЕсли;
		
	КонецЕсли;
	
	Если РегистрСведенийМетаданные <> Неопределено Тогда
		
		НаименованиеРегистра       = РегистрСведенийМетаданные.Имя;
		МетаданныеРегистраСведений = Метаданные.РегистрыСведений[НаименованиеРегистра];

		МассивИзмерений = Новый Массив;
		Для Каждого Измерение Из МетаданныеРегистраСведений.Измерения Цикл
			МассивИзмерений.Добавить(Измерение.Имя);
		КонецЦикла;
		
		МассивРесурсов  = Новый Массив;
		Для Каждого Ресурс Из МетаданныеРегистраСведений.Ресурсы Цикл
			МассивРесурсов.Добавить(Ресурс.Имя);
		КонецЦикла;
		
		СтруктураРегистра = Новый Структура;
		СтруктураРегистра.Вставить("Измерения", МассивИзмерений);
		СтруктураРегистра.Вставить("Ресурсы",   МассивРесурсов);
		
	КонецЕсли;
	
	Возврат СтруктураРегистра;
	
КонецФункции // СтруктураМетаданныхРегистраСведений()

Устанавливаем заголовок системы

2 Добавил: miha
        // Устанавливаем заголовок системы 
        ЗаголовокСистемы = ПолучитьЗаголовокСистемы();
        Если Не ОсновнаяОрганизация.Пустая() Тогда
            Попытка
                ЗаголовокСистемы = ЗаголовокСистемы + " / " + СокрЛП(ОсновнаяОрганизация.Наименование);
            Исключение
            КонецПопытки;
        КонецЕсли;
        Если ПараметрыСеанса.ИспользованиеРИБ Тогда
            Если НЕ ПустаяСтрока(ПланыОбмена.Полный.ЭтотУзел().Наименование) Тогда
                ЗаголовокСистемы = ЗаголовокСистемы + " / " + СокрЛП(ПланыОбмена.Полный.ЭтотУзел());
            Иначе
                ЗаголовокСистемы = ЗаголовокСистемы + " / " + СокрЛП(ПланыОбмена.ПоОрганизации.ЭтотУзел());
            КонецЕсли;
        КонецЕсли;
        ЗаголовокСистемы = ЗаголовокСистемы + " / "+ СокрЛП(глТекущийПользователь);
        УстановитьЗаголовокСистемы(ЗаголовокСистемы);