arefaste/1C_Forums huggingface dataset:
Запись Чтение XML 2
Теги: 1С,XML

# Код реализации

```1c
   //Имя справочника для примера
    ИмяСправочника = "Номенклатура";

    ////////////////////////////////////////////////////////////­/////////////
    //Выгрузка

    Запись = Новый ЗаписьXML;
    Запись.УстановитьСтроку();

    //записываем объявление xml файла: <?xml version="1.0"?>
    Запись.ЗаписатьОбъявлениеXML();

    //записываем корневой элемент, по спецификации xml он может быть только один, назовем его "Данные"
    Запись.ЗаписатьНачалоЭлемента("Данные");

    //для того чтобы пространства имен не объявлялись сериализатором в кажом элементе, пишем их в корневой элемент
    //они будут работать на все вложеные элементы
    //пространство имен по-умолчанию
    Запись.ЗаписатьСоответствиеПространстваИмен("", "http://v8.1c.ru/8.1/data/enterprise/current-config");

    //пространства имен остальные префиксы
    Запись.ЗаписатьСоответствиеПространстваИмен("xsd", "http://www.w3.org/2001/XMLSchema");
    Запись.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance");

    //ограничение количества выгружаемых элементов для примера
    Кол = 4;
    Выборка = Справочники[ИмяСправочника].Выбрать();
    Пока Выборка.Следующий() Цикл

        //вместо этого кода в боевой реализации выгрузки будет создание ОбъектаXDTO и его сериализация
        //через ФабрикуXDTO и загруженные в нее схемы конфигурации приемника
        СериализаторXDTO.ЗаписатьXML(Запись, Выборка.ПолучитьОбъект());
        //

        Кол = Кол - 1;
        Если Кол=0 Тогда
            Прервать;
        КонецЕсли;
    КонецЦикла;

    //записываем конец корневого элемента
    Запись.ЗаписатьКонецЭлемента();

    //покажем что получилось
    Текст = Запись.Закрыть();
    Сообщить("Содержимое файла:");
    Сообщить(Текст);

    //а теперь загрузим это обратно

    ////////////////////////////////////////////////////////////­/////////////
    //Загрузка
    Сообщить("Данные полученные при загрузке:");

    Чтение = Новый ЧтениеXML;
    Чтение.УстановитьСтроку(Текст);

    //прочитаем начало xml файла
    Чтение.ПерейтиКСодержимому();

    //прочитаем начало корневого элемента
    Чтение.Прочитать();

    //читаем содержимое пока текущим не станет конец корневого элемента, т.к. мы писали туда только целые элементы справочника,
    //а сериализатор читает каждый из их полностью, то мы упремся именно в конец корневого
    Пока Чтение.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл

        //читаем очередной элемент справочника
        Объект = СериализаторXDTO.ПрочитатьXML(Чтение);

        //покажем что прочитали, осталось только записать объект
        Сообщить(""+ТипЗнч(Объект)+" - "+Объект);
    КонецЦикла;

    Чтение.Закрыть();
```
Получить представление [разницы] времени
Теги: 1С,Дата

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

# Код реализации

