Найти в Дзене
1с разное

Метод табличного программирования

Демонстрируется метод табличного программирования из книги "Совершенный код. Мастер-класс" Стива Макконнелла.

* * *

Мне бы только
мой крошечный вклад внести
За короткую жизнь сплести
Хотя бы ниточку шёлка.

песня "Шелкопряд", автор Flёur

Когда знаешь - все просто

Николай Павлов, портал "Планета Эксель"

Всем привет!

Книга «Совершенный код. Мастер-класс», автор Стив Макконнелл, - является одной из настольных книг разработчика. До сих пор никто не адаптировал алгоритмы и приемы из книги под 1С-программирование. Про рекурсию и циклы в книге все понятно - на всех языках похоже. Про применение табличного программирования, описанного в главе 18 "Табличные методы", уже поймет не каждый. Я привожу примеры табличного программирования для всеобщего понимания такого приема разработки. С помощью этого способа можно элегантно писать алгоритмы: они становятся на порядок меньше, код становится легче масштабировать и адаптировать.

Для примера возьму простейший алгоритм расчета категорий АВС по номенклатуре. В типовых конфигурациях представлен АВС-анализ в виде отчетов. Я демонстрирую другой универсальный вариант решения задачи: при котором пользователю удобно изменять кол-во категорий (от двух до четырех и более), менять диапазоны категорий, а для разработчика описана схема доработки инструмента – легко добавить другие показатели для анализа.

В кратце опишу алгоритм расчета АВС-анализа.

1. Получаем данные для анализа - показатели "сумму продаж" и "прибыль за период" по номенклатуре. Тут же суммируем общую сумму продаж и общую прибыль.

2. Рассчитываем по каждой номенклатуре столбец "Процент от общей выручки, %" — доля в общей выручке; и отдельно столбец "Процент от общей прибыли, %" - доля в общей прибыли.

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

4. Группируем строки с помощью нарастающего итога по столбцу "Процент от общей выручки, %", пока общая сумма по столбцу не приблизится к соответствующему заданному диапазону - сначала для категории А, затем для категории В и т.д. Такую же группировку нарастающим итогом производим над столбцом "Процент от общей прибыли, %".

В классической формулировке задаются три категории А, В и С. Если вы ограничитесь двумя категориями, то получите правило Парето. В общем случае, бывают ситуации, когда разбить на три категории множество объектов не получается - тогда можно выделить 4 категории для анализа.

-2

5. Сохраняем рассчитанные сведения в регистр сведений и выводим их по необходимости на форму документов.

-3

Пример разработан на платформе 1С:Предприятие 8.3 (8.3.20.2184), на демо-конфигурации "Управление торговлей", редакция 10.3 (10.3.73.1).

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

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

-4

В коде сверху для выбора цвета использовано 11 строк кода без учета пустых строк, в коде снизу - 2 строки для выбора цвета (!).

Согласно табличному методу этот код можно переписать вот так - в данном случае Соответствие является той самой "табличной структурой", которая привносит в код элегантность и порядок:

-5

Пример 2. Использование разрядности - количества знаков после запятой - для отображения на форме процентов. Как это можно запрограммировать обычным линейным и табличным способом представлено на рисунке:

-6

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

Пример 3. Как описать проверку на NULL или 0 итоговой суммы показателя? Далее показано как было и как стало:

-7
-8

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

-9
-10

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

На этом все. Всем добра!

С пользой для клиентов, Rustig