Как рассчитать суммарный расход протеина понедельно и за весь период в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ входных данных и постановка задачи

Прежде чем приступать к написанию кода, проанализируем условия. Нам известны: ЧастотаПриема, количество грамм в будние (ПротеинВБудни) и выходные дни (ПротеинВВыходные), а также общее количество дней (ВсегоДней). Расчет всегда начинается с понедельника. Наша цель — заполнить Массив и обработать его для вывода отчетности.

Шаг 1. Получение данных от пользователя

Для интерактивного ввода данных в 1С удобнее всего использовать функцию ВвестиЧисло(). Рассмотрим, как инициализировать наши переменные:


Переменная_ЧастотаПриема = 0;
Переменная_ПротеинВБудни = 0;
Переменная_ПротеинВВыходные = 0;
Переменная_ВсегоДней = 0;

Если ВвестиЧисло(Переменная_ЧастотаПриема, "Введите частоту приема в день") 
    И ВвестиЧисло(Переменная_ПротеинВБудни, "Грамм в будни")
    И ВвестиЧисло(Переменная_ПротеинВВыходные, "Грамм в выходные")
    И ВвестиЧисло(Переменная_ВсегоДней, "Количество дней приема") Тогда
    // Переходим к расчету
КонецЕсли;

Шаг 2. Заполнение массива данными

Согласно условию, мы обязаны хранить информацию за каждый день в массиве. Разберем логику: нам нужно пройти циклом от 1 до ВсегоДней. Чтобы определить, является ли день будним или выходным, воспользуемся операцией остатка от деления на 7.

Проанализируем алгоритм определения дня недели:

  1. Используем цикл Для Счетчик = 1 По ВсегоДней Цикл.
  2. Вычисляем текущий день недели: ДеньНедели = (Счетчик - 1) % 7 + 1.
  3. Если ДеньНедели меньше или равен 5 — это будни, если 6 или 7 — выходные.
  4. Умножаем разовую дозу на ЧастотаПриема и добавляем результат в Массив.

ПриемыМассив = Новый Массив;
Для НомерДня = 1 По Переменная_ВсегоДней Цикл
    ТекущийДеньНедели = (НомерДня - 1) % 7 + 1; // Понедельник = 1, Воскресенье = 7
    
    Если ТекущийДеньНедели <= 5 Тогда
        ДневнаяНорма = Переменная_ПротеинВБудни * Переменная_ЧастотаПриема;
    Иначе
        ДневнаяНорма = Переменная_ПротеинВВыходные * Переменная_ЧастотаПриема;
    КонецЕсли;
    
    ПриемыМассив.Добавить(ДневнаяНорма);
КонецЦикла;

Шаг 3. Обработка массива и вывод итогов по неделям

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

Рассмотрим пошагово процесс вывода:

  1. Создадим переменные СуммаЗаНеделю и ОбщаяСумма, обнулив их перед циклом.
  2. Внутри цикла будем прибавлять значение текущего элемента массива к обеим переменным.
  3. Если текущий день кратен 7 или это последний день в массиве — выводим итог за неделю и обнуляем СуммаЗаНеделю.

ОбщаяСумма = 0;
СуммаЗаНеделю = 0;
НомерНедели = 1;

Для Индекс = 0 По ПриемыМассив.Количество() - 1 Цикл
    ТекущийПрием = ПриемыМассив[Индекс];
    СуммаЗаНеделю = СуммаЗаНеделю + ТекущийПрием;
    ОбщаяСумма = ОбщаяСумма + ТекущийПрием;
    
    // Проверяем, наступил ли конец недели (каждый 7-й день) или конец всего периода
    Если (Индекс + 1) % 7 = 0 Или (Индекс + 1) = ПриемыМассив.Количество() Тогда
        Сообщить(СтрШаблон("Неделя %1 – %2гр", НомерНедели, СуммаЗаНеделю));
        СуммаЗаНеделю = 0;
        НомерНедели = НомерНедели + 1;
    КонецЕсли;
КонецЦикла;

Сообщить(СтрШаблон("Всего – %1гр", ОбщаяСумма));

Полезные советы для оптимизации

Выясним, какие инструменты платформы помогают сделать код чище. Использование функции СтрШаблон() позволяет избежать громоздкой конкатенации строк. Также важно помнить, что индексация в Массив в 1С начинается с нуля, поэтому при расчете остатка от деления мы используем Индекс + 1 или корректируем логику под нужды задачи.

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

← На главную