Как изменить формат даты в таблице значений и извлечь дату из строки в 1C 7.7

Программист 1С v7.7
← На главную

В процессе разработки отчетов в системе 1С:Предприятие 7.7 программисты и продвинутые пользователи часто сталкиваются с необходимостью управления отображением данных. Одной из типичных задач является приведение даты к формату с четырехзначным годом (дд.мм.гггг) в объекте ТаблицаЗначений, а также программное извлечение даты из длинных текстовых строк, например, из названия договора. Разберем эти задачи подробно, опираясь на практический опыт и стандартные возможности платформы.

Метод 1: Использование функции Формат при выводе данных

Самый простой и гибкий способ изменить визуальное представление даты — это использование встроенной функции Формат(). Рассмотрим ситуацию, когда у нас уже есть переменная типа «Дата» (например, из документа-основания), и мы хотим записать её в таблицу значений или вывести в отчет.

Функция Формат() в 1С 7.7 принимает два параметра: само значение и строку формата. Для того чтобы год всегда отображался четырьмя цифрами, мы будем использовать специальную управляющую строку.

Рассмотрим пример кода:


// Предположим, Док.ДатаДок имеет значение 01.01.23
ДатаДляВывода = Формат(Док.ДатаДок, "Д ДДММГГГГ");
// Теперь ДатаДляВывода содержит строку "01.01.2023"

Важный нюанс: Обратите внимание, что результат функции Формат() всегда является строкой. Если вы планируете в дальнейшем сортировать таблицу значений по этой колонке, помните, что строковая сортировка отличается от дат (например, "10.01.2022" может оказаться раньше "02.01.2023"). Поэтому рекомендуется хранить в ТЗ данные в типе Дата, а форматирование применять только в момент вывода в печатную форму или на экран.

Метод 2: Настройка формата при создании колонки Таблицы Значений

Малоизвестная, но очень эффективная возможность 1С 7.7 заключается в том, что формат отображения можно задать непосредственно при описании структуры таблицы значений. Метод НоваяКолонка() имеет несколько параметров, один из которых отвечает за форматирование.

Проанализируем синтаксис метода:

НоваяКолонка(Идентификатор, Тип, Длина, Точность, Заголовок, Ширина, Формат, Положение)

Рассмотрим, как применить это на практике для нашей задачи:


ТЗ = СоздатьОбъект("ТаблицаЗначений");
// Седьмой параметр отвечает за формат отображения даты
ТЗ.НоваяКолонка("ДатаДог", "Дата", , , "Дата договора", 12, "Д ДДММГГГГ");

// Теперь при заполнении колонки обычными датами:
ТЗ.НоваяСтрока();
ТЗ.ДатаДог = РабочаяДата(); // В ТЗ визуально отобразится дд.мм.гггг

Этот способ хорош тем, что данные в колонке остаются полноценным типом Дата, что позволяет корректно выполнять сортировку командой ТЗ.Сортировать("ДатаДог"), но при просмотре таблицы пользователем год будет четырехзначным.

Метод 3: Извлечение даты из сложной строки договора

Часто бухгалтеры вводят информацию в поле «Договор» в свободном виде, например: "Ш-372 от 08.07.2019г.". Чтобы программно выделить отсюда дату, нам потребуется использовать строковые функции поиска и выделения подстроки. Выясним, как сделать алгоритм устойчивым к изменениям в конце строки (наличие или отсутствие «г.»).

Разберем по шагам алгоритм поиска:

  1. Найдем позицию ключевого слова " от ". Важно искать именно с пробелами, чтобы не "поймать" часть другого слова.
  2. Отсчитаем позицию начала самой даты.
  3. Выделим 10 символов, которые обычно составляют дату (дд.мм.гггг).

Пример реализации:


СтрокаДоговора = "Ш-372 от 08.07.2019г.";
// Ищем вхождение разделителя
Поз = Найти(СтрокаДоговора, " от ");

Если Поз > 0 Тогда
    // Дата начинается через 4 символа после начала " от " (с учетом пробелов)
    ДатаСтрокой = Сред(СтрокаДоговора, Поз + 4, 10);
    
    // Если в конце могли написать "08.07.19" (8 символов), 
    // можно добавить дополнительную логику очистки от "г."
    ДатаСтрокой = СтрЗаменить(ДатаСтрокой, "г", "");
    ДатаСтрокой = СтрЗаменить(ДатаСтрокой, ".", "");
    
    // Преобразуем очищенную строку обратно в дату, если это необходимо
    // В 7.7 функция Дата() требует формат ГГГГММДД или ДД.ММ.ГГ
    // Надежнее собрать её вручную или использовать встроенные механизмы
КонецЕсли;

Метод 4: Глобальные настройки системы

Иногда формат отображения даты зависит не от кода, а от настроек окружения. Если во всей программе даты отображаются с двумя цифрами года, стоит проверить системные параметры. Проследуем по пути: Меню — Сервис — Параметры — вкладка «Общие».

Здесь можно найти настройки:

Рекомендация: Чтобы ваш отчет выглядел одинаково у всех пользователей, независимо от их персональных настроек, всегда используйте явное форматирование в коде (как в Методе 1 или 2).

Продвинутый подход: Работа с регулярными выражениями (VBScript.RegExp)

Если формат строки договора постоянно меняется (например, "Договор №123 от 01.01.2023" или "Дата: 01.01.2023, Договор поставки"), обычный поиск Найти() может подвести. В среде Windows (на которой работает 1С 7.7) можно вызвать объект регулярных выражений для поиска даты по шаблону.

Проанализируем пример использования:


RegExp = СоздатьОбъект("VBScript.RegExp");
RegExp.IgnoreCase = 1;
RegExp.Global = 1;
RegExp.Pattern = "\d{2}\.\d{2}\.\d{4}"; // Шаблон для поиска дд.мм.гггг

Matches = RegExp.Execute(СтрокаДоговора);
Если Matches.Count > 0 Тогда
    Результат = Matches.Item(0).Value;
    Сообщить("Найдена дата: " + Результат);
КонецЕсли;

Этот способ является наиболее профессиональным и надежным, так как он находит дату в любом месте строки, независимо от окружающего текста.

Резюме

Для решения поставленной задачи мы рассмотрели несколько инструментов. Если нужно просто изменить вид даты в колонке таблицы — используйте параметр Формат в методе НоваяКолонка. Если же нужно "вытащить" дату из текста — применяйте функции Найти и Сред, либо используйте регулярные выражения для максимальной точности. Помните о разнице между типом Дата и строковым представлением, чтобы не потерять возможность правильной сортировки данных в отчете.

← На главную