```1c
// Возвращает представление прошедшего времени
//
// Параметры:
//  РазницаВремени  - Число - Высчитанная разница времени в секундах/милисекундах
//	ВремяВМилисекундах - Булево - Время передано в милисекундах
//
// Возвращаемое значение:
//   Строка   - Представление разницы времени
//
Функция ПолучитьПредставлениеВремени(РазницаВремени, ВремяВМилисекундах = Ложь) Экспорт

	РазмерЧаса = 3600;
	РазмерМинуты = 60;
	РазмерСекунды = 1;

	Если ВремяВМилисекундах Тогда

		РазмерЧаса = РазмерЧаса * 1000;
		РазмерМинуты = РазмерМинуты * 1000;
		РазмерСекунды = РазмерСекунды * 1000;

	КонецЕсли;

	Часов = Цел(РазницаВремени / РазмерЧаса);
	Минут = Цел((РазницаВремени - (Часов * РазмерЧаса)) / РазмерМинуты);
	Секунд = Цел((РазницаВремени - ((Часов * РазмерЧаса) + (Минут * РазмерМинуты))) / РазмерСекунды);

	Если ВремяВМилисекундах Тогда

		Милисекунд = РазницаВремени - ((Часов * РазмерЧаса) + (Минут * РазмерМинуты) + (Секунд * РазмерСекунды));

	Иначе

		Милисекунд = Цел((РазницаВремени - ((Часов * РазмерЧаса) + (Минут * РазмерМинуты) + (Секунд * РазмерСекунды))) * 1000);

	КонецЕсли;

	ВремяТекст = "";

	Если РазницаВремени >= РазмерЧаса Тогда

		//ВремяТекст = ВремяТекст + Строка(Часов) + " час.";
		ВремяТекст = ВремяТекст + " " + СтрокаСЧислом(";%1 час;;%1 часа;%1 часов;%1 часа", Часов, ВидЧисловогоЗначения.Количественное);

	КонецЕсли;

	Если РазницаВремени >= РазмерМинуты Тогда

		//ВремяТекст = ВремяТекст + ?(Часов > 0, ?(Секунд > 0, " ", " и "), "") + Строка(Минут) + " мин.";
		ВремяТекст = ВремяТекст + ?(Часов > 0, ?(Секунд > 0, " ", " и "), "") + " " + СтрокаСЧислом(";%1 минута;;%1 минуты;%1 минут;%1 минут", Минут, ВидЧисловогоЗначения.Количественное);

	КонецЕсли;

	Если РазницаВремени >= РазмерСекунды и Секунд > 0 Тогда

		//ВремяТекст = ВремяТекст + ?(Минут > 0, ?(Милисекунд > 0, " ", " и "), "") + Строка(Секунд) + " сек.";
		ВремяТекст = ВремяТекст +  ?(Минут > 0, ?(Милисекунд > 0, " ", " и "), "") + " " + СтрокаСЧислом(";%1 секунда;;%1 секунды;%1 секунд;%1 секунд", Секунд, ВидЧисловогоЗначения.Количественное);

	КонецЕсли;

	Если Милисекунд > 0 и РазницаВремени <= РазмерСекунды Тогда

		//ВремяТекст = ВремяТекст + ?(Секунд > 0, " и ", "") + Строка(Милисекунд) + " мсек.";
		ВремяТекст = ВремяТекст + Строка(Милисекунд) + " мсек.";

	КонецЕсли;

	Возврат ВремяТекст;

КонецФункции // ПолучитьПредставлениеВремени()
// Внимание, если у вас старая платформа и не поддерживает  метод "СтрокаСЧислом" закоментируйте строки и раскоментируйте строки над ними
```
Получить дату через указанное количество [дней, месяцев, лет, ...]
Теги: 1С,Дата

Функция получает при помощи запроса дату через указанный промежуток

# Код реализации

