- Що таке дата і як її визначити
- Перетворення до дати
- Особливості використання дати в запитах 1С
- Дата і межа часу
Наша взаимовыгодная связь https://banwar.org/
У всіх документів, що існують в конфігураціях 1С, а, отже, і практично у всіх регістрів обов'язково повинен бути хоча б один реквізит з типом Дата, саме тому кожному розробнику необхідно знати і розуміти:
- Як виконувати перетворення параметрів інших типів до розглянутого типу;
- Як визначити порожню дату в запиті 1С;
- Чим відрізняється дата і межа часу.
Саме на ці питання ми і постараємося відповісти в нашій статті.
Що таке дата і як її визначити
Так як для прийняття більшості управлінських рішень і ведення обліку не потрібна точність часу, що перевищує 1 секунду, розробники платформи 1С вирішили, що саме ця величина буде граничним мінімумом в форматі дати. Таким чином, кожна реквізит, що описує час події в програмі повинен містити:
- Рік, коли відбулася подія;
- Місяць цієї події;
- День.
Необов'язково вказувати: годину, хвилину і секунду. Якщо ці три параметри опущені і немає додаткових умов, програма автоматично встановлює час на початок дня.
Існуючі в світі формати дати мають суттєву різницю:
- У Росії ми звикли на перше місце ставити день, потім йде місяць події, в кінці - рік;
- Жителі США починають дату з місяця;
- Чехи, поляки і словенці записують період в форматі «Рік - Місяць - День».
Саме останній формат і використовує платформа 1С.
Перетворення до дати
Для того щоб з кількох значень або з рядка отримати параметр з типом Дата необхідно використовувати код, вказаний на Рис. 1
Мал. 1
Як видно з наведеного рисунка, визначити дату можна як за допомогою одного рядка, так і з розбивкою цього рядка на складові частини за допомогою коми, результат від цього не зміниться.
Важливо розуміти, що рік дати повинен складатися з чотирьох цифр, включаючи тисячоліття і століття події, місяць, день, години і секунди - повинні мати довжину в два символи, включаючи лідируючі нулі.
Відлік часу в програмі йде від початку дні 1 січня 0001 року. Для наведеного вище коду це значення можна визначити одним із двох способів (Рис. 2).
Мал. 2
У другому рядку ми опустили години, хвилини і секунди події, що анітрохи не вплинуло на працездатність нашого коду.
Особливості використання дати в запитах 1С
Для більшості типів даних, що використовуються платформою 1С, існують зумовлені значення порожнечі. Для чисел - це 0, для посилань можна визначити значення ПустаяСсилка (), для дати порожнім значенням прийнято вважати дату початку відліку, саме з нею необхідно порівнювати реквізити відповідного типу при установці параметрів запиту.
Важливо зрозуміти, що навіть якщо в значенні реквізиту форми, що має розглянутий тип, не вказано жодних цифр, тобто вікно має вигляд (Рис. 3), це не означає що в ньому нічого не вказано, порівняння цього параметра з нового рядка не пройде.
Мал. 3
Отримавши порожню дату, ми можемо вказати її в якості параметра до нашого запиту, тобто використовувати конструкцію (Рис. 4)
Мал. 4
Однак, існують моменти, коли перевірку краще проводити всередині тексту запиту, не передаючи порожню дату в якості параметра. Для цього в коді запиту можна ввести відповідне умова (Рис. 5) і використовувати функцію запиту ДатаВремя ().
Мал. 5
У наведеному тексті запиту ми опустили лідируючі нулі у року, місяця і дня, а так само не вказали годин, хвилин і секунд і програма, що називається, з'їла це припущення.
Дата і межа часу
Ще один цікавий факт, що стосується співвідношення запитів і дати - це використання поняття «момент часу» при зверненні до різних таблиць бази даних.
Точність «до мілісекунди», зазначена в технічній документації при описі примітивного типу Дата найяскравіше проявляється при вибірці записів з віртуальних таблиць регістра накопичення: якщо у регістру накопичення крім таблиці Обороти, існують таблиці Залишки і ОстаткіІОбороти, то вибірка по ним, здійснена на певний час , може дати різні результати.
Для того щоб зрозуміти, як і чому це відбувається, розглянемо простий приклад:
- До проведення о 12 годині 31 хвилину 36 секунд документа реалізації залишки по номенклатурі Цукор становили 30 кг;
- Документом в зазначений час було списано 10 кг;
- Звіт, що формується на дату документа на 12 годин 31 хвилину 36 секунд по таблиці Залишки, покаже залишок 30кг;
- Той же самий звіт по таблиці ОстаткіІОбороти на той же самий час покаже залишок в 20 кг.
У чому ж причина такої поведінки і як цього уникнути?
Проблема в тому, що в таблиці Залишки період задається відкритим відрізком, тобто, руху, здійснені на момент часу формування звіту не беруться в розрахунок, тобто час береться на початок зазначеної в параметрі секунди. У той же самий час, для таблиці Оборотов і для таблиці ОстаткіІОбороти кордону часу беруться в розрахунок тобто час береться на кінець зазначеної секунди.
Виходів з цієї ситуації кілька:
- При використанні таблиці Залишки, вказувати момент часу на 1 секунду більший, ніж заданий;
- Використовувати тільки таблицю ОстаткіІОбороти (не найоптимальніший з точки зору продуктивності варіант);
- Використовувати поняття Кордон.
Останній варіант можна уявити кодом, зазначеному на Рис. 6.
Мал. 6
У першому параметрі нашого об'єкта ми вказуємо дату, на яку необхідно сформувати звіт, другий параметр визначає тип кордону. Так як для нас важливо, щоб руху на задану дату увійшли до вибірки ми повинні встановити цей параметр в положення «Включаючи».
У чому ж причина такої поведінки і як цього уникнути?