THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама

Очень часто в запросах 1С приходится работать с датами. Особенно когда запрос строится к объектам метаданных в которых содержится периодическая информация. Как правило это регистры (сведений, накопления, расчета, бухгалтерии). Рассмотрим наиболее часто используемые функции языка запросов 1С для работы с датами. Примеры будем строить на основе регистра сведений РаботникиОрганизаций Конфигурации ЗУП редакция 2.5.

  • ДАТАВРЕМЯ

    Позволяет получить в запросе дату (со временем или без) путем указания года, месяца, дня, часа, минуты, секунды.
    Синтаксис:
    ДАТАВРЕМЯ(Год, Месяц, День, Час, Минута, Секунда)
    Обычно час, минута и секунда не указываются. Давайте приведем мини пример. Введите в консоли запросов следующий текст:

    ВЫБРАТЬ ДАТАВРЕМЯ(2016, 1, 1)

    В результате выполнения запроса получаем дату - 01.01.2016
    На самом деле трудно представить ситуацию в которой в запросе дата будет указываться таким образом. Ведь когда надо указать период используются параметры. Но есть случай когда эта функция представляет особую ценность. Это когда нам надо в полях или в условиях запроса указать пустую дату. Напомню, что для языка 1С пустая дата имеет вид - 0001.01.01. Таким образом, чтобы получить пустую дату в запросе достаточно указать ДАТАВРЕМЯ(1, 1, 1) . В качестве примера выберем из регистра сведений РаботникиОрганизаций записи у которых не заполнен ПериодЗавершения :

    ВЫБРАТЬ РаботникиОрганизаций.Период, РаботникиОрганизаций.Сотрудник, РаботникиОрганизаций.Должность, РаботникиОрганизаций.ПодразделениеОрганизации ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ГДЕ РаботникиОрганизаций.ПериодЗавершения = ДАТАВРЕМЯ(1, 1, 1)

  • НАЧАЛОПЕРИОДА

    Для указанной даты возвращает начало периода в который она входит.
    Синтаксис:
    НАЧАЛОПЕРИОДА(Дата, ТипПериода)
    ТипПериода может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
    В консоли запросов введите:

    ВЫБРАТЬ НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2016, 1, 15), МЕСЯЦ)

    Запрос вернет - 01.01.2016
    А теперь пример. Как известно периодичность у регистра РаботникиОрганизаций один день. Составим запрос в котором вместо действительного периода записей будет отображаться дата начала месяца.

    ВЫБРАТЬ НАЧАЛОПЕРИОДА(РаботникиОрганизаций.Период, МЕСЯЦ) КАК НачалоМесяца, РаботникиОрганизаций.Сотрудник, РаботникиОрганизаций.Должность, РаботникиОрганизаций.ПодразделениеОрганизации ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций

  • КОНЕЦПЕРИОДА

    Синтаксис такой же как и у начала периода. И как ясно из названия возвращает конец периода по дате и типу периода. Подробно рассматривать не будем. Ограничимся мини примером.
    Запрос:

    ВЫБРАТЬ КОНЕЦПЕРИОДА(ДАТАВРЕМЯ(2016, 1, 15), МЕСЯЦ)

    Возвращает 31.01.2016 23:59:59
    Как видим значение возвращается с точностью до секунды.

  • ДОБАВИТЬКДАТЕ

    Добавляет к дате указанное количество временных интервалов.
    Синтаксис:
    ДОБАВИТЬКДАТЕ(Дата, ТипПериода, Количество)
    ТипПериода принимает те же значения, что и для функции НАЧАЛОПЕРИОДА
    Для примера выберем февральскую дату:

    ВЫБРАТЬ ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2016, 2, 15), МЕСЯЦ, 2)

    Получаем дату 15.04.2016 0:00:00 Несмотря на то, что февраль короткий месяц, день полученной даты тот же самый, что и у исходной. Очень удобно, что не приходится задумываться о количестве дней в месяцах.
    Количество может быть и отрицательным. Тогда отсчет интервала производится в обратную сторону.

  • РАЗНОСТЬДАТ

    Расчитыват разность между двумя датами в указанных единицах измерения.
    Синтаксис:
    РАЗНОСТЬДАТ(ДатаНачала, ДатаОкончания, ТипПериода)
    Тип периода может принимать значения: СЕКУНДА, МИНУТА, ЧАС, ДЕНЬ, МЕСЯЦ, КВАРТАЛ, ГОД
    Например:

    ВЫБРАТЬ РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2016, 2, 15), ДАТАВРЕМЯ(2016, 3, 1), ДЕНЬ)

    возвращает 15