```1c
// Возращает дату через указанное количество в указанном типе
//
// Параметры:
//	Дата1	- Дата от которой будет производится исчисление
//	Кол		- Количество прибавляемых или убавляемых единиц указанного типа
//	Тип		- Тип исчисления, поддерживается: секунда, минута, день, час, неделя, меняс, год
//	Знак	- При значении "+" прибавляет к дате указанное количество единиц указанного типа
//			  При значении "-" отнимает от даты указанное количество единиц указанного типа
//
// По умолчанию тип разницы "День", знак равен "+".
// Указывать тип можно в любом регистре!
// Допускается передавать отрицательное количество единиц в поле "Кол" и опускании значения "Знак"
// В таком случае функция будет считать значение параметра знак равным "-"
//
Функция ПолучитьДатуЧерез(Дата1, Кол, Знач Тип = "день", Знач Знак = "") Экспорт

	Если Кол = 0 Тогда
		Возврат Дата1;
	КонецЕсли;

	Тип = НРег(Тип);

	Если Кол < 0 и НЕ ЗначениеЗаполнено(Знак) Тогда
		Кол = Кол * -1;
		Знак = "-";
	ИначеЕсли НЕ ЗначениеЗаполнено(Знак) Тогда
		Знак = "+";
	КонецЕсли;

	ЗнакПлюс = ?(Знак = "+", Истина, Ложь);

	Если НЕ ЗнакПлюс Тогда

		Кол = Кол * -1;

	КонецЕсли;

	Если Тип = "сек" или Тип = "секунда" или Тип = "секунды" Тогда Тип = "СЕКУНДА"
	ИначеЕсли Тип = "мин" или Тип = "минута" или Тип = "минуты" Тогда Тип = "МИНУТА"
	ИначеЕсли Тип = "час" или Тип = "часы" Тогда Тип = "ЧАС"
	ИначеЕсли Тип = "день" или Тип = "дней" или Тип = "дни" Тогда Тип = "ДЕНЬ"
	ИначеЕсли Тип = "неделя" или Тип = "недель" или Тип = "недели" Тогда Тип = "НЕДЕЛЯ"
	ИначеЕсли  Тип = "месяц" или Тип = "месяцев" или Тип = "месяцы" Тогда Тип = "МЕСЯЦ"
	ИначеЕсли Тип = "год" или Тип = "лет" Тогда Тип = "ГОД"
	Иначе Возврат 0;
	КонецЕсли;

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

	Возврат ?(Выборка.Следующий(), Выборка.Значение, 0);

КонецФункции
```
Отправка сообщения в чат-бот телеграм
Теги: 1С,Отладка,Telegram

Удобно использовать при отладке: добавив к условию точки остановки <здесь ваше произвольное условие> И ОповеститьВтелеграм(ОписаниеОшибки()) = Неопределено  - отправит в телеграм причину ошибки, если она произошла. Или, условие точки остановки ОповеститьВтелеграм("Процедура окончена") = Неопределено И Ложь - сообщит о том, что точка остановки пройдена

# Примечания

- Спасибо! Думал что будет сложно впилить себе отправку на телегу, а оказалось всего две строчки. К слову, сервис "https://cms3.ru/kak-poluchit-chat-id-telegram/" ничего не сообщал не смотря на то что я несколько сообщений боту отправил.. При ручном запросе ./getUpdates через браузер, всё заработало и смог вытащить chat_id. Так-же хотелось бы сказать тем кто так же как и я боится, блокировки API нет. Так что работает как часы. А возможности открываются потрясающие!

- Как я понимаю в РФ работать не будет?

- Отправить сообщение или табличный документ в телеграм

- (2) Mat Skywalker, можешь глянуть мой код (3), предусматривает использование http/socks прокси.

- Надо через прокси делать. И в описании API есть возожность отправлять сообщения в теле запроса ПОСТ, там же креды, чтоб не светить их на весь интернет.

- (2) Mat Skywalker, Будет через прокси.

- Сегодня работает без прокси. Домашний интернет от билайн, екатеринбург
Получение интервалов неизменности курсов валют
Теги: 1С,Минимализмы,Задачи

Запрос по курсам валют. Как и в других подобных задачах, в этой ключ к решению - в выборе подходящего инварианта. Здесь инвариантом является количество отличающихся курсов перед данным.
Запрос составлялся без оглядки на эффективность. Если данных много и эффективность важна, то можно взять метод решения из http://catalog.mista.ru/public/402534/

# Код реализации

```1c
ВЫБРАТЬ
    Дано.Период,
    Дано.Валюта,
    Дано.Курс,
    КОЛИЧЕСТВО(Было.Курс) КАК Номер
ПОМЕСТИТЬ Интервалы
ИЗ
    Дано КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Было
        ПО (Было.Валюта = Дано.Валюта)
            И (Было.Период <= Дано.Период)
            И (Было.Курс <> Дано.Курс)
СГРУППИРОВАТЬ ПО
    Дано.Период,
    Дано.Валюта,
    Дано.Курс
;
ВЫБРАТЬ
    МИНИМУМ(Интервалы.Период) КАК ДатаС,
    МАКСИМУМ(Интервалы.Период) КАК ДатаПо,
    Интервалы.Валюта,
    Интервалы.Курс
ИЗ
    Интервалы КАК Интервалы
СГРУППИРОВАТЬ ПО
    Интервалы.Валюта,
    Интервалы.Курс,
    Интервалы.Номер
УПОРЯДОЧИТЬ ПО
    Интервалы.Валюта,
    ДатаС
```
Определение пропусков в последовательности чисел
Теги: 1С,Минимализмы,Задачи

