Публикации

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

Найдено результатов: 119


Срезы последних (интерполяция периодических сведений)

"Срезы последних" - одна из первых задач, на которой спотыкается начинающий программист 1С. Хорошо поняв идею виртуального регистра "Срез последних", мы ожидаем такой же простоты, если задана не одна дата, на которую нужно выбрать сведения, а несколько. Но... Читать дальше
FastCode 9 1

Плановая себестоимость продаж (цена на Дату документа)

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


Получить дату файла

Функция определяет дату последней модификации существующего файла на диске
1 bolsun 30 4
// Функция определяет дату последней модификации существующего файла на диске
// Параметры
//  ИмяФайла  – Строка, содержащая полный путь к файла на диске.
//
// Возвращаемое значение:
//   Дата – Дата последней модификации файла
//
Функция ПолучитьДатуФайла(Знач ИмяФайла) Экспорт
	
	Файл = Новый Файл(ИмяФайла);
	Возврат Файл.ПолучитьВремяИзменения();
	 
КонецФункции

Последняя строка таблицы на одной странице вместе с подвалом

 //После цикла вывода строк

ТабДок.Область(ТабДок.ВысотаТаблицы, ,ТабДок.ВысотаТаблицы,).ВместеСоСледующим = Истина;

Создать временную таблицу по имени регистра СрезПоследних

Автор: HostHost

FastCode 9 1
// 1.

ОписаниеФильтра = ЗарплатаКадрыОбщиеНаборыДанных.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТСотрудникиПериоды","Сотрудник");

ОписаниеФильтра.СоответствиеИзмеренийРегистраИзмерениямФильтра.Вставить("Период", "Период");

ОписаниеФильтра.СоответствиеИзмеренийРегистраИзмерениямФильтра.Вставить("Сотрудник", "Сотрудник");

ЗарплатаКадрыОбщиеНаборыДанных.СоздатьВТИмяРегистраСрезПоследних(

        "ГрафикРаботыСотрудников",

        МенеджерВременныхТаблиц,

        Истина,

        ОписаниеФильтра,, "ВТГрафики");

// 2.

ОписаниеФильтра = ЗарплатаКадрыПериодическиеРегистры.ОписаниеФильтраДляСоздатьВТИмяРегистра("ВТФильтрПозиции", "Позиция");   

ПараметрыПостроения = ЗарплатаКадрыПериодическиеРегистры.ПараметрыПостроенияДляСоздатьВТИмяРегистраСрез();

ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(ПараметрыПостроения.Отборы, "Позиция", "<>", Справочники.ШтатноеРасписание.ПустаяСсылка());

ПоказателиПремий = Новый Массив;

ПоказателиПремий.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "ПроцентПпремииПроизводственной"));

ПоказателиПремий.Добавить(Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "ПроцентГодовойПремии"));

ЗарплатаКадрыОбщиеНаборыДанных.ДобавитьВКоллекциюОтбор(ПараметрыПостроения.Отборы, "Показатель", "В", ПоказателиПремий);

ЗарплатаКадрыПериодическиеРегистры.СоздатьВТИмяРегистраСрезПоследних("ЗначенияПлановыхПоказателейРасчетаЗП", МенеджерВТ, Истина, ОписаниеФильтра, ПараметрыПостроения, "ВТЗначенияПлановыхПоказателейРасчетаЗП");

Добавить к дате и разность дат

Функции для работы с датами как в языке запросов

Автор: ildarovich

FastCode 9 1
Функция ДобавитьКДате(Дата1, Количество, Период) Экспорт
    Шаг = Новый Структура("Год, Квартал, Месяц, Неделя, День, Час, Минута, Секунда", 12, 3, 1, -604800, -86400, -3600, -60, -1);
    Возврат ?(Шаг[Период] > 0, ДобавитьМесяц(Дата1, Количество * Шаг[Период]), Дата1 - Количество * Шаг[Период])
КонецФункции
Функция РазностьДат(Дата1, Дата2, Период) Экспорт
    Шаг = Новый Структура("Год, Квартал, Месяц, Неделя, День, Час, Минута, Секунда", 12, 3, 1, -604800, -86400, -3600, -60, -1);
    Возврат Цел(?(Шаг[Период] > 0, Год(Дата2) * 12 + Месяц(Дата2) - 1, '00010101' - Дата2) / Шаг[Период]) 
          - Цел(?(Шаг[Период] > 0, Год(Дата1) * 12 + Месяц(Дата1) - 1, '00010101' - Дата1) / Шаг[Период])
КонецФункции

//Функция Квартал

Функция Квартал(Дата) Экспорт  
    Возврат Цел((Месяц(Дата) - 1) / 3) + 1
КонецФункции

//Названия месяцев прописью

Формат(Дата(1, НомерМесяца, 1),"ДФ=ММММ")

//Название дней недели прописью

Формат(Дата(1, 1, 2 + НомерДняНедели),"ДФ=дддд")

Конвертация даты из формата ISO8601 в дату 1С с учетом миллисекунд

Возвращает структуру с полями "Дата" и "Миллисекунды", стандартный способ преобразования даты округляет время, а в некоторых случаях важна особая точность
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт

	КонвертированнаяДата = Новый Структура("Дата, Миллисекунды");
	
	АвтоконвертированнаяДата = XMLЗначение(Тип("Дата"), Дата);

	Миллисекунды = Сред(Дата, 21);
	Миллисекунды = СокрЛП(СтрЗаменить(Миллисекунды, "Z", ""));

	Если НЕ ПустаяСтрока(Миллисекунды) Тогда
		
		ЧислоМиллисекунд = Число(Миллисекунды);
		
		Если ЧислоМиллисекунд >= 500 Тогда
			
			АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1;
			
		КонецЕсли;
		
	КонецЕсли;
	
	КонвертированнаяДата.Дата = АвтоконвертированнаяДата;
	
	КонвертированнаяДата.Миллисекунды = Миллисекунды;
	
	Возврат КонвертированнаяДата;

КонецФункции 

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

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

УстановитьДатуПоследнегоНапоминания

Устанавливает дату последнего оповещения пользователя.
ОбщийМодуль.РезервноеКопированиеИБВызовСервера
Автор: 1С
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Устанавливает дату последнего оповещения пользователя.
//
// Параметры: 
//	ДатаНапоминания - Дата - дата и время последнего оповещения пользователя о необходимости проведения резервного
//	                         копирования.
//
Процедура УстановитьДатуПоследнегоНапоминания(ДатаНапоминания) Экспорт
	
	РезервноеКопированиеИБСервер.УстановитьДатуПоследнегоНапоминания(ДатаНапоминания);
	
КонецПроцедуры