Минимализмы

Публикация № 306536 08.10.14

Приемы и методы разработки - Математика и алгоритмы

решения задач

Приводится подборка кратчайших решений некоторых задач. Ранее эти решения были разбросаны по комментариям к чужим публикациям.

После упразднения блогов стало негде хранить небольшие короткие решения, сделанные в ходе обсуждения интересных задач других авторов. Решил собрать все такие свои решения в одну статью, которую надеюсь постепеннно дополнять. Большинство решений выполнено в стиле "минимализма" и, наверное, не могут служить примером для подражания. То есть это такие сублиматы кода, которые перед употреблением, возможно, следует еще "размочить" комментариями.

С другой стороны, есть конкурсы по "гольфу" для программистов, где требуется решить задачу с использованием минимального количества команд. Приведенные решения можно использовать для соответствующей тренировки. 

Решения приведены с минимумом пояснений или вообще без них. Заинтересовавшимся стоит посмотреть ссылки на исходные обсуждения или задать вопросы здесь. Постараюсь на них ответить.

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

//infostart.ru/public/87861/

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

2. Колонка сжато

//infostart.ru/public/82347/

Суть задачи в том, что в колонке табличной части находятся целые числа. Необходимо "сжать" ряд чисел, заменив подряд идущие числа их диапазоном.

Например: 1, 3, 4, 5, 7, 10, 11, 12, 16 должно превратиться в 1, 3-5, 7, 10-12, 16. 

Функция КолонкаСжато(ДокументСсылка, ИмяТабличнойЧасти, ИмяКолонки, Слэш = ",", Тире = "-")
    Запрос = Новый Запрос("ВЫБРАТЬ Различные " + ИмяКолонки + " ИЗ Документ." + ДокументСсылка.Метаданные().Имя + "." + ИмяТабличнойЧасти + " ГДЕ Ссылка = &Ссылка Упорядочить ПО " + ИмяКолонки);
    Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
    Ряд = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку(ИмяКолонки);
    Если Ряд.Количество() = 0 Тогда Возврат ""
    КонецЕсли;
    Ряд.Добавить(0); Ряд.Добавить(0);
    Сжато = Строка(Ряд[0]);
    Для ё = 1 По Ряд.Количество() - 3 Цикл
        Если Число(Ряд[ё + 1]) - Число(Ряд[ё - 1]) <> 2 Тогда
            Сжато = Сжато + Слэш + Строка(Ряд[ё])
        ИначеЕсли Число(Ряд[ё + 2]) - Число(Ряд[ё]) <> 2 Тогда
            Сжато = Сжато + Тире
        КонецЕсли
    КонецЦикла;
    Возврат СтрЗаменить(Сжато, Тире + Слэш, Тире)
КонецФункции

3. Сортировка слиянием

//infostart.ru/public/70024/

Дано два отсортированных по возрастанию массива А и В. Необходимо вывести по возрастанию все элементы этих массивов. 

ёж = 0; 
Для уж = 0 По А.Количество() + В.Количество() - 1 Цикл 
    що = (уж - ёж) = В.Количество() ИЛИ ёж < А.Количество() И А[ёж] < В[уж - ёж]; 
    Сообщить(?(що, "а" + ёж + "=" + А[ёж], "в" + (уж - ёж) + "=" + В[уж - ёж])); 
    ёж = ёж + що 
КонецЦикла
ё = 0; 
Для Сч = 1 По А.Количество() + В.Количество() Цикл 
    ж = (Сч - 1 - ё) = В.Количество() ИЛИ ё < А.Количество() И А[ё] < В[Сч - 1 - ё]; 
    Сообщить(?(ж, "А[" + ё + "]=" + А[ё], "В[" + (Сч - 1 - ё) + "]=" + В[Сч - 1 - ё])); 
    ё = ё + ж 
КонецЦикла

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

//infostart.ru/public/77568/

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

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

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

Идея в том, чтобы вместо поиска периода, на котором начинается актуальная цена, искать саму цену. Для этого подобрана функция, которая "отправляет" цену прошлого периода на свой "эшелон", высота которого зависит от древности цены. Ширина "эшелона" задается параметром "Много" - это величина, гарантированно перекрывающая диапазон изменения цены (1000000, 10000000 и т.п.). После нахождения ближайшей (нижайшей) "летящей" цены, высота соответствующего "эшелона" вычитается и цена "опускается на землю". 

Можно подобрать функцию для дат, булевых и строковых значений.

Кроме краткости записи, других достоинств у запроса нет. Минусы - некоторый проигрыш по времени "классическому" запросу из-за большего объема вычислений в группировках, необходимость думать над значением "Много", работа только с простыми типами.

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

5. ЗначениеСвойства

//infostart.ru/public/89809/

Для получения значения одного свойства выбранного объекта хватает одной строки кода, которую можно оформить в виде функции или использовать "инлайн"

ЗначениеСвойства = РегистрыСведений.ЗначенияСвойствОбъектов.Получить(Новый Структура("Объект, Свойство", ОбъектСсылка, ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию(ИмяСвойства))).Значение;

6. Остатки на каждый день

//infostart.ru/public/102435/

Стандартная выборка из виртуального регистра остатков и оборотов не показывает остатки на периодах, в которых нет оборотов. В СКД, то есть вне запроса проблема легко решается, а для использования внутри запроса приходится "городить огород". У многих это выливается в несколько запросов, тогда как можно обойтись и одним. Остатки здесь получаются суммированием оборотов. По тому же принципу платформа рассчитывает остатки внутри периода хранения итогов.

ВЫБРАТЬ РАЗЛИЧНЫЕ
    КурсыВалют.Период
ПОМЕСТИТЬ Дни
ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
    КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода
;

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

СГРУППИРОВАТЬ ПО
    Движения.Номенклатура,
    ДНИ.Период

Правда, здесь рассчитываются остатки на конец каждого дня (это легко поправить, сдвинув даты на -1). Регистр "КурсыВалют" взят для краткости и для разнообразия - все даты внутри периода можно получать и по другому. Классический вариант проигрывает по быстродействию предложенному примерно в 1.5 раза (проверялось на файловой базе УПП). 

7. Связывание таблиц значений по ФИФО

Если имеется две таблицы с колонками: Период, Документ, Сумма, то часто возникает задача построения объединенной таблицы "Результат" с колонками Период1, Документ1, Период2, Документ2, Сумма, в которой документы двух таблиц связаны по ФИФО. Чтобы функция Результат.Свернуть("Период1,Документ1", "Сумма") давала первую таблицу, а Результат.Свернуть("Период2,Документ2", "Сумма") - вторую. 

Такой задачей, является, например, распределение оплат по отгрузкам.

Вот требуемая функция. Осторожнее, так как она меняет исходные таблицы! 

Функция СвязываниеПоФИФО(А, Б, ё = 0, ж = 0) Экспорт
    Результат = НовыйТаблицаЗначений("Период1, Документ1, Период2, Документ2, Сумма");
    Пока ё < А.Количество() И ж < Б.Количество() Цикл
        Сумма = Мин(А[ё].Сумма, Б[ж].Сумма);
        ЗаполнитьЗначенияСвойств(Результат.Добавить()
        , Новый Структура("Период1, Документ1, Период2, Документ2, Сумма"
        , А[ё].Период, А[ё].Документ, Б[ж].Период, Б[ж].Документ, Сумма));
        А[ё].Сумма = А[ё].Сумма - Сумма;
        Б[ж].Сумма = Б[ж].Сумма - Сумма;
        ё = ё + (А[ё].Сумма = 0);
        ж = ж + (Б[ж].Сумма = 0)
    КонецЦикла;
    Возврат Результат 
КонецФункции

8. Формирование синонима переменной из идентификатора

//infostart.ru/public/162834/

Вариант на основе стэйт-машины

Функция Синонимайзер(Имя, Ответ = "", Стэйт = 7, б = "") Экспорт
   Для ё = 1 По СтрДлина(Имя) Цикл
      а = Сред(Имя, ё, 1);
      Стэйт = (НРег(а) <> а) * 4 + Цел(Стэйт / 2);
      Ответ = Ответ + ?(Стэйт = 2, НРег(б), ?(ё = 2, ВРег(б), б)) + ?(Стэйт = 4 ИЛИ Стэйт = 5, " ", "");
      б = а
   КонецЦикла;
   Возврат Ответ + б
КонецФункции

Выгодное отличие здесь в том, что символ вырезается из строки и проверяется на регистр только один раз. Если б не надо было первую букву делать заглавной - было бы еще красивее.

9. Сравнение двух строк

//infostart.ru/public/174530/

Результатом сравнения двух строк является массив, который показывает, что от "От" до "До" позиции строки совпадают (ОК = Истина) или нет.

Функция ТаблицаСравненияСтрок_(С1, С2) Экспорт
   Ответ = Новый ТаблицаЗначений; //Ответ = НоваяТаблицаЗначений("От, До, ОК");
   Ответ.Колонки.Добавить("От");
   Ответ.Колонки.Добавить("До"); 
   Ответ.Колонки.Добавить("ОК");  
   ЗаполнитьЗначенияСвойств(Ответ.Добавить(), Новый Структура("От, ОК", 1, Сред(С1, 1, 1) = Сред(С2, 1, 1)));
   Для ё = 2 По Макс(СтрДлина(С1), СтрДлина(С2)) Цикл
      Если Ответ[0].ОК <> (Сред(С1, ё, 1) = Сред(С2, ё, 1)) Тогда
         ЗаполнитьЗначенияСвойств(Ответ.Вставить(0), Новый Структура("От, ОК", ё, НЕ Ответ[1].ОК));                            
         Ответ[1].До = ё - 1
      КонецЕсли      
   КонецЦикла;
   Ответ[0].До = Макс(СтрДлина(С1), СтрДлина(С2));
   Возврат Ответ
КонецФункции

С дихотомией

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

10. Ход конем

http://forum.infostart.ru/forum1/topic78895/message844453/#message84445

Определить количество и поля клеток, доставаемых конем, в зависимости от его положения на доске

 

ВЫБРАТЬ 1 у, "a" х
ПОМЕСТИТЬ а
ОБЪЕДИНИТЬ ВЫБРАТЬ 2, "b"
ОБЪЕДИНИТЬ ВЫБРАТЬ 3, "c"
ОБЪЕДИНИТЬ ВЫБРАТЬ 4, "d"
ОБЪЕДИНИТЬ ВЫБРАТЬ 5, "e"
ОБЪЕДИНИТЬ ВЫБРАТЬ 6, "f"
ОБЪЕДИНИТЬ ВЫБРАТЬ 7, "g"
ОБЪЕДИНИТЬ ВЫБРАТЬ 8, "h"
;
ВЫБРАТЬ г.х, д.у
ИЗ а а, а г, а д
ГДЕ а.х = &ах И (а.у - г.у) * (а.у - г.у) + (&бу - д.у) * (&бу - д.у) = 5


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

//infostart.ru/public/175509/

Функция возвращает строку, в которой 0 - сгиб от нас, 1 - к нам. Первый параметр - необходимое число сложений, второй и третий параметры служебные. Всего в записи функции 77 символов. Не по-русски потому, что так короче.

function W(k,a=0,b=0)return?(k<1,"",W(k-1,a+b)+a%2+W(k-1,a+1+b,1))endfunction

Если предположить, что число сгибов не может быть отрицательным, то можно сэкономить еще 2 символа. Итого 75 символов. Можно ли короче?

function W(k,a=0,b=0)return?(k,W(k-1,a+b)+a%2+W(k-1,a+b+1,1),"")endfunction

12. Найти кратчайший путь коня между двумя заданными клетками

http://forum.infostart.ru/forum1/topic78895/message839037/#message839037

