Публикации

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

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


Сгибы листка (задача с собеседования)

Функция возвращает строку, в которой 0 - сгиб от нас, 1 - к нам. Первый параметр - необходимое число сложений, второй и третий параметры служебные. Всего в записи функции 77 символов. Не по-русски потому, что так короче. function W(k,a=0,b=0)return?(k1,,W(...
FastCode 51 7

Загадка суммы и произведения

Пусть x и y два целых числа 1 < = x < = y притом x + y < = 100. Салли сказали только сумму x + y, а вот Полю произведение xy. Салли и Пол честнейшие ребята, это всем известно, они и друг другу отродясь не врали. И вот такой вышел у них разговор: Пол: «Не ...
FastCode 51 7

Объединение непересекающихся интервалов в запросе

Задача заключается в том, чтобы собрать в один непрерывный интервал все время проживание гостя в гостинице, если между интервалами не было перерывов. То есть для таблицы t1.png Это делает следующий запрос, являющийся развитием идей решения задачи 14 из пре...
FastCode 51 7

Количество дней, когда товар был на складе

Обычный подход к решению этой задачи - рассчитать "остатки на каждый день" и подсчитать дни наличия товара. Предлагается другой подход: найти все интервалы отсутствия товара и вычесть их общую длину из длины периода. Получается следующий запрос: ВЫБРАТЬ ...
FastCode 51 7

Первый пропущенный артикул

Чтобы по максимуму использовать номерную емкость, иногда требуется назначать новому элементу незанятую комбинацию цифр, а для этого определять первый пропущенный артикул. Идея решения здесь в том, чтобы преобразовать артикулы в числа методом из статьи "Выр...
FastCode 51 7

Генератор вариантов формул

В данной задаче требуется сформировать список строк, каждая из которых будет являться вариантом формулы, содержащей аргументы X1, X2, ..., Xmax, знаки арифметических операций и скобки. Этот список затем можно использовать для решений задач типа "расставьте...
FastCode 51 7

Как в запросе секунды преобразовать в часы и минуты

Автор: ildarovich

FastCode 51 7
РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1, 1, 1), ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах), ЧАС) 
    + МИНУТА(ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(1, 1, 1), СЕКУНДА, &ДлительностьВСекундах)) / 100

Получение предпоследнего курса валюты

Автор: ildarovich

FastCode 51 7
ВЫБРАТЬ ПЕРВЫЕ 1
    ВЗ.Период КАК Период,
    ВЗ.Курс КАК Курс
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 2
        КурсыВалют.Период КАК Период,
        КурсыВалют.Курс КАК Курс
    ИЗ
        РегистрСведений.КурсыВалют КАК КурсыВалют
    ГДЕ
        КурсыВалют.Валюта = &Валюта
    УПОРЯДОЧИТЬ ПО
        Период УБЫВ) КАК ВЗ
УПОРЯДОЧИТЬ ПО
    Период

Квайн (программа, распечатывающая свой собственный текст)

Автор: ildarovich

FastCode 51 7
С="С="";Л=Лев(С,3);П=Сред(С,3);Сообщить(Л+Л+П+П)";Л=Лев(С,3);П=Сред(С,3);Сообщить(Л+Л+П+П)
Процедура КВН(К)С="Процедура КВН(К)С="";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры";Л=Лев(С,19);П=Сред(С,19);Сообщить(Л+Л+П+П)КонецПроцедуры

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

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

Функция для превращения строки в дату по форматной строке

Автор: ildarovich

