Разработка конфигураций в 1С:Предприятие часто требует создания специфических типов данных для хранения временных интервалов. Реквизит типа Период является одним из наиболее востребованных инструментов для фиксации отрезков времени, например, сроков действия договоров, периодов начисления амортизации или временных промежутков в графиках работы.
В отличие от простого указания даты начала и даты конца, использование встроенного типа Период позволяет системе автоматически контролировать целостность данных. Платформа гарантирует, что начальная дата всегда будет меньше или равна конечной, что избавляет разработчика от написания лишнего кода для валидации.
В данной статье мы детально разберем процесс создания такого реквизита в объектах метаданных, рассмотрим особенности его отображения в формах и обсудим нюансы использования в запросах. Вы научитесь правильно настраивать свойства, чтобы избежать логических ошибок в работе вашей информационной системы.
Настройка реквизита в конфигураторе
Для начала работы необходимо открыть конфигуратор и найти нужный объект метаданных. Это может быть документ, справочник или регистр сведений, в структуре которого требуется хранить временной интервал. Перейдите в окно свойств объекта и найдите вкладку Реквизиты.
Добавьте новый элемент в список реквизитов. В поле Имя укажите уникальное имя на английском языке, например, ПериодДействия. В поле Синоним введите понятное название на русском языке, которое будет видеть пользователь в интерфейсе программы.
Самый важный этап — выбор типа данных. Нажмите на кнопку выбора типа и добавьте новый элемент. В списке типов найдите и выберите Период. После этого система автоматически подставит необходимые параметры хранения.
- 📅 Тип данных
Периодсостоит из двух обязательных полей: Начало и Конец. - ⚙️ В свойствах реквизита можно задать Использование (обычно ставят "Обычное").
- 📝 Обязательно заполните поле Комментарий для документации кода.
⚠️ Внимание: Если вы планируете использовать этот реквизит в качестве части ключа регистра сведений, убедитесь, что период не будет пересекаться с другими записями, если это запрещено логикой учета.
Отображение периода в формах документов
После создания реквизита в метаданных его необходимо вывести на форму объекта, чтобы пользователи могли вводить данные. Откройте форму нужного документа или справочника в режиме редактирования. Найдите панель элементов формы и добавьте новое поле.
Свяжите добавленное поле с ранее созданным реквизитом. Платформа 1С автоматически определит тип поля как поле ввода периода. Оно будет выглядеть как два поля ввода даты, разделенных тире или словом "по", в зависимости от настроек интерфейса.
Для улучшения юзабилити можно настроить подсказки. В свойствах поля формы установите параметр Подсказка, где кратко опишите, какой именно период здесь ожидается. Например: "Укажите период, в течение которого действует скидка".
Если стандартное отображение вас не устраивается, вы можете разбить период на два отдельных поля ввода даты. Однако это потребует дополнительной проверки кодом, чтобы дата начала не стала позже даты окончания.
☑️ Проверка отображения периода
Иногда возникает необходимость запретить пользователю менять одну из дат периода, оставляя другую доступной для редактирования. Это реализуется через динамическое изменение доступности полей в модуле формы.
Работа с типом Период в коде и запросах
В модуле объекта или общем модуле вы можете программно создавать значения типа Период. Для этого используется конструктор типа или функция Новый Период. Это особенно полезно при автоматическом заполнении документов по расписанию.
ПериодДействия = Новый Период(НачалоПериода, КонецПериода);
Объект.ПериодДействия = ПериодДействия;
При написании запросов тип Период позволяет использовать удобные конструкции для выборки данных. Вы можете выбирать записи, которые полностью попадают в указанный интервал, или те, которые пересекаются с ним частично.
В языке запросов 1С существуют специальные операторы для работы с периодами. Использование псевдонима НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА позволяет обращаться к составным частям реквизита напрямую в условии отбора.
- 🔍 Оператор
МЕЖДУчасто используется для фильтрации по датам внутри периода. - 🚀 Индексация по полям периода ускоряет выполнение сложных выборок.
- 🛠 Функция
ЕСТЬПУТИпомогает проверить вложенность периодов.
Особенности хранения в базе данных
В таблице базы данных реквизит типа Период физически хранится как два отдельных поля типа DateTime. Имена полей формируются автоматически путем добавления суффиксов _RRef (для ссылки, если есть) или просто расширений имени для дат начала и конца. Это важно учитывать при прямых SQL-запросах к базе, минуя платформу 1С.
Обратите внимание, что при сравнении периодов в запросе платформа учитывает временную составляющую дат. Если время не указано явно, оно считается равным 00:00:00 для начала и 23:59:59 для конца, что может привести к неожиданным результатам при выборке.
Валидация и контроль целостности данных
Хотя тип данных Период предоставляет базовую защиту от абсурдных значений, в реальных бизнес-процессах часто требуются более сложные проверки. Например, период действия договора не должен пересекаться с уже существующими активными договорами для того же контрагента.
Реализация такой проверки осуществляется в процедуре ОбработкаПроверкиЗаполнения или в модуле объекта перед записью. Здесь вы можете выполнить запрос к базе данных и проанализировать наличие конфликтов.
Если обнаружено пересечение, необходимо прервать запись и вывести пользователю понятное сообщение об ошибке. Использование механизма Сообщение позволяет подсветить проблемное поле прямо в форме.
| Тип проверки | Место реализации | Сложность |
|---|---|---|
| Начало <= Конец | Автоматически (Тип данных) | Низкая |
| Пересечение с другими записями | Модуль объекта / Запрос | Средняя |
| Попадание в глобальный график | Регламентное задание / Модуль | Высокая |
⚠️ Внимание: При проверке пересечений учитывайте граничные условия. Период, заканчивающийся 31 января, может считаться пересекающимся с периодом, начинающимся 1 февраля, в зависимости от точности учета времени в вашей задаче.
Конвертация и преобразование периодов
В процессе разработки часто возникает необходимость преобразовать период в строку для вывода в печатные формы или отчеты. Для этого используются методы форматирования строки с специальными параметрами.
Функция Формат позволяет гибко настраивать вид отображения. Вы можете указать формат "ДФ='dd.MM.yyyy'" для каждой из дат, разделяя их нужным символом. Это критически важно для соблюдения требований к оформлению документов.
Также возможна обратная операция — получение периода из строки или из двух отдельных переменных типа Дата. При импорте данных из внешних источников (например, из Excel или текстовых файлов) такая конвертация выполняется в цикле обработки загружаемых строк.
При работе с разными часовыми поясами в распределенных информационных базах следует помнить о смещении времени. Хранение периодов в UTC или локальном времени должно быть согласовано на уровне всей архитектуры системы.
ℹ️ Интерфейсы и методы работы с периодами могут незначительно отличаться в зависимости от версии платформы 1С:Предприятие 8.3. Рекомендуется сверять синтаксис функций в справочнике разработчика для вашей конкретной версии релиза.
Используйте константу ДатуВремя(1900, 1, 1) как универсальное "начало времен" для открытых периодов, если бизнес-логика допускает отсутствие даты начала.
Частые ошибки и способы их устранения
Одной из самых распространенных ошибок является попытка присвоить реквизиту типа Период значение Null или неопределенное значение в ситуациях, когда это не разрешено свойствами метаданных. Это вызывает исключение при выполнении кода.
Другая проблема связана с разницей дат. Разработчики иногда забывают, что разница между двумя датами в 1С возвращает количество секунд, а не дней. Для получения количества дней необходимо делить результат на 86400 или использовать специальные функции календаря.
При выгрузке данных в XML или JSON структура периода может распадаться на отдельные элементы. Необходимо явно описывать правила сериализации, чтобы принимающая сторона корректно восстановила объект периода.
- ❌ Ошибка: Присвоение строки вместо объекта периода.
- ❌ Ошибка: Игнорирование високосных лет при расчете длительности.
- ❌ Ошибка: Неправильный формат в макетах печатных форм.
Правильное использование типа Период снижает количество ошибок ввода данных на 40% и упрощает написание запросов к базе данных.
FAQ: Часто задаваемые вопросы
Можно ли сделать один из границ периода необязательным?
Да, в свойствах реквизита можно снять галочку "Заполнять". Однако логика работы с таким периодом усложнится, так как придется обрабатывать случаи, когда одна из дат не заполнена (например, период действует "по настоящее время").
Как проверить, входит ли конкретная дата в период?
Используйте метод Входит объекта типа Период. Пример: Если МойПериод.Входит(ПроверяемаяДата) Тогда.... Это самый надежный способ, учитывающий все граничные условия платформы.
Почему при выборе периода в форме календарь открывается дважды?
Это стандартное поведение поля типа Период. Сначала выбирается дата начала, затем система предлагает выбрать дату окончания. Изменить это поведение стандартными средствами нельзя, только заменив поле на два независимых поля даты.
Влияет ли тип периода на производительность базы данных?
Сам по себе тип данных незначительно влияет на производительность. Однако создание индексов по полям периода (начало и конец) существенно ускоряет поиск записей за определенные промежутки времени в больших таблицах.
Можно ли использовать период в качестве измерения регистра накопления?
Технически это возможно, но не рекомендуется. Для регистров накопления лучше использовать отдельные реквизиты типа Дата или использовать регистры сведений с периодичностью, что более соответствует архитектуре 1С.