В процессе обучения программированию на платформе 1С:Предприятие 8.3 начинающие разработчики часто сталкиваются с задачами, требующими комбинирования нескольких базовых механизмов: циклов, массивов и условий. В данной статье мы разберем задачу по расчету графика приема протеина. Нам необходимо не просто получить итоговую цифру, но и сохранить данные за каждый день в массив, а также вывести промежуточные итоги по каждой неделе.
Прежде чем приступать к написанию кода, проанализируем условия. Нам известны: ЧастотаПриема, количество грамм в будние (ПротеинВБудни) и выходные дни (ПротеинВВыходные), а также общее количество дней (ВсегоДней). Расчет всегда начинается с понедельника. Наша цель — заполнить Массив и обработать его для вывода отчетности.
Для интерактивного ввода данных в 1С удобнее всего использовать функцию ВвестиЧисло(). Рассмотрим, как инициализировать наши переменные:
Переменная_ЧастотаПриема = 0;
Переменная_ПротеинВБудни = 0;
Переменная_ПротеинВВыходные = 0;
Переменная_ВсегоДней = 0;
Если ВвестиЧисло(Переменная_ЧастотаПриема, "Введите частоту приема в день")
И ВвестиЧисло(Переменная_ПротеинВБудни, "Грамм в будни")
И ВвестиЧисло(Переменная_ПротеинВВыходные, "Грамм в выходные")
И ВвестиЧисло(Переменная_ВсегоДней, "Количество дней приема") Тогда
// Переходим к расчету
КонецЕсли;
Согласно условию, мы обязаны хранить информацию за каждый день в массиве. Разберем логику: нам нужно пройти циклом от 1 до ВсегоДней. Чтобы определить, является ли день будним или выходным, воспользуемся операцией остатка от деления на 7.
Проанализируем алгоритм определения дня недели:
Для Счетчик = 1 По ВсегоДней Цикл.ДеньНедели = (Счетчик - 1) % 7 + 1.ДеньНедели меньше или равен 5 — это будни, если 6 или 7 — выходные.ЧастотаПриема и добавляем результат в Массив.
ПриемыМассив = Новый Массив;
Для НомерДня = 1 По Переменная_ВсегоДней Цикл
ТекущийДеньНедели = (НомерДня - 1) % 7 + 1; // Понедельник = 1, Воскресенье = 7
Если ТекущийДеньНедели <= 5 Тогда
ДневнаяНорма = Переменная_ПротеинВБудни * Переменная_ЧастотаПриема;
Иначе
ДневнаяНорма = Переменная_ПротеинВВыходные * Переменная_ЧастотаПриема;
КонецЕсли;
ПриемыМассив.Добавить(ДневнаяНорма);
КонецЦикла;
Теперь, когда у нас есть заполненный Массив, мы должны рассчитать еженедельное потребление. Выясним причину, почему это лучше делать вторым проходом: это разделяет логику подготовки данных и логику формирования отчета, что является хорошим тоном в программировании.
Рассмотрим пошагово процесс вывода:
СуммаЗаНеделю и ОбщаяСумма, обнулив их перед циклом.СуммаЗаНеделю.
ОбщаяСумма = 0;
СуммаЗаНеделю = 0;
НомерНедели = 1;
Для Индекс = 0 По ПриемыМассив.Количество() - 1 Цикл
ТекущийПрием = ПриемыМассив[Индекс];
СуммаЗаНеделю = СуммаЗаНеделю + ТекущийПрием;
ОбщаяСумма = ОбщаяСумма + ТекущийПрием;
// Проверяем, наступил ли конец недели (каждый 7-й день) или конец всего периода
Если (Индекс + 1) % 7 = 0 Или (Индекс + 1) = ПриемыМассив.Количество() Тогда
Сообщить(СтрШаблон("Неделя %1 – %2гр", НомерНедели, СуммаЗаНеделю));
СуммаЗаНеделю = 0;
НомерНедели = НомерНедели + 1;
КонецЕсли;
КонецЦикла;
Сообщить(СтрШаблон("Всего – %1гр", ОбщаяСумма));
Выясним, какие инструменты платформы помогают сделать код чище. Использование функции СтрШаблон() позволяет избежать громоздкой конкатенации строк. Также важно помнить, что индексация в Массив в 1С начинается с нуля, поэтому при расчете остатка от деления мы используем Индекс + 1 или корректируем логику под нужды задачи.
Таким образом, мы разделили задачу на логические блоки: ввод данных, формирование структуры (массива) и анализ накопленной информации. Этот подход позволяет легко масштабировать программу, например, если потребуется изменить логику расчета только для определенных недель.