FastCode 51 7
Функция СтрокаВДату(Знач ФорматДаты, Знач Дано, Ошибка = Ложь) Экспорт 
    Попытка 
        ё = Формат('00010101', "ДФ=" + ФорматДаты) // - необязательная проверка первого правильности параметра 
    Исключение 
        Ошибка = Истина; 
        Возврат '00010101' 
    КонецПопытки; 
    Ч = Новый Соответствие; 
    Для ё = 1 По СтрДлина(ФорматДаты) + 7 Цикл 
        Ч[Сред(ФорматДаты + "dMyHhms", ё, 1)] = 0    // - инициализация частей даты 
    КонецЦикла; 
    Для ё = 1 По 12 Цикл 
        Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMММ"), Формат(ё, "ЧЦ=4; ЧВН=")); // - замена названий месяцев числами 
        Дано = СтрЗаменить(Дано, Формат(Дата(1, ё, 1), "ДФ=MMМ" ), Формат(ё, "ЧЦ=3; ЧВН=")) 
    КонецЦикла; 
    Для ё = 1 По СтрДлина(ФорматДаты) Цикл 
        Ч[Сред(ФорматДаты, ё, 1)] = 10 * Ч[Сред(ФорматДаты, ё, 1)] + Найти("123456789", Сред(Дано, ё, 1)); // - накопление частей даты 
        Ошибка = Ошибка ИЛИ Найти("dMyHhms", Сред(ФорматДаты, ё, 1)) И НЕ Найти("0123456789", Сред(Дано, ё, 1)) // - необязательная проверка на цифры 
    КонецЦикла; 
    Ч["y"] = Ч["y"] + ?(Ч["y"] < 50, 2000, ?(Ч["y"] < 100, 1900, 0)); // - дополнение двух цифр года до четырех 
    Попытка 
        Возврат Дата(Ч["y"], Ч["M"], Ч["d"], Ч["H"] + Ч["h"], Ч["m"], Ч["s"]) 
    Исключение 
        Ошибка = Истина; 
        Возврат '00010101' 
    КонецПопытки 
КонецФункции

Простой трюк для быстрого объединения таблиц значений

Стандартный способ объединения двух таблиц значений заключается в организации цикла, в котором строки второй таблицы приписываются в конец копии первой. Для этого используется следующий простой код: ОбъединениеТаблиц = Таблица1.Скопировать(); Для Каждого С...
FastCode 51 7

Подсчет записей, содержащих одинаковые неупорядоченные пары значений

Если в некоторой таблице есть два поля, заполняемые в произвольном порядке, то как посчитать число "одинаковых" записей? К примеру, для таблицы "два любимых блюда" t2.png так можно посчитать число различных комбинаций блюд: t3.png Собственно, запрос, решаю...
FastCode 51 7

Выбрать в запросе одну запись из нескольких

Имеется таблица, содержащая, например, колонки Ф, К1, К2, К3, К4. Для каждого значения Ф в таблице может быть несколько записей. t4.png Требуется получить таблицу, включающую по одной (любой) записи для каждого значения Ф. t5.png Несмотря на простоту форм...
FastCode 51 7

Свернуть строки в таблице значений конкатенацией

Автор: ildarovich

FastCode 51 7
Дано.Сортировать("Поле1, Поле2");
ё = Дано.Количество();
Пока ё > 1 Цикл
   ё = ё - 1;
    Если Дано[ё - 1].Поле1 = Дано[ё].Поле1 И Дано[ё - 1].Поле2 = Дано[ё].Поле2 Тогда
        Дано[ё - 1].Поле3 = Дано[ё - 1].Поле3 + Дано[ё].Поле3;
        Дано.Удалить(ё)
    КонецЕсли 
КонецЦикла;

Разбиение произвольного периода на интервалы в запросе

Автор: ildarovich

FastCode 51 7
ВЫБРАТЬ
    0 КАК Х
ПОМЕСТИТЬ Бит
ОБЪЕДИНИТЬ
ВЫБРАТЬ
    1
;
ВЫБРАТЬ
    Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) КАК Х
ПОМЕСТИТЬ Периоды
ИЗ
    Бит КАК Б0,
    Бит КАК Б1,
    Бит КАК Б2,
    Бит КАК Б3,
    Бит КАК Б4,
    Бит КАК Б5
ГДЕ
    Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * Б5.Х)))) < РАЗНОСТЬДАТ(&Дата1, &Дата2, МЕСЯЦ)
;
ВЫБРАТЬ
    ЕСТЬNULL(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Начала.Х + 1), МЕСЯЦ), &Дата1) КАК ДатаНачала,
    ЕСТЬNULL(КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(&Дата1, МЕСЯЦ, Окончания.Х), МЕСЯЦ), &Дата2) КАК ДатаОкончания
