Модель распределения суммы по базе

Публикация № 1620797 21.03.22

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

Модель запроса распределения Распределение по базе DSL

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

Оглавление

Введение

DSL для задач распределения

Структура распределения

Отношение

Виды распределений

Распределение по порядку

Пропорциональное распределение

Матричное распределение

Приемы работы с результатом распределения

Досчет итоговых колонок после матричного распределения

Конвейер

Модель распределения

Поставка


Списание партий товаров по номенклатуре - пожалуй самая хрестоматийная задача распределения по порядку. Такого рода задачи весьма распространены в учете: зачет авансов, определение лимитов, распределение заказа по складам, определение факта БДДС по оплаченным заявкам и т.д. Удивительно, но решая множество таких задач мне и в голову не приходило, что их можно объединить в единый класс задач по распределению. Вначале каждую такую задачу я решал по месту. В какой-то момент я понял, что пора уже выделить распределение в отдельную универсальную функцию.

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

Вот пример того, что у меня получалось в 1-ой версии:

ТаблицаРаспределения(МенеджерВременныхТаблиц, ИмяТаблицы, ИмяБазы, КлючевыеПоля, КлючУникальный, ПоляБазы, ПоляРесурсов, ПоляПорядка, ТаблицаПревышения, ТаблицаОстатков, Разрядность)

Вот пример того, что у меня получалось во 2-ой версии:

ТаблицаРаспределенияЧерезОтношение(МенеджерВременныхТаблиц, ИмяТаблицы, ИмяБазы, КлючевыеПоля, КлючУникальный, ПоляБазы, ПоляРесурсов, ПоляПорядка, ТаблицаПревышения, ТаблицаОстатков, Разрядность, ИмяТаблицыОтношения, ПоляОтношения)

Получилось, что мне потребовалось от 11 до 13 параметров! Использовать такие функции все-таки лучше, чем каждый раз решать задачу занова. Однако с таким большим количеством параметров терялась наглядность и как ни странно - гибкость.

Наглядность терялась из-за необходимости использовать разный набор параметров. Гибкость ограничивалась набором параметров, количество которых не может быть бесконечным. Обе эти проблемы хорошо решаются при использовании DSL.

Для повышения наглядности можно было бы разбить одну универсальную функцию на несколько и создать своего рода фреймворк по распределению. Но тогда возникает вопрос, а где хранить контекстную информацию? Создание множества переменных и манипуляция ими мне тоже не показалось лучшим решением (см. мой фреймворк по работе со схемой запроса). Однако мои эксперименты в области решения подобной задачи повышения наглядности через реализацию текучего интерфейса навели на мысль, что подобное решение можно применить и в этот раз. Оставалось дело за малым - придумать DSL и сделать его поддержку на базе реализации текучего интерфейса (см. мою библиотеку МодельЗапроса).

Гибкость при таком подходе достигается за счет использования операторов и параметров к ним. Например для описания входящей таблицы распределения можно предусмотреть операторы для установки измерений, ресурсов и реквизитов таблицы. Причем можно использовать не весь набор операторов, а только те, которые нужны для конкретного результата или являются обязательными. Кроме того, даже отдельные операторы можно также иерархически описывать вложенными операторами - и так до бесконечности :).

Конечно у такого подхода есть и свои недостатки. Такой подход очень зависим от соблюдения синтаксиса. Для использования решения на базе DSL необходимо знать этот новый, хоть и очень ограниченный, язык программирования. Однако у этого подхода есть и преимущества: необычайная гибкость и выразительность. Первое достигается за счет операторов и вложенности, 2-ое через синтаксис и отсутствие необходимости сохранять контекст в переменных.

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

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

Измерения - это поля таблицы распределения, по которым связываются строки исходной таблицы с таблицей базы распределения. Способ описание полей измерений, как впрочем и полей ресурсов, сделан по аналоги с построением схемы запроса (см. Модель запроса). В ряде задач таблица распределения и база могут быть не связаны. В этом случае измерения будут отсутствовать, а связь будет установлена путем распределения.

Ресурсы - это числовые поля, участвующие в распределении из исходной таблицы по ресурсам базы. В простом случае участвует один ресурс или поле, сумма из которого распределяется по суммам базы. Если же ресурсов несколько, то первый ресурс будет суммой всех остальных. Более математически для нескольких ресурсов должно соблюдаться равенство: Ресурс 1 = Сумма(Ресурс 2 ... n).

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

И наконец Реквизиты - это дополнительные поля, которые должны попасть в результат распределения.

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