В первой строке всегда 0, во второй нужное значение.

# Код реализации

```1c
В обсуждении много разных вариантов решения. Из моих быстрее всего работает вот этот:

ВЫБРАТЬ ПЕРВЫЕ 2
    Дано.Х + ВЗ.У КАК Х
ИЗ
    Дано КАК Дано,
    (ВЫБРАТЬ
        0 КАК У
    ОБЪЕДИНИТЬ
    ВЫБРАТЬ
        1) КАК ВЗ
СГРУППИРОВАТЬ ПО
    Дано.Х + ВЗ.У
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(*) = 1
УПОРЯДОЧИТЬ ПО
    Дано.Х + ВЗ.У
```
Инвертирование периодов в запросе
Теги: 1С,Минимализмы,Задачи

"Вывернуть" периоды в запросе. Есть запрос с выборкой периодов исключения: ДатаНачалаИсключения - ДатаОкончанияИсключения, а также основной период ДатаНачалаОсновная - ДатаОкончанияОсновная. Нужно составить запрос так, чтобы образовались периоды на основании основного периода, в которые не входят периоды исключения.
Здесь используется тот факт, что при сквозной нумерации упорядоченных краев интервалов, края одного и того же интервала будут иметь номера, одинаковые при делении на два нацело.

# Код реализации

```1c
ВЫБРАТЬ
    &ДатаНачалаОсновная КАК Дата
ПОМЕСТИТЬ Даты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(Дано.ДатаНачалаИсключения, ДЕНЬ, -1)
ИЗ
    Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(Дано.ДатаОкончанияИсключения, ДЕНЬ, 1)
ИЗ
    Дано КАК Дано
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    &ДатаОкончанияОсновная
;
ВЫБРАТЬ
    МИНИМУМ(Даты.Дата) КАК ДатаНачала,
    МАКСИМУМ(Даты.Дата) КАК ДатаОкончания
ИЗ
    (ВЫБРАТЬ
        КОЛИЧЕСТВО(Раньше.Дата) КАК Номер,
        Даты.Дата КАК Дата
    ИЗ
        Даты КАК Раньше
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
            ПО Раньше.Дата <= Даты.Дата
    СГРУППИРОВАТЬ ПО
        Даты.Дата) КАК Даты
СГРУППИРОВАТЬ ПО
    ВЫРАЗИТЬ(Даты.Номер / 2 КАК ЧИСЛО(10, 0))
```
Проверка совпадения таблиц.
Теги: 1С,Минимализмы,Задачи

Есть массив А из элементов некоторого справочника и есть справочник Б с табличной частью  из элементов того же справочника. Найти элемент Б, где список точно совпадает с массивом А (ни больше ни меньше).

На примере справочника "Контрагенты" (Как справочник Б). Приведенным далее запросом находятся контрагенты, у которых в табличной части имеются менеджеры из справочника "Пользователи" (Справочник А), список которых точно определен массивом &Массив. Требуется заранее определить размер массива и передать его в параметр &МассивКоличество.

# Код реализации

```1c
ВЫБРАТЬ
	Менеджеры.Ссылка
ИЗ
	Справочник.Контрагенты.МенеджерыПокупателя КАК Менеджеры

СГРУППИРОВАТЬ ПО
	Менеджеры.Ссылка

ИМЕЮЩИЕ
	КОЛИЧЕСТВО(*) = &МассивКоличество И
	МИНИМУМ(Менеджеры.МенеджерПокупателя В (&Массив)) = ИСТИНА
```
Проверка совпадения таблиц путем сравнения полного и внутреннего соединения
Теги: 1С,Минимализмы,Задачи