Первая функция размечает доску, вторая рекурсивно перечисляет пути из конечной точки. 
Разметка идет "по спирали". Номер витка (круга) соответствует минимальному расстоянию от начальной точки. На каждом витке неразмеченные клетки просматриваются в паре с каждой клеткой последнего витка. Если расстояние (сумма квадратов разности координат равно пяти) соответствует шагу коня клетка включается в следующий виток (круг). И так пока в круг не попадет конечная клетка. В каждой клетке запоминается массив клеток предыдущего витка, из которых попадают в текущую. Это дает возможность рекурсивно раскрутить пути до начальной точке "при спуске".

Функция Спираль(А, Б, Круг = 0)Экспорт
    Поле = НоваяТаблицаЗначений("Х, У, Круг, Связи");
    Для К = 0 По 63 Цикл 
        ЗаполнитьЗначенияСвойств(Поле.Добавить(), Новый Структура("Х, У, Круг, Связи", Цел(К / 8), К % 8, (К = А) - 1, Новый Массив))
    КонецЦикла;
    Пока Поле[Б].Круг < 0 Цикл 
        Целина = Поле.НайтиСтроки(Новый Структура("Круг", -1));
        Трек = Поле.НайтиСтроки(Новый Структура("Круг", Круг));
        Для Каждого С Из Целина Цикл
            Для Каждого К Из Трек Цикл
                Если (С.Х - К.Х) * (С.Х - К.Х) + (С.У - К.У) * (С.У - К.У) = 5 Тогда
                    С.Круг = Круг + 1;
                    С.Связи.Добавить(К.Х * 8 + К.У)
                КонецЕсли
            КонецЦикла
        КонецЦикла;
        Круг = Круг + 1
    КонецЦикла;
    Возврат Поле
КонецФункции
Процедура Спуск(Б, Поле, Знач Путь = "") Экспорт
    Путь = Сред("abcdefgh", Б / 8 + 1, 1) + (Б % 8 + 1) + " " + Путь;
    Если Поле[Б].Связи.Количество() = 0 Тогда
        ЗаполнитьЗначенияСвойств(Пути.Добавить(), Новый Структура("Путь", Путь))
    Иначе
        Для Каждого К Из Поле[Б].Связи Цикл
            Спуск(К, Поле, Путь)
        КонецЦикла
    КонецЕсли
КонецПроцедуры

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

//infostart.ru/public/200111/

Функция СтрокаВДату(Знач ФорматДаты, Знач Дано, Ошибка = Ложь) Экспорт 
    Попытка 
        ё = Формат('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' 
    КонецПопытки 
КонецФункции 

14. Сжатое представление последовательности дат запросом

http://forum.infostart.ru/forum26/topic112033/message1160294/#message1160294

Задача похожа на сжатое представление ряда чисел, только роль чисел играют даты. Дана последовательность дат. Нужно заменить ее последовательностью непрерывных интервалов дат. Вот решение

ВЫБРАТЬ 
    Даты.Дата, 
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДатыДо.Дата) КАК Номер 
ПОМЕСТИТЬ НомераДат 
ИЗ 
    ВТДаты КАК Даты 
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДаты КАК ДатыДо 
        ПО (ДатыДо.Дата < = Даты.Дата) 
СГРУППИРОВАТЬ ПО 
    Даты.Дата 
; 

//////////////////////////////////////////////////////////////////////////////// 
ВЫБРАТЬ 
    МИНИМУМ(НомераДат.Дата) КАК ДатаНач, 
    МАКСИМУМ(НомераДат.Дата) КАК ДатаКон 
ИЗ 
    НомераДат КАК НомераДат 
СГРУППИРОВАТЬ ПО 
    ДОБАВИТЬКДАТЕ(НомераДат.Дата, ДЕНЬ, -НомераДат.Номер)

15. Размещение восьми ферзей на шахматной доске для СУБД Oracle

Найти запросом все варианты размещения 8-ми ферзей на шахматной доске, чтобы они не били друг друга.

В Oracle много чего есть, включая рекурсию. Поэтому режение получилось коротким. Задача взята с Хабра из раздела "ненормальное программирование"

http://habrahabr.ru/post/228373/#first_unread

with 
    x(i) as (select level from dual connect by level < = 8),
    q(z, j) as (select '', 1 from dual 
                union all 
                select z || y.i, j + 1 from q inner join x y 
                    on not exists(select 1 from x where i < j and (y.i - substr(z, i, 1)) / (j - i) IN (-1, 0, 1))) 

cycle z set cyclemark to 'X' default '-'

select translate('a1 b2 c3 d4 e5 f6 h7 g8', '12345678', z) from q where j = 8 + 1

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

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

//infostart.ru/public/308429/

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

17. Получение таблицы и массива, заполненных последовательностью чисел от 0 до N-1

Иногда бывает нужно быстро получить готовый массив с последовательностью чисел от 0 до N-1. Например, чтобы пронумеровать строки таблицы значений путем загрузки в нее колонки с номерами строк. Это можно очень быстро сделать, используя "Порождающий запрос". Все необходимые функции очень компактны. Поэтому они приведены здесь.

// Возвращает текст запроса, формирующего таблицу чисел rN с одной колонкой X (eng), содержащую ряд: 0, 1, (N - 1).
function ProtoText(N, M = 1000000000) export
    return ?(N > 2
    , ProtoText(M - Int(M - Sqrt(N)))
    + strreplace(strreplace(";select top #2 a.X * #1 + b.X X into r#2 from r#1 a, r#1 b", "#2", format(N, "NG=")), "#1", format(M - Int(M - Sqrt(N)), "NG="))
    , "select 0 X into r2 union select 1")
endfunction

// Возвращает таблицу, содержащую последовательность чисел: 0, 1, 2, ..., (ЧислоСтрок - 1)
Функция ПоследовательностьЧиселТаблицей(ЧислоСтрок) Экспорт
	Запрос = Новый Запрос(СтрЗаменить(ProtoText(ЧислоСтрок), "into r" + format(ЧислоСтрок, "NG="), ""));
	Возврат Запрос.Выполнить().Выгрузить()
КонецФункции

// Возвращает массив, содержащий последовательность чисел: 0, 1, 2, ..., (ЧислоЭлементов - 1) 
Функция ПоследовательностьЧиселМассивом(ЧислоЭлементов) Экспорт
	Возврат ПоследовательностьЧиселТаблицей(ЧислоЭлементов).ВыгрузитьКолонку(0)
КонецФункции

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

Стандартный способ объединения двух таблиц значений заключается в организации цикла, в котором строки второй таблицы приписываются в конец копии первой. Для этого используется следующий простой код:

ОбъединениеТаблиц = Таблица1.Скопировать();
Для Каждого Строка Из Таблица2 Цикл ЗаполнитьЗначенияСвойств(ОбъединениеТаблиц.Добавить(), Строка) КонецЦикла

Все возможности оптимизация данного способа ограничиваются записью в одну строку и выбором таблицы с меньшим количеством элементов в качестве источника добавляемых строк.

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

1)      Вторая (добавляемая) таблица копируется в таблицу-результат;

2)      В начало таблицы результата перед уже скопированной таблицей вставляется столько пустых строк, сколько строк в первой таблице. Таким образом «освобождается место» для первой таблицы;

3)      Затем первая таблица помещается на освобожденное место методом выгрузки-загрузки колонок.  Фокус в том, что при загрузке колонки в таблицу значений, если загружаемая колонка короче целевой, то оставшиеся элементы целевой колонки не меняются.

Схематичное описание той же последовательности действий приведено на рисунке ниже

Схема способа

Реализация предложенного способа очень проста и выполняется следующим фрагментом программного кода:

ОбъединениеТаблиц = Таблица2.Скопировать();
Для ё = 1 По Таблица1.Количество() Цикл ОбъединениеТаблиц.Вставить(0) КонецЦикла;
Для ё = 0 По Таблица1.Колонки.Количество() - 1 Цикл 
	ОбъединениеТаблиц.ЗагрузитьКолонку(Таблица1.ВыгрузитьКолонку(ё), ё) 
КонецЦикла;

 

Колонок в таблицах значений обычно всегда значительно меньше, чем строк. Поэтому такой способ содержит меньше отдельных действий и в результате выполняется платформой быстрее построчного копирования. Ускорение зависит от соотношения числа строк и столбцов и может достигать полутора раз.

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

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

ВЫБРАТЬ 0 КАК Х
ПОМЕСТИТЬ Бит
ОБЪЕДИНИТЬ ВЫБРАТЬ 1
;
ВЫБРАТЬ	Бит0.Х + 2 * (Бит1.Х + 2 * (Бит2.Х + 2 * (Бит3.Х + 2 * (Бит4.Х + 2 * (Бит5.Х + 2 * Бит6.Х))))) КАК Х
ПОМЕСТИТЬ Ряд
ИЗ Бит КАК Бит6, Бит КАК Бит5, Бит КАК Бит4, Бит КАК Бит3, Бит КАК Бит2, Бит КАК Бит1, Бит КАК Бит0
;
ВЫБРАТЬ Ряд1.Х КАК Х, Ряд2.Х КАК У, Ряд1.Х + Ряд2.Х КАК Сумма, Ряд1.Х * Ряд2.Х КАК ХУ
ПОМЕСТИТЬ Пробы
ИЗ Ряд КАК Ряд1, Ряд КАК Ряд2
ГДЕ 1 < Ряд1.Х И Ряд1.Х < Ряд2.Х И Ряд1.Х + Ряд2.Х <= 100
;
ВЫБРАТЬ РАЗЛИЧНЫЕ Сумма
ПОМЕСТИТЬ ТабуСумм
ИЗ Пробы
ГДЕ ХУ В (ВЫБРАТЬ ХУ ИЗ Пробы СГРУППИРОВАТЬ ПО ХУ ИМЕЮЩИЕ КОЛИЧЕСТВО(*) = 1)
;
ВЫБРАТЬ	ХУ КАК Произведение
ПОМЕСТИТЬ ЧислаПоля
ИЗ Пробы
ГДЕ	НЕ Сумма В (ВЫБРАТЬ * ИЗ ТабуСумм)
СГРУППИРОВАТЬ ПО ХУ
ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сумма) = 1
;
ВЫБРАТЬ Сумма, МАКСИМУМ(Произведение), МАКСИМУМ(Х), МАКСИМУМ(У)
ИЗ Пробы ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЧислаПоля ПО ХУ = Произведение
ГДЕ НЕ Сумма В (ВЫБРАТЬ * ИЗ ТабуСумм)
СГРУППИРОВАТЬ ПО Сумма
ИМЕЮЩИЕ КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Произведение) = 1

20. Поразрядное исключающее ИЛИ

Для решения задачи Задача о 64 монетах, двух заключённых и одной шахматной доске написан запрос

ВЫБРАТЬ
	Дано.Икс
ПОМЕСТИТЬ Дано
ИЗ
	&Дано КАК Дано
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	1 КАК Вес
ПОМЕСТИТЬ Позиции

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	2

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	4

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	8

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	16

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	32
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СУММА(Разряды.Вес * (Разряды.Икс - (ВЫРАЗИТЬ(Разряды.Икс / 2 + 0.5 КАК ЧИСЛО(10, 0))) * 2 + 2)) КАК Икс
ИЗ
	(ВЫБРАТЬ
		Позиции.Вес КАК Вес,
		СУММА((ВЫРАЗИТЬ(Дано.Икс / Позиции.Вес + 0.5 КАК ЧИСЛО(10, 0))) - 1) КАК Икс
	ИЗ
		Дано КАК Дано,
		Позиции КАК Позиции
	
	СГРУППИРОВАТЬ ПО
		Позиции.Вес) КАК Разряды