В примере рассматривается распределение товаров по лимитам с приоритетом. Здесь детальный уровень соответствует лимитам по товару и статье, общий - по статье по всем товарам, общий - по всем статьям и товарам, Непредвиденные. Где общий лимит по всем товарам представлен пустым значением измерения базы Товар, а по всем статьям - пустое значение измерения базы Статья. Непредвиденные представлены статьей по всем товарам.

В примере "Списание лимитов" используется отношение для определения лимитов по приоритетам.

Формула распределения: Товары х Приоритеты х Лимиты => Лимиты по товарам по приоритетам

МодельРаспределения
    .Таблица("ВТ_ТОВАРЫ")
        .Измерения()
            .Поле("Товар", "ТоварИсходный")
            .Поле("Статья", "СтатьяИсходная")
        .Реквизиты()
            .Поле("*")
        .Ресурсы()
            .Поле("Сумма")
        .Отбор("НЕ Корректировка")
    .Отношение("ВТ_ПРИОРИТЕТЫ_ЛИМИТОВ")
        .ИзмеренияТаблицы()
            .Поле("*")
        .ИзмеренияБазы()
            .Поле("Товар")
            .Поле("Статья")
        .Порядок("Приоритет")
    .База("ВТ_ЛИМИТЫ")
        .Измерения()
            .Поле("*")
        .Реквизиты()
            .Поле("*")
        .Ресурсы()
            .Поле("Сумма")
;

 Модель распределения "Списание лимитов"

 

В хрестоматийном примере задачи распределения номенклатуры по партиям товаров с одной стороны есть список товаров с их количеством, а с другой - остатки партий товаров. Необходимо рассчитать количество товаров по партиям по порядку FIFO. Обычная задачка из экзамена на 1С Специалиста решается стандартно одним запросом.

Пример "Товары по партиям".

Формула распределения: Товары х Партии (по FIFO) => Товары по партиям, Нераспределенные товары, Нераспределенные партии. Декларативное описание будет следующим:

МодельРаспределения
    .Таблица("ВТ_ТОВАРЫ")
        .Измерения()
            .Поле("Товар")
        .Реквизиты()
            .Поле("*")
        .Ресурсы()
            .Поле("Количество")
        .Отбор("НЕ Корректировка")
    .База("ВТ_ПАРТИИ")
        .Измерения()
            .Поле("*")
        .Реквизиты()
            .Поле("*")
        .Ресурсы()
            .Поле("Количество")
        .Порядок("ДатаПартии")
;

Модель распределения "Товары по партиям"

 

Задача в предыдущем примере может быть решена и по другому, например, проворционально всем партиям товаров. Для этого достаточно было не указывать порядок базы.

В следующем примере "Пропорция" сумма распределяется по строкам товаров и по суммам: Сумма без НДС, Сумма НДС.

МодельРаспределения
    .Таблица("ВТ_СУММА_РАСПРЕДЕЛЕНИЯ")
        .Ресурсы()
            .Поле("Сумма")
    .База("ВТ_ТОВАРЫ")
        .Ресурсы()
            .Поле("Сумма")
            .Поле("СуммаБезНДС")
            .Поле("СуммаНДС")
        .Реквизиты()
            .Поле("*")
        .Отбор("НЕ Корректировка")
;

Модель распределения "Пропорция"

 

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

В данном примере решается задача распределения авансовых платежей по товарам методом FIFO. Сумма аванса распределяется по общей сумме товара и по её составляющим: НДС, без НДС.

Пример "Зачет".

Формула распределения: Авансы х Товары => Зачет авансов по товарам в сумме НДС, без НДС

МодельРаспределения
    .Таблица("ВТ_ТОВАРЫ")
        .Реквизиты()
            .Поле("*")
        .Ресурсы()
            .Поле("Сумма")
            .Поле("СуммаБезНДС")
            .Поле("СуммаНДС")
        .Отбор("НЕ Корректировка")
    .База("ВТ_АВАНСЫ")
        .Реквизиты()
            .Поле("*")
        .Ресурсы()
            .Поле("Сумма")
        .Порядок("ДатаАванса")
;

Модель распределения "Зачет"

 

Еще одним примером такой задачи является реклассификация затрат по статьям (использована таблица Товары). Сами затраты учитываются как сумма НДС и без НДС. Необходимо распределить корректировочные строки с отрицательной суммой на строки с положительной суммой.

Пример "Реклассификация".

Формула распределения: Товары корр х Товары => Товары корр по строкам товаров, где соответствие задается через НомерСтрокиКорр -> НомерСтроки