Здесь были рассмотрены наиболее часто употребляемые функции языка запросов 1С. Остальные применяются достаточно редко. При необходимости примеры работы с ними можно посмотреть в справке, встроенной в платформу 1С.

В этой статье будут рассмотрены способы проверки на пустое значение в зависимости от типа проверяемого реквизита в , в том числе пустой ссылки.

Значение NULL возвращается в том случае, когда реквизита попросту нет. Тип в этом случае будет тоже NULL. Например, вы объединяете две таблицы через левое соединение. В том случае, когда для левой таблицы не будет найдено ни одного значения в правой, вернется NULL.

Проверку на данное значение можно осуществить при помощи конструкции «ЕСТЬ NULL» и « ». В первом случае возвращается Истина или Ложь. Во втором случае можно сразу задать другое значение в том случае, когда возвращается NULL.

В приведенном ниже запросе 1С 8.3 будут возвращен список контактных лиц тех партнеров, у кого не задан сегмент.

ВЫБРАТЬ
КонтактныеЛицаПартнеров.Ссылка
ИЗ
Справочник.КонтактныеЛицаПартнеров КАК КонтактныеЛицаПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.СегментыПартнеров КАК СегментыПартнеров
ПО КонтактныеЛицаПартнеров.Владелец = СегментыПартнеров.Родитель
ГДЕ
СегментыПартнеров.Ссылка ЕСТЬ NULL

Пустая дата

Проверка значения на пустую дату производится путем сравнения с конструкцией ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0). Пример использования приведен ниже:

Пустая ссылка в запросе 1С

В случае, когда возвращаемый реквизит имеет ссылочный тип, например, это элемент какого-либо справочника, документа и т. п., используется следующая конструкция: ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ПустаяСсылка).

В приведенном ниже примере запрос выбирает всех партнеров, у которых не указан бизнес-регион.

Чтобы проверить на «ЗначениеЗаполнено» нужно сделать обратное условие:

Партнеры.БизнесРегион <> ЗНАЧЕНИЕ(Справочник.БизнесРегионы.ПустаяСсылка)

Пустая строка

Для проверки строковых типов производится сравнение с другим образцом. В данном случае – «».

Приведенный ниже запрос отберет всех партнеров с незаполненным наименованием.

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

  • Как выполнять преобразования параметров других типов к рассматриваемому типу;
  • Как определить пустую дату в запросе 1С;
  • Чем отличается дата и граница времени.

Именно на эти вопросы мы и постараемся ответить в нашей статье.

Что такое дата и как ее определить

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

  • Год, когда произошло событие;
  • Месяц этого события;
  • День.

Необязательно указывать: час, минуту и секунду. Если эти три параметра опущены и нет дополнительных условий, программа автоматически устанавливает время на начало дня.

Существующие в мире форматы даты имеют существенное различие:

  1. В России мы привыкли на первое место ставить день, затем идет месяц события, в конце – год;
  2. Жители США начинают дату с месяца;
  3. Чехи, поляки и словенцы записывают период в формате «Год – Месяц – День».

Именно последний формат и использует платформа 1С.

Преобразование к дате

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

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

Важно понимать, что год даты должен содержать четыре цифры, включая тысячелетие и век события, месяц, день, часы и секунды – должны иметь длину в два символа, включая лидирующие нули.

Отсчет времени в программе идет от начала дня 1 января 0001 года. Для приведенного выше кода это значение можно определить одним из двух способов (Рис. 2).

Рис. 2

