Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
08 янв 2026, 02:42

ШагЗаполнения

Автор Дмитрий Корнилов, 25 окт 2025, 19:15

0 Пользователей и 1 гость просматривают эту тему.

Дмитрий Корнилов

Здравствуйте, помогите пожалуйста исправить задачу

Создайте обработку, на которой будут два поля с типом значения Дата и с видом даты Время.
Пользователь вводит время в первое поле и время во второе поле. Сделайте проверку ввода
времени в поля: чтобы всегда время, введенное во второе поле, было больше времени в первом
поле. Разместите на поле переключатель с тремя пунктами: Заполнить с шагом в час, Заполнить
с шагом в полчаса, Заполнить с шагом в 10 минут. Создайте и заполните одномерный массив, в
котором первым элементом будет время, введенное в первом поле, второй элемент будет
больше первого элемента на то количество минут, которое указано в переключателе, и так
далее. Последний элемент будет соответствовать времени, указанном в последнем поле.
Выведите элементы массива в окно сообщений.

&НаКлиенте
// Вспомогательная функция для добавления минут к дате
// 1 минута = 60 секунд. Используется для корректного расчета времени.
Функция ДобавитьМинуты(Дата, КоличествоМинут)
    Возврат Дата + КоличествоМинут * 60;
КонецФункции
 
&НаКлиенте
Процедура ВремяНачалаПриИзменении(Элемент)
   
    // Проверка, что ВремяНачала меньше ВремяКонца.
    // Если условие не выполнено, корректируем ВремяКонца.
    Если ЗначениеЗаполнено(Объект.ВремяНачала)
        И ЗначениеЗаполнено(Объект.ВремяКонца)
        И Объект.ВремяНачала >= Объект.ВремяКонца Тогда
       
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Время начала должно быть меньше времени конца! Время конца будет автоматически увеличено на 1 час.";
        Сообщение.Поле = "ВремяКонца";
        Сообщение.Сообщить();
       
        // Автоматически увеличиваем ВремяКонца на 1 час (60 минут)
        Объект.ВремяКонца = ДобавитьМинуты(Объект.ВремяНачала, 60);
       
    КонецЕсли;
КонецПроцедуры
 
&НаКлиенте
Процедура ВремяКонцаПриИзменении(Элемент)
   
    // Строгая проверка, что ВремяКонца строго больше ВремяНачала.
    // Если условие не выполнено, очищаем некорректное значение.
    Если ЗначениеЗаполнено(Объект.ВремяНачала)
        И ЗначениеЗаполнено(Объект.ВремяКонца)
        И Объект.ВремяКонца <= Объект.ВремяНачала Тогда
       
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "Время конца должно быть строго больше времени начала! Значение будет сброшено.";
        Сообщение.Поле = "ВремяКонца";
        Сообщение.Сообщить();
       
        // Очищаем некорректное значение
        Объект.ВремяКонца = Неопределено;
       
    КонецЕсли;
КонецПроцедуры
 
&НаКлиенте
// Функция-помощник для определения шага в минутах (предполагая, что ШагЗаполнения - это Число 1, 2 или 3)
Функция ПолучитьШагВМинутах()
   
    Шаг = Объект.Шаг;
   
    Если Шаг = 1 Тогда
        Возврат 60; // 1 час
    ИначеЕсли Шаг = 2 Тогда
        Возврат 30; // полчаса
    ИначеЕсли Шаг = 3 Тогда
        Возврат 10; // 10 минут
    КонецЕсли;
   
    Возврат 0; // Недопустимый шаг
   
КонецФункции
 
&НаКлиенте
Процедура ЗаполнитьИВывести(Команда)
   
    Если НЕ ЗначениеЗаполнено(Объект.ВремяНачала)
        ИЛИ НЕ ЗначениеЗаполнено(Объект.ВремяКонца) Тогда
       
        Сообщить("Заполните оба поля времени!", СтатусСообщения.Важное);
        Возврат;
    КонецЕсли;
   
    // Проверка, что время конца строго больше времени начала
    Если Объект.ВремяНачала >= Объект.ВремяКонца Тогда
        Сообщить("Время конца должно быть строго больше времени начала. Проверьте введенные данные.", СтатусСообщения.Ошибка);
        Возврат;
    КонецЕсли;
   
    МассивВремени = Новый Массив();
    ШагМинут = ПолучитьШагВМинутах();
   
    Если ШагМинут = 0 Тогда
        Сообщить("Не выбран корректный шаг заполнения.", СтатусСообщения.Ошибка);
        Возврат;
    КонецЕсли;
   
    ТекущееВремя = Объект.ВремяНачала;
   
    // Цикл заполнения массива с шагом
    Пока ТекущееВремя <= Объект.ВремяКонца Цикл
       
        // Добавляем текущее время
        МассивВремени.Добавить(ТекущееВремя);
       
        // Рассчитываем следующее время
        СледующееВремя = ДобавитьМинуты(ТекущееВремя, ШагМинут);
       
        // Проверка условия завершения
        // Если следующее время превышает ВремяКонца, то оно не должно быть добавлено
        // Однако, если ВремяКонца должно быть последним элементом, мы его добавим после цикла
        Если СледующееВремя > Объект.ВремяКонца Тогда
            Прервать;
        КонецЕсли;
       
        ТекущееВремя = СледующееВремя;
       
    КонецЦикла;
   
    // Добавляем время конца, если оно не было добавлено шагом.
    // Условие: "Последний элемент будет соответствовать времени, указанному в последнем поле."
    Если МассивВремени.Количество() = 0 ИЛИ МассивВремени[МассивВремени.Количество() - 1] <> Объект.ВремяКонца Тогда
        МассивВремени.Добавить(Объект.ВремяКонца);
    КонецЕсли;
   
    // 3. Вывод элементов массива в окно сообщений
    Сообщить("--- Массив временных меток (" + МассивВремени.Количество() + " элементов) ---");
    Сообщить("Шаг: " + Строка(ШагМинут) + " мин.");
   
    Для Каждого ЭлементМассива Из МассивВремени Цикл
        // Форматируем дату для вывода только времени: "ЧЧ:ММ"
        Сообщить(Формат(ЭлементМассива, "ДФ=ЧЧ:мм"));
    КонецЦикла;
   
КонецПроцедуры

antoneus

Нет такого статуса сообщения.

Дмитрий Корнилов

antoneus, Если что посмотрите пожалуйста в выгрузке может станет более ясно

antoneus

Да что там смотреть, говорю же, такой сущности как

СтатусСообщения.Ошибка
в 1с не существует. Какие статусы существуют - в приложенной картинке. Например, можно написать СтатусСообщения.Внимание - и 1с не будет возражать.

Попробую угадать - задачи по 1с дали в универе, код писала нейросеть?

LexaK

Дмитрий Корнилов, а вам программирование вообще читали? объясняли что это такое?
цикл с условием примерно такой должен быть

    ////ВремяКонца  - сделайте реквизитом формы
    // Цикл заполнения массива с шагом
    Пока ТекущееВремя < ВремяКонца Цикл
       
        МассивВремени.добавить(ТекущееВремя );
        ТекущееВремя  = ТекущееВремя  + ШагСекунд;
       
    КонецЦикла;
    МассивВремени.добавить(ВремяКонца); //массив должен заканчиваться //

если помогло нажмите: Спасибо!

Теги:
Рейтинг@Mail.ru

Поиск