МодельРаспределения
    .Таблица("ВТ_ТОВАРЫ")
        .Реквизиты()
            .Поле("НомерСтроки", "НомерСтрокиКорр")
            .Поле("*")
        .Ресурсы()
            .Поле("-Сумма", "Сумма")
            .Поле("-СуммаБезНДС", "СуммаБезНДС")
            .Поле("-СуммаНДС", "СуммаНДС")
        .Отбор("Корректировка")
    .База("ВТ_ТОВАРЫ")
        .Реквизиты()
            .Поле("*")
        .Ресурсы()
            .Поле("*")
        .Отбор("НЕ Корректировка")
        .Порядок("Сумма", "-")
;

Модель распределения "Реклассификация"

 

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

  1. Сумма = НДС + Сумма без НДС
  2. Сумма = Сумма Материалы + Сумма Работы
  3. Сумма = Сумма Материалы НДС + Сумма Материалы без НДС + Сумма Работы НДС + Сумма Работы без НДС

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

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

Приведу пример из моей практики. По бизнес-процессу вначале оформляется заявка на расходование денежных средств в разрезе статей БДДС. Затем эта заявка размещается по определенному счету для резервирования денежных средств. При формировании платежного поручения в документе выбирается список заявок. Могут быть указаны как просто заявки, так и размещения заявок по счету. Для определения состава статей необходимо выполнить два распределения: вначале распределить заявки с явным указанием размещения, затем остальные заявки. Остальные заявки тоже размещены, однако конкретное размещение в платежном поручении по ним не указано. Второе распределение как раз устанавливает соответствие заявок с их размещениями.

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

МодельРаспределения
    .Таблица(МодельРаспределения.ТаблицаРаспределения)
        .Измерения()
            .Поле("Товар")
        .Ресурсы()
            .Поле("Количество")
        .Реквизиты()
            .Поле("*")
    .База(МодельРаспределения.БазаРаспределения)
        .Измерения()
            .Поле("*")
        .Ресурсы()
            .Поле("*")
        .Реквизиты()
            .Поле("*")
;

Передача результата предыдущего распределения (см. пример "Конвейер")

 

Объектная модель распределения состоит из описания трех таблиц: Таблица, Отношение, База. Если Отношение не требуется, то оно не должно участвовать в описании модели. Таблицы передаются в модель по имени временной таблицы или через таблицу (табличная часть, таблица значений, данные формы коллекция).

Таблица описывается группами полей: Измерения, Реквизиты, Ресурсы. Каждое поле представляет собой выражение и псевдоним. Описание поля аналогично как в Модели запроса. Допускается использование обобщенного символа "*" (см. Снежинка для запроса).

Кроме описания полей для таблицы можно также задать Порядок и Отбор (см. Модель запроса). Использование порядка в описании таблицы базы приводит к однозначному выбору распределения по порядку.

Описание Отношения отличается от описания таблиц Таблица и База наличием двух групп измерений: ИзмеренияТаблицы, ИзмеренияБазы.

В конструктор объекта модели распределения можно передать МенеджерВременныхТаблиц и количество знаков после запятой (по-умолчанию 2).

МодельРаспределения = Общий.МодельРаспределения(МодельЗапроса.МенеджерВременныхТаблиц);

Модель описывается в виде структуры: Таблица-Состав полей (см. примеры выше). Результат распределения получается после вызова метода Распределить().

//  Конструктор
МодельРаспределения = Общий.МодельРаспределения(МенеджерВременныхТаблиц);
//  Описание модели
МодельРаспределения
    .Таблица("ВТ_СУММА_РАСПРЕДЕЛЕНИЯ")
        .Ресурсы()
            .Поле("Сумма")
    .База("ВТ_ТОВАРЫ")
        .Ресурсы()
            .Поле("Сумма")
            .Поле("СуммаБезНДС")
            .Поле("СуммаНДС")
        .Реквизиты()
            .Поле("*")
        .Отбор("НЕ Корректировка")
;
МодельРаспределения.Распределить();
//  Результат
МодельРаспределения.РезультатРаспределения;
МодельРаспределения.БазаРаспределения;// остаток базы
МодельРаспределения.ТаблицаРаспределения;// остаток распределения

Пример работы с моделью

 

Поставка

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

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

Зависимости: БСП, МодельЗапроса, Платформа 8.3.18 (8.3.18.1520)

Проект выложен на github.

Скачать файлы

Наименование Файл Версия Размер
Конфигурация

.cf 129,00Kb
1
.cf 1.0.0.2 129,00Kb 1 Скачать
Демо база

.dt 78,67Mb
3
.dt 1.0.0.2 78,67Mb 3 Скачать
Расширение