Этот запрос определяет шесть разрядов контрольной суммы, полученных выполнением поразрядного суммирования по модулю два чисел, заданных в таблице "Дано". Приведенный запрос может использоваться при создании и проверке контрольных соотношений, при других действиях в арифметике полей Галуа GF(2^6). Запрос легко обобщается на другие разрядности.

21. Определение длины строки в запросе

Это тема из обсуждения "Как с помощью запроса посчитать количество символов в реквизите"

ВЫБРАТЬ
	Дано.НомерСтроки,
	Дано.Строка
ПОМЕСТИТЬ Дано
ИЗ
	&Дано КАК Дано
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	0 КАК ё
ПОМЕСТИТЬ Р0

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	2 * Р1.ё + Р0.ё КАК ё
ПОМЕСТИТЬ Р10
ИЗ
	Р0 КАК Р1,
	Р0 КАК Р0
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	4 * Р32.ё + Р10.ё КАК ё
ПОМЕСТИТЬ Р3210
ИЗ
	Р10 КАК Р32,
	Р10 КАК Р10
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	16 * Р54.ё + Р3210.ё + 1 КАК ё
ПОМЕСТИТЬ Р543210
ИЗ
	Р10 КАК Р54,
	Р3210 КАК Р3210
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Дано.НомерСтроки,
	Дано.Строка,
	МАКСИМУМ(Р543210.ё) КАК ДлинаСтроки
ИЗ
	Дано КАК Дано,
	Р543210 КАК Р543210
ГДЕ
	ПОДСТРОКА(Дано.Строка, Р543210.ё, 1) + "!" <> "!"

СГРУППИРОВАТЬ ПО
	Дано.НомерСтроки,
	Дано.Строка

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. trumanl 12 09.10.14 10:59 Сейчас в теме
Классная подборка, так сказать на "подумать".
Конечно в реальных задачах не часто этому можно найти применение, но кое-что взял на заметку.
Спасибо! Люблю читать Ваши статьи.
3. Denis S 09.10.14 11:08 Сейчас в теме
Спасибо за статью! Хорошая пища для ума будет)
marsovna; +1 Ответить
4. PiccaHut001 09.10.14 11:11 Сейчас в теме
"15. Размещение восьми ферзей на шахматной доске для СУБД Oracle" и 1С неразрывно связаны. Я вот, каждый день прихожу на работу, попью чаю, и сразу думаю, как-бы разместить 8(ВОСЕМЬ!!!) ферзей на шахматной доске. Ситуация очень жизненная, у каждого дома должно быть 4 набора шахмат, чтобы получилось восемь ферсей, а то некомильфо. Спасибо автору, не поленился, и собрал вместе такие нужные ссылки.
wowik; SagittariusA; Gendelf; SunShinne; bonya_by; VrYasuyk; Krasnyj; cypherpunks01; Захаров_Николай; pomestnik; jaroslav.h; s_vidyakin; DoctorRoza; EMelihoff; Maxis; zainaz; talych; Dimon2005; ojiojiowka; ya.Avoronov; Mingrel; garaevilnur; sorb; CyberCerber; BigRig; fzt; nixel; Дмитрий74Чел; RailMen; Nuobu; palsergeich; succub1_5; CratosX; smit1c; jmi; fomix; AllexSoft; Steelvan; ssega; tehas; sashocq; Mihas_01; mbreaker; alexey_kurdyukov; Mi4man; alexinzaz; Pawlick; Anchoret; sh_max; sergelemon; Aleks_Antonuk; Sasha_jr; SeiOkami; +53 1 Ответить
6. ildarovich 7509 09.10.14 11:46 Сейчас в теме
(4) PiccaHut001, здесь задачу 15 и ее решение я привел по нескольким причинам:
- возможно, кто-то захочет ее решить на "1С" и можно будет сравнить длину решения;
- возможно, кому-либо будет интересно как выглядит язык запросов СУБД Oracle;
- возможно, кому-либо будут интересны новые возможности языка запросов Oracle, примененные в этом решении, так как эти возможности могут когда-либо появиться и в 1С, в том числе, и нашими стараниями.

А вообще это известная классическая задача, которую можно решить для тренировки или просто для удовольствия, если нравится программировать.
50. StaticUnsafe 30.12.14 09:26 Сейчас в теме
(6) решал задачу с ферзями на 1С, удивлял препода в инсте )))
51. ksuman 14.01.15 22:48 Сейчас в теме
(6)
возможно, кто-то захочет ее решить на "1С" и можно будет сравнить длину решения;


Я конечно поддерживаю различные задачки по развитию аналитического мышления, и часть задач мне нравится, но замечу Вам, что нельзя вводить в заблуждение наивных программистов 1С краткостью решения, тем более когда сие осуществляется путем исключения пробелов и необходимых переносов строк. Погоня за краткостью, может привезти к противоположному результату и будут противоречить двум основополагающим принципам программирования:

1. Компактности и/или Быстродействие, при этом компактность кода подразумевается не то что видим мы, а то что компилируется в исполняемый модуль, сколько временных переменных используется, сколько создается и уничтожается объектов/классов, сколько при этом расходуется памяти. С учетом того что пример показан в среде 1С, компактность скомпилированного кода может даже потерять значительно. Вот в языке "C" там есть такой оператор для целых чисел ++ или --, также как и =- и =+, которые реально делали отдельные операции компактными и быстрыми. Однако в С++ и дальше они утратили свой смысл для классов с перегрузкой операторов, но все же мы можем с помощью отладчиков как то увидеть, что реально делается.
Пример, когда увеличение кода ведет к повышению его производительности:
а) Перем ЕстьДанные,Наименование,НашАдрес,НашаСтруктура, ТабЗнИст; // объявление ряда переменных вначале процедуры - исключает ряд операций по манипуляции со стеком и пулом свободной памяти.
б) //Описание кода в таком виде
ЕстьДанные=ИсходныйНаборСтруктур.Свойство("НашаСтруктура",НашаСтруктура);
Если ЕстьДанные Тогда
НашАдрес=НашаСтруктура.Адрес;
Наименование=НашаСтруктура.Наименование;
КонецЕсли;
// будет выполняться быстрее и компактнее чем в нижестоящем, за счет исключения лишних обращений к каждому из объектов и вычислении у него адреса свойства или метода.
НашАдрес=ИсходныйНаборСтруктур.НашаСтруктура.НашАдрес;
Наименование=ИсходныйНаборСтруктур.НашаСтруктура.Наименование;

2. Наглядность кода - если целью решения задачи является Демонстрация или Создание библиотек функций для дальнейшего использования, то это святое. Код должен быть понятным легко и без напряга. Здесь же во многих задачах как раз и приходится напрягаться, чтобы понять какая переменная за что отвечает. Ещё давно, когда делал первые шаги к программированию, была рекомендация по использованию имен переменных для читабельности кода. Например все счетчики, которые использовались в циклах обычно именовались в таком порядке (i, j, k), целые числа (n, m, l), вещественные: (x, y, z), другие все переменные были носили понятные имена и начинались с префиксами, подсказывающими их тип (chPath, uFileName, bResultPath).

Конечно мы не в Си рассматриваем примеры, но можно было бы хотя бы рядом с кратким решением (если уж так хочется блеснуть низкой длинной решения), выводить структурированное и с нормальными и понятными именами. А так же упор делать на реальной производительности, а не не посчете символов кода.
ЧИА; juricher; wowik; hairman; Tosik_; Дмитрий74Чел; +6 Ответить
52. ildarovich 7509 14.01.15 23:48 Сейчас в теме
(51) ksuman, спасибо за такой подробный комментарий.

Не буду спорить, я много раз слышал эти доводы и сам много раз говорил те же слова другим.

Но когда ищешь короткое решение и находишь "легальную" возможность его сокращения, то психологически трудно вовремя затормозить, не убрав еще одну строчку, обратившись к реквизиту через десять точек и тому подобное.
Те решения, от которых я отталкивался были в пять и больше раз длиннее. Совершенно ненужная избыточность в них точно была. И минимизация заключалась не только в сокращении имен переменных и записи в одну строчку. Где-то я переборщил. Я это уже понял. Здесь больше чем в других программистких сообществах ценят не компактность кода, а простоту и наглядность кода. Буду иметь это ввиду, наступая на горло своим привычкам.

Ну и, кстати, в начале статье открытым текстом написано, что приведены сублиматы кода и перед использованием их следует размачивать.

возможно, кто-то захочет ее решить на "1С" и можно будет сравнить длину решения
это относилось к обоснованию того, зачем нам здесь код на Oracle. В исходной статье можете посмотреть каким был исходный код. Видно, что имена переменных и форматирование кода там были очень краткими и совсем "не в стиле 1С". Полюбопытствуйте, как пишут ораклисты. Я написал код в их стиле и гораздо короче и гибче, применив рекурсию. Попробуйте предложить несокращаемое компактно-понятно-наглядное решение на 1С для этой задачи.

Про то, что явное объявление локальных переменных экономит время раньше не знал.
5. tindir 09.10.14 11:22 Сейчас в теме
забавно, что если 1с писать на басурманском, то он легким движениме руки начинета походить на JS со сторонними библиотеками=)
8. alexey_kurdyukov 09.10.14 12:51 Сейчас в теме
(5) tindir, Чем? Тем, что в нём тоже есть слова?

вот 1С:
function W(k,a=0,b=0)return?(k<1,"",W(k-1,a+b)+a%2+W(k-1,a+1+b,1))endfunction

вот JS:
function W(k,a,b) {return (k<1?"":W(k-1,a+b)+a%2+W(k-1,a+1+b,1))}

вот Pascal:
function W(k: real,a: real,b: real) begin if (k<1) then result:=""; else result:=W(k-1,a+b)+a%2+W(k-1,a+1+b,1)); end; end

вот VB:
function W(k,a,b) if (k<1) then W:="" else W:=W(k-1,a+b)+a%2+W(k-1,a+1+b,1)) end if end function

может на VB больше похоже? или может все языки одинаковые?
28. DrAku1a 1484 15.10.14 07:36 Сейчас в теме
(8) alexnecro, да это как языки общения - в принципе, используются для одной общей цели (общаться с железом) - просто немного разная специфика у каждого языка. Простейшие задачи с примитивными расчетами - можно решать практически в любом языке высокого уровня (а может и не только высокого). Выбор языка - вопрос удобства, надёжности и простоты общения на нём...

Например, оперируя в Delphi - мне не хватает удобных коллекций данных, реализованных в 1С (список, таблица значений, структура, соответствие), универсальности типов значений, беззаботного отношения к создаваемым объектам. Всё это можно реализовать, конечно - через компоненты. Интерфейс и функционал стандартных компонентов - тоже уступает 1С и тоже навёрстывается компонентами... Зато в Delphi я могу написать программу, не связанную с базой данных, выполняющую вообще - другие функции...
7. adhocprog 1128 09.10.14 11:55 Сейчас в теме
9. amon_ra 50 09.10.14 14:30 Сейчас в теме
Достаточно интересная подборка и описано все занимательно, однако, названия переменных состоящих из одной буквы или какого-то странного слога ломает глаза и заставляет напрягать мозг(
Я наверно из тех, кто уж лучше переменную назовет по длиннее зато ясненько-понятненько.)
ЧИА; Gendelf; Aspire1C; citicat; Designer1C; Mingrel; garaevilnur; CyberCerber; BigRig; daMaster; Zhilyakovdr; Tavalik; jmi; illUMI; Steelvan; ssega; help1Ckr; +17 Ответить
14. ildarovich 7509 09.10.14 14:54 Сейчас в теме
(9) amon_ra, я первое время спорил, потому что сохранились привычки программирования и чтения программ на других языках, а теперь просто соглашусь. И буду стараться использовать в других подходящих случаях содержательные названия переменных. Раз уж так все здесь привыкли (со своим уставом в чужой монастырь не ходят).
И еще тут был интерес сделать код не скучно-понятным, а смешным (ёж, уж, що, ох, ах, ух) и нарядным. Но не все это правильно понимают - слишком серьезные тут многие, что-ли.
16. Yashazz 4284 10.10.14 01:23 Сейчас в теме
Кое-что уже можно сделать иначе, благо возможности платформы растут, но...
Спасибо за полузабытое удовольствие читать красивый код, спасибо за "вкусные" и изящные решения. Эстетично.Стильно. Прям даже не 1С, а настоящее программирование.
Респект ишшо раз!

