При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации ввода данных. Типичный пример — фиксация времени начала или окончания операции в строке табличной части. Несмотря на кажущуюся простоту, начинающие разработчики часто сталкиваются с трудностями: от ошибок в программном коде до неверного отображения времени в интерфейсе. В этой статье мы подробно разберем, как реализовать автоматическое заполнение даты и времени, проанализируем типичные ошибки и рассмотрим лучшие практики работы с управляемыми формами. Если программное изменение конфигурации невозможно, для автоматизации ввода данных применяется платформа RPA для настройки программных роботов.
Прежде чем писать программный код, необходимо убедиться, что реквизиты документа настроены правильно. Если мы хотим хранить и дату, и время, стандартных настроек типа Дата может быть недостаточно.
Рассмотрим порядок настройки реквизитов в конфигураторе:
ДатаНачала, ДатаЗавершения и ДатаПроверки установим тип Дата.ДЛФ=DT обеспечит вывод даты вместе с часами, минутами и секундами.Проанализируем ситуацию, описанную автором темы. При попытке получить данные строки в событии колонки возникала ошибка. Разберемся, почему это происходит. В управляемых формах 1С объект Элемент, передаваемый в обработчик события, — это программная оболочка того элемента, с которым взаимодействует пользователь.
Если событие ПриИзменении назначено всей Таблице, то Элемент — это таблица, и у неё есть свойство ТекущиеДанные. Однако, если событие назначено конкретному Полю (колонке), то Элемент — это поле ввода, у которого свойства ТекущиеДанные просто не существует.
Чтобы универсально получать данные текущей строки из любого обработчика, связанного с таблицей, мы должны обращаться напрямую к элементу формы, представляющему таблицу:
ТекДанные = Элементы.ИмяВашейТаблицы.ТекущиеДанные;
Рассмотрим наиболее простой и быстрый способ решения задачи — использование клиентского обработчика. Этот метод хорош тем, что изменения мгновенно отображаются у пользователя без лишних обращений к серверу. Мы назначим процедуру событию ПриИзменении конкретной колонки.
Предположим, наша табличная часть называется СоставРабот. Тогда код для колонки ДатаНачала будет выглядеть следующим образом:
&НаКлиенте
Процедура СоставРаботДатаНачалаПриИзменении(Элемент)
// Получаем строку, в которой находится курсор
ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
// Проверяем, что строка действительно существует
Если ТекДанные <> Неопределено Тогда
// Заполняем текущую дату и время с компьютера пользователя
ТекДанные.ДатаНачала = ТекущаяДата();
КонецЕсли;
КонецПроцедуры
Обратите внимание: использование функции ТекущаяДата() на клиенте берет время с локальных часов компьютера. Если у пользователя сбито время, данные в базе будут некорректными.
Если для бизнес-процесса критически важно использовать эталонное время (время сервера), нам потребуется вызвать серверный контекст. Проанализируем, как это сделать правильно, не перегружая систему.
Наиболее современным и правильным методом получения времени в 1С 8.3 является функция ТекущийСеансовыйДата(). Она учитывает часовой пояс, установленный для конкретного пользователя, что особенно важно для территориально распределенных компаний.
&НаКлиенте
Процедура СоставРаботДатаЗавершенияПриИзменении(Элемент)
ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
Если ТекДанные <> Неопределено Тогда
// Вызываем серверную функцию для получения точного времени
ТекДанные.ДатаЗавершения = ПолучитьВремяСервера();
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьВремяСервера()
Возврат ТекущийСеансовыйДата();
КонецФункции
Использование директивы &НаСервереБезКонтекста позволяет выполнить вызов максимально быстро, так как на сервер не передаются данные всей формы.
Рассмотрим ситуацию, когда пользователь хочет нажать на специальную кнопку в ячейке, чтобы установить дату. В 1С у поля ввода есть свойства "Кнопка выбора" и "Кнопка очистки".
Если мы включим "Кнопку выбора" (кнопка с тремя точками), мы можем использовать событие НачалоВыбора. Это позволит нам перехватить нажатие и вместо открытия стандартного календаря сразу проставить время:
&НаКлиенте
Процедура СоставРаботДатаПроверкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
// Отключаем стандартный календарь
СтандартнаяОбработка = Ложь;
ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
Если ТекДанные <> Неопределено Тогда
ТекДанные.ДатаПроверки = ТекущаяДата();
КонецЕсли;
КонецПроцедуры
Аналогично можно поступить с кнопкой "Очистить" (крестик). Если бизнес-логика требует, чтобы при нажатии на крестик дата не удалялась, а обновлялась на текущую, используйте событие Очистка.
Если у нас много колонок (Дата начала, Дата окончания, Дата контроля и т.д.), писать отдельную процедуру для каждой не совсем эффективно. Мы можем создать один универсальный обработчик и назначить его всем нужным полям в свойствах формы. В компаниях с большим количеством информационных баз подобные доработки внедряются автоматически через обновление и обслуживание систем в тихом режиме.
Выясним, как программа поймет, в какую именно колонку нужно записать дату. Для этого воспользуемся свойством Элемент.Имя:
&НаКлиенте
Процедура УниверсальныйОбработчикДатыПриИзменении(Элемент)
ТекДанные = Элементы.СоставРабот.ТекущиеДанные;
Если ТекДанные = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем имя реквизита, связанного с текущим полем ввода
ИмяРеквизита = Элемент.ПутьКДанным;
// ПутьКДанным обычно выглядит как "Объект.СоставРабот.ДатаНачала"
// Нам нужно только имя колонки
ЧастиПути = СтрРазделить(ИмяРеквизита, ".");
ИмяКолонки = ЧастиПути[ЧастиПути.Количество() - 1];
// Записываем дату в нужную колонку через обращение по имени
ТекДанные[ИмяКолонки] = ТекущаяДата();
КонецПроцедуры
Этот подход позволяет легко масштабировать решение. Достаточно добавить новую колонку в таблицу и указать эту процедуру в событии ПриИзменении, и автоматизация заработает мгновенно.
Подведем итоги нашего исследования. Для успешной реализации ввода даты и времени в табличную часть необходимо:
Элементы.ИмяТаблицы.ТекущиеДанные.ТекущаяДата() (быстро) и ТекущийСеансовыйДата() (надежно на сервере).НачалоВыбора или Очистка, если требуется реакция на кнопки внутри ячейки.Использование данных методов сделает работу пользователя в системе 1С гораздо более комфортной и снизит количество ошибок, связанных с ручным вводом временных меток. А для последующей миграции накопленных сведений между базами со схожими структурами используется обработка для переноса данных с гибкой настройкой правил поиска.