.cfe 61,17Kb
1
.cfe 1.0.0.2 61,17Kb 1 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. starik-2005 2681 21.03.22 06:51 Сейчас в теме
Идея сделать объектную модель в 1С - отличная. Другое дело, что описано, на мой взгляд, достаточно туманно и стандартный 1С-нег вполне легко может запутаться в определениях, из-за чего сочтет подобный механизм никому не нужным наворотом. Также не раскрыт аспект округлений в распределениях сумм по базе для итоговых ресурсов, т.к. есть как минимум два алгоритма, которые позволяют это сделать таким образом, чтобы округление сходило на нет (об одном я писал тут: https://infostart.ru/1c/articles/416217/).

В общем, суть отличная, подача хромает. Но это мое, скорее всего неправильное, мнение.
cleaner_it; +1 Ответить
5. kalyaka 824 21.03.22 09:23 Сейчас в теме
(1)
не раскрыт аспект округлений в распределениях сумм по базе для итоговых ресурсов
Я читал вашу статью, как впрочем и другие статьи на данную тему. Подобный алгоритм распределения я сам когда-то написал и использую до сих пор. Однако, при проработке нового универсального решения, я сознательно закладывался на возможность выбора нужного метода при необходимости. В предложенном решении для распределения используется функция
ОбщегоНазначенияКлиентСервер.РаспределитьСуммуПропорциональноКоэффициентам
из БСП. В ней реализован метод распределения погрешности по массиву максимальных сумм. Я поэкпериментирол с ней на примере распределения предельно малых сумм и результат мне вполне понравился. Такой эксперимент можно провести и в демо обработке из поставки к данной статье.

Самое полное исследование алгоритмов распределения погрешностей на мой взгляд проведено в статье Честное распределение суммы по таблице значений и здесь больше двух алгоритмов :). У каждого метода есть свои преимущества и недостатки. Какой бы метод ни был выбран, общий результат то один - распределенная сумма. Тут главное не менять алгоритм в следующих версиях, а то повторяемость нарушится.

суть отличная, подача хромает
Что ж делать, писать подобные статьи дело не совсем благодарное :) Приходится идти на некий компромис: и идею донести, и не потратить неразумно много времени на одну лишь статью. Хотя есть у меня статья, на которую было потрачено безумно много времени, так и результат того наверное стоит :). В общем суть в том, что востребованный материал можно и дорабатывать и "шлифовать" и распространять на разных ресурсах для широкой аудитории, а узко специализированный на профильных ресурсах только для профессионалов.
eeeio; cleaner_it; +2 Ответить
8. starik-2005 2681 21.03.22 13:59 Сейчас в теме
(5)
В ней реализован метод распределения погрешности по массиву максимальных сумм.
В принципе это как у Ильдаровича (как и у меня бегущий коэффициент, только по упорядоченному по суммам сверху вниз массиву данных), только в несколько циклов (т.е. со всей это "возней в гиперпространстве").

Я же говорил о двух алгоритмах, в которых цикл один. Только я и Ильдарович (до меня, и до него тоже были публикации) имеем распределение с нарастающим проскосом единиц округления, а есть алгоритм, который равномерно распределяет эти округления. У меня коллега мне показывал, но я сразу не въехал, а теперь мы в разных конторах работаем. Поэтому я считаю, что их два. Остальные - это размазывание оставшихся копеек по такому же упорядоченному сверху вниз массиву или даже без оного.

(5)
Приходится идти на некий компромисс: и идею донести, и не потратить неразумно много времени на одну лишь статью.
Ну в принципе идея тут и та, что использована объектная модель (с передачей модуля обработки, или даже глобального модуля - не суть), и та, что эта модель используется для практического применения. И вот тут возникает проблема: т.к. при реализации используется неклассический подход, то это заставляет читателя (а читатели этого портала, способные уловить суть, сейчас достаточно занятой народ) дополнительно погрузиться в другие Ваши статьи, а на это нет достаточного времени. В итоге вроде бы распределение суммы по базе в Вашем изложении, которое могло бы заинтересовать новичков, например, вряд ли вызовет у новичков этот интерес, т.к. подход к реализации неклассический. Им будет гораздо удобнее использовать ту самую функцию из БСП, а ее в статье нет - только в комментах (
2. malikov_pro 1152 21.03.22 07:11 Сейчас в теме
В начале применена аббревиатура, но нет её расшифровки, с википедии:
Предметно-ориентированный язык (англ. domain-specific language, DSL — «язык, специфический для предметной области») — компьютерный язык, специализированный для конкретной области применения (в противоположность языку общего назначения, применимому к широкому спектру областей и не учитывающему особенности конкретных сфер знаний). Построение такого языка и/или его структура данных отражают специфику решаемых с его помощью задач[1].

"Вот пример того, что у меня получалось в 1-ой версии:" - При длине строки более 120 символов следует использовать переносы., https://docs.checkbsl.org/checks/overall/LineLength/. Хорошо написанный код проще воспринимать.
3. starik-2005 2681 21.03.22 07:26 Сейчас в теме
(2)
DSL
Автор много статей написал на эту тему, поэтому предполагает, видимо, что читатель новой статьи так же погружен в контекст предыдущих статей, как и сам автор. Да, наивняк )))