p.s. и да, это случай, когда (14) более уместны именно одно-двух-буквенные переменные, опять же ностальгия...
karpik666; +1 Ответить
19. zqzq 23 10.10.14 08:23 Сейчас в теме
(14) Понятные и адекватные названия переменных и нормальное оформление кода - это не изобретение 1С, а общемировая практика хорошего программирования. См. классическую книгу С. Макконел "Совершенный код" (S. MacConnel "Code Complete"). Кстати, по поводу "ужей" и "ежей" там тоже было:
Не используйте имена, которые совершенно не связаны с тем, что представляют переменные Использование имен вроде margaret и pookie практиески гарантирует, что никто другой их не поймет. Не называйте переменные в честь девушки, жены, любимого сорта пива и т. д., если только девушка, жена или сорт пива не являются представляемыми в программе «сущностями». Но даже тогда
вы должны понимать, что все в мире изменяется, поэтому имена девушка, жена и любимыйСортПива гораздо лучше!
ЧИА; wowik; citicat; timeforlive; egoludens; Mingrel; garaevilnur; nixel; daMaster; gavrikprog; eugeniezheludkov; 1cprogr_nsk; ssega; monkbest; Sardukar; sergelemon; Sasha_jr; awk; gradi; A.Sytchev; Taktic; +21 Ответить
20. ildarovich 7509 10.10.14 10:09 Сейчас в теме
(19) zqzq, есть у меня эта книга, читал ее.
Но для меня в задаче 3 уж и еж - являются представляемыми в программе сущностями. Они как бы идут (ползут) по массиву в процессе его обработки. При этом их положение взаимосвязано - как и в природе, если они встречаются. В этом и был интерес в этих названиях. Ну и "що" - это просторечное "что", которое отмечает результат сравнения - что случилось и куда двигаться ежу.
Знаете, есть даже конкурсы, в которых программы пишутся так, чтобы получались стихи. У нас программы на русском языке и мы можем придать за счет этого им больше выразительности.
Это упражнение, этюд, я не призываю так оформлять все свои программы.
Но польза от таких упражнений есть.
Например, в работе http://infostart.ru/public/294285/ я постарался, не теряя смысла, назвать все переменные короткими четырехбуквенными словами, отражающими еще смысл данных переменных. Порадовался богатству языка: у нас очень много коротких выразительных слов: тень, ранг, след, рост, путь, плюс. Там только "змея" оказалось не на месте, хотя и отражала зигзагообразный порядок обхода массива. Но, посмотрев на результаты со стороны, послушав критику людей, которым это представление динамики выполнения программы оказывается недостаточно близким (у них могут быть свои ассоциации), решил больше так не делать и использовать все же в дальнейшем более понятные словосочетания в качестве имен переменных.

Ну и потом, объясните мне, почему в математических формулах используются короткие названия сущностей. Ведь формулы должны быть еще более понятны: они исключительно для чтения читателями.
RibD; pm74; Prometeus2011; amon_ra; +4 Ответить
22. amon_ra 50 10.10.14 11:05 Сейчас в теме
(20) А вы оказывается не плохой философ! ) Вы уж не обижайтесь на наши придирки - мы просто еще не постигли дзен программирования) Теперь на ваши куски кода смотрю иным взглядом)
30. Sardukar 56 16.10.14 07:46 Сейчас в теме
(20)
"Ну и потом, объясните мне, почему в математических формулах используются короткие названия сущностей. Ведь формулы должны быть еще более понятны: они исключительно для чтения читателями. "

Чтобы математики другим казались умнее.
21. amon_ra 50 10.10.14 10:58 Сейчас в теме
(14) Как раз юмор понятен, но если один пример, то читается легко, но после 3-4 уже сложнова-то прочитывать код.
10. fjay69 32 09.10.14 14:34 Сейчас в теме
function W(k,a=0)return?(k,"",W(k-1,0)+a+W(k-1,1))endfunction

Что я делаю не так?
13. awa 2567 09.10.14 14:42 Сейчас в теме
(10) У нас одинаковые решения! Объединяя их, получаем 58 символов.
функция г(ё,н=0)return?(ё,г(ё-1)+н+г(ё-1,1),"")endfunction
15. ildarovich 7509 09.10.14 15:12 Сейчас в теме
(13) awa, - супер! Мне тогда показалось, что без третьего параметра никак не обойтись, хотя ощущение его ненужности было. Вывод: нельзя было останавливаться на достигнутом!
11. awa 2567 09.10.14 14:35 Сейчас в теме
Задача 11.
Итого 75 символов. Можно ли короче?
Можно.
функция г(ё,н="0")return?(ё,г(ё-1)+н+г(ё-1,1),"")endfunction
Итого 60 символов.
wowik; fjay69; +2 Ответить
12. fjay69 32 09.10.14 14:39 Сейчас в теме
(11) awa, про аргумент по умолчанию я и забыл)
17. karpik666 3551 10.10.14 06:13 Сейчас в теме
Долго пытался вникнуть в рекурсию в решении задачи 11. И пока думал пришел к другому решению:
По сути при каждом складывании листа изгиб никуда не девается, он так и будет занимать свой 0 или 1 в последовательности, просто каждый раз добавляем слева и справа для каждого изгиба в последовательности 0 и 1, например: был 0, при следующем изгибе добавляем 0 и 1 получаем 001, затем еще раз сгибаем: 0010011. Поэтому при решении такой задачи использовал Массив и функцию вставить, чтобы он динамически раздвигался. Может мое решение не такое изящное, но мне кажется более понятное.

Наконец-то разобрался=) идея получается точно такая же, просто у меня реализация ужасная.
18. karpik666 3551 10.10.14 06:27 Сейчас в теме
И еще хотел спросить по решению:
function W(k,a=0,b=0)return?(k,W(k-1,a+b)+a%2+W(k-1,a+b+1,1),"")endfunction

Разве 1С такое может, чтобы переменная, если равна нулю, то одновременно передавала и значение Ложь, а если не равно, то Истина?
35. AlexanderKai 27.10.14 09:05 Сейчас в теме
(18) karpik666,
Может. Так по умолчанию принято.
23. pm74 210 10.10.14 16:21 Сейчас в теме
на форуме была задача по смыслу почти обратная № 2 :
По строке вида "1,2,3,5,9-15" найти количество цифр в последовательности.

Вот решение в духе минимализма:
Строка="1,2,3,5,9-15";
Число=0;
Выполнить("Строка=""Вычислить(""+Вычислить("""+СтрЗаменить(Строка,",",""")*-1+"")+Вычислить(""+Вычислить(""")+""")*-1+"")""");
Выполнить("Число=Вычислить("+СтрЗаменить(СтрЗаменить(Строка,"-","0*"),"(","(1+")+")");
Сообщить("Результат ="+Число);
ildarovich; +1 Ответить
24. ildarovich 7509 10.10.14 16:51 Сейчас в теме
(23) pm74, ага, видел краем глаза уже с решением. Оригинальная идея. Тогда не нашел возможности улучшить. Но вообще бы подумал как бы это записать покрасивее и обобщить.
25. egorovntn 229 12.10.14 18:35 Сейчас в теме
Да не которые примеры интересны, давно думал как это реализовать еще с олимпиад известные задачи, а руки то не доходили...
26. Патриот 342 14.10.14 18:19 Сейчас в теме
сразу в глаза бросилась ненужность параметра Б. Хотел своё сокращение привести
function W(k,a=0,b=0)return?(k,W(k-1,a+b)+b+W(k-1,a+b+1,1),"")endfunction
залез в комменты почитать и понял, что я на несколько дней опоздал, и уже найдены решения где от него полностью избавились =((
29. Патриот 342 15.10.14 17:52 Сейчас в теме
(26) Решил ещё раз штурмануть задачу 11, но уже с целью выведения формулы определения i-того символа в нужной последовательности (причём количество сгибаний нас не интересует, т.к. последовательность n-того порядка является началом любой другой последовательности более старшего порядка, значит можно исходить из того, что мы имеем независимую (от n, например) бесконечную последовательность). Возможно продолбался бы я не один день с этой идеей, если бы вовремя не заметил, что наша последовательность, это запись самодвойственной функции! С которыми я по первому курсу универа пропарился немало, т.к. преподаватель дискретной математики очень заинтересовал нерешёнными досель вопросами в этой области. Подробностей не помню, но смысл в том, что пока такой формулы нет и не предвидится (что её нельзя вывести, тоже вроде не доказано), так что я смело отказался от данной затеи.
Но вдруг кого заинтересует более решаемая задача - Написать суперкороткую функцию, которой на вход мы скармливаем номер символа последовательности, рождаемой в задаче 11, а на выходе выплёвывается искомый символ. В принципе сиё достигается небольшой модификацией исходного решения. На досуге накидаю.
76. denis_aka_wolf 78 12.12.16 05:21 Сейчас в теме
(29) Ругается что поля А и Б не входят в группу
Весь мой запрос:

ВЫБРАТЬ "Овсянка" А, "Омлет" Б
ПОМЕСТИТЬ Дано 
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Плов","Борщ"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Омлет","Овсянка"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Пельмени","Шашлык"
ОБЪЕДИНИТЬ
ВЫБРАТЬ "Борщ","Плов"
;

ВЫБРАТЬ А, Б, КОЛИЧЕСТВО(*) 
ИЗ (ВЫБРАТЬ А, Б ИЗ Дано ГДЕ А <= Б 
       ОБЪЕДИНИТЬ ВСЕ 
       ВЫБРАТЬ Б, А ИЗ Дано ГДЕ А > Б) ВЗ
Показать
77. denis_aka_wolf 78 12.12.16 13:48 Сейчас в теме
(76) ошибочка вышла, не туда написал, извините...
27. DrAku1a 1484 15.10.14 07:03 Сейчас в теме
Заметочки про 1С:Предприятие # Про быстрые массивы - вот это действительно ВЕЩЬ! и как раз в стиле минимализма...
ildarovich; +1 Ответить
31. bashirov.rs 27 16.10.14 10:44 Сейчас в теме
Не плохо написано! Спасибо за собранный материал. Ждем еще...
32. DAnry 8 16.10.14 12:17 Сейчас в теме
Спасибо! Хорошая подборка. Интересные оригинальные решения, так сказать гимнастика для мозга. Но есть и полезные, которые можно использовать в работе.
33. KeyFire 21.10.14 10:32 Сейчас в теме
Спасибо. Познавательно.
34. ildarovich 7509 26.10.14 09:53 Сейчас в теме
Добавил задачу 16 про недостающие функции для работы с датами (как в языке запросов).
На самом деле довольно интересно то, что
ДобавитьКДате('20120131', 1, "Месяц") = '20120229', 
ДобавитьКДате('20120131', 3, "Месяц") = '20120430',
ДобавитьКДате('20120130', 3, "Месяц") = '20120430'
ДобавитьКДате('20120229', 1, "Год") = '20130228'

Также не все обращают внимание, что
РазностьДат('20131231235959','20140101000000',"Год") = 1 и
РазностьДат('20131231235959','20140101000000',"Час") = 1
Как в шутке про прошлогодние салаты на Новый год

Также интересно, что инициализация структуры Шаг
может проводиться таким образом
Шаг = Новый Структура("Месяц, Секунда", 1, -1);
Шаг.Добавить("Минута", Шаг.Секунда * 60);
Шаг.Добавить("Час", Шаг.Минута * 60);
Шаг.Добавить("День", Шаг.Час * 24);
Шаг.Добавить("Неделя", Шаг.День * 7);

Шаг.Добавить("Квартал", Шаг.Месяц * 3);
Шаг.Добавить("Год", Шаг.Квартал * 4);


Это упростит поддержку 1С в поселении на Марсе :-)
37. ZLENKO 31.10.14 18:49 Сейчас в теме
(34) "ДобавитьКДате('20120229', 1, "Год") = '20130228'"

А еще вариант: ДобавитьКДате('20110228',ГОД, 1) = '20120228', а не '20120229' :-)
36. ZLENKO 31.10.14 18:22 Сейчас в теме
Возможно я ошибаюсь, но в алгоритме "7. Связывание таблиц значений по ФИФО" часть записей одной из таблиц, которые не "связались" не попадут в результирующую таблицу ?