Это более простой вариант сравнения таблиц с эталоном, чем, например, в 53. Здесь используется тот факт, что КОЛИЧЕСТВО(*) показывает общее количество строк полного соединения, а КОЛИЧЕСТВО(Товары.Номенклатура) и КОЛИЧЕСТВО(Эталон.Номенклатура) только число строк не ЕСТЬNULL. При совпадении таблиц все эти количества должны быть равны, что и проверяется самым коротким способом с использованием тернарного логического условия МЕЖДУ.

# Код реализации

```1c
ВЫБРАТЬ
	Товары.Номенклатура,
	Товары.Количество
ПОМЕСТИТЬ Эталон
ИЗ
	&Товары КАК Товары
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Товары.Ссылка
ИЗ
	Документ.ЗаказПокупателя.Товары КАК Товары
		ПОЛНОЕ СОЕДИНЕНИЕ Эталон КАК Эталон
		ПО Товары.Номенклатура = Эталон.Номенклатура
			И Товары.Количество = Эталон.Количество

СГРУППИРОВАТЬ ПО
	Товары.Ссылка

ИМЕЮЩИЕ
	КОЛИЧЕСТВО(Товары.Номенклатура) МЕЖДУ КОЛИЧЕСТВО(*) И КОЛИЧЕСТВО(Эталон.Номенклатура)
```
Определение периодов работы сотрудников по данным СКУД. Сгруппировать периоды в запросе
Теги: 1С,Минимализмы,Задачи

В задаче требовалось по данным записи событий входа и выхода на разных дверях предприятия определить периоды работы сотрудника. Дополнительно считается, что если человек в течении 6 часов отсутсвует на территории - то он ушел домой и данный рабочий "день" для него закончен.
Найти заказы, количества во всех строках которых меньше либо равны нулю
Теги: 1С,Минимализмы,Задачи

Алгоритм запроса для получения групп данных с условием, отвечающим элементам подгрупп

# Код реализации

```1c
ВЫБРАТЬ
Ссылка
ИЗ Документ.ЗаказПокупателя.Товары
СГРУППИРОВАТЬ ПО Ссылка
ИМЕЮЩИЕ МАКСИМУМ(Количество) <= 0
```
Определение плановых остатков товара с учетом предшествующих фактических и будущих плановых продаж
Теги: 1С,Минимализмы,Задачи

Расчет таблиц в запросе

# Код реализации

```1c
ВЫБРАТЬ
    ФактическиеПродажи.Период,
    ФактическиеПродажи.Номенклатура,
    ФактическиеПродажи.КоличествоОборот КАК Количество,
    ЛОЖЬ КАК План
ПОМЕСТИТЬ НедельныеПродажи
ИЗ
    РегистрНакопления.Продажи.Обороты(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, НЕДЕЛЯ, -&Окно), НЕДЕЛЯ), КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, НЕДЕЛЯ, -1), НЕДЕЛЯ), Неделя, ) КАК ФактическиеПродажи

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

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

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

СГРУППИРОВАТЬ ПО
    Периоды.Период,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.КоличествоОстаток
```
Сравнение плановых и фактических дней отпуска
Теги: 1С,Минимализмы,Задачи

Объединение двух таблиц запроса с датами
Имеется график отпусков, в нем есть колонки плановая дата ухода в отпуск и фактическая (эти данные получаются из разных регистров). Необходимо сопоставить эти данные в запросе.
План и факт отпуска рассматриваются как списание по партиям. Запланированный отпуск добавляет неотгулянные дни, а фактический - их списывает. Поэтому критерием соединения плановых и фактических отпусков является сквозной (по всем отпускам) номер дня отпуска. Исходными являются таблицы "План" и "Факт" с колонками "Сотрудник", "Начало", "Окончание".

# Код реализации