С другой стороны, это все гуглится как два пальца (ну или на "раз-два" - дня наших западных партнеров), ну и проходится на начальных курсах в высших и средних учебных заведениях по профильным направлениям, которые так любят указывать в вакансиях работодатели. Но 1С-неги - это не только лишь все, которые профильные колледжи и ВУЗы закончили. Среди них куда больше народу, окончившего что-то типа строительного техникума и отмотавшего после этого три года на какой-нить экономике в каком-нить региональном платном ВУЗе с околонулевым уровнем в рейтингах. А есть и агрономы бывшие, животноводы, ветеринары, дантисты, лесники, кадастровые инженеры и конструкторы летательных аппаратов. Вот для них - основной массы 1С-негов - автору стоило бы указывать по крайней мере сцылки (желательно, чтобы аббревиатура была кликабельной, как в ВИКИ).

С третьей стороны, большинству 1С-него данная статья не зайдет и они пройдут мимо нее, как время, которое проходит мимо автора.
4. AndreyShitov 21.03.22 08:13 Сейчас в теме
(2) Меня больше смутили ссылки в заголовках, которые никуда не ведут.

Если вместо
<h3><a name="_Toc98100650">DSL для задач распределения</a></h3>

писать
<h3 name="_Toc98100650">DSL для задач распределения</h3>

то и навигация в оглавлении всё ещё будет работать, и читателя с толку не будет сбивать подсветка заголовка как ссылки.

Если учесть необходимость определения терминов встречающихся в статье впервые, то хорошо бы заголовок привести к такому виду:
<h3 name="_Toc98100650"><abbr title="язык, специфический для предметной области">DSL</abbr> для задач распределения</h3>


И чтобы не раскидывать пустые ссылки внутри блоков, можно диву имя присвоить, т.о.
<div><h2><a name="Row_2_DSL_для_задач_распределения"></a><a name="_Toc98100649">Введение</a></h2></div>

без потери функциональности сократится до
<div name="Row_2_DSL_для_задач_распределения"><h2 name="_Toc98100649">Введение</h2></div>

Заодно и браузер сможет построить более чистую DOM.

Но это я уже придираюсь. Человек не занимающийся разработкой не обязан знать тонкости языков разметки.
starik-2005; +1 Ответить
7. kalyaka 824 21.03.22 12:20 Сейчас в теме
(4)
Человек не занимающийся разработкой не обязан знать тонкости языков разметки
Как часто вам приходится заглядывать в код xml сохраненного файла word? Ладно, это был риторический вопрос. Вообще по верстке на infostart был целая статья, к сожалению ее удалили.
11. AndreyShitov 22.03.22 05:54 Сейчас в теме
(7) в ворд никогда, если он не пробелами свёрстан. А в то, что понаделали WYSIWYG редакторы на сайтах, если есть возможность, каждый раз заглядываю, т.к. видел какую грязь вместо кода они генерируют в абсолютном большинстве случаев. Ну и потому что функциональность в них ограничена. Вернее стараюсь вообще их не использовать, напрямую код писать быстрее выходит.

Вообще по верстке на infostart был целая статья, к сожалению ее удалили.

Интернет помнит всё
6. kalyaka 824 21.03.22 09:36 Сейчас в теме
(2)
В начале применена аббревиатура, но нет её расшифровки
Тут (3) уже ответили за меня, согласен.
При длине строки более 120 символов следует использовать переносы
Здесь код приведен в одну строку для усиления иллюстрации проблемы :)
9. kser87 2265 21.03.22 15:38 Сейчас в теме
хотелось бы видеть примеры помимо описаний. ТО есть табличку с цифрами и табличку-результат. Круто было бы если бы она была со стрелочками и формулами
10. kalyaka 824 21.03.22 21:37 Сейчас в теме
(9) Во вложении к статье есть демо база, в ней есть обработка с демо примерами. Для каждого примера есть тестовые данные, которые можно интерактивно отредактировать. Можно посмотреть код подготовки и выполнения распределения. После выполнения каждого примера формируется отчет, в котором выводятся входящие таблицы и таблицы результата распределения.

У кого нет мани, могут скачать демо из релиза к репозиторию.
Оставьте свое сообщение

