Загрузка данных
Глава 1.7. Преобразование типов и общие функции — решения задач
Краткий конспект функций
Функция Что делает
Строка(X) Преобразует число (или другое значение) в строку
Число(X) Преобразует строку в число
Дата("ГГГГММДДЧЧММСС") Преобразует строку в дату
Дата(Год, Месяц, День, Час, Мин, Сек) Создаёт дату из чисел
Мин(...) Минимум из набора
Макс(...) Максимум из набора
Правила Мин/Макс по типам:
Тип Мин Макс
Число наименьшее наибольшее
Строка самая короткая самая длинная
Дата самая ранняя самая поздняя
Булево Ложь Истина
---
Задача 1. Арифметика двух чисел одной строкой
```1С
А = 0;
Б = 0;
ВвестиЧисло(А, "Введите первое число", 10, 2);
ВвестиЧисло(Б, "Введите второе число", 10, 2);
Сообщить(Строка(А) + " + " + Строка(Б) + " = " + Строка(А + Б) + ";");
Сообщить(Строка(А) + " * " + Строка(Б) + " = " + Строка(А * Б) + ";");
Сообщить(Строка(А) + " - " + Строка(Б) + " = " + Строка(А - Б) + ";");
Сообщить(Строка(А) + " / " + Строка(Б) + " = " + Строка(А / Б) + ".");
```
Пример для 2 и 5:
```
2 + 5 = 7;
2 * 5 = 10;
2 - 5 = -3;
2 / 5 = 0,4.
```
Ключевой момент: Строка(А + Б) — сначала складываем числа, потом преобразуем в строку. Если написать Строка(А) + Строка(Б) без Строка(...) снаружи — получится склейка строк "25", а не сумма 7.
---
Задача 2. Минимум из трёх чисел
```1С
А = 0; Б = 0; В = 0;
ВвестиЧисло(А, "Введите первое число", 10, 2);
ВвестиЧисло(Б, "Введите второе число", 10, 2);
ВвестиЧисло(В, "Введите третье число", 10, 2);
Минимум = Мин(А, Б, В);
Сообщить("Из чисел " + А + ", " + Б + ", " + В + " минимальное: " + Минимум);
```
---
Задача 3. Самая поздняя и самая ранняя дата
```1С
Д1 = Дата(1, 1, 1);
Д2 = Дата(1, 1, 1);
Д3 = Дата(1, 1, 1);
ВвестиДату(Д1, "Введите первую дату", ЧастьДаты.Дата);
ВвестиДату(Д2, "Введите вторую дату", ЧастьДаты.Дата);
ВвестиДату(Д3, "Введите третью дату", ЧастьДаты.Дата);
Ф = "ДФ=""гггг-ММ-дд""";
Ранняя = Мин(Д1, Д2, Д3);
Поздняя = Макс(Д1, Д2, Д3);
Сообщить("Самая ранняя дата: " + Формат(Ранняя, Ф));
Сообщить("Самая поздняя дата: " + Формат(Поздняя, Ф));
```
Важно: Мин/Макс работают с датами напрямую — не нужно преобразовывать.
---
Задача 4. Самая короткая и самая длинная строка — два способа
Способ 1. Через Мин/Макс (сравнение строк как значений)
```1С
С1 = ""; С2 = ""; С3 = "";
ВвестиСтроку(С1, "Введите первую строку", 100);
ВвестиСтроку(С2, "Введите вторую строку", 100);
ВвестиСтроку(С3, "Введите третью строку", 100);
Короткая = Мин(С1, С2, С3);
Длинная = Макс(С1, С2, С3);
Сообщить("Самая короткая строка: " + Короткая);
Сообщить("Самая длинная строка: " + Длинная);
```
⚠️ Важно: Мин/Макс для строк сравнивают их по алфавиту (лексикографически), а не по длине! Формулировка в лекции («самая маленькая по длине») некорректна. Для честного поиска по длине нужен способ 2.
Способ 2. Через СтрДлина (сравнение чисел)
```1С
С1 = ""; С2 = ""; С3 = "";
ВвестиСтроку(С1, "Введите первую строку", 100);
ВвестиСтроку(С2, "Введите вторую строку", 100);
ВвестиСтроку(С3, "Введите третью строку", 100);
// Сначала — минимум по длине
Длина1 = СтрДлина(С1);
Длина2 = СтрДлина(С2);
Длина3 = СтрДлина(С3);
МинДлина = Мин(Длина1, Длина2, Длина3);
МаксДлина = Макс(Длина1, Длина2, Длина3);
// Теперь находим, какая из строк соответствует этой длине
Короткая = ?(Длина1 = МинДлина, С1, ?(Длина2 = МинДлина, С2, С3));
Длинная = ?(Длина1 = МаксДлина, С1, ?(Длина2 = МаксДлина, С2, С3));
Сообщить("Самая короткая строка: " + Короткая + " (" + МинДлина + " симв.)");
Сообщить("Самая длинная строка: " + Длинная + " (" + МаксДлина + " симв.)");
```
---
Задача 5. Преобразовать «20.09.2012» в дату
Проблема: Дата("20.09.2012") не сработает — строка должна быть в формате ГГГГММДД.
Значит, надо переставить части:
```1С
Стр = "20.09.2012";
// Разбираем на части
Т1 = Найти(Стр, ".");
Т2 = Найти(Сред(Стр, Т1 + 1, СтрДлина(Стр) - Т1), ".");
День = Лев(Стр, Т1 - 1);
Остаток = Сред(Стр, Т1 + 1, СтрДлина(Стр) - Т1);
Т2 = Найти(Остаток, ".");
Месяц = Лев(Остаток, Т2 - 1);
Год = Сред(Остаток, Т2 + 1, СтрДлина(Остаток) - Т2);
// Собираем в формат ГГГГММДД и преобразуем
ДатаИзСтроки = Дата(Год + Месяц + День);
Сообщить(Формат(ДатаИзСтроки, "ДФ=""гггг-ММ-дд"""));
```
Результат: 2012-09-20 ✅
Более короткий вариант — через Дата(Год, Месяц, День)
```1С
Стр = "20.09.2012";
День = Число(Лев(Стр, 2));
Месяц = Число(Сред(Стр, 4, 2));
Год = Число(Прав(Стр, 4));
ДатаИзСтроки = Дата(Год, Месяц, День);
Сообщить(Формат(ДатаИзСтроки, "ДФ=""гггг-ММ-дд"""));
```
---
Задача 6. Метод извлечения количества товара
Строки вида:
```
23452 Карандаш зеленый кол-во 34
22111 Ручка шариковая кол-во 45
```
Нужно получить число (34, 45).
Логика
Количество — последнее слово в строке (после кол-во ). Значит:
1. Найти "кол-во "
2. Взять всё после него
3. Преобразовать через Число()
```1С
// Процедура-метод
Функция ПолучитьКоличество(СтрокаТовара)
Поз = Найти(СтрокаТовара, "кол-во ");
КолСтр = СокрЛП(Сред(СтрокаТовара, Поз + 7, СтрДлина(СтрокаТовара) - Поз - 6));
Возврат Число(КолСтр);
КонецФункции
// Использование
Сообщить(ПолучитьКоличество("23452 Карандаш зеленый кол-во 34")); // 34
Сообщить(ПолучитьКоличество("22111 Ручка шариковая кол-во 45")); // 45
```
Пояснение чисел:
· Поз + 7 — начинаем после "кол-во " (7 символов: к,о,л,-,в,о, )
· СтрДлина - Поз - 6 — длина остатка (минус длина "кол-во " без первого символа)
Вариант короче — через Прав (если количество всегда в конце)
```1С
Функция ПолучитьКоличество(СтрокаТовара)
// Ищем последний пробел — количество идёт после него
Пробел = 0;
Для Сч = 1 По СтрДлина(СтрокаТовара) Цикл
Если Сред(СтрокаТовара, Сч, 1) = " " Тогда
Пробел = Сч;
КонецЕсли;
КонецЦикла;
Возврат Число(Сред(СтрокаТовара, Пробел + 1, СтрДлина(СтрокаТовара) - Пробел));
КонецФункции
```
---
Задача 7. Дата из введённых дня, месяца, года
```1С
День = 0;
Месяц = 0;
Год = 0;
ВвестиЧисло(День, "Введите день", 2, 0);
ВвестиЧисло(Месяц, "Введите месяц", 2, 0);
ВвестиЧисло(Год, "Введите год", 4, 0);
Результат = Дата(Год, Месяц, День);
// Любой удобный формат
Сообщить("Дата: " + Формат(Результат, "ДФ=""дд.ММ.гггг"""));
Сообщить("Дата: " + Формат(Результат, "ДЛФ=ДД"));
Сообщить("Дата: " + Формат(Результат, "ДФ=""гггг-ММ-дд"""));
```
Пример для 20, 9, 2012:
```
Дата: 20.09.2012
Дата: 20 сентября 2012 г.
Дата: 2012-09-20
```
---
Ключевые приёмы раздела
Приём Пример Где применяется
Число → строка Строка(5) Задача 1
Строка → число Число("34") Задача 6
Строка → дата Дата("20120920") Задача 5
Дата из чисел Дата(2012, 9, 20) Задачи 5, 7
Минимум/максимум Мин(...), Макс(...) Задачи 2, 3, 4
Формат даты Формат(Д, "ДФ=""…""") Задачи 3, 5, 7
Важные замечания
1. Строка(А + Б) ≠ Строка(А) + Строка(Б)
· Первое: сложить числа, потом в строку → "7"
· Второе: склеить две строки → "25"
2. Мин/Макс для строк сравнивают по алфавиту, а не по длине
· Для сравнения по длине используйте СтрДлина + Мин/Макс по числам
3. Дата("20.09.2012") не работает — строка должна быть ГГГГММДД
· Правильно: Дата("20120920") или Дата(2012, 9, 20)
4. Число() терпит лишние пробелы — Число(" 34 ") вернёт 34
· Но лучше на всякий случай оборачивать в СокрЛП