Загрузка данных


Глава 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
   · Но лучше на всякий случай оборачивать в СокрЛП