См. также

Модель состояния для MVC Промо

Работа с интерфейсом Идеи и тренды в разработке v8 1cv8.cf Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    519    kalyaka    0    

Найди слова

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Пример примитивной автоматизации с помощью 1С (и не только).

3 стартмани

11.08.2022    470    0    SerVer1C    10    

Если хочется ООП с наследованием и полиморфизмом

Математика и алгоритмы Языки и среды v8 Абонемент ($m)

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

1 стартмани

21.07.2022    749    0    Alxby    8    

IDN и Punycode в 1С

Универсальные функции Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Обработка "Punycode конвертер".

1 стартмани

01.05.2022    1217    0    SpaceOfMyHead    0    

Нечеткое сравнение строк. Метод Джаро-Винклера на 1С Промо

Математика и алгоритмы v8::УФ 1cv8.cf Абонемент ($m)

Схожесть строк. Метод Джаро-Винклера. В обработке реализован алгоритм нечеткого сравнения строк.

3 стартмани

20.04.2018    27944    108    Serg1701    19    

Реализация задачки с собеседования: найти максимальное число, но не более, чем ограничено параметром

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Реализация небольшой задачки с собеседования: найти максимальное число в матрице чисел размерностью M*N, заполненной случайными числами, но не большее, чем задано ограничивающим параметром. Сразу скажу, это не с моего собеседования. Просто интересно было решить ее на платформе 1С.

1 стартмани

31.03.2022    1703    0    serverstar    15    

Вычисление хеша по алгоритму fnv1a

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

Вычисление средствами платформы хеш суммы по алгоритму fnv1a 32/64.

1 стартмани

01.02.2022    1808    0    dim_zal    0    

Решение задачи Эйнштейна на 1С (управляемые формы)

Математика и алгоритмы v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

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

1 стартмани

13.08.2021    3101    2    VGorkunov    4    

Определение кратчайших путей, критических путей одним запросом Промо

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Еще два примера применения алгоритма каскадного матричного умножения, впервые описанного в статье «Транзитивное замыкание запросом» http://infostart.ru/public/158512/

1 стартмани

07.04.2014    43434    62    ildarovich    31    

Разработка с учетом Показателей

Математика и алгоритмы Анализ и проектирование ИТ-систем v8 Россия Абонемент ($m)

Время от времени приходится разрабатывать алгоритмы расчета с некоторыми условными значениями. Я их называю Показателями. Данная статья предлагает один из методов работы с Показателями.

1 стартмани

04.06.2021    3084    0    blockcode    1    

Машинное обучение и анализ данных

Математика и алгоритмы Идеи и тренды в разработке v8 Абонемент ($m)

Данная конфигурация предназначена для автоматизации процесса машинного обучения и анализа данных средствами 1С.

1 стартмани

04.05.2021    5282    14    cdrw3    11    

Алгоритм и обработка для проведения розыгрыша среди анкет

Математика и алгоритмы v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

12.03.2021    3062    0    delta    2    

Полная методичка к курсу "Программирование 8.2" Промо

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

580 страниц знаний! Публикую методичку, а точнее стенограмму курса по подготовке программистов 8.2.

10 стартмани

09.01.2014    60219    1377    GROOVY    100    

Алгоритм Карацубы

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Реализация метода Карацубы - функции быстрого умножения, которая позволяет перемножать два n-значных числа с битовой вычислительной сложностью (реализация на платформе 1С:Предприятие 8.3 (8.3.9.2233))

1 стартмани

31.08.2020    2925    0    Tatsiana    3    

Решение задачи Эйнштейна на платформе 1с

Математика и алгоритмы v8 Абонемент ($m)

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

1 стартмани

12.08.2020    4605    4    itmind    2    

Пример программирования методом Конечных автоматов на базе написания парсера CSV

Математика и алгоритмы v8::УФ 1cv8.cf Россия Абонемент ($m)

Способ реализации программирования методом Конечного автомата на примере написания парсера CSV-файла с обработкой двойных кавычек и многострочным текстом в ячейках.

1 стартмани

17.06.2020    4771    0    Salimbek    3    

Разработка синтаксического анализатора языка запросов на языке 1С Промо

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Пример разработки генератора для PEG парсера

1 стартмани

03.12.2014    29474    5    so-quest    70    

Расчет времени циклов солнца

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

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

1 стартмани

25.05.2020    2248    0    116hrus    0    

Treemapping. Демонстрационная обработка

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

Пример реализации диаграммы вида Treemap на 1С

1 стартмани

27.02.2020    7013    16    randomus    4    

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

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

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

1 стартмани

06.01.2020    3358    5    WalterFOX    1    