```1c
ВЫБРАТЬ
    План.Сотрудник,
    План.Начало,
    Календарь.ДатаКалендаря КАК День
ПОМЕСТИТЬ ПланДни
ИЗ
    План КАК План
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
        ПО (Календарь.ДатаКалендаря МЕЖДУ План.Начало И План.Окончание)
;

////////////////////////////////////////////////////////////////////////////////

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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    План.Сотрудник,
    План.Начало,
    План.День,
    КОЛИЧЕСТВО(Прошлое.День) КАК НомерДня
ПОМЕСТИТЬ ПланПлюс
ИЗ
    ПланДни КАК План
        ЛЕВОЕ СОЕДИНЕНИЕ ПланДни КАК Прошлое
        ПО План.Сотрудник = Прошлое.Сотрудник
            И План.День >= Прошлое.День

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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Факт.Сотрудник,
    Факт.Начало,
    Факт.День,
    КОЛИЧЕСТВО(Прошлое.День) КАК НомерДня
ПОМЕСТИТЬ ФактПлюс
ИЗ
    ФактДни КАК Факт
        ЛЕВОЕ СОЕДИНЕНИЕ ФактДни КАК Прошлое
        ПО Факт.Сотрудник = Прошлое.Сотрудник
            И Факт.День >= Прошлое.День

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

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ПланПлюс.Сотрудник КАК СотрудникПлан,
    МИНИМУМ(ПланПлюс.День) КАК НачалоПлан,
    МАКСИМУМ(ПланПлюс.День) КАК ОкончаниеПлан,
    ФактПлюс.Сотрудник КАК СотрудникФакт,
    МИНИМУМ(ФактПлюс.День) КАК НачалоФакт,
    МАКСИМУМ(ФактПлюс.День) КАК ОкончаниеФакт,
    ЕСТЬNULL(КОЛИЧЕСТВО(ПланПлюс.День), КОЛИЧЕСТВО(ФактПлюс.День)) КАК Длина
ИЗ
    ПланПлюс КАК ПланПлюс
        ПОЛНОЕ СОЕДИНЕНИЕ ФактПлюс КАК ФактПлюс
        ПО ПланПлюс.Сотрудник = ФактПлюс.Сотрудник
            И ПланПлюс.НомерДня = ФактПлюс.НомерДня

СГРУППИРОВАТЬ ПО
    ПланПлюс.Сотрудник,
    ФактПлюс.Сотрудник,
    ПланПлюс.Начало,
    ФактПлюс.Начало

УПОРЯДОЧИТЬ ПО
    СотрудникПлан,
    НачалоПлан,
    НачалоФакт
```
Получить дату по номеру дня недели и его порядковому номеру в месяце
Теги: 1С,Минимализмы,Задачи

Получение даты, зная день недели и его порядок в месяце
Иногда бывает необходимость получить "Первый понедельник месяца" или "Вторую пятницу месяца"...

# Код реализации

```1c
Функция ПолучитьДатуПоНомерамДняВНеделеИМесяце(НомерДняНеделиМесяца, НомерДняНедели, ДатаМесяца)

    Возврат НачалоМесяца(ДатаМесяца)
+ 86400 * (7 * НомерДняНеделиМесяца - 7 + (НомерДняНедели - ДеньНедели(НачалоМесяца(ДатаМесяца)) + 7) % 7)
```
Получение предпоследнего курса валюты
Теги: 1С,РегистрСведений,Минимализмы

# Код реализации

```1c
ВЫБРАТЬ ПЕРВЫЕ 1
    ВЗ.Период КАК Период,
    ВЗ.Курс КАК Курс
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 2
        КурсыВалют.Период КАК Период,
        КурсыВалют.Курс КАК Курс
    ИЗ
        РегистрСведений.КурсыВалют КАК КурсыВалют
    ГДЕ
        КурсыВалют.Валюта = &Валюта
    УПОРЯДОЧИТЬ ПО
        Период УБЫВ) КАК ВЗ
УПОРЯДОЧИТЬ ПО
    Период
```
Определить элементарные интервалы, образующиеся при пересечении всех исходных интервалов
Теги: 1С,Минимализмы,Задачи