Когда будет обработана последняя запись "меньшей" из таблиц, то цикл прервется по условию "Пока ё < А.Количество() И ж < Б.Количество() Цикл", т.к. условие "И".
Просто заменить на "ИЛИ" тоже нельзя - неправильно будет работать :-(
Просто я помню возился с такой задачкой и "красивого" алгоритма не получилось :-(
Изначально написал почти такой же алгоритм, но "не взлетело"...
Пришлось добавлять "обработку хвостов" и вся "красивость" исчезла.
38. ildarovich 7509 31.10.14 19:23 Сейчас в теме
(36) ZLENKO.PRO, нет, не ошибаетесь, я должен был добавить в описание, что предварительно добиваемся, чтобы А.Итог("Сумма") = Б.Итог("Сумма") за счет ПРЕДВАРИТЕЛЬНОГО дописывания последней записи к таблице с меньшей суммой. В коде, откуда это было выдернуто, это делалось в другом модуле.

(37) Так вроде бы тоже самое и написано. - Ровно тот же пример.
Про 20120228 + Год, наверное, стоит добавить.
39. miniogn 22 05.11.14 10:04 Сейчас в теме
16. Добавить к дате и разность дат

В данном случае получается красиво. Но в ущерб скорости. Создание структур вовсе не обязательно делать для такой задачи.
40. ildarovich 7509 05.11.14 10:20 Сейчас в теме
(39) miniogn, в комментариях к статье, где обсуждалась задача было сказано (ссылка приведена), что создание структуры Шаг можно вынести из тела функции для повышения производительности. Можно сделать ее глобальной и создавать ее один раз в соответствующем модуле. Это решит все проблемы с производительностью.
Наверное, эту мысль нужно было перенести и сюда.

Но вот еще что действительно интересно.
Если этот прием понимать как реализацию сложного селекта, с большим количеством ИначеЕсли, в котором проверяются строки или числа, то не будет ли это просто быстрее? Сколько "стоит" создание структуры? - Можно еще исследовать этот вопрос. Для данной задачи я делал замеры - получается медленнее, но не намного. Числа есть в упомянутых комментариях.
42. miniogn 22 12.11.14 12:38 Сейчас в теме
(40) >Можно сделать ее глобальной и создавать ее один раз в соответствующем модуле. Это решит все проблемы с производительностью.
На сервере будете создавать? А как же клиент... Или будет вызов сервера.
Или каждый раз перед вызовом создавать локально и заполнять? Тоже мало смысла.

В общем еще хуже будет. В исходном варианте хотя бы рабочий вариант.
43. ildarovich 7509 12.11.14 14:48 Сейчас в теме
(42) miniogn, затраты времени на создание этой структуры не значительны.
Я говорил про вынос определения этой структуры из тела функции, если вдруг время ее выполнения будет критично. Куда помещать определение структуры Шаг - зависит от задачи. По моему мнению на клиенте массовых вычислений с использованием этих функций быть не должно. Скорее всего, это будет какой-либо алгоритм, выполняемый на сервере.
41. ildarovich 7509 06.11.14 20:24 Сейчас в теме
Добавил минимализм 17.
Приведен набор из трех коротких функций. С его помощью можно получать готовый массив любого заданного размера N, содержащий последовательность чисел от 0 до N - 1. Этот массив затем, например, можно загрузить в нужную колонку таблицы значений, чтобы перенумеровать ее строки, не используя цикл. Такой способ в 3 раза МЕДЛЕННЕЕ нумерации таблицы значений в цикле. Поэтому для практических целей он не подойдет - только как основа для какого-либо другого решения.

Используется "Порождающий запрос" (с), текст которого генерируется для заданного числа N очень короткой рекурсивной функцией prototext.
44. ildarovich 7509 01.12.14 13:02 Сейчас в теме
Добавил задачу 18.
"Простой трюк для быстрого объединения таблиц значений".
Первоначально эта задача была опубликована как отдельная статья, которую набрала довольно большой рейтинг.
К сожалению, из-за досадной ошибки в замерах эффект предложенного метода в статье был сильно завышен. В статье говорилось об ускорении в 10 и более раз. Тогда как на самом деле максимальное ускорение - всего в полтора раза. Поэтому статья, получившая незаслуженные оценки, была снята с публикации, а ее начинка помещена сюда под номером 18.
49. aspirator23 334 06.12.14 15:34 Сейчас в теме
(44) Спасибо.Из кода 5% выжимают, а тут 50. Подарок.
45. mylogin 106 01.12.14 13:24 Сейчас в теме
Все возможности оптимизация данного способа ограничиваются записью в одну строку и выбором таблицы с меньшим количеством элементов в качестве источника добавляемых строк.


Я всегда думал, что выигрыш в производительности от уменьшения количества строк кода возникает только при отладке.
46. ildarovich 7509 01.12.14 13:26 Сейчас в теме
(45) mylogin, некоторый выигрыш все-таки есть. Посмотрите в статье Заметочки про 1С:Предприятие 8
47. mylogin 106 01.12.14 13:30 Сейчас в теме
(46) Да, действительно. Спасибо, будем знать.
48. gigagr 03.12.14 16:16 Сейчас в теме
Спасибо за собранный материал.
53. ildarovich 7509 10.02.15 11:17 Сейчас в теме
Добавил задачу 19 "загадка суммы и произведения". Приведено короткое решение этой переборной по сути задачи. Использован один пакетный запрос и техника искусственных таблиц. О задаче узнал от scientes. Запросы в пакете отражают последовательность ограничений, накладываемых на числа Х и У.
54. zqzq 23 12.02.15 15:07 Сейчас в теме
За остатки на каждый день спасибо, полезный запрос. Можно туда же добавить и начальный остаток из вашего комментария к той статье (проверил - вроде правильно считает).
55. ildarovich 7509 18.02.15 16:56 Сейчас в теме
Добавил задачу 20 "Расчет поразрядного исключающего ИЛИ". Сам запрос понадобился для решения головоломки про 64 монеты http://habrahabr.ru/post/250585/. Но вообще его можно использовать для подсчета контрольных сумм по исключающему ИЛИ, инвертирования двоичных разрядов в числах и прочих поразрядных битовых операциях.
56. ildarovich 7509 27.02.15 18:30 Сейчас в теме
Добавил задачу 21 "Как с помощью запроса посчитать количество символов в реквизите?" Большую часть кода там занимается часть, формирующая таблицу чисел 1-64.
57. mailrum2004 1 30.03.15 16:41 Сейчас в теме
Интересно, спасибо! Запрос из "19. Загадка суммы и произведения" не заработал сразу.
дописал в первой строке "КАК Х"
ВЫБРАТЬ 0 КАК Х
ildarovich; +1 Ответить
58. ildarovich 7509 30.03.15 16:44 Сейчас в теме
(57) mailrum2004, спасибо за замечание: была опечатка, сейчас поправлю.
59. vasyak319 143 30.03.15 17:53 Сейчас в теме
Функции Квартал не хватает "+1" перед ";"
60. ildarovich 7509 02.04.15 11:40 Сейчас в теме
(59) vasyak319, спасибо, поправил
61. Rusmus 45 05.06.15 10:43 Сейчас в теме
задачу 21 (Определение длины строки в запросе) у себя делаю по такому принципу:

ВЫБРАТЬ
Дано.*,
ЕСТЬNULL(ё, "256+") КАК Длина
ИЗ
Дано
ЛЕВОЕ СОЕДИНЕНИЕ Р543210
ПО ПОДСТРОКА(Дано.Строка,ё,1) <> "" И ПОДСТРОКА(Дано.Строка,ё+1,1) = ""

Преимущества:
не портится таблица Дано - записи с длинными строками не пропадут, одинаковые записи не сгруппируются
полей в Дано может быть сколько угодно; не надо писать список в разделе "сгруппировать по"

Как думаете, какая будет разница по скорости?
ildarovich; +1 Ответить
62. ildarovich 7509 05.06.15 13:05 Сейчас в теме
(61) Rusmus, отличная идея! - Возьму на вооружение. - Согласен насчет преимуществ. Одно уточнение: нужно писать
ПО ПОДСТРОКА(Дано.Строка,ё,1)  + "!" <> "!" И ПОДСТРОКА(Дано.Строка,ё+1,1) + "!"= "!" 
чтобы Длина строки "мама мыла раму" не считалась равной одновременно 4, 9 и 13.

По скорости, думаю, выигрыша не будет. За счет двойного вычисления подстроки может быть даже проигрыш в простых случаях. Но преимущества перевешивают.
63. Rusmus 45 05.06.15 15:19 Сейчас в теме
(62) спасибо за дополнение.
64. ya.Avoronov 114 28.08.15 16:12 Сейчас в теме
Я тут один такой?

- Прочитал статью - лайкнул статью;
- Прочитал комментарии - лайкнул пару комментариев;
- Лайкнул бы и автора);
- Не нашел применения сему в своей жизни - забыл все как в страшном сне.

Ощущение, как во время олимпиады по информатике в 9 классе.
65. herfis 440 19.02.16 13:42 Сейчас в теме
Очень соблазнительный вариант простого алгоритма "Остатки на каждый день". Автор также везде советует его в комментариях к другим публикациям. Заявляется, что его производительность лучше стандартного "тяжелого" варианта. Но ведь это только для отчета с фиксированными группировками. Подавляющее большинство реальных отчетов базируются на СКД и имеют настраиваемые группировки. А значит - не получится в запросе выполнить свертку. А в этом случае на вход СКД приползет в разы большее количество детальных записей, чем в "тяжелом" варианте. Тесты не проводил, но вполне может оказаться, что на отчетах обрабатывающих большое количество данных такая оптимизация может выйти боком.
66. ildarovich 7509 19.02.16 15:04 Сейчас в теме
(65) herfis, трудно возражать на неконкретные замечания типа "если кто-то кое-где у нас порой", или
Тесты не проводил, но вполне может оказаться
Во-первых, приведите (в виде текста запроса) тот вариант, который вы считаете лучшим. Насколько я понимаю, всего есть два разных популярных принципа восстановления остатков на дни без оборотов. В первом суммируются обороты. Во втором остатки на дни с оборотами интерполируются по принципу срезов последних. Я за первый вариант и против второго, который кажется мне объединением недостатков разных техник.
Но и в первом и втором группировки для получения остатков фиксируются. Ну а как иначе? Здесь я ничего принципиально не менял (как в "Баттерфляй", например), просто записал известный прием короче (в одном запросе). Поэтому данное замечание кажется странным.
67. herfis 440 19.02.16 16:33 Сейчас в теме
(66) Вы правы. Заработался. В голове все смешалось :) Приношу извинения. Вылетело из головы, что в "тяжелом" варианте тоже фиксированные группировки. Сейчас как раз делаю новый отчет с использованием этого подхода. В комментариях к статье http://infostart.ru/public/102435 приложил рабочую формулу для начального остатка.
68. ildarovich 7509 24.02.16 13:40 Сейчас в теме
Следующая серия минимализмов опубликована в продолжении этой статьи, которая называется "Минимализмы 2".
69. Ovrfox 14 21.06.16 15:19 Сейчас в теме
К задаче 20. Поразрядное исключающее ИЛИ
Насколько я понял в последнем запросе ошибка
Должно быть примерно так:
ВЫБРАТЬ
Разряды.Вес * (СУММА (Разряды.Икс) - ВЫРАЗИТЬ(СУММА(Разряды.Икс) / 2 + 0.5 КАК ЧИСЛО(10, 0)) * 2 + 2) КАК Икс
ИЗ
(ВЫБРАТЬ
Позиции.Вес КАК Вес,
СУММА((ВЫРАЗИТЬ(Дано.Икс / Позиции.Вес + 0.5 КАК ЧИСЛО(10, 0))) - 1) КАК Икс
ИЗ
Дано КАК Дано,
Позиции КАК Позиции

СГРУППИРОВАТЬ ПО
Позиции.Вес) КАК Разряды
70. ildarovich 7509 21.06.16 23:50 Сейчас в теме
(69) Ovrfox, нет, там ВСЕ ПРАВИЛЬНО. Запрос в результате получает ОДНО число. Это контрольная сумма, полученная поразрядным ксором шести разрядов чисел в таблице Дано.
Запрос довольно хитрый. Хитрость в том, младшие биты заранее (на промежуточных этапах) выделять не нужно. Их можно выделить уже после суммирования, что и сделано. То есть младший бит суммы (XOR) равен сумме (XOR) младших битов.
Я проверял запрос в консоли. Можете тоже проверить сами.
71. Ovrfox 14 22.06.16 10:21 Сейчас в теме
(70) Верно, Без вложенного запроса не обойтись.
Сначала вычисляем четность по разрядно, а потом приводим ее к числу.
Но если кому то нужна четность по разрядно, то ее можно получить и одним запросом.
	               ВЫБРАТЬ
	               	СУММА(Разряды.Вес * Разряды.Икс) КАК Икс
	               ИЗ
	               	(ВЫБРАТЬ
	               		Позиции.Вес КАК Вес,
	               		СУММА((ВЫРАЗИТЬ(Дано.Икс / Позиции.Вес + 0.5 КАК ЧИСЛО(10, 0))) - 1) - (ВЫРАЗИТЬ(СУММА((ВЫРАЗИТЬ(Дано.Икс / Позиции.Вес + 0.5 КАК ЧИСЛО(10, 0))) - 1) / 2 + 0.5 КАК ЧИСЛО(10, 0))) * 2 + 2 КАК Икс
	               	ИЗ
	               		Дано КАК Дано,
	               		Позиции КАК Позиции
	               	
	               	СГРУППИРОВАТЬ ПО
	               		Позиции.Вес) КАК Разряды