ИЗ
    Периоды КАК Начала
        ПОЛНОЕ СОЕДИНЕНИЕ Периоды КАК Окончания
        ПО (Начала.Х + 1 = Окончания.Х)

Посчитать запросом суммарную длительность различных состояний

Автор: ildarovich

FastCode 51 7
ВЫБРАТЬ
    &Дата1 КАК Период,
    НаНачало.Скважина,
    НаНачало.Состояние
ПОМЕСТИТЬ Дано
ИЗ
    РегистрСведений.Резерв.СрезПоследних(&Дата1, ) КАК НаНачало

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

ВЫБРАТЬ
    Резерв.Период,
    Резерв.Скважина,
    Резерв.Состояние
ИЗ
    РегистрСведений.Резерв КАК Резерв
ГДЕ
    Резерв.Период МЕЖДУ &Дата1 И &Дата2

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

ВЫБРАТЬ
    &Дата2,
    НаКонец.Скважина,
    НаКонец.Состояние
ИЗ
    РегистрСведений.Резерв.СрезПоследних(&Дата2, ) КАК НаКонец
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Раньше.Период,
    Раньше.Скважина,
    Раньше.Состояние,
    РАЗНОСТЬДАТ(Раньше.Период, МИНИМУМ(Позже.Период), СЕКУНДА) КАК Длительность
ПОМЕСТИТЬ Интервалы
ИЗ
    Дано КАК Раньше
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Позже
        ПО Раньше.Скважина = Позже.Скважина
            И Раньше.Период < Позже.Период

СГРУППИРОВАТЬ ПО
    Раньше.Период,
    Раньше.Скважина,
    Раньше.Состояние
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Интервалы.Скважина,
    Интервалы.Состояние,
    СУММА(Интервалы.Длительность) КАК Длительность
ИЗ
    Интервалы КАК Интервалы

СГРУППИРОВАТЬ ПО
    Интервалы.Скважина,
    Интервалы.Состояние

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

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

Автор: ildarovich

FastCode 51 7
Функция ДобавитьКДате(Дата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 + НомерДняНедели),"ДФ=дддд")

Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом

Автор: ildarovich

FastCode 51 7
ВЫБРАТЬ
   Дни.ДеньНедели,
   РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, -Дни.ДеньНедели), НЕДЕЛЯ)
, НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 1 - Дни.ДеньНедели), НЕДЕЛЯ), ДЕНЬ) / 7 КАК КоличествоДней
ИЗ
   (ВЫБРАТЬ 1 КАК ДеньНедели ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5
   ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7) КАК Дни

Выбор записи по номеру из НЕПРОНУМЕРОВАННОЙ таблицы

Расчёт медианы числовых рядов запросом

Автор: ildarovich

FastCode 51 7
ВЫБРАТЬ
    0 КАК Х
ПОМЕСТИТЬ Бит

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    1
;
ВЫБРАТЬ
    NULL КАК Х
ПОМЕСТИТЬ Сдвиг
ИЗ
    Бит КАК Б0,
    Бит КАК Б1,
    Бит КАК Б2,
    Бит КАК Б3,
    Бит КАК Б4,
    Бит КАК Б5,
    Бит КАК Б6,
    Бит КАК Б7
ГДЕ
    Б0.Х + 2 * (Б1.Х + 2 * (Б2.Х + 2 * (Б3.Х + 2 * (Б4.Х + 2 * (Б5.Х + 2 * (Б6.Х + 2 * Б7.Х)))))) < 256 - &Номер
;
ВЫБРАТЬ
    Дано.Х КАК Х
ПОМЕСТИТЬ Дано
ИЗ 
&Дано КАК Дано
;
ВЫБРАТЬ ПЕРВЫЕ 2
    ВЗ.Х
ИЗ
    (ВЫБРАТЬ ПЕРВЫЕ 256
        ВЗ.Х
    ИЗ
        (ВЫБРАТЬ
            Сдвиг.Х
        ИЗ
            Сдвиг КАК Сдвиг
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            Дано.Х
        ИЗ
            Дано КАК Дано) КАК ВЗ
    
    УПОРЯДОЧИТЬ ПО
        Х) КАК ВЗ

УПОРЯДОЧИТЬ ПО
    Х УБЫВ