В процессе разработки на платформе 1С часто возникает задача взаимодействия с пользователем для получения даты и последующей обработки этой информации. Одной из классических учебных и практических задач является определение дня недели по введенной дате. В этой статье мы подробно рассмотрим несколько способов решения этой задачи: от использования встроенных функций форматирования до создания собственных алгоритмов на основе массивов, а также разберем нюансы работы с диалоговыми окнами в современных версиях платформы.
Начнем с самого эффективного и профессионального метода. Платформа 1С обладает мощным механизмом форматирования данных, который позволяет получить строковое представление даты (включая название дня недели) без написания сложных условий. Разберем этот метод подробнее.
Функция Формат() принимает два основных параметра: значение (наша дата) и форматную строку. Для получения полного названия дня недели используется параметр ДФ=дддд. Если же нам требуется сокращенное название (например, "Пн", "Вт"), мы используем ддд.
Рассмотрим пример кода:
ВыбраннаяДата = ТекущаяДата(); // Предположим, дата получена от пользователя
НазваниеДня = Формат(ВыбраннаяДата, "ДФ=дддд");
Сообщить("Сегодня: " + НазваниеДня);
Преимущества этого метода:
Иногда перед программистом стоит задача вывести кастомные названия дней недели (например, только заглавными буквами или на другом языке, независимо от настроек системы). В этом случае мы проанализируем ситуацию и воспользуемся функцией ДеньНедели().
Функция ДеньНедели() возвращает число от 1 (понедельник) до 7 (воскресенье). Важно помнить, что в 1С индексы массивов начинаются с 0, поэтому при сопоставлении номера дня с элементом массива нам нужно вычитать единицу.
Разберем реализацию через массив по шагам:
// 1. Создаем и заполняем массив названий
МассивДней = Новый Массив;
МассивДней.Добавить("Понедельник");
МассивДней.Добавить("Вторник");
МассивДней.Добавить("Среда");
МассивДней.Добавить("Четверг");
МассивДней.Добавить("Пятница");
МассивДней.Добавить("Суббота");
МассивДней.Добавить("Воскресенье");
// 2. Получаем номер дня недели (1-7)
НомерДня = ДеньНедели(ВыбраннаяДата);
// 3. Извлекаем название по индексу (0-6)
ДеньПрописью = МассивДней[НомерДня - 1];
Сообщить(ДеньПрописью);
Существует еще один интересный метод, который часто встречается в старых типовых конфигурациях или учебных примерах. Он основан на использовании функции СтрПолучитьСтроку() и многострочного текста. Выясним, как это работает.
Мы создаем строку, где каждый день недели находится на новой строчке, а затем программно "выдергиваем" нужную строку по ее номеру. Посмотрим на пример:
СписокДней = "понедельник
|вторник
|среда
|четверг
|пятница
|суббота
|воскресенье";
НомерДня = ДеньНедели(ТекущаяДата());
ДеньПрописью = СтрПолучитьСтроку(СписокДней, НомерДня);
Сообщить(ДеньПрописью);
Этот способ удобен тем, что он нагляден, однако он менее производителен, чем работа с массивом, так как системе приходится каждый раз парсить строку для поиска нужного фрагмента.
Теперь перейдем к первой части задачи — запросу даты. Здесь важно различать "старый" (модальный) и "новый" (асинхронный) подходы. Проанализируем разницу.
Модальный подход (устаревший): Команда ВвестиДату() открывает окно и полностью останавливает выполнение кода до тех пор, пока пользователь не нажмет "ОК" или "Отмена".
ПеременнаяДата = ТекущаяДата();
Если ВвестиДату(ПеременнаяДата, "Введите дату для анализа") Тогда
// Код выполнится только после закрытия окна
Название = Формат(ПеременнаяДата, "ДФ=дддд");
Предупреждение(Название);
КонецЕсли;
Современный подход (немодальный): В современных конфигурациях 1С (начиная с платформы 8.3) использование модальных окон часто запрещено настройками конфигурации ("Режим использования модальности"). В этом случае мы должны использовать процедуру ПоказатьВводДаты().
Работа с ПоказатьВводДаты() требует создания специальной процедуры-обработчика (callback), которая будет вызвана платформой после того, как пользователь выберет дату. Это позволяет системе не "замораживать" интерфейс. При необходимости организовать интерактивный ввод нескольких дней можно использовать форму календаря для множественного выбора дат без зажатия клавиши Ctrl.
Проанализируем критически важный момент: что произойдет, если пользователь не выберет дату и нажмет "Отмена"? В переменной останется так называемая "Пустая дата" (01.01.0001). Если передать такую дату в функцию ДеньНедели(), результат может быть непредсказуемым или привести к логической ошибке.
Всегда проверяйте заполнение данных:
Если ЗначениеЗаполнено(ВыбраннаяДата) Тогда
// Выполняем расчеты
Иначе
Сообщить("Дата не была выбрана!");
КонецЕсли;
Мы рассмотрели три различных способа получения названия дня недели и разобрались с тем, как запрашивать данные у пользователя. В реальной практике рекомендуется использовать функцию Формат(), так как она наиболее надежна и учитывает региональные настройки. Если же вы только учитесь, полезно реализовать задачу через Массив, чтобы лучше понять принципы работы с индексами и коллекциями в 1С. Также не забывайте о современных требованиях к отказу от модальности, чтобы ваш код успешно работал в любых современных конфигурациях.