Есть таблица ГрафикПоКалендарю с колонками От, До, ТипВремени и таблица Загрузка с колонками От, До, Работа. Требуется объединить эти таблицу в одну.
Найти количество повторяющихся подряд по дням записей
Теги: 1С,Минимализмы,Задачи

Например, имеются данные из двух полей "Дата" и "Явка": 1/ДА, 2/ДА, 3/ДА, 4/НЕТ, 5/НЕТ, 6/ДА, 7/НЕТ. Нужно получить таблицу из кол-ва повторяющихся подряд "Дата", "Явка", "РазПодряд".

# Код реализации

```1c
ВЫБРАТЬ
    Дано.Дата,
    МИНИМУМ(Дано.Явка) КАК Явка,
    РАЗНОСТЬДАТ(ЕСТЬNULL(МАКСИМУМ(ВЫБОР
                    КОГДА Раньше.Явка <> Дано.Явка
                        ТОГДА Раньше.Дата
                КОНЕЦ), ДОБАВИТЬКДАТЕ(МИНИМУМ(Раньше.Дата), ДЕНЬ, -1)), Дано.Дата, ДЕНЬ) КАК РазПодряд
ИЗ
    Дано КАК Дано
        ЛЕВОЕ СОЕДИНЕНИЕ Дано КАК Раньше
        ПО (Раньше.Дата <= Дано.Дата)

СГРУППИРОВАТЬ ПО
    Дано.Дата
УПОРЯДОЧИТЬ ПО
    Дано.Дата
```
Сравнение набора товаров, проданных сменами
Теги: 1С,Минимализмы,Задачи

Если смена 1 и смена 2 продали одинаковые товары, то между ними в итоговой таблице должен стоять знак "=", иначе "<>"

# Код реализации

```1c
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Дано.Смена,
    ВЗ.Знак
ИЗ
    Дано КАК Дано,
    (ВЫБРАТЬ
        МИНИМУМ(ВЫБОР
                КОГДА Дано1.Смена ЕСТЬ NULL
                        ИЛИ Дано2.Смена ЕСТЬ NULL
                    ТОГДА "<>"
                ИНАЧЕ "="
            КОНЕЦ) КАК Знак
    ИЗ
        Дано КАК Дано1
            ПОЛНОЕ СОЕДИНЕНИЕ Дано КАК Дано2
            ПО Дано1.Товар = Дано2.Товар
                И Дано1.Смена <> Дано2.Смена) КАК ВЗ
```
Найти документ, состав табличной части которого соответствует параметру - таблице значений
Теги: 1С,Минимализмы,Задачи

Запросом найти ТЧ документа по ТЗ в качестве параметра

# Код реализации

```1c
ВЫБРАТЬ
    Товары.Номенклатура,
    Товары.Количество
ПОМЕСТИТЬ Эталон
ИЗ
    &Товары КАК Товары
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Товары.Ссылка,
    Товары.Номенклатура КАК Номенклатура,
    Товары.Количество КАК Количество
ПОМЕСТИТЬ ВсеСтроки
ИЗ
    Документ.ЗаказПокупателя.Товары КАК Товары

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

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЗаказПокупателя.Ссылка,
    Эталон.Номенклатура,
    Эталон.Количество
ИЗ
    Эталон КАК Эталон,
    Документ.ЗаказПокупателя КАК ЗаказПокупателя
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Пары.Ссылка
ИЗ
    (ВЫБРАТЬ
        Пары.Ссылка КАК Ссылка,
        Пары.Номенклатура КАК Номенклатура,
        Пары.Количество КАК Количество,
        КОЛИЧЕСТВО(*) КАК Признак
    ИЗ
        ВсеСтроки КАК Пары

    СГРУППИРОВАТЬ ПО
        Пары.Ссылка,
        Пары.Номенклатура,
        Пары.Количество) КАК Пары

СГРУППИРОВАТЬ ПО
    Пары.Ссылка

ИМЕЮЩИЕ
    МИНИМУМ(Пары.Признак) = 2
```