Как сделать дату в документе 1С заполняемой по умолчанию, но доступной для редактирования?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе освоения разработки на платформе «1С:Предприятие 8» начинающие специалисты часто сталкиваются с задачей автоматического заполнения реквизитов документов. Один из классических вопросов: как сделать так, чтобы при создании нового документа в поле даты автоматически подставлялись текущие дата и время (то, что новички часто называют «системной датой»), но при этом у пользователя оставалась возможность вручную отредактировать это значение?

На первый взгляд задача кажется простой, однако при её решении в реальных проектах легко совершить критические ошибки, которые приведут к сбоям в учете, нарушению хронологии и проблемам при работе в разных часовых поясах. В этой статье мы подробно разберем как базовые методы решения, так и профессиональные стандарты разработки фирмы «1С», которые гарантируют стабильную работу вашей конфигурации.

Разбор базового решения (на примере обычных форм)

Обратимся к решению, которое часто предлагают на форумах для старых версий платформ или обычных форм. Проанализируем пример кода, выполняемый при открытии формы документа:


Процедура ПриОткрытии()
    Если ЭтоНовый() Тогда
        Дата = ТекущаяДата();
    КонецЕсли;
КонецПроцедуры

Давайте подробно разберем, как устроен этот механизм:

  1. Метод ЭтоНовый() проверяет, был ли данный документ уже записан в базу данных. Если документ только что создается пользователем и еще не сохранен, метод возвращает значение Истина.
  2. Если условие выполняется, реквизиту Дата присваивается значение, возвращаемое функцией ТекущаяДата().
  3. Благодаря проверке Если ЭтоНовый() Тогда, при повторном открытии уже сохраненного ранее документа существующая дата не будет перезаписываться текущим временем компьютера.
  4. Поскольку поле на форме связано с реквизитом Дата, пользователь видит заполненное значение, но сама форма не блокирует элемент управления — поле остается доступным для ручного изменения.

Несмотря на то, что этот код решает задачу «в лоб», в современной разработке на платформе «1С:Предприятие 8.3» использовать его в таком виде настоятельно не рекомендуется. Давайте выясним причины.

Критический анализ: почему ТекущаяДата() — это ловушка в клиент-серверной архитектуре

Метод ТекущаяДата() возвращает системное время компьютера, на котором выполняется данный код. В клиент-серверном варианте работы системы это может привести к серьезным ошибкам, описанным в стандарте разработки 1С № 643 «Работа в разных часовых поясах»:

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

Архитектурная ошибка: почему нельзя инициализировать данные в модуле формы

Еще одна важная деталь, которую упускают новички, — это место написания кода. Если мы прописываем инициализацию значений по умолчанию в модуле формы (например, в процедурах ПриОткрытии или ПриСозданииНаСервере), мы привязываем логику работы к интерактивному интерфейсу.

Рассмотрим ситуацию: в компании внедряется интеграция, и новые документы создаются программно (например, загружаются из внешнего файла, мобильного приложения или по API). При программном создании объект создается непосредственно в памяти сервера, и его форма вообще не открывается. В результате весь код, написанный внутри формы, просто не выполнится, и документ запишется с пустой датой.

Правило хорошего тона: заполнение любых реквизитов по умолчанию для новых объектов должно происходить в Модуле объекта в предопределенной процедуре ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка).

Давайте посмотрим, как правильно написать этот код в модуле объекта документа:


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    // Заполняем реквизит текущим временем сеанса пользователя
    // Этот код сработает как при интерактивном создании, так и при программном
    ИмяВашегоРеквизитаДаты = ТекущаяДатаСеанса();
    
КонецПроцедуры

Данный обработчик вызывается платформой автоматически при создании любого нового объекта. При этом система сама заботится о том, чтобы этот код не затирал данные уже существующих документов при их последующем открытии.

Встроенные механизмы платформы «1С:Предприятие» (без написания кода)

Если речь идет о стандартном реквизите документа Дата, то писать код в большинстве случаев вообще не требуется! Платформа 1С обладает мощным встроенным механизмом работы с датами документов:

  1. При интерактивном создании нового документа в форму автоматически подставляется текущая дата сеанса. Пользователь сразу видит её и может редактировать.
  2. В свойствах формы документа (или в свойствах самого документа) существует важнейшая настройка — «Автовремя». Она определяет поведение системы при записи и проведении документа:
    • Не использовать: документ записывается ровно с тем временем, которое указано в форме (или на момент нажатия кнопки «Записать»).
    • Текущее или последнее: система анализирует другие документы за этот день и автоматически сдвигает время нового документа так, чтобы он гарантированно встал в конец хронологической последовательности текущего дня.
    • Оперативное: при оперативном проведении система автоматически присваивает документу текущую оперативную отметку времени, что исключает коллизии в последовательностях проведения.

Пошаговое руководство по правильной реализации задачи

Подводя итог, разберем по шагам, как решить задачу в зависимости от вашей цели.

Сценарий А: Вам нужно автоматически заполнять стандартную дату документа

В этом случае вам не нужно писать код. Убедитесь в следующих настройках конфигурации:

  1. Откройте свойства вашего документа в конфигураторе.
  2. Перейдите на вкладку «Основные» или «Данные».
  3. Проверьте, что стандартный реквизит Дата выведен на форму документа и доступен для редактирования (свойство «Доступность» установлено в значение Истина, свойство «Только просмотр» отключено).
  4. Настройте свойство «Автовремя» в зависимости от бизнес-логики вашей компании (для большинства оперативных документов рекомендуется использовать режим «Использовать» или «Оперативное»).

Сценарий Б: Вам нужно заполнять собственный (дополнительный) реквизит даты

Если вы создали свой реквизит (например, ДатаДоставки или ДатаФактическогоОформления) и хотите, чтобы он заполнялся текущим временем, но оставался редактируемым, выполните следующие действия:

  1. Откройте конфигуратор, найдите нужный документ и перейдите в его Модуль объекта.
  2. Найдите или создайте предопределенную процедуру ОбработкаЗаполнения.
  3. Вставьте следующий код, адаптировав его под имя вашего реквизита:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    
    // Заполняем реквизит временем начала сеанса текущего пользователя
    Если Не ЗначениеЗаполнено(ДатаДоставки) Тогда
        ДатаДоставки = ТекущаяДатаСеанса();
    КонецЕсли;
    
КонецПроцедуры

Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), для получения корректного времени на клиенте (в модуле формы) рекомендуется использовать специальный метод:


// В модуле формы управляемого приложения:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Пример получения даты сеанса через инструменты БСП на клиенте
    ТекущееВремя = ОбщегоНазначенияКлиент.ДатаСеанса();
КонецПроцедуры

Использование этих простых, но профессиональных правил позволит вам избежать проблем с разницей во времени между филиалами вашей компании, гарантирует корректную работу обменов данными и обеспечит чистоту и отказоустойчивость программного кода.

← На главную