Переменная не определена дата

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

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

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

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

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

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

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

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

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

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

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

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

Рис. 1

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

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

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

Рис. 2

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

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

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

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

Рис. 3

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

Рис. 4

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

Рис. 5

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

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

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

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

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

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

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

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

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

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

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

Рис. 6

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

Данная ошибка характерна для управляемых форм платформы 1С:Предприятие 8

Начиная с версии 8.3.3 платформы в модуле управляемой формы, модуле команды и общем модуле появилось ключевое слово ЭтотОбъект, которое ссылается на текущий контекст модуля. В более ранних версиях платформы ключевое слово ЭтотОбъект использовалось только в модуле объекта или в модуле обычной формы и ссылалось на текущий объект. С какой стати решили использовать то же слово для модулей вместо более благозвучных ЭтотМодуль и ЭтаФорма — непонятно. Оставим это на совести разработчиков. Нам же нужно разобраться с ошибкой.

Итак, если вы разработали управляемую форму на платформе 8.3.3 или выше и пытаетесь использовать ее на платформе 1С:Предприятие 8.2 или 8.3.2 и ниже, помните, что в них ключевого слова ЭтотОбъект нет! Поэтому вызов, подобный этому, будет генерировать ошибку:

&НаКлиенте Процедура ПокупательПриИзменении(Элемент) МодульКлиент.ВызовМетода(ЭтотОбъект); КонецПроцедуры

Чтобы избавиться от ошибки, можно:

  1. Обновить платформу до версии 8.3.3 или выше (Если используется стандартная конфигурация, возможно, потребуется обновить еще и версию конфигурации. Если конфигурация самописная, возможно, потребуется тестирование всех модулей и форм с последующим проведением рефакторинга);
  2. Избавиться от использования ключевого слова ЭтотОбъект, проведя рефакторинг кода;

Оставьте комментарий