Начнем с распространенной ситуации, когда возникает путаница между различными понятиями дат в 1С:Предприятии. Часто пользователи и разработчики задаются вопросом, как правильно работать с датами, особенно когда требуется управлять датой создания новых документов или проводить их «задним числом». Рассмотрим, как отличить ТекущаяДата() от РабочаяДата, и разберем механизмы, позволяющие гибко управлять датами в вашей системе.
Многие из нас сталкивались с желанием «откатить» документы на определенную дату или обеспечить, чтобы новые документы по умолчанию создавались с конкретной датой, отличной от системной. Именно об этом шла речь в нашей дискуссии, где мы выясняли, можно ли менять дату через меню «Сервис» и какие функции для этого подходят.
Для начала, давайте четко определим основные понятия, чтобы избежать дальнейших недоразумений. В 1С существует несколько сущностей, связанных с датами, и каждая имеет свое назначение.
Дата – это базовый тип данных в 1С:Предприятии. Мы должны понимать, что любое значение типа Дата всегда хранит в себе как календарную дату, так и время, причем с точностью до секунд. Это очень важно, поскольку позволяет нам оперировать датами, включающими только календарную часть (например, дату рождения), только время (например, начало рабочего дня) или полную комбинацию даты и времени (например, момент проведения документа).
ТекущаяДата() – это функция, которая возвращает нам текущие системные дату и время. Мы должны помнить, что эта дата берется с компьютера, на котором выполняется код.
ТекущаяДата() в клиент-серверных информационных базах, особенно при работе с управляемыми формами в модели сервиса (SaaS). Почему? Потому что это может привести к значительным расхождениям во времени между клиентом и сервером. Разные часовые пояса, некорректно настроенное системное время на одном из компьютеров или даже обычная сетевая задержка могут вызвать серьезные ошибки в логике работы нашей системы, особенно там, где важна строгая хронология документов.РабочаяДата – это не функция, как ТекущаяДата(), а скорее концепция или параметр, который значительно упрощает работу с датами при создании новых документов.
РабочейДаты – обеспечить удобство ввода документов «задним числом» или автоматическую подстановку заранее определенной даты по умолчанию при создании новых документов. То есть, когда мы создаем новый документ, система предлагает нам не системную дату, а ту, которую мы задали как «рабочую».РабочаяДата существовала как переменная глобального контекста. Это означало, что ее можно было не только менять через пользовательский интерфейс, но и программно.
// Получение текущей РабочейДаты
ТекущаяРабочаяДата = РабочаяДата;
Сообщить("Текущая рабочая дата: " + ТекущаяРабочаяДата);
// Установка новой РабочейДаты (программно, в обычных формах)
РабочаяДата = '20230101'; // Устанавливаем 1 января 2023 года
Сообщить("Новая рабочая дата установлена: " + РабочаяДата);
Для полноты картины и в ответ на реплики из обсуждения, мы также рассмотрим несколько других функций, которые могут быть полезны, хотя и не являются прямым решением исходного вопроса.
ТекущаяДатаСеанса() – эта функция возвращает нам текущую дату сеанса, но, что очень важно, она приведена к часовому поясу пользователя. Мы рекомендуем использовать ее в серверном коде вместо ТекущаяДата() для избежания проблем с часовыми поясами и расхождением клиентского и серверного времени. В Библиотеке стандартных подсистем (БСП) также существует клиентская функция ДатаСеанса(), которая возвращает время, максимально близкое к ТекущаяДатаСеанса(), для использования в клиентском коде, когда прямой вызов сервера нецелесообразен.
ТекущаяУниверсальнаяДатаВМиллисекундах() – эта мощная функция возвращает текущую универсальную дату (UTC) в миллисекундах, отсчитываемых с начала эпохи 01.01.0001 00:00:00. Мы используем ее для высокоточных измерений времени, например, при оценке производительности выполнения участков кода или для формирования уникальных идентификаторов, включающих миллисекундную точность. Для нашей текущей задачи по подстановке дат она избыточна, но полезно знать о ее существовании.
Механизм работы с РабочейДатой значительно эволюционировал со временем, и мы должны четко понимать эти различия.
Мы уже упоминали, что в более старых конфигурациях, построенных на обычных формах, РабочаяДата действительно была свойством глобального контекста. Это позволяло нам изменять ее как через пользовательский интерфейс, так и программно в коде, влияя на все вновь создаваемые документы.
С переходом на управляемые формы и активным использованием Библиотеки стандартных подсистем (БСП) подход изменился. Мы обнаружим, что платформенная РабочаяДата может не использоваться напрямую. Вместо этого в БСП реализован собственный, более гибкий механизм управления «рабочей датой».
РабочаяДата, функциональность ее подстановки сохраняется, но уже на уровне прикладного решения.Теперь давайте разберем, как мы, как пользователи или администраторы, можем изменить РабочуюДату через интерфейс программы. Это прямо отвечает на вопрос о возможности изменения даты через меню «Сервис».
Открываем персональные настройки:
Для большинства типовых конфигураций на управляемых формах мы найдем эти настройки в меню «Главное» (иногда «Сервис») или через раздел «Настройки» в панели действий. Нам нужно найти пункт, который обычно называется «Персональные настройки» или «Параметры пользователя».
Находим параметр даты:
В открывшемся окне нам следует найти группу настроек, связанных с датами. Часто это будет параметр «Рабочая дата» или «Дата подстановки в новые документы».
Выбираем нужный режим:
Обычно нам предлагают два основных варианта:
Сохраняем изменения:
После выбора нужного варианта не забудьте нажать кнопку «Записать и закрыть» или «ОК», чтобы наши изменения вступили в силу.
Что происходит после установки «Другой даты»? Мы должны четко понимать: после того, как мы установили «Другую дату» в своих персональных настройках, все новые документы, которые мы будем создавать, будут по умолчанию предлагать эту дату. Это очень удобно, если мы работаем с документами за определенный период или хотим ввести документы «задним числом». Однако, это не означает, что «все документы будут редактироваться на эту дату». Мы всегда можем вручную изменить дату конкретного документа при его создании или редактировании, независимо от РабочейДаты. РабочаяДата лишь предоставляет значение по умолчанию, но не навязывает его жестко.
Исходя из всего вышесказанного, мы можем сформулировать несколько ключевых практических советов.
Используем РабочуюДату для удобства ввода:
Если наша задача – обеспечить удобство ввода новых документов за определенный период или «задним числом», то РабочаяДата через пользовательские настройки – наш идеальный инструмент. Мы настраиваем ее один раз, и система автоматически подставляет нужное значение. Это значительно ускоряет работу.
Осторожно с ТекущаяДата():
Мы должны быть крайне осторожны при использовании функции ТекущаяДата(), особенно в клиент-серверных и распределенных системах. Всегда помните о потенциальных расхождениях во времени между клиентом и сервером. Если нам нужна актуальная серверная дата и время, приведенная к часовому поясу пользователя, предпочтительнее использовать ТекущаяДатаСеанса().
Установка даты документа:
Независимо от РабочейДаты, фактическая дата любого документа в 1С всегда хранится в его реквизите Дата. Мы можем установить ее программно или изменить вручную через форму документа.
// Пример присвоения даты новому документу (концептуальный)
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = '20230315103000'; // Устанавливаем конкретную дату и время
// Или используем РабочуюДату как значение по умолчанию
// НовыйДокумент.Дата = РабочаяДата; // Если РабочаяДата доступна в глобальном контексте
// В современных конфигурациях, значение уже будет подставлено при создании
// из настроек пользователя.
НовыйДокумент.Записать();
"Откат" документов:
Что касается "отката" документов на любую дату, как это было сформулировано в вопросе – если мы говорим о существующих проведенных документах, то это означает изменение их даты и, возможно, перепроведение. Это более сложная задача, требующая отдельной логики, которая проверяет корректность таких операций (например, не нарушает ли это хронологию). РабочаяДата здесь не поможет, так как она влияет только на дату по умолчанию для новых документов.
Мы подробно рассмотрели основные понятия, связанные с датами в 1С:Предприятии, а также выяснили, как управлять подстановкой дат по умолчанию для новых документов. Мы теперь четко понимаем, что ТекущаяДата() и РабочаяДата – это разные сущности с разными целями. РабочаяДата является удобным инструментом для пользователя, позволяющим контролировать дату по умолчанию для создаваемых документов через простые настройки в интерфейсе программы, что значительно упрощает работу с учетными данными. Всегда анализируйте контекст использования даты, чтобы выбрать наиболее подходящий инструмент и избежать нежелательных ошибок.