Наш ответ американским лекторам Промо

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Это спойлер к замечательной публикации «Алгоритмы. Часть 1.1. Динамические соединения». Здесь описывается гораздо более быстрый способ решения задачи динамического связывания при отсутствии ограничений на используемые структуры данных

1 стартмани

11.04.2014    26416    6    ildarovich    36    

Решение задач по мотивам статьи "30 задач. Странных и не очень"

Математика и алгоритмы v8 v8::УФ 1cv8.cf Абонемент ($m)

Обработка по мотивам статьи: https://infostart.ru/public/1161686/

1 стартмани

04.12.2019    7292    2    batsy66    9    

Алгоритмы поиска пути в графе. Часть 2

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Новые возможности, ранее реализованных алгоритмов поиска пути в графе на платформе 1С 8.3.

1 стартмани

13.08.2019    11186    9    RonX01    10    

Алгоритмы поиска пути в графе

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Реализуем алгоритмы поиска пути в графе на платформе 1С 8.3, такие как алгоритм А*, поиск в ширину, жадный поиск, алгоритм Дейкстры и вконце волновой.

1 стартмани

09.07.2019    26298    13    RonX01    11    

Еще один взгляд на проблему «жизнь без последовательностей». Часть вторая (практическая) Промо

Математика и алгоритмы v8 КА1 БП2.0 УТ10 Розница УПП1 УНФ Россия Абонемент ($m)

В [1 - http://infostart.ru/public/62938/] был предложен метод корректировки списаний по партиям при изменении документов задним числом. Использование данного метода позволяет контролировать остатки при неоперативном проведении и поддерживать учет по партиям всегда в актуальном состоянии, то есть обходиться без механизма последовательности документов. Собственно метод заключался в решении задачи правильного списания по партиям как задачи линейного программирования. В доказательство работоспособности метода приводится следующая «каркасная» конфигурация «Полигон», в которой этот метод реализован.

1 стартмани

19.08.2010    33953    168    ildarovich    35    

Таблица принятия решений, таблица истинности

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Два инструмента для разработки алгоритмов.

1 стартмани

02.05.2019    5700    0    pm74    2    

Сортировка кучей (пирамидальная сортировка, heap sort)

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Алгоритм сортировки массива кучей (пирамидальная сортировка).

1 стартмани

29.03.2019    4875    4    FirstSmart    0    

Алгоритм заполнения шапки табличного документа по дереву значений

Математика и алгоритмы v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

Произвольное дерево значений превращается в шапку табличного документа.

1 стартмани

03.03.2019    5932    3    Алексей777    0    

Включаем звук в 1С. Доступно и всерьез. Промо

Математика и алгоритмы Универсальные функции v8 1cv8.cf Абонемент ($m)

Как сделать воспроизведение звука в 1С без внешних компонентов? Решаем средствами интернета. Для тонкого, толстого и web-клиента.

1 стартмани

30.12.2013    91965    275    sikuda    37    

Случайная неслучайная скидка

Ценообразование, анализ цен Математика и алгоритмы v8 1cv8.cf УУ Абонемент ($m)

Найти случайное число, но сделать так, чтобы чем меньше значение, тем чаще выпадало это число (с обратной экспоненциальной зависимостью).

1 стартмани

24.01.2019    3224    0    Hokum    1    

Пример решения математической задачи: вывод ряда чисел где сумма двух ненулевых слагаемых, составленных из знаков числа, возведенного в квадрат, равняется самому числу

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Задача предполагает вывод ряда чисел, удовлетворяющих условию: сумма двух ненулевых слагаемых, составленных из знаков числа, возведенного в квадрат, равняется самому числу (fun only).

1 стартмани

27.12.2018    4490    0    alexander-lubich    13    

Развернуть дерево спецификаций быстро

Производство готовой продукции (работ, услуг) Математика и алгоритмы Запросы v8 УПП1 БУ УУ Абонемент ($m)

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

10 стартмани

23.10.2018    16111    12    SITR-utyos    8    

Честное распределение суммы по таблице значений (3.1.4.1) Промо

Математика и алгоритмы v8 1cv8.cf 1С7:ТиС Россия Абонемент ($m)

Варианты "честного" распределения суммы по таблице значений (табличной части)

1 стартмани

29.10.2008    50552    2378    alexk-is    61    

Решение задачи коммивояжера алгоритмом Литтла

Математика и алгоритмы v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

12.04.2018    13950    39    van_za    20    

Умножение больших чисел методом Карацубы

Математика и алгоритмы Универсальные функции v8 1cv8.cf Абонемент ($m)

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

1 стартмани

10.01.2018    7732    0    Kosmovski    10    

Определение похожести строк или фраз (алгоритм нахождения расстояния Дамерау Левенштейна)

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Реализация алгоритма поиска расстояния Дамерау Левенштейна (Damerau–Levenshtein distance) для определения похожести слов или фраз.

1 стартмани

14.12.2017    12935    68    PerlAmutor    14    

Конспект лекций по курсу «Автоматизированные информационные системы» Промо

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

Конспект лекций по курсу «Автоматизированные информационные системы» составлен на основании требования Государственного образовательного стандарта среднего профессионального образовании к содержанию и уровню подготовки выпускника по специальности 230103 «Автоматизированные системы обработки информации и управления». В конспекте есть общие сведения о методике 1С:Профкейс. Конспект лекций разработал: канд. техн. наук, доцент Космачев С.Н.

1 стартмани

07.06.2012    29598    187    ksnik    19    

Комбинатор. Подбор суммы из набора чисел. Обработка для 1С версии 8.х (УФ)

Математика и алгоритмы v8 v8::УФ 1cv8.cf Абонемент ($m)

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

1 стартмани

19.05.2017    25182    80    romasna    31    

Тестируем алгоритмы для торговых роботов срочного рынка РТС

Займы, кредит, лизинг Математика и алгоритмы v8 Финансовые услуги, инвестиции Россия УУ Абонемент ($m)

1С может много чего. И ее возможности давно вышли за рамки изначально задуманного. В качестве такого примера решил выложить конфигурацию для тестирования простой стратегии торговли фьючерсом на пару Доллар-Рубль на срочном рынке РТС.

1 стартмани

29.04.2017    15514    13    rrider    2    

Задачи по программированию на 1С

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Сборник задач по программированию. Начало...

1 стартмани

18.04.2017    28284    6    Xershi    10    

Пополнение товара на складе по теории ограничения систем

Оптовая торговля Склад и ТМЦ Математика и алгоритмы v8 КА1 УПП1 УУ Абонемент ($m)

В статье рассматривается алгоритм пополнения склада по теории ограничений систем. Сами подходы описаны в книге Элия М. Голдратта «Я так и знал! Теория ограничений для розничной торговли».

1 стартмани

26.01.2017    20618    17    vva    6    

Набор математических функций

Универсальные функции Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Небольшой набор математических функций для работы с массивами чисел.

1 стартмани

12.01.2017    19896    7    SvoyakMartin    23    

1С+Классы. Версия-0

Разработка внешних компонент Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Разработано ООП-расширение языка 1С, включающее (но не ограничивающееся): Классы как абстрактные типы данных с элементами «переменная», «свойство», «функция», «процедура»; Интерфейсы как абстрактные классы без элементов состояния («переменная») и без привязки к реализации методов (свойств, процедур, функций) при определении; Имплементация (реализация) интерфейсов классами; - одиночное открытое наследование; Области видимости «внутренняя» (private), «экспорт» (public), «защищенная» (protected); Статические элементы классов (общие для всех экземпляров класса); Замещение (переопределение реализации) методов при наследовании – «виртуальные методы, свойства»; Сокрытие (затенение) обычных (не замещаемых) элементов при наследовании; Перегрузка процедур и функций по количеству и типам данных аргументов; Конструкторы класса; Деструктор класса; Слабые ссылки; Делегаты.

1 стартмани

28.10.2016    25690    7    IntelInside    68    

Генетический алгоритм для решения простой задачки

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Генетический алгоритм в решении задачи: Необходимо расставить правильно (по другому) скобки, чтобы получилось 850 (1 + 2) (3 + 4) (5 + 6) (7 + 8) (9 + 10) (11 + 12) (13 + 14) + 15

1 стартмани

26.09.2016    13036    5    eugeniezheludkov    4    

Мультиквайн на 1С. Курица и яйцо

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Мультиквайн - программа, выдающая текст другой программы, которая, в свою очередь, выдаёт текст первой. Теперь и на 1С.

1 стартмани

07.09.2016    9986    1    kg_am    5    

Декартово (прямое) произведение

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Прямое или декартово произведение двух множеств — это множество, элементами которого являются всевозможные упорядоченные пары элементов исходных множеств.

1 стартмани

11.05.2016    11749    7    yojeeg    3    

Еще один способ расчета остатков на каждый день в запросе

Математика и алгоритмы v8 Абонемент ($m)

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

1 стартмани

24.04.2016    45162    58    ildarovich    23    

Алгоритм разбиения строки (предложения,текста) на несколько строк, с заданными длинами результирующих строк

Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

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

1 стартмани

17.03.2016    9538    2    zakkvanaxel    5