При роботі з датами 1С, типовий порядок частин дати - рік, місяць, день, годину, хвилини, секунди. При цьому години, хвилини, секунди можна пропустити.
При створенні дати з рядка ( «приведення до дати») можна вказати в локалізованому форматі (день.місяць.рік годинник: хвилини: секунди), але тільки повністю.
наприклад:
// Робота з датами 1С - перетворити дату в 1С з частин - рік, місяць, день (плюс необов'язково час)
Дата \u003d Дата (2012,10,30); // без часу
Дата \u003d Дата (2012,10,30,12,00,00); //з \u200b\u200bчасом
// Робота з датами 1С - перетворити дату в 1С з рядка, різні способи
Дата \u003d Дата ( "20121030"); // рік, місяць, день
Дата \u003d Дата ( "30.10.2012 12:00:00"); // локалізований формат, тільки повністю
// Робота з датами 1С - вказівка \u200b\u200bзначення дати без приведення, безпосередньо
Дата \u003d "20121030"; // без часу
Дата \u003d "20121030120000"; //з \u200b\u200bчасом
Робота з датами 1С - Порожня дата 1С
Щоб перевірити дату 1С на заповненість - її порівнюють з «порожній датою». При наявності в довіднику / документі реквізиту з типом дата, якщо користувач не заповнив це поле, то її значення також буде - «порожня дата».
«Порожня дата» - це 01.01.0001 00:00:00.
наприклад:
ПустаяДата \u003d "00010101000000";
Якщо НужнаяДата \u003d "00010101000000" Тоді
Повідомити ( "Ви не заповнили дуже потрібну дату");
КонецЕсли;
Робота з датами 1С - Дата в реквізитах (довідників, документів і т.п.)
При вказівці типу реквізиту можна вказати використовувати:
- Тільки дату (час тоді завжди одно 00:00:00)
- Тільки час (дата тоді завжди дорівнює 01.01.0001)
- Дату і час
отримання дати
Для отримання дати і часу використовується функція 1С ТекущаяДата ().
Дуже важливо місце - де викликається ця функція - на клієнті або на сервері. Детальніше див. Тему «Режим виконання / Виконання». Часто буває, що на клієнтських машинах час трохи різний, тому намагаються всюди використовувати серверне час - навіть якщо воно встановлено на сервері не вірно, то хоча б у всіх клієнтів буде однакове невірний час.
Для того, щоб отримати серверну дату (дату, встановлену в операційній системі комп'ютера сервера), зазвичай в конфігурації створюють загальний модуль зі встановленою галочкою «Сервер» у властивостях, і в ньому створюють функцію
// функція розташована в загальному модулі, наприклад з ім'ям СерверниеФункціі
// в властивості загального модуля встановлена \u200b\u200bгалочка «Сервер» і не встановлена \u200b\u200bгалочка «Клієнт»
Функція ПолучітьДатуСервера () Експорт
Повернення ТекущаяДата ();
КонецФункціі
// виклик цієї функції для використання з іншого модуля виглядає так
ДокументОб'ект.Дата \u003d СерверниеФункціі.ПолучітьДатуСервера (); //ІмяМодуля.ІмяФункціі ()
Також в тонкому клієнті безпосередньо у функцій модулів вказується де вона буде виконана:
Початок і кінець дня
Для дати «30.10.2012»:
- дата початку дня виглядає так «30.10.2012 00:00:00»
- дата кінця дня виглядає так «30.10.2012 23:59:59»
Використовується в звітах і запитах, які потребують отримати дані за період - день, місяць, рік.
Так наприклад період з «01.01.2012 00:00:00» по «31.01.2012 00:00:00» є невірним, тому що не включає в себе один день місяця (але включає в себе одну секунду останнього дня місяця).
Робота з датами 1С - Порівняння дат
Дата містить дату і час. При порівнянні дат (без урахування часу) їх зазвичай призводять до початку дня (місяця, року).
наприклад:
Дата1 \u003d Дата ( "30.10.2012 12:00:00");
Якщо НачалоДня (Дата1) \u003d НачалоДня (ДокументСсилка.Дата) Тоді
Повідомити ( "Документ введений заданої датою");
КонецЕсли;
Про всяк випадок, приклад порівняння дати в періоді:
Якщо ДокументСсилка.Дата\u003e \u003d НачалоМесяца (ТекущаяДата ()) і
ДокументСсилка.Дата
Робота з датами 1С - Зміна дати
Дата є числом секунд. Якщо ми хочемо не просто дізнатися - більше чи одна дата інший - але і на скільки більше, то отримуємо різницю в секундах.
наприклад:
СНачалаДня \u003d ТекущаяДата () - НачалоДня (ТекущаяДата ());
Повідомити ( "З початку дня пройшло" + Рядок (СНачалаДня) + "секунд");
Повідомити ( "З початку дня пройшло" + Рядок (СНачалаДня / 60) + "хвилин");
Повідомити ( "З початку дня пройшло" + Рядок (СНачалаДня / 60/60) + "годин");
Також ми можемо змінити дату, при зміні ми додаємо або віднімаємо кількість секунд:
НачалоЕтогоДня \u003d НачалоДня (ТекущаяДата ());
НачалоПредидущегоДня \u003d НачалоДня (НачалоЕтогоДня - 1); // прибираємо секунду - роблячи «вчора» і беремо початок дня у «вчора»
НачалоПредидущегоДня \u003d НачалоЕтогоДня - 24 * 60 * 60; // інший спосіб - віднімаємо 24 години - 24 (години) * 60 (вийшли хвилини) * 60 (секунди)
Робота з датами 1С - Момент часу
Момент часу - це розширене уявлення дати, яке застосовується до документів (і відповідно регістрів).
Воно потрібне для порівняння часу документів, якщо дата і час документів один і той же. Відповідно його можна використовувати при відборах в запитах.
Момент часу можна отримати у документа наступними способами:
// спосіб 1
МоментВременіДокумента \u003d ДокументСсилка.МоментВремені ();
Також можна порівняти момент часу з датою / часом:
МоментВременіЕталон \u003d Новий момент часу (НачалоДня (ТекущаяДата ()));
Якщо ДокументСсилка.МоментВремені (). Порівняти (МоментВременіЕталон) \u003d -1 Тоді
Повідомити ( "Документ введений раніше, ніж сьогодні");
КонецЕсли;
// Якщо документ введений сьогоднішньої датою в 00:00:00, то він все одно введений - сьогодні
Робота з датами 1С - Форматування дат
Тип «Дата» в 1С входить в число 4 основних типів даних поряд з числом, рядком і булево. У конфігураціях дати зустрічаються повсюдно - при розробці неможливо уникнути роботи з цим типом даних. Тому краще починати писати запити, вже розуміючи, як обробляти дати, які є можливості для роботи з ними, як вони зберігаються. Розглянемо на прикладах всі нюанси написання запитів з різними датами.
Приклади роботи з датами в запитах 1С
В першу чергу, необхідно отримати дату в запиті в потрібному форматі - з часом або без нього. Виконати це завдання можна декількома шляхами:
- Передати через параметр. Отримати поточну дату сеансу можна тільки цим методом;
- Отримати дату в запиті з поля вибірки;
- Перетворити з числових значень за допомогою функції ДАТАВРЕМЯ ().
Найпоширенішою завданням при роботі з документами є перевірка на порожню дату в запиті 1С. В цьому випадку найлегше порівняти змінну або поле з порожньою датою, яка виходить за допомогою функції ДАТАВРЕМЯ (1,1,1):
ДАТАВРЕМЯ (1, 1, 1)Аналогічної командою можна отримати довільну дату і час в запиті. При цьому їх можна вказати з точністю до секунди, задавши в якості параметрів 6 чисел. Якщо ж використовується тільки 3 числа, то години, хвилини і секунди будуть прирівняні до 0 (початок дня). Наприклад, нам необхідно в запиті вибрати документи за перші 10 днів січня 2018 року:
ВИБРАТИ ПоступленіеНаРасчетнийСчет.Ссилка ЯК Посилання ІЗ Документ.ПоступленіеНаРасчетнийСчет ЯК ПоступленіеНаРасчетнийСчет ДЕ ПоступленіеНаРасчетнийСчет.Дата МІЖ ДАТАВРЕМЯ (2018, 1, 1, 0, 0, 0) І ДАТАВРЕМЯ (2018, 1, 10, 23, 59, 59)У запиті на вбудованій мові 1С можна не тільки вибирати різні поля і отримувати параметри. Існує безліч функцій, що полегшують форматування дати під потреби конкретного завдання. Якщо ви часто працюєте з датами в запиті, то ви повинні знати ці команди:
- ПОЧАТОК ПЕРІОДУ. Як параметри вказується дата і проміжок часу, в розрізі якого необхідно отримати початок дати. Використовується, щоб перетворити дату до формату без часу. Для цього необхідно задати другий параметр - «ДЕНЬ»;
- КОНЕЦПЕРІОДА. Аналогічна команда, яка повертає останню дату в розрізі зазначених в параметрах одиниць;
- ДОБАВІТЬКДАТЕ. Дозволяє отримати дату, велику на задану кількість зазначених одиниць часу. Як параметри функції вказують дату, одиницю виміру часу і число;
- РАЗНОСТЬДАТ. Отримує різницю між датами в зазначених одиницях виміру;
- ДЕНЬ ТИЖНЯ. Поверне порядковий номер одного з днів тижня.
Грамотно застосовуючи ці функції, розробник може вирішувати досить нетривіальні завдання. Наприклад, отримання найменування дня тижня поточної дати в запиті у вигляді рядка:
ВИБІР КОЛИ ДЕНЬНЕДЕЛІ (& ТекущаяДата) \u003d 1 ТОДІ "Понеділок" КОЛИ ДЕНЬНЕДЕЛІ (& ТекущаяДата) \u003d 2 ТОДІ "вівторок" КОЛИ ДЕНЬНЕДЕЛІ (& ТекущаяДата) \u003d 3 ТОДІ "середовище" КОЛИ ДЕНЬНЕДЕЛІ (& ТекущаяДата) \u003d 4 ТОДІ "Четвер" КОЛИ ДЕНЬНЕДЕЛІ (& ТекущаяДата) \u003d 5 ТОДІ "п'ятниця" КОЛИ ДЕНЬНЕДЕЛІ (& ТекущаяДата) \u003d 6 ТОДІ "субота" ІНАКШЕ "Воскресенье" КІНЕЦЬПеретворення типів в запиті 1С з числа або рядки в дату - трудомістке заняття. З чисел можна отримати дату за допомогою функції ДАТАВРЕМЯ, з рядка - комбінуючи функцію Підрядки і конструкцію ВИБІР КОЛИ ТОДІ ІНАКШЕ. Виходячи з цього, розробники вважають за краще отримувати дату з інших типів в модулі і передавати її в запит за допомогою параметра. На жаль, це не завжди піддається реалізації, тому доводиться міняти формат дати в запиті.
Є можливість вказати дату в запиті 1С в якості параметра для отримання даних з віртуальних таблиць регістрів. У цій ролі також можна використовувати всі перераховані вище функції. Але тут важливо не допустити, щоб порожня дата в запиті 1С могла позначитися на кінцевому результаті виконання коду, тому обов'язково треба робити перевірку.
При роботі з датами 1С, типовий порядок частин дати - рік, місяць, день, годину, хвилини, секунди. При цьому години, хвилини, секунди можна пропустити.
При створенні дати з рядка ( «приведення до дати») можна вказати в локалізованому форматі (день.місяць.рік годинник: хвилини: секунди), але тільки повністю.
наприклад:
// Робота з датами 1С - перетворити дату в 1С з частин - рік, місяць, день (плюс необов'язково час) Дата \u003d Дата (2012,10,30); // без часу Дата \u003d Дата (2012,10,30,12,00,00); // згодом // Робота з датами 1С - перетворити дату в 1С з рядка, різні способи Дата \u003d Дата ( "20121030"); // рік, місяць, день Дата \u003d Дата ( "30.10.2012 12:00:00"); // локалізований формат, тільки повністю // Робота з датами 1С - вказівка \u200b\u200bзначення дати без приведення, безпосередньо Дата \u003d "20121030"; // без часу Дата \u003d "20121030120000"; //з \u200b\u200bчасом
Робота з датами 1С - Порожня дата 1С
Щоб перевірити дату 1С на заповненість - її порівнюють з «порожній датою». При наявності в довіднику / документі реквізиту з типом дата, якщо користувач не заповнив це поле, то її значення також буде - «порожня дата».
«Порожня дата» - це 01.01.0001 00:00:00.
наприклад:
ПустаяДата \u003d "00010101000000"; Якщо НужнаяДата \u003d "00010101000000" Тоді Повідомити ( "Ви не заповнили дуже потрібну дату"); КонецЕсли;
Робота з датами 1С - Дата в реквізитах (довідників, документів і т.п.)
При вказівці типу реквізиту можна вказати використовувати:
Тільки дату (час тоді завжди одно 00:00:00)
Тільки час (дата тоді завжди дорівнює 01.01.0001)
Дату і час
отримання дати
Для отримання дати і часу використовується функція 1С ТекущаяДата ().
Дуже важливо місце - де викликається ця функція - на клієнті або на сервері. Детальніше див. Тему «Режим виконання / Виконання». Часто буває, що на клієнтських машинах час трохи різний, тому намагаються всюди використовувати серверне час - навіть якщо воно встановлено на сервері не вірно, то хоча б у всіх клієнтів буде однакове невірний час.
Для того, щоб отримати серверну дату (дату, встановлену в операційній системі комп'ютера сервера), зазвичай в конфігурації створюють загальний модуль зі встановленою галочкою «Сервер» у властивостях, і в ньому створюють функцію
// функція розташована в загальному модулі, наприклад з ім'ям СерверниеФункціі // в властивості загального модуля встановлена \u200b\u200bгалочка «Сервер» і не встановлена \u200b\u200bгалочка «Клієнт» Функція ПолучітьДатуСервера () Експорт Повернення ТекущаяДата (); КонецФункціі // виклик цієї функції для використання з іншого модуля виглядає так ДокументОб'ект.Дата \u003d СерверниеФункціі.ПолучітьДатуСервера (); //ІмяМодуля.ІмяФункціі ()
Також в тонкому клієнті безпосередньо у функцій модулів вказується де вона буде виконана:
Початок і кінець дня
Для дати «30.10.2012»:
дата початку дня виглядає так «30.10.2012 00:00:00»
дата кінця дня виглядає так «30.10.2012 23:59:59»
Використовується в звітах і запитах, які потребують отримати дані за період - день, місяць, рік.
Так наприклад період з «01.01.2012 00:00:00» по «31.01.2012 00:00:00» є невірним, тому що не включає в себе один день місяця (але включає в себе одну секунду останнього дня місяця).
Робота з датами 1С - Порівняння дат
Дата містить дату і час. При порівнянні дат (без урахування часу) їх зазвичай призводять до початку дня (місяця, року).
наприклад:
Дата1 \u003d Дата ( "30.10.2012 12:00:00"); Якщо НачалоДня (Дата1) \u003d НачалоДня (ДокументСсилка.Дата) Тоді Повідомити ( "Документ введений заданої датою"); КонецЕсли; Про всяк випадок, приклад порівняння дати в періоді: Якщо ДокументСсилка.Дата\u003e \u003d НачалоМесяца (ТекущаяДата ()) і ДокументСсилка.Дата<= КонецМесяца(ТекущаяДата()) Тогда Сообщить("Документ введен в текущем месяце"); КонецЕсли;
Робота з датами 1С - Зміна дати
Дата є числом секунд. Якщо ми хочемо не просто дізнатися - більше чи одна дата інший - але і на скільки більше, то отримуємо різницю в секундах.
наприклад:
СНачалаДня \u003d ТекущаяДата () - НачалоДня (ТекущаяДата ()); Повідомити ( "З початку дня пройшло" + Рядок (СНачалаДня) + "секунд"); Повідомити ( "З початку дня пройшло" + Рядок (СНачалаДня / 60) + "хвилин"); Повідомити ( "З початку дня пройшло" + Рядок (СНачалаДня / 60/60) + "годин");
Також ми можемо змінити дату, при зміні ми додаємо або віднімаємо кількість секунд:
НачалоЕтогоДня \u003d НачалоДня (ТекущаяДата ()); НачалоПредидущегоДня \u003d НачалоДня (НачалоЕтогоДня - 1); // прибираємо секунду - роблячи «вчора» і беремо початок дня у «вчора» НачалоПредидущегоДня \u003d НачалоЕтогоДня - 24 * 60 * 60; // інший спосіб - віднімаємо 24 години - 24 (години) * 60 (вийшли хвилини) * 60 (секунди)
Робота з датами 1С - Момент часу
Момент часу - це розширене уявлення дати, яке застосовується до документів (і відповідно регістрів).
Воно потрібне для порівняння часу документів, якщо дата і час документів один і той же. Відповідно його можна використовувати при відборах в запитах.
Момент часу можна отримати у документа наступними способами:
// спосіб 1 МоментВременіДокумента \u003d ДокументСсилка.МоментВремені (); Також можна порівняти момент часу з датою / часом: МоментВременіЕталон \u003d Новий момент часу (НачалоДня (ТекущаяДата ())); Якщо ДокументСсилка.МоментВремені (). Порівняти (МоментВременіЕталон) \u003d -1 Тоді Повідомити ( "Документ введений раніше, ніж сьогодні"); КонецЕсли; // Якщо документ введений сьогоднішньої датою в 00:00:00, то він все одно введений - сьогодні
При досить частина зустрічається необхідність роботи зі змінними типу «Дата». У даній статті ми розглянемо основні прийоми - передача поточної дати, перевірка на порожнє значення, довільна дата.
При написанні запитів найчастіше необхідно порівнювати дані з поточною датою. У вбудованій мові 1С є функція ТекущаяДата (). Вона дозволяє визначити поточний час і дату на комп'ютері. Для здійснення операцій з поточною датою необхідно передавати в запит значення цієї функції в якості параметра.
Нижче представлений запит, що вибирає всі файли, приєднані до авансових звітів з датою створення до теперішнього моменту:
ПрімерЗапроса \u003d Новий Запит;
ПрімерЗапроса.Текст \u003d «
| ВИБРАТИ
| АвансовийОтчетПрісоедіненниеФайли.Ссилка
| З
| Справочнік.АвансовийОтчетПрісоедіненниеФайлиКАК АвансовийОтчетПрісоедіненниеФайли
| ДЕ
| АвансовийОтчетПрісоедіненниеФайли.Дата< &ТекДата»;
ПрімерЗапроса.УстановітьПараметр ( «ТекДата», ТекущаяДата ());
довільна дата
Розглянута вище функція дозволяє порівнювати і, отже, проводити відбір з будь-якого періоду. Такий спосіб дозволяє задати в запиті жорсткий відбір без використання додаткових параметрів.
Зверніть увагу, що використовуючи цю функцію в прикладі вище, в якості вхідних параметрів ми передавали тільки три числа (рік, місяць, день). Останні три (година, хвилина, секунда) не є обов'язковими і при відсутності замінюються на «0», тобто початок дня.
В рамках даного прикладу будуть отримані всі файли, приєднані до авансових звітів до кінця минулого 2016 року. У зв'язку з цим ми вкажемо годину, хвилину і секунду, щоб порівнювати моментом часу «31 грудня 2016 р 23:59:59».
ВИБРАТИ
АвансовийОтчетПрісоедіненниеФайли.Ссилка
З
Справочнік.АвансовийОтчетПрісоедіненниеФайли ЯК АвансовийОтчетПрісоедіненниеФайли
ДЕ
АвансовийОтчетПрісоедіненниеФайли.Дата< ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)
порожня дата
Здійснити перевірку змінної на те, чи містить вона в собі незаповнену дату найпростіше звичайним порівнянням. У цьому прикладі ми, використовуючи запит, виберемо всі надходження коштів на р / с, у яких не заповнена входить дата.