Во второй строке мы опустили часы, минуты и секунды события, что нисколько не повлияло на работоспособность нашего кода.

Особенности использования даты в запросах 1С

Для большинства типов данных, используемых платформой 1С, существуют предопределенные значения пустоты. Для чисел – это 0, для ссылок можно определить значение ПустаяСсылка(), для даты пустым значением принято считать дату начала отсчета, именно с ней необходимо сравнивать реквизиты соответствующего типа при установке параметров запроса.

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

Рис. 3

Получив пустую дату, мы можем указать ее в качестве параметра к нашему запросу, то есть использовать конструкцию (Рис. 4)

Однако, существуют моменты, когда проверку лучше проводить внутри текста запроса, не передавая пустую дату в качестве параметра. Для этого в коде запроса можно ввести соответствующее условие (Рис. 5) и использовать функцию запроса ДатаВремя().

Рис. 5

В приведенном тексте запроса мы опустили лидирующие нули у года, месяца и дня, а так же не указали часов, минут и секунд и программа, что называется, скушала это допущение.

Дата и граница времени

Еще один интересный факт, касающийся соотношения запросов и даты – это использование понятия «момент времени» при обращении к различным таблицам базы данных.

Точность «до миллисекунды», указанная в технической документации при описании примитивного типа Дата ярче всего проявляется при выборке записей из виртуальных таблиц регистра накопления: если у регистра накопления помимо таблицы Обороты, существуют таблицы Остатки и ОстаткиИОбороты, то выборка по ним, осуществленная на определенное время, может дать различные результаты.

Для того чтобы понять, как и почему это происходит, рассмотрим простой пример:

  1. До проведения в 12 часов 31 минуту 36 секунд документа реализации остатки по номенклатуре Сахар составляли 30 кг;
  2. Документом в указанное время было списано 10 кг;
  3. Отчет, формируемый на дату документа на 12 часов 31 минуту 36 секунд по таблице Остатки, покажет остаток 30кг;
  4. Тот же самый отчет по таблице ОстаткиИОбороты на то же самое время покажет остаток в 20 кг.

В чем же причина подобного поведения и как этого избежать?

Проблема в том, что в таблице Остатки период задается открытым отрезком, то есть, движения, осуществленные на момент времени формирования отчета не берутся в расчет, то есть время берется на начало указанной в параметре секунды. В то же самое время, для таблицы Оборотов и для таблицы ОстаткиИОбороты границы времени берутся в расчет то есть время берется на конец указанной секунды.

Выходов из этой ситуации несколько:

  1. При использовании таблицы Остатки, указывать момент времени на 1 секунду больший, чем заданный;
  2. Использовать только таблицу ОстаткиИОбороты (не самый оптимальный с точки зрения производительности вариант);
  3. Использовать понятие Граница.

Последний вариант можно представить кодом, указанном на Рис. 6.

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

Средства определения пустых ссылок, дат или строк. Рассмотрим, как проверить на пустую ссылку, дату или строку в запросе 1С.

Определить нулевые данные можно путем использования специальных операторов.

Информацию из базы данных 1С запрашивают (а потом получают) с помощью такого инструмента, как язык запросов (Query, англ.). Они составляются на латинице и кириллице. А одним из ключевых слов-команд (операторов) при получении информации является слово-команда ВЫБРАТЬ (SELECT, англ.) в сочетании с некоторыми конструкциями. Приведём примеры построения интересующих нас по теме запрашиваемых заданий:

Проверка на содержание NULL

Такое задание выполняется оператором ВЫБРАТЬ в сочетании с конструкцией «ЕСТЬ NULL»:

SELECT
ЗаказыОстатки.Заказчик,
ЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.Заказы.Остатки КАК ЗаказыОстатки
ГДЕ
ЗаказыОстатки.КоличествоОстаток ЕСТЬ NULL

Контроль даты

Пустая дата в запросе 1С вносится построением «ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)»:

SELECT
СчетВходящийПоставщика.Link,
СчетВходящийПоставщика.ДатаПрихода
ИЗ
Документ. СчетВходящийПоставщика КАК СчетВходящийПоставщика
ГДЕ
СчетВходящийПоставщика.ДатаПрихода = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)

Ссылочная проверка

Проверка несуществующих внутриссылочных значений (на планы счетов, справочники и пр.) производится с использованием конструкции «VALUE(Справочник.Имя…ПустаяСсылка)»:

Проверка строки

Пустота в строках обнаруживается с применением пробела в кавычках «»:

SELECT
Покупатели.Link
ИЗ
Справочник.Покупатели КАК Покупатели
ГДЕ
Покупатели.Код = «»

Ещё о битых и обычных линках

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

Платформы 1С не обладают внутренними средствами чтобы их отсечь. Ещё нужно понимать, что вне «битых» в системе живут специальные «пустые линки», которые следует различать одни от других.
Это можно выяснить и без запросов к базе данных:

В системе 1С-7.7

Для «битой» - методом Link.Selected() и функцией ПустоеЗначение() возвращается ноль. Для «пустой» - в первом случае ноль, а во втором - единица. Для «нормальной» - единица и ноль. Получается, в 1С-7.7 «битая» - не является несуществующим значением, которое не считается выбранным.

В системе 1С-8.x

Всё по-другому - в обоих случаях (для «битых» и «обычных») метод возвращает Ложь, а функция - Истину. Решение такое: Для «битой» методом Ссылка.ПолучитьОбъект() возвращается функция «Неопределено». Для «пустой» - выбрасывается «Ошибка метода контекста». Для «нормальной» - возвращается значение согласно документации; Выходит, в 1С-8.х «битая» - не будет несуществующей функцией ссылочного типа, которая возвращает Неопределённое значение объекта.

Откуда они берутся

При переходе по несуществующему адресу битой линки пользователю в лучшем случае показано уведомление о том, что объект не найден, в худшем - изображение страницы сервера. Наихудшей их чертой является скрытость. Отсюда - сложность в проверке их корректности. Во время работы с конфигурацией она постоянно дорабатывается, обновляется. Какие-то объекты подлежат удалению, изменяется структура. А ссылка на удалённый элемент остаётся в конструкциях и алгоритмах. Таким образом, несуществующие адреса остаются в системе после удаления самого элемента (вместе с адресом).

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

При довольно часть встречается необходимость работы с переменными типа «Дата». В данной статье мы рассмотрим основные приемы — передача текущей даты, проверка на пустое значение, произвольная дата.

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

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

ПримерЗапроса = Новый Запрос;
ПримерЗапроса.Текст =«
|ВЫБРАТЬ
| АвансовыйОтчетПрисоединенныеФайлы.Ссылка
|ИЗ
| Справочник.АвансовыйОтчетПрисоединенныеФайлыКАК АвансовыйОтчетПрисоединенныеФайлы
|ГДЕ
| АвансовыйОтчетПрисоединенныеФайлы.Дата < &ТекДата»;
ПримерЗапроса.УстановитьПараметр(«ТекДата», ТекущаяДата());

Произвольная дата

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

Обратите внимание, что используя эту функцию в примере выше, в качестве входных параметров мы передавали только три числа (год, месяц, день). Последние три (час, минута, секунда) не являются обязательными и при отсутствии заменяются на «0», то есть начало дня.

В рамках данного примера будут получены все файлы, присоединенные к авансовым отчетам до конца прошлого 2016 года. В связи с этим мы укажем час, минуту и секунду, чтобы сравнивать моментом времени «31 декабря 2016 г 23:59:59».

ВЫБРАТЬ
АвансовыйОтчетПрисоединенныеФайлы.Ссылка
ИЗ
Справочник.АвансовыйОтчетПрисоединенныеФайлы КАК АвансовыйОтчетПрисоединенныеФайлы
ГДЕ
АвансовыйОтчетПрисоединенныеФайлы.Дата < ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Пустая дата

Осуществить проверку переменной на то, содержит ли она в себе незаполненную дату проще всего обычным сравнением. В этом примере мы, используя запрос, выберем все поступления денежных средств на р/с, у которых не заполнена входящая дата.

THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама