В процессе разработки отчетов в системе 1С:Предприятие 7.7 программисты и продвинутые пользователи часто сталкиваются с необходимостью управления отображением данных. Одной из типичных задач является приведение даты к формату с четырехзначным годом (дд.мм.гггг) в объекте ТаблицаЗначений, а также программное извлечение даты из длинных текстовых строк, например, из названия договора. Разберем эти задачи подробно, опираясь на практический опыт и стандартные возможности платформы.
Самый простой и гибкий способ изменить визуальное представление даты — это использование встроенной функции Формат(). Рассмотрим ситуацию, когда у нас уже есть переменная типа «Дата» (например, из документа-основания), и мы хотим записать её в таблицу значений или вывести в отчет.
Функция Формат() в 1С 7.7 принимает два параметра: само значение и строку формата. Для того чтобы год всегда отображался четырьмя цифрами, мы будем использовать специальную управляющую строку.
Рассмотрим пример кода:
// Предположим, Док.ДатаДок имеет значение 01.01.23
ДатаДляВывода = Формат(Док.ДатаДок, "Д ДДММГГГГ");
// Теперь ДатаДляВывода содержит строку "01.01.2023"
Важный нюанс: Обратите внимание, что результат функции Формат() всегда является строкой. Если вы планируете в дальнейшем сортировать таблицу значений по этой колонке, помните, что строковая сортировка отличается от дат (например, "10.01.2022" может оказаться раньше "02.01.2023"). Поэтому рекомендуется хранить в ТЗ данные в типе Дата, а форматирование применять только в момент вывода в печатную форму или на экран.
Малоизвестная, но очень эффективная возможность 1С 7.7 заключается в том, что формат отображения можно задать непосредственно при описании структуры таблицы значений. Метод НоваяКолонка() имеет несколько параметров, один из которых отвечает за форматирование.
Проанализируем синтаксис метода:
НоваяКолонка(Идентификатор, Тип, Длина, Точность, Заголовок, Ширина, Формат, Положение)
Рассмотрим, как применить это на практике для нашей задачи:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
// Седьмой параметр отвечает за формат отображения даты
ТЗ.НоваяКолонка("ДатаДог", "Дата", , , "Дата договора", 12, "Д ДДММГГГГ");
// Теперь при заполнении колонки обычными датами:
ТЗ.НоваяСтрока();
ТЗ.ДатаДог = РабочаяДата(); // В ТЗ визуально отобразится дд.мм.гггг
Этот способ хорош тем, что данные в колонке остаются полноценным типом Дата, что позволяет корректно выполнять сортировку командой ТЗ.Сортировать("ДатаДог"), но при просмотре таблицы пользователем год будет четырехзначным.
Часто бухгалтеры вводят информацию в поле «Договор» в свободном виде, например: "Ш-372 от 08.07.2019г.". Чтобы программно выделить отсюда дату, нам потребуется использовать строковые функции поиска и выделения подстроки. Выясним, как сделать алгоритм устойчивым к изменениям в конце строки (наличие или отсутствие «г.»).
Разберем по шагам алгоритм поиска:
Пример реализации:
СтрокаДоговора = "Ш-372 от 08.07.2019г.";
// Ищем вхождение разделителя
Поз = Найти(СтрокаДоговора, " от ");
Если Поз > 0 Тогда
// Дата начинается через 4 символа после начала " от " (с учетом пробелов)
ДатаСтрокой = Сред(СтрокаДоговора, Поз + 4, 10);
// Если в конце могли написать "08.07.19" (8 символов),
// можно добавить дополнительную логику очистки от "г."
ДатаСтрокой = СтрЗаменить(ДатаСтрокой, "г", "");
ДатаСтрокой = СтрЗаменить(ДатаСтрокой, ".", "");
// Преобразуем очищенную строку обратно в дату, если это необходимо
// В 7.7 функция Дата() требует формат ГГГГММДД или ДД.ММ.ГГ
// Надежнее собрать её вручную или использовать встроенные механизмы
КонецЕсли;
Иногда формат отображения даты зависит не от кода, а от настроек окружения. Если во всей программе даты отображаются с двумя цифрами года, стоит проверить системные параметры. Проследуем по пути: Меню — Сервис — Параметры — вкладка «Общие».
Здесь можно найти настройки:
Рекомендация: Чтобы ваш отчет выглядел одинаково у всех пользователей, независимо от их персональных настроек, всегда используйте явное форматирование в коде (как в Методе 1 или 2).
Если формат строки договора постоянно меняется (например, "Договор №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;
Сообщить("Найдена дата: " + Результат);
КонецЕсли;
Этот способ является наиболее профессиональным и надежным, так как он находит дату в любом месте строки, независимо от окружающего текста.
Для решения поставленной задачи мы рассмотрели несколько инструментов. Если нужно просто изменить вид даты в колонке таблицы — используйте параметр Формат в методе НоваяКолонка. Если же нужно "вытащить" дату из текста — применяйте функции Найти и Сред, либо используйте регулярные выражения для максимальной точности. Помните о разнице между типом Дата и строковым представлением, чтобы не потерять возможность правильной сортировки данных в отчете.