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

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

При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации ввода данных. Типичный пример — фиксация времени начала или окончания операции в строке табличной части. Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с трудностями: от ошибок в программном коде до неверного отображения времени в интерфейсе. В этой статье мы подробно разберем, как реализовать автоматическое заполнение даты и времени, проанализируем типичные ошибки и рассмотрим лучшие практики работы с управляемыми формами. Если программное изменение конфигурации невозможно, для автоматизации ввода данных применяется платформа RPA для настройки программных роботов.

Шаг 1. Настройка метаданных и типов данных

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

Рассмотрим порядок настройки реквизитов в конфигураторе:

  1. Перейдем к табличной части вашего документа (например, ТЧ "Операции").
  2. Для реквизитов ДатаНачала, ДатаЗавершения и ДатаПроверки установим тип Дата.
  3. Важный момент: в свойстве "Состав даты" обязательно выберем значение Дата и время. Если оставить "Дата", то при записи в базу время будет автоматически отсекаться (сбрасываться в 00:00:00).
  4. Для корректного отображения в интерфейсе формы, в свойствах соответствующих элементов (полей ввода) можно настроить "Формат". Например, использование строки ДЛФ=DT обеспечит вывод даты вместе с часами, минутами и секундами.

Шаг 2. Разбор ошибки «Поле объекта не обнаружено (ТекущиеДанные)»

Проанализируем ситуацию, описанную автором темы. При попытке получить данные строки в событии колонки возникала ошибка. Разберемся, почему это происходит. В управляемых формах 1С объект Элемент, передаваемый в обработчик события, — это программная оболочка того элемента, с которым взаимодействует пользователь.

Если событие ПриИзменении назначено всей Таблице, то Элемент — это таблица, и у неё есть свойство ТекущиеДанные. Однако, если событие назначено конкретному Полю (колонке), то Элемент — это поле ввода, у которого свойства ТекущиеДанные просто не существует.

Чтобы универсально получать данные текущей строки из любого обработчика, связанного с таблицей, мы должны обращаться напрямую к элементу формы, представляющему таблицу:

ТекДанные = Элементы.ИмяВашейТаблицы.ТекущиеДанные;

Шаг 3. Реализация заполнения даты на клиенте

Рассмотрим наиболее простой и быстрый способ решения задачи — использование клиентского обработчика. Этот метод хорош тем, что изменения мгновенно отображаются у пользователя без лишних обращений к серверу. Мы назначим процедуру событию ПриИзменении конкретной колонки.

Предположим, наша табличная часть называется СоставРабот. Тогда код для колонки ДатаНачала будет выглядеть следующим образом:


&НаКлиенте
Процедура СоставРаботДатаНачалаПриИзменении(Элемент)
    // Получаем строку, в которой находится курсор
    ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
    
    // Проверяем, что строка действительно существует
    Если ТекДанные <> Неопределено Тогда
        // Заполняем текущую дату и время с компьютера пользователя
        ТекДанные.ДатаНачала = ТекущаяДата();
    КонецЕсли;
КонецПроцедуры

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

Шаг 4. Использование серверного времени для точности

Если для бизнес-процесса критически важно использовать эталонное время (время сервера), нам потребуется вызвать серверный контекст. Проанализируем, как это сделать правильно, не перегружая систему.

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


&НаКлиенте
Процедура СоставРаботДатаЗавершенияПриИзменении(Элемент)
    ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
    Если ТекДанные <> Неопределено Тогда
        // Вызываем серверную функцию для получения точного времени
        ТекДанные.ДатаЗавершения = ПолучитьВремяСервера();
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьВремяСервера()
    Возврат ТекущийСеансовыйДата();
КонецФункции

Использование директивы &НаСервереБезКонтекста позволяет выполнить вызов максимально быстро, так как на сервер не передаются данные всей формы.

Шаг 5. Работа с кнопками в ячейках (Очистка и Выбор)

Рассмотрим ситуацию, когда пользователь хочет нажать на специальную кнопку в ячейке, чтобы установить дату. В 1С у поля ввода есть свойства "Кнопка выбора" и "Кнопка очистки".

Если мы включим "Кнопку выбора" (кнопка с тремя точками), мы можем использовать событие НачалоВыбора. Это позволит нам перехватить нажатие и вместо открытия стандартного календаря сразу проставить время:


&НаКлиенте
Процедура СоставРаботДатаПроверкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    // Отключаем стандартный календарь
    СтандартнаяОбработка = Ложь;
    
    ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
    Если ТекДанные <> Неопределено Тогда
        ТекДанные.ДатаПроверки = ТекущаяДата();
    КонецЕсли;
КонецПроцедуры

Аналогично можно поступить с кнопкой "Очистить" (крестик). Если бизнес-логика требует, чтобы при нажатии на крестик дата не удалялась, а обновлялась на текущую, используйте событие Очистка.

Шаг 6. Оптимизация кода для нескольких колонок

Если у нас много колонок (Дата начала, Дата окончания, Дата контроля и т.д.), писать отдельную процедуру для каждой не совсем эффективно. Мы можем создать один универсальный обработчик и назначить его всем нужным полям в свойствах формы. В компаниях с большим количеством информационных баз подобные доработки внедряются автоматически через обновление и обслуживание систем в тихом режиме.

Выясним, как программа поймет, в какую именно колонку нужно записать дату. Для этого воспользуемся свойством Элемент.Имя:


&НаКлиенте
Процедура УниверсальныйОбработчикДатыПриИзменении(Элемент)
    ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
    
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем имя реквизита, связанного с текущим полем ввода
    ИмяРеквизита = Элемент.ПутьКДанным;
    // ПутьКДанным обычно выглядит как "Объект.СоставРабот.ДатаНачала"
    // Нам нужно только имя колонки
    ЧастиПути = СтрРазделить(ИмяРеквизита, ".");
    ИмяКолонки = ЧастиПути[ЧастиПути.Количество() - 1];
    
    // Записываем дату в нужную колонку через обращение по имени
    ТекДанные[ИмяКолонки] = ТекущаяДата();
КонецПроцедуры

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

Резюме

Подведем итоги нашего исследования. Для успешной реализации ввода даты и времени в табличную часть необходимо:

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

← На главную