Показать

PS: Как хреново, что обычных мат операций (как целочисленное деление) нет в языке запросов 1С!
72. ildarovich 7509 22.06.16 11:54 Сейчас в теме
(71) Ovrfox, это метод "в лоб". В нем вычислений
- (ВЫРАЗИТЬ(Разряды.Икс / 2 + 0.5 КАК ЧИСЛО(10, 0))) * 2 + 2
гораздо больше. Во столько раз, сколько чисел в таблице Дано. А в моем варианте для сокращения объема вычислений используется интересная математическая закономерность. То есть все не просто так.

По поводу отсутствия некоторых функций в языке запросов тоже сожалею. Громоздкость некоторых конструкций сильно раздражает. Есть, правда, некоторые мысли по этому поводу (что можно сделать). Может, дойдут руки.
73. Ovrfox 14 22.06.16 13:12 Сейчас в теме
(72)Насколько я знаю MS SQL, то значение (ВЫРАЗИТЬ(Дано.Икс / Позиции.Вес + 0.5 КАК ЧИСЛО(10, 0)) - 1) скорее всего будет вычислено для каждого элемента (декартового произведения таблиц запроса) один раз, а не два.
Операция же с суммами будет выполнена один раз для каждого значения группировки. Это очевидно.
Это означает, что в упомянутом запросе вычислений ровно столько же, сколько и в Вашем варианте. Ни на одно больше.
74. EmpireSer 25.07.16 15:25 Сейчас в теме
(0), А ни кто не обратил внимание, что код из "13. Функция для превращения строки в дату по форматной строке" может обрабатывать строки и не по шаблону?
Например он спокойно обрабатывает шаблон:
СтрокаВДату("yyyy-MM-ddTHH-mm-ss", "2016-10-01 07:20:34");


Учитывая такое поведение и мои условия у меня получилась вот такая функция из твоей:
Функция ДатаИВремяИзСтроки(Знач ДатаИВремяСтрокой, Знач ФорматДаты, Знач ВызыватьИсключение = Истина) Экспорт
	Перем Результат;
	// Исходный код разработан Сергеем (Ник: ildarovich)(http://infostart.ru/profile/28527/)
	//   упоминается в Минимализмы (http://infostart.ru/public/306536/)
	
	ДатаИВремяСтрокой = СокрЛП(ДатаИВремяСтрокой);
	ФорматДаты = СокрЛП(ФорматДаты);
	
	#Область ДатаИВремяИзСтроки_ОбработкаКоллекцииФорматовДат
	Если ЭтоМассив(ФорматДаты) Тогда
		Для Индекс = 0 По ФорматДаты.Количество() - 1 Цикл
			Результат = ДатаИВремяИзСтроки(ДатаИВремяСтрокой, ФорматДаты[Индекс], Ложь);
			Если Результат <> Неопределено Тогда
				Возврат Результат;
			КонецЕсли;
		КонецЦикла;
		
		Если ВызыватьИсключение Тогда
			ТекстОшибки = СтрокаПараметрыПодставить("Переданные шаблоны форматов даты не подходят для конвертации строки ""%1""."
				,	ДатаИВремяСтрокой
			);
			ВызватьИсключение ТекстОшибки;
		КонецЕсли;
		Возврат Неопределено;
	КонецЕсли;
	#КонецОбласти
	
	Попытка
		Ч = Формат('00010101', "ДФ=" + ФорматДаты); // - необязательная проверка первого правильности параметра
	Исключение
		Если ВызыватьИсключение Тогда
			ТекстОшибки = СтрокаПараметрыПодставить("Передан не правильный шаблон формата даты ""%1""."
				, ФорматДаты
			);
			ВызватьИсключение ТекстОшибки;
		КонецЕсли;
		Возврат Неопределено;
	КонецПопытки;
	Ч = Новый Соответствие();
	Для Индекс = 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"]);
	Исключение
		Если ВызыватьИсключение Тогда
			ВызватьИсключение;
		КонецЕсли;
		Возврат Неопределено;
	КонецПопытки;
	
	ДатаИВремяСтрокойНовая = Формат(Результат, "ДФ=" + ФорматДаты);
	Если Лев(ДатаИВремяСтрокой, СтрДлина(ДатаИВремяСтрокойНовая)) = ДатаИВремяСтрокойНовая Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если ВызыватьИсключение Тогда
		ТекстОшибки = СтрокаПараметрыПодставить("Шаблон формата даты ""%1"" не подходит для конвертации строки ""%2""."
			, ФорматДаты
			,	ДатаИВремяСтрокой
		);
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	Возврат Неопределено;
КонецФункции
Показать
75. kuzyara 1294 30.08.16 06:29 Сейчас в теме
(74) EmpireSer, действительно. Думаю стоит сделать ограничение на входной шаблон этой функции, тогда получится более компактный вариант:
Функция СтрокаВДату(Знач Строка, Знач ФорматДаты) Экспорт
	Ч = Новый Соответствие; 
	Для ё = 1 По СтрДлина(ФорматДаты) + 6 Цикл 
	    Ч[Сред(ФорматДаты + "dMyHms", ё, 1)] = 0
	КонецЦикла; 
	Для ё = 1 По СтрДлина(ФорматДаты) Цикл 
	    Ч[Сред(ФорматДаты, ё, 1)] = 10 * Ч[Сред(ФорматДаты, ё, 1)] + Найти("123456789", Сред(Строка+ФорматДаты, ё, 1));
	КонецЦикла; 
	Ч["y"] = Ч["y"] + ?(0 < Ч["y"] И Ч["y"] < 50, 2000, ?(0 < Ч["y"] И Ч["y"] < 100, 1900, 0));
	Возврат Дата(Макс(Ч["y"], 1), Макс(Ч["M"],1), Макс(Ч["d"],1), Ч["H"], Ч["m"], Ч["s"]);
КонецФункции
Показать

Процедура КнопкаВыполнитьНажатие(Кнопка)
	Тесты = "dd MM yy
	|yy-MM-dd HH:mm
	|dd MM yy HH mm ss
	|dd MM yyyy
	|MM dd, yyyy, HH:mm
	|dd.MM.yy
	|MM, dd, yyyy
	|yyyyMMdd
	|HH-mm-ss, dd-MM-yy
	|dd
	|dd MM HH:mm:ss yyyy
	|HH:mm:ss
	|HH:mm
	|yyyy-MM-dd HH:mm:ss
	|yyyy-MM-dd
	|yyyy/MM/dd
	|dd/MM/yy
	|MM dd yyyy
	|dd MM yyyy
	|dd MM yyyy
	|yyyy-MM
	|yyyy
	|MM, dd, yyyy
	|dd-MM-yyyy
	|ddMMyyyy";
	Пройдено=0;
	ВсегоТестов = СтрЧислоСтрок(Тесты);
	ТекДата = Дата("20160112131415");
	Для й=1 по ВсегоТестов Цикл
		ТекФормат = СтрПолучитьСтроку(Тесты, й);
		ТекСтрока = Формат(ТекДата, "ДФ='"+ТекФормат+"'");
		ТестДата = СтрокаВДату(ТекСтрока, ТекФормат);
		ТестСтрока = Формат(ТестДата, "ДФ='"+ТекФормат+"'");
		РезультатТеста = ТекСтрока = ТестСтрока;
		Сообщить("Тест "+й+" - "+РезультатТеста+" 	["+ТекФормат+"] - ["+ТекСтрока+"]: "+ТестДата);
		Пройдено = Пройдено + РезультатТеста;
	КонецЦикла;
	Сообщить("Пройдено тестов: "+Пройдено+"/"+ВсегоТестов);
КонецПроцедуры
Показать

Тест 1 - Да 	[dd MM yy] - [12 01 16]: 12.01.2016 0:00:00
Тест 2 - Да 	[yy-MM-dd HH:mm] - [16-01-12 13:14]: 12.01.2016 13:14:00
Тест 3 - Да 	[dd MM yy HH mm ss] - [12 01 16 13 14 15]: 12.01.2016 13:14:15
Тест 4 - Да 	[dd MM yyyy] - [12 01 2016]: 12.01.2016 0:00:00
Тест 5 - Да 	[MM dd, yyyy, HH:mm] - [01 12, 2016, 13:14]: 12.01.2016 13:14:00
Тест 6 - Да 	[dd.MM.yy] - [12.01.16]: 12.01.2016 0:00:00
Тест 7 - Да 	[MM, dd, yyyy] - [01, 12, 2016]: 12.01.2016 0:00:00
Тест 8 - Да 	[yyyyMMdd] - [20160112]: 12.01.2016 0:00:00
Тест 9 - Да 	[HH-mm-ss, dd-MM-yy] - [13-14-15, 12-01-16]: 12.01.2016 13:14:15
Тест 10 - Да 	[dd] - [12]: 12.01.0001 0:00:00
Тест 11 - Да 	[dd MM HH:mm:ss yyyy] - [12 01 13:14:15 2016]: 12.01.2016 13:14:15
Тест 12 - Да 	[HH:mm:ss] - [13:14:15]: 01.01.0001 13:14:15
Тест 13 - Да 	[HH:mm] - [13:14]: 01.01.0001 13:14:00
Тест 14 - Да 	[yyyy-MM-dd HH:mm:ss] - [2016-01-12 13:14:15]: 12.01.2016 13:14:15
Тест 15 - Да 	[yyyy-MM-dd] - [2016-01-12]: 12.01.2016 0:00:00
Тест 16 - Да 	[yyyy/MM/dd] - [2016/01/12]: 12.01.2016 0:00:00
Тест 17 - Да 	[dd/MM/yy] - [12/01/16]: 12.01.2016 0:00:00
Тест 18 - Да 	[MM dd yyyy] - [01 12 2016]: 12.01.2016 0:00:00
Тест 19 - Да 	[dd MM yyyy] - [12 01 2016]: 12.01.2016 0:00:00
Тест 20 - Да 	[dd MM yyyy] - [12 01 2016]: 12.01.2016 0:00:00
Тест 21 - Да 	[yyyy-MM] - [2016-01]: 01.01.2016 0:00:00
Тест 22 - Да 	[yyyy] - [2016]: 01.01.2016 0:00:00
Тест 23 - Да 	[MM, dd, yyyy] - [01, 12, 2016]: 12.01.2016 0:00:00
Тест 24 - Да 	[dd-MM-yyyy] - [12-01-2016]: 12.01.2016 0:00:00
Тест 25 - Да 	[ddMMyyyy] - [12012016]: 12.01.2016 0:00:00
Пройдено тестов: 25/25
Показать
78. EmpireSer 19.12.16 12:35 Сейчас в теме
(75)
Я заметил, что ты дополнительно защитился от того, когда в Ч параметры y или М или d могут быть нулями. Я как раз напоролся на это у себя.

Но вот кое чего мы забыли: формат даты может быть и на русском языке! Например "ДФ=ггггММ"
(1С может переваривать так же и формат, когда русские буквы перемешаны с английскими)

И как это обработать?
79. pm74 210 08.11.17 14:52 Сейчас в теме
было или нет не знаю , может быть пригодится
Функция МассивСтрокВСтроку(Массив)
	Если Массив.Количество()>0 Тогда
		Возврат ЗначениеИзСтрокиВнутр(СтрПолучитьСтроку(Стрзаменить(ЗначениеВСтрокуВнутр(Массив),"""},"+Символы.ПС+"{""S"",""",""),3));
	Иначе 
		Возврат "";
	КонецЕсли;	
КонецФункции 
Показать
80. bulpi 202 03.06.18 16:18 Сейчас в теме
По поводу задачи № 6 - остатки на каждый день. Автор пишет "Правда, здесь рассчитываются остатки на конец каждого дня (это легко поправить, сдвинув даты на -1)." Да, но СКД не захотела у меня сдвигать на 1 день почему-то (возможно, из-за моего неумения). Поэтому могу предложить текст запроса для получения НАЧАЛЬНЫХ остатков на каждый день без сдвига дат :
ВЫБРАТЬ
    Движения.Номенклатура,
    ДНИ.Период КАК ДатаОстатка,
    СУММА(ВЫБОР
            КОГДА Движения.Период = &НачалоПериода И Движения.Период =ДНИ.Период  ТОГДА Движения.КоличествоНачальныйОстаток
            КОГДА Движения.Период = &НачалоПериода И Движения.Период <ДНИ.Период  ТОГДА Движения.КоличествоКонечныйОстаток
             КОГДА Движения.Период < ДНИ.Период   ТОГДА Движения.КоличествоОборот 
ИНАЧЕ 0  КОНЕЦ
        ) КАК НачальныйОстатокНаДату
ИЗ
    Дни КАК ДНИ,
    РегистрНакопления.ЗапасыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, День) КАК Движения

СГРУППИРОВАТЬ ПО
    Движения.Номенклатура,
    ДНИ.Период
Показать
RibD; Alex_mar; vre; +3 Ответить
81. bulpi 202 03.06.18 16:20 Сейчас в теме
(80)
Хм... а как раскрасит по синтаксису запроса, а не кода?
82. binex 269 06.08.18 12:55 Сейчас в теме
(80)

Таким запросом вы Начальный остаток только на одну дату получите - на &НачалоПериода

ПС. Хотя ещё не до конца разобрался. Но что-то тут не так. )
83. qazaz2 16 16.03.19 10:49 Сейчас в теме
Огромное спасибо Автору, уйму времени сэкономил.
84. zqzq 23 22.07.20 08:46 Сейчас в теме
Синонимайзер нуждается в доработке.

Пример: "Один_два", "Один_Два" --> должно выдавать "Один два" как в платформе, а сейчас сохраняет подчеркивание.

Добавил фикс в последнюю строку (не очень красиво, но лень в магии основного алгоритма разбираться):
Возврат СтрЗаменить(СтрЗаменить(Ответ + б, "_", " "), "  ", " ")
85. serferian 26 22.10.20 10:26 Сейчас в теме
Синонимайзер:

В ответе режет последнюю букву:
"Привет" -> "Приве"

Решение
Для ё = 1 По СтрДлина(Имя) + 1 Цикл
Оставьте свое сообщение

См. также

Как работает серверный вызов в 1С Промо

Математика и алгоритмы v8::УФ Бесплатно (free)

Клиент-серверная архитектура заложена в платформе изначально — со времен «1С:Предприятие 8.0». Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере. Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере — другой. Клиент и сервер «общаются» между собой с помощью серверного вызова. Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

18.11.2017    74237    pahich    86    

Изменения формата файлов конфигурации (CF) в 8.3.16

Математика и алгоритмы v8 Бесплатно (free)

Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.

16.12.2021    2340    fishca    10    

Установка отбора по списку значений при открытии формы выбора справочника из реквизита обработки

Математика и алгоритмы v8 1cv8.cf Россия Бесплатно (free)

Описан алгоритм установки отбора по списку значений при открытии формы выбора справочника. Параметром отбора является список значений передаваемый из одной формы обработки в другую форму этой же обработки. Тестировано под платформу 8.3.18

11.12.2021    1376    prog1c_vl    4    

Что за ? в коде, или Секретный оператор в 1С

Математика и алгоритмы v8 Платформа 1C v8.2 Платформа 1С v8.1 1cv8.cf Бесплатно (free)

Инкремент, модуль и прочая магия, которая скрыта под символом "?"

21.10.2021    12580    SeiOkami    43    

Минимализмы 3 Промо

Математика и алгоритмы v8 Бесплатно (free)

Очередная серия "минимализмов" [http://infostart.ru/public/306536/, https://infostart.ru/public/460935/]. Также, как и в предыдущих статьях, здесь приведена подборка коротких оригинальных авторских решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

19.02.2018    51742    ildarovich    47    

Механизм анализа данных. Кластеризация.

Математика и алгоритмы Анализ учета v8 v8::DataMining Бесплатно (free)

Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.

31.08.2021    3390    dusha0020    8    

Практическое применение операции копирования массива

Математика и алгоритмы v8 Бесплатно (free)

Решение задачи https://projecteuler.net/problem=250 из Project Euler средствами 1C.

02.08.2021    1313    scientes    2    

Запрос всей номенклатуры с характеристиками

Математика и алгоритмы v8 ERP2 УТ11 КА2 Бесплатно (free)

Сравнение различных вариантов запроса всей номенклатуры с характеристиками (УТ11.4, КА 2.4, ERP 2.4).

1 стартмани

30.07.2021    1970    Daemonold    3    

Будни автоматизации или "мне нужна программка для 3D упаковки" Промо

Математика и алгоритмы Оптовая торговля v8 1cv8.cf УУ Бесплатно (free)

Автоматизация отечественных предприятий, которой приходиться заниматься, это нужная и высокооплачиваемая, но довольно нервная работа. Выручает юмор. Например, при общении с требовательным клиентом можно вспомнить анекдот: "Держась руками за стену, на ногах еле стоит мужик. К нему пристает ребенок: "Ну, папа, пожалуйста, сделай мне кораблик!", папа отвечает: "Ага! - Сейчас все брошу и пойду делать тебе кораблик!". Про один такой сделанный для клиента "кораблик" и хочется рассказать. Надеюсь, совместное погружение в теплое ламповое (то есть клиентоориентированное) программирование доставит Вам положительные эмоции, да и задача попалась интересная. Поплыли?

24.03.2014    47876    ildarovich    119    

Распределенные алгоритмы РИБ 1С

Математика и алгоритмы Обмен между базами 1C v8 Бесплатно (free)

Небольшое исследование на тему применимости классических распределённых алгоритмов репликации и синхронизации данных между узлами обмена РИБ 1С.

02.07.2021    1628    zhichkin    1    

Параллельная обработка очереди сообщений

Математика и алгоритмы v8 Бесплатно (free)

Описание алгоритма обработки очереди последовательных сообщений регистрации изменений записей регистра сведений. Алгоритм может быть применим к любым объектам метаданных. Алгоритм основан на обработке объектов по их ключам.

15.06.2021    2917    zhichkin    11    

Чем воспользоваться для распознавания котиков в 1С?

Математика и алгоритмы Языки и среды v8 Бесплатно (free)

На митапе по инструментам для расширения возможностей 1С выступил Олег Филиппов. Он сравнил подходы Native API, COM, Docker и Serverless, и рассказал, как упростить использование в 1С алгоритмов, реализованных на других языках, с помощью облачной технологии «Функция как сервис».

12.04.2021    4051    comol    10    

Минимализмы 2 Промо

Математика и алгоритмы v8 Бесплатно (free)

Следующая серия "минимализмов" [http://infostart.ru/public/306536/]. Также, как и в предыдущей статье, здесь приведена подборка коротких оригинальных решений некоторых задач. Ранее эти решения были разбросаны по моим комментариям к чужим публикациям.

23.02.2016    52725    ildarovich    83    

Эффективные приемы разработки

Математика и алгоритмы Рефакторинг и качество кода СКД v8 Бесплатно (free)

На Infostart Meetup Ekaterinburg.Online выступил Сергей Наумов – руководитель центра аналитики и консалтинга WiseAdvice. Сергей поделился с коллегами приемами разработки, которые помогут избежать потенциальных проблем при реализации сложных проектов.

07.04.2021    4115    SergeyN    13    

Проект Эйлер в 1С. Задача №5

Математика и алгоритмы v8 1cv8.cf Россия Бесплатно (free)

Решение задачи №5 проекта Эйлер.

02.03.2021    706    VasRogov    0    

Рекурсия для начинающих

Математика и алгоритмы v8 Бесплатно (free)

Рассмотрен подход к пониманию рекурсий. Приведены примеры из реальной практики.

10.02.2021    5484    szv    5    

Приемы обработки больших данных в 1С Промо

Универсальные обработки Математика и алгоритмы Обмен между базами 1C v8 1cv8.cf Бесплатно (free)

Рассказ об эффективных приемах организации обработок больших объемов данных на платформе 1С

07.08.2015    73254    tormozit    29    

Самый быстрый FizzBuzz на 1С

Математика и алгоритмы v8 Бесплатно (free)

Давайте попробуем найти самое быстрое решение задачи "BuzzFizz" на 1С.

03.02.2021    1565    Donrad    23    

Программное создание корректировочного счета-фактуры выданного в УПП 1.3

Математика и алгоритмы Механизмы типовых конфигураций Запросы v8 УПП1 Россия БУ НДС Бесплатно (free)

Данный функционал можно использовать, например, в процессе оформления возвратов от поставщика (корректировка реализации по согласованию сторон) при автоматическом создании корректировок реализации по документам поставщика, он позволяет массово создать корректировочные счета-фактуры в УПП 1.3. При создании документа из первичного счета-фактуры выданного в новый корректировочный счет-фактуру выданный копируются значения свойств.

17.12.2020    866    ksnik    0    

Параллельные вычисления расчета факториала числа N

Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Распараллеливание алгоритма с помощью фоновых заданий (асинхронные вычисления)

29.06.2020    4559    Rustig    18    

Решение транспортной задачи запросом Промо

Математика и алгоритмы v8 Бесплатно (free)

Списание по двум последовательностям партий запросом (без программной обработки)

1 стартмани

30.04.2014    36586    bforce    22    

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

Математика и алгоритмы Склад и ТМЦ v8 1cv8.cf Оптовая торговля, дистрибуция, логистика Россия УУ Бесплатно (free)

Особенности учета партионной системы при наличии двух количественных показателей.

26.03.2020    5013    lastcontra    5    

Treemapping — способ визуализации данных древовидной структуры. Карта-схема дерева

Математика и алгоритмы Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Предлагается ознакомиться с редким способом графического представления иерархических данных. Приводится алгоритм формирования и пример реализации.

18.02.2020    7286    randomus    20    

Сравнение адресов: случай из практики

Математика и алгоритмы Универсальные функции v8 Россия Бесплатно (free)

Как с учетом обстоятельств сравнить два небрежно записанных адреса и решить, означают ли они одно и то же. Программный код написан для режима совместимости с 8.2.

04.01.2020    4409    AnatolPopov    7    

Парсер запросов 1С. Часть 1: Введение, разбор математических выражений Промо

Математика и алгоритмы v8 Бесплатно (free)

Рано или поздно становится скучно решать типичные задачи, для которых придумана 1С. Голова пухнет от бухгалтерских терминов и очередных "хотелок" пользователей. Именно в такие моменты хочется гордо поднять голову, воскликнуть "Но я же программист!" и заняться чем-то интересным. В цикле статей я постараюсь доступно описать, как устроены парсеры в целом и на примере парсера языка запросов 1С. Требования к навыкам читающего: основы языка 1С, основы алгоритмизации.

1 стартмани

04.12.2013    31613    juntatalor    49    

[После]Новогодние задачи

Математика и алгоритмы v8 Бесплатно (free)

Совсем немного времени осталось до того момента, когда отзвучат куранты, шампанское будет выпито, мандарины съедены, и даже оливье закончится. Возникнет вопрос: чем бы занять неожиданно появившееся свободное время?

30.12.2019    3649    Alxby    23    

30 задач. Странных и не очень

Математика и алгоритмы Механизмы платформы 1С v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    29857    YPermitin    63    

Иерархия без "В ИЕРАРХИИ"

Математика и алгоритмы v8 Бесплатно (free)

Говорится о том, как эффективно представлять иерархию в СУБД, как получать и использовать эти представления при решении задач в запросной технике. Уточняются и дополняются запросы из статьи "Уровни, глубина, прародители, циклы и аналоги запросом" [https://infostart.ru/public/160707/].

22.08.2019    16948    ildarovich    24    

Сервис для изучения методов платформы 1С:Предприятие 8. Бесплатно! Промо

Подготовка к аттестации Математика и алгоритмы v8 Бесплатно (free)

Бесплатный ON-Line сервис изучения методов платформы 1С:Предприятие 8. Подготовка к аттестации 1С:Специалист on-line! Тестовые задания по различным видам учета! Подсказки для оптимального решения!

27.06.2013    52020    bpc222    54    

Побитовые операции "на пальцах"

Математика и алгоритмы v8 Бесплатно (free)

Простой пример для понимания того, как это работает.

02.08.2019    4375    nbeliaev    16    

Обработчики событий при записи объектов. Зачем и что за чем?

Математика и алгоритмы v8 Бесплатно (free)

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    144811    AlbinaAAA    50    

FizzBuzz на 1С. Чем короче, тем веселее. Варианты принимаются...

Математика и алгоритмы v8 Бесплатно (free)

Мне было скучно, я не мог себя заставить написать ничего полезного. И читал статью на Хабре. Потом я читал комментарии, а потом... нет я не ушел смотреть котиков на ютюбе. Я решил сделать несколько решений задачки FizzBuzz на 1С, с целью "чем короче, тем лучше". Прошу сильно не пинать, это просто развлечение для вечера.

24.07.2019    6329    vandalsvq    19    

v8: Концепция минимального изменения конфигурации для легкого обновления Промо

Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

"Лучше день потерять потом за пять минут долететь" ((с) "Крылья, ноги и хвосты") или как сделать так чтобы обновление конфигурации проходило с минимальными трудозатратами.

28.01.2013    39052    MarSeN    57    

Что делает "В ИЕРАРХИИ" в запросе?

Математика и алгоритмы v8 Бесплатно (free)

Описание действий платформы 1С при использовании конструкции "В ИЕРАРХИИ" в запросах.

16.07.2019    57737    YPermitin    34    

Создание отчетов с помощью СКД - основные понятия и элементы

Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    86275    ids79    30    

Реализуем Стек, Очередь и Приоритетную очередь в 1С

Математика и алгоритмы Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

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

24.06.2019    17723    RonX01    69    

Пример выбора несколько обработчиков событий записи объекта для решения одной задачи Промо

Математика и алгоритмы v8 Бесплатно (free)

Данная публикация предназначена для начинающих разработчиков и является продолжением статьи "Обработчики событий при записи объектов. Зачем и что за чем?" (ссылка далее). Содержит пример использования несколько обработчиков событий для решения одной задачи и объясняется почему выбраны именно они.

27.09.2012    197934    AlbinaAAA    65    

Организация хранения промежуточных данных

Математика и алгоритмы v8 Бесплатно (free)

Организация хранения промежуточных данных в процедуре сверки.

29.05.2019    4758    scientes    1    

Вычисление 200 тысяч знаков числа pi

Математика и алгоритмы v8 Россия Бесплатно (free)

В статье рассматриваются возможности платформы выполнять сверхточные вычисления без использования сложных алгоритмов и внешних компонент на примере вычисления числа pi.

28.05.2019    10053    Oleg_nsk    97    

Парсер таблиц по шаблону. Автоматическая корректировка парсера. Представление таблиц в виде графа.

Математика и алгоритмы Работа с интерфейсом Универсальные функции v8 1cv8.cf Россия Бесплатно (free)

Возникла такая задача: нужно нарисовать в макете шаблон таблицы, где расписано какая ячейка за что отвечает, загрузить таблицу из html и сравнить, подходит ли она под шаблон. Если да, то загрузить информацию по правилу из шаблона. Проблема в том, что в html таблица может приходить с ошибками, то есть какие то ячейки совмещены, хотя не должны. Поэтому нужно сделать так, что бы программа понимала, что таблицы похожи и где конкретно ошибки. Соответсвенно, поделил задачу на 3 этапа. 1 - это представление таблицы в виде графа, 2 - сравнение графов, 3 - забор информации. В данной статье пойдет описание пункта 1.

25.04.2019    4327    trim89    5    

Альтернативные способы работы с XML. Часть 2: Введение в xPath или запросы к XML Промо

Математика и алгоритмы Файловые протоколы обмена (TXT, XML, DBF), FTP v8 1cv8.cf Бесплатно (free)

В предыдущей статье "Введение в DOM или объектная модель документа" было описано понятие объектной модели документа (DOM), раскрыты плюсы и минусы использования модели при разборе файлов XML, приведено сравнение с построчным последовательным разбором. Были представлены варианты выборки данных с помощью объекта 1С ДокументDOM. Теперь настало время познакомить читателей с самым, на мой взгляд, интересным способом извлечения данных из XML - при помощи языка запросов xPath.

09.08.2012    43773    1cspecialist    13    

Нечёткий поиск. Bitap алгоритм, модификация от Wu-Manber

Математика и алгоритмы v8 Россия Бесплатно (free)

Временами нужен нечёткий поиск в тексте, но не всегда можно использовать внешние компоненты. Данный алгоритм прост, достаточно быстр.

01.04.2019    5451    trim89    10    

Решение системы линейных уравнений

Математика и алгоритмы v8 Бесплатно (free)

Пример использования объекта Расчет систем линейных уравнений.

25.03.2019    9847    scientes    9    

Обсуждение двух задач на пересечение отрезков

Математика и алгоритмы v8 Бесплатно (free)

Ищем общее в частностях, или задача о пересечении отрезков.

15.03.2019    6941    scientes    16    

От Hello world - к защите конфигураций за 1 минуту Промо

Защита ПО и шифрование Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Вы всегда хотели но боялись создать COM объект? Тогда мы идем к вам! С обычным блокнотом, где будем программировать на c#, и таймером ...

19.05.2012    36105    O-Planet    130    

Многопоточное восстановление последовательностей

HighLoad оптимизация Математика и алгоритмы Универсальные функции v8 Бесплатно (free)

Универсальный алгоритм многопоточного фонового восстановления любой последовательности.

05.12.2018    16211    _ASZ_    33    

Валовая прибыль / потенциальные продажи по закупочным ценам на дату продажи

Оптовая торговля v8 1cv8.cf Украина Россия УУ Абонемент ($m)

Отчет «Валовая прибыль/потенциальные продажи по закупочным ценам на дату продажи» предназначен для: 1) анализа валовой прибыли с учетом себестоимости, рассчитанной по ценам выбранного типа, действовавших на дату продажи. 2) анализа потенциальных продаж, рассчитанных по ценам выбранного типа, действовавших на дату продажи, и полученной/потерянной разницы по сравнению с реальными продажами

1 стартмани

19.11.2018    4970    5    Serdgio    0    

Возврат (loop) в Алгоритмах визирования. Бит Финанс

Бюджетирование и планирование Математика и алгоритмы v8 1cv8.cf Финансовые услуги, инвестиции Россия Госбюджет Бесплатно (free)

В статье рассматривается минимальная доработка конфигурации БИТ Финанс, с сохранением поддержки, для расширения функционала Визирования: Возрат к предидущим точкам алгоритмов. Полезно будет для программистов и специалистов, занимающихся внедрением БИТ Финанс.

07.08.2018    8006    gladky    2    

Новые функции СКД 8.2.14 Промо

Математика и алгоритмы v8::СКД 1cv8.cf Россия Бесплатно (free)

Демонстрация новых функций СКД 8.2.14

29.06.2011    227967    fishca    51    

Извлечение текстов модулей из внешней обработки 1С

Математика и алгоритмы v8 Россия Бесплатно (free)

Лень в очередной раз сподвигла меня на доработку существующего инструментария. В публикации опишу свой опыт парсинга бинарного файла с данными обычной формы (выгруженного с помощью функционала платформы 1С "Выгрузить в файлы").

28.04.2018    16061    zenechka    6    

Преобразование запросов

Математика и алгоритмы v8 Бесплатно (free)

Использование математических методов для языка запросов.

15.03.2018    12700    vasilev2015    24    

"Взлом" теста "1С:Профессионал" методом машинного обучения

Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

Нейронные сети – не единственная модель, реализующая принципы машинного обучения. Есть еще байесовская модель, которая математически строже и определеннее, поскольку построена на надежном фундаменте теории вероятностей. Применению байесовского вывода к решению интересной теоретической задачи и посвящена данная статья. Слово "взлом" в заголовке использовано для привлечения внимания. Речь идет исключительно о математическом методе, показанном на примере знакомой всем задачи. 

12.03.2018    21868    ildarovich    19