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

09.04.22

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование SM По подписке [?] Купить один файл
Конфигурация
.cf 129,00Kb
1
1
1 SM
Скачать Купить за 1 850 руб.
Демо база
.dt 78,67Mb
5
5
1 SM
Скачать Купить за 1 850 руб.
Расширение
.cfe 61,17Kb
1
1
1 SM
Скачать Купить за 1 850 руб.

Оглавление

Введение

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.

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

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    2342    stopa85    12    

34

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

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    5737    user1959478    50    

35

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    2265    maksa2005    8    

24

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    9017    7    SpaceOfMyHead    17    

60

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    3539    RustIG    7    

25

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

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

23.11.2022    2631    gzharkoj    14    

24

Работа с интерфейсом Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

05.07.2022    4596    kalyaka    6    

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

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

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

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

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

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

"Вот пример того, что у меня получалось в 1-ой версии:" - При длине строки более 120 символов следует использовать переносы., https://docs.checkbsl.org/checks/overall/LineLength/. Хорошо написанный код проще воспринимать.
3. starik-2005 3061 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 1086 21.03.22 12:20 Сейчас в теме
(4)
Человек не занимающийся разработкой не обязан знать тонкости языков разметки
Как часто вам приходится заглядывать в код xml сохраненного файла word? Ладно, это был риторический вопрос. Вообще по верстке на infostart был целая статья, к сожалению ее удалили.
11. AndreyShitov 22.03.22 05:54 Сейчас в теме
(7) в ворд никогда, если он не пробелами свёрстан. А в то, что понаделали WYSIWYG редакторы на сайтах, если есть возможность, каждый раз заглядываю, т.к. видел какую грязь вместо кода они генерируют в абсолютном большинстве случаев. Ну и потому что функциональность в них ограничена. Вернее стараюсь вообще их не использовать, напрямую код писать быстрее выходит.

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

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

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