THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму

При роботі з датами 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. Передати через параметр. Отримати поточну дату сеансу можна тільки цим методом;
  2. Отримати дату в запиті з поля вибірки;
  3. Перетворити з числових значень за допомогою функції ДАТАВРЕМЯ ().

Найпоширенішою завданням при роботі з документами є перевірка на порожню дату в запиті 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С можна не тільки вибирати різні поля і отримувати параметри. Існує безліч функцій, що полегшують форматування дати під потреби конкретного завдання. Якщо ви часто працюєте з датами в запиті, то ви повинні знати ці команди:

  • ПОЧАТОК ПЕРІОДУ. Як параметри вказується дата і проміжок часу, в розрізі якого необхідно отримати початок дати. Використовується, щоб перетворити дату до формату без часу. Для цього необхідно задати другий параметр - «ДЕНЬ»;
НАЧАЛОПЕРІОДА (,) НАЧАЛОПЕРІОДА (& Дата, ДЕНЬ) період\u003e дата\u003e
  • КОНЕЦПЕРІОДА. Аналогічна команда, яка повертає останню дату в розрізі зазначених в параметрах одиниць;
  • ДОБАВІТЬКДАТЕ. Дозволяє отримати дату, велику на задану кількість зазначених одиниць часу. Як параметри функції вказують дату, одиницю виміру часу і число;
ДОБАВІТЬКДАТЕ (,) ДОБАВІТЬКДАТЕ (& Дата, ДЕНЬ, 10) кількість\u003e тип\u003e дата\u003e
  • РАЗНОСТЬДАТ. Отримує різницю між датами в зазначених одиницях виміру;
РАЗНОСТЬДАТ (,) РАЗНОСТЬДАТ (& Дата1, & Дата2, ДЕНЬ) тип\u003e дата2\u003e дата1\u003e
  • ДЕНЬ ТИЖНЯ. Поверне порядковий номер одного з днів тижня.

Грамотно застосовуючи ці функції, розробник може вирішувати досить нетривіальні завдання. Наприклад, отримання найменування дня тижня поточної дати в запиті у вигляді рядка:

ВИБІР КОЛИ ДЕНЬНЕДЕЛІ (& ТекущаяДата) \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)

порожня дата

Здійснити перевірку змінної на те, чи містить вона в собі незаповнену дату найпростіше звичайним порівнянням. У цьому прикладі ми, використовуючи запит, виберемо всі надходження коштів на р / с, у яких не заповнена входить дата.

THE BELL

Є ті, хто прочитали цю новину раніше вас.
Підпишіться, щоб отримувати статті свіжими.
Email
ім'я
Прізвище
Як ви хочете читати The Bell
без спаму