Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются как программисты, так и обычные пользователи.hether вам нужно сформировать отчёт по дням, рассчитать график платежей, построить календарь с выходными или просто получить список дат между двумя значениями — без правильно организованной таблицы дат не обойтись. В этой статье мы разберём 5 практических способов создания таблиц дат в 1С: от простейших методов для новичков до оптимизированных решений для крупных баз данных.
Особенность работы с датами в 1С заключается в том, что платформа предоставляет как встроенные инструменты (например, функции языка запросов), так и требует ручного программирования для нестандартных задач. Мы покажем, как получить таблицу дат без программирования (через конструкторы запросов), а также приведём готовые 1С-код и SQL-запросы для типичных сценариев. Все примеры протестированы на актуальных версиях платформы 1С:Предприятие 8.3.
Важно: если вы работаете с большими временными интервалами (например, 10+ лет), некоторые методы могут тормозить. В таких случаях мы рекомендуем использовать виртуальные таблицы или предварительно рассчитанные календари. Об этом — в соответствующих разделах статьи.
1. Простейший способ: диапазон дат через конструктор запросов
Если вам нужна таблица дат без учёта выходных и праздников, самый быстрый способ — воспользоваться конструктором запросов в конфигураторе. Этот метод не требует знания языка программирования и подходит для формирования отчётов или временных выборок.
Инструкция:
- 📌 Откройте
Конфигуратор→Файл→Новый→Запрос. - 🔍 В конструкторе перейдите на вкладку
Таблицыи добавьте виртуальную таблицуКалендарь(доступна в большинстве типовых конфигураций, например, в 1С:Бухгалтерии или 1С:ЗУП). - 📅 В поле
Периодукажите начальную и конечную даты (например,ДатаНачала = '2026-01-01',ДатаКонца = '2026-12-31'). - 📊 На вкладке
Полядобавьте полеДата(оно будет содержать каждую дату из диапазона).
Пример готового запроса:
ВЫБРАТЬ
Календарь.Дата КАК Дата
ИЗ
Календарь КАК Календарь
ГДЕ
Календарь.Дата МЕЖДУ &НачалоПериода И &КонецПериода
⚠️ Внимание: Виртуальная таблица Календарь может отсутствовать в некоторых конфигурациях (например, в 1С:УТ 10.3). В этом случае используйте методы из следующих разделов.
2. Генерация таблицы дат через язык 1С (встроенные функции)
Для программистов самый гибкий способ — создание таблицы дат непосредственно в коде 1С. Этот метод позволяет учитывать выходные дни, праздники, а также добавлять дополнительные поля (например, "номер недели" или "день недели").
Базовый алгоритм:
- Создать новую таблицу значений (
ТаблицаЗначений). - Добавить колонки (например,
Дата,ДеньНедели,ЭтоВыходной). - Заполнить таблицу циклoм от начальной до конечной даты.
Пример кода:
Процедура СоздатьТаблицуДат(ДатаНачала, ДатаКонца)
ТаблицаДат = Новый ТаблицаЗначений;
ТаблицаДат.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДат.Колонки.Добавить("ДеньНедели", Новый ОписаниеТипов("Строка"));
ТаблицаДат.Колонки.Добавить("ЭтоВыходной", Новый ОписаниеТипов("Булево"));
ТекущаяДата = ДатаНачала;
Пока ТекущаяДата <= ДатаКонца Цикл
НоваяСтрока = ТаблицаДат.Добавить();
НоваяСтрока.Дата = ТекущаяДата;
НоваяСтрока.ДеньНедели = Формат(ТекущаяДата, "ДФ=dddd"); // Полное название дня недели
НоваяСтрока.ЭтоВыходной = (ДеньНедели(ТекущаяДата) = 6) ИЛИ (ДеньНедели(ТекущаяДата) = 7); // 6=суббота, 7=воскресенье
ТекущаяДата = ТекущаяДата + 86400; // +1 день в секундах
КонецЦикла;
Возврат ТаблицаДат;
КонецПроцедуры
Чтобы учесть праздничные дни, добавьте проверку через функцию ЭтоПраздник() (если она есть в вашей конфигурации) или создайте свой справочник праздников. Пример расширенной проверки:
НоваяСтрока.ЭтоВыходной = (ДеньНедели(ТекущаяДата) >= 6) ИЛИ ЭтоПраздник(ТекущаяДата);
☑️ Подготовка к генерации таблицы дат
3. Использование временных таблиц в запросах 1С
Если вам нужна таблица дат внутри SQL-запроса (например, для дальнейшей обработки или соединения с другими данными), можно использовать временные таблицы. Этот метод особенно полезен при работе с управляемыми формами или когда данные нужны непосредственно в отчёте.
Пример запроса с генерацией дат "на лету":
ВЫБРАТЬ
ДобавитьКДате('2026-01-01', ЧИСЛООТ(1) КАК Число) КАК Дата
ПОМЕСТИТЬ ВТ_Дата
ИЗ
Числа(ДатаКонец - ДатаНачало + 1) КАК Числа
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВТ_Дата.Дата КАК Дата,
ДеньНедели(ВТ_Дата.Дата) КАК НомерДняНедели,
ВЫРАЗИТЬ(ДеньНедели(ВТ_Дата.Дата) В ("Воскресенье", "Понедельник", ..., "Суббота")) КАК ДеньНеделиТекст
ИЗ
ВТ_Дата КАК ВТ_Дата
ГДЕ
ВТ_Дата.Дата МЕЖДУ &ДатаНачало И &ДатаКонец
Особенности метода:
- 🔹 Работает быстрее, чем программное заполнение таблицы значений (особенно для больших диапазонов).
- 🔹 Позволяет сразу добавлять вычисляемые поля (например, номер недели или квартал).
- 🔹 Можно использовать в
ОБЪЕДИНЕНИИс другими таблицами для анализа данных по датам.
⚠️ Внимание: Функция Числа(N) генерирует последовательность чисел от 1 до N. В некоторых версиях платформы она может быть ограничена (например, до 10 000 строк). Для больших диапазонов разбивайте запрос на части.
4. Таблица дат с учётом производственного календаря
В задачах расчёта зарплаты, графиков работы или планирования часто требуется таблица дат с учётом производственного календаря (выходные, праздники, сокращённые дни). В типовых конфигурациях (1С:ЗУП, 1С:ERP) для этого есть готовый инструмент — справочник ПроизводственныеКалендари.
Как получить таблицу дат с учётом календаря:
- Откройте справочник
ПроизводственныеКалендари(обычно находится в разделеНормативно-справочная информация). - Выберите нужный календарь (например, "Основной график работы").
- Используйте метод
ПолучитьДниКалендаря()для генерации таблицы.
Пример кода:
Процедура ПолучитьТаблицуПоКалендарю(Календарь, ДатаНачала, ДатаКонца)
ТаблицаДат = Новый ТаблицаЗначений;
ТаблицаДат.Колонки.Добавить("Дата");
ТаблицаДат.Колонки.Добавить("ТипДня"); // Рабочий, Выходной, Праздник
МассивДней = Календарь.ПолучитьДниКалендаря(ДатаНачала, ДатаКонца);
Для Каждого День Из МассивДней Цикл
Строка = ТаблицаДат.Добавить();
Строка.Дата = День.Дата;
Строка.ТипДня = День.ВидДня; // Например, "Рабочий день", "Выходной"
КонецЦикла;
Возврат ТаблицаДат;
КонецПроцедуры
Если в вашей конфигурации нет справочника ПроизводственныеКалендари, можно создать упрощённую версию:
- 📅 Создайте справочник
Праздникис полемДата. - 📋 Заполните его датами официальных праздников (можно импортировать из Excel).
- 🔄 В коде генерации таблицы добавляйте проверку на присутствие даты в этом справочнике.
Если вам нужно учитывать региональные праздники (например, День города), добавьте в справочник Праздники поле Регион и фильтруйте по нему при генерации таблицы.
5. Оптимизация для больших диапазонов (10+ лет)
При генерации таблиц дат за длительные периоды (например, 2000–2030 годы) стандартные методы могут работать медленно или вызывать ошибки переполнения памяти. В таких случаях рекомендуется:
- Использовать виртуальные таблицы (если они поддерживаются конфигурацией). Например, в 1С:ERP есть виртуальная таблица
Календарь.Дни, которая оптимизирована для больших выборок. - Генерировать данные частями (по годам или кварталам) и объединять результаты.
- Сохранять готовый календарь в регистр сведений и обновлять его раз в год (например, 1 января).
Пример оптимизированного кода для генерации по годам:
Процедура СоздатьБольшойКалендарь(ДатаНачала, ДатаКонца)
ТаблицаДат = Новый ТаблицаЗначений;
ТекущийГод = Год(ДатаНачала);
Пока ТекущийГод <= Год(ДатаКонца) Цикл
ДатаНачалаГода = НачалоГода(ТекущийГод);
ДатаКонцаГода = КонецГода(ТекущийГод);
Если ДатаКонцаГода > ДатаКонца Тогда
ДатаКонцаГода = ДатаКонца;
КонецЕсли;
// Генерация дат для текущего года
ЧастьТаблицы = СоздатьТаблицуДат(ДатаНачалаГода, ДатаКонцаГода);
ТаблицаДат.Объединить(ЧастьТаблицы);
ТекущийГод = ТекущийГод + 1;
КонецЦикла;
Возврат ТаблицаДат;
КонецПроцедуры
Для крайне больших диапазонов (50+ лет) рассмотрите вариант хранения календаря во внешней базе данных (например, PostgreSQL) с подключением через 1С:Адаптер интеграции.
⚠️ Внимание: При работе с диапазонами более 10 лет проверьте ограничения вашей версии платформы 1С:Предприятие. В некоторых конфигурациях могут возникать ошибки при обработке более 1 000 000 строк.
6. Экспорт и импорт таблиц дат (Excel, JSON, XML)
Иногда таблицу дат удобнее создать во внешней программе (например, в Microsoft Excel), а затем импортировать в 1С. Это актуально, если:
- 📊 Вам нужно визуально редактировать даты (например, отмечать события).
- 🔄 Данные поступают из другой системы (например, корпоративного календаря).
- 📅 Вы используете нестандартные форматы (например, буддистский или исламский календарь).
Как импортировать таблицу дат из Excel:
- Создайте в Excel столбец с датами (формат ячеек —
Дата). - Добавьте дополнительные столбцы (например, "Тип дня", "Примечание").
- Сохраните файл в формате
.xlsxили.csv. - В 1С используйте обработку
ЗагрузкаДанныхИзТабличногоДокументаили напишите свой код для чтения файла.
Пример кода для загрузки из CSV:
Процедура ЗагрузитьДатаИзCSV(ПутьКФайлу)
Текст = Новый ЧтениеТекста(ПутьКФайлу);
ТаблицаДат = Новый ТаблицаЗначений;
ТаблицаДат.Колонки.Добавить("Дата");
ТаблицаДат.Колонки.Добавить("Описание");
Пока Текст.ПрочитатьСтроку() Цикл
Данные = РазложитьСтрокуПоРазделителю(Текст.ТекущаяСтрока, ";");
Если ЗначениеЗаполнено(Данные[0]) Тогда
Строка = ТаблицаДат.Добавить();
Строка.Дата = Дата(Данные[0]);
Строка.Описание = Данные[1];
КонецЕсли;
КонецЦикла;
Возврат ТаблицаДат;
КонецПроцедуры
Для экспорта таблицы дат в Excel используйте стандартную обработку ВыгрузкаДанныхВТабличныйДокумент или библиотеку OneScript (если нужны сложные форматы).
Как избежать ошибок при импорте дат?
При импорте дат из Excel в 1С часто возникают проблемы с форматами. Например, дата "01.02.2026" может интерпретироваться как "1 февраля" или "2 января" в зависимости от региональных настроек. Чтобы избежать ошибок:
1. Перед импортом установите в Excel формат ячеек "Дата" (не "Текст").
2. В коде 1С используйте явное преобразование: Дата = Дата(ЗначениеИзСтрокиВнутр(Данные[0]));
3. Для больших файлов (>10 000 строк) разбивайте их на части по 5 000 строк.
7. Примеры использования таблиц дат в отчётах и обработках
Таблицы дат чаще всего применяются в следующих сценариях:
| Задача | Пример использования | Особенности |
|---|---|---|
| Отчёт по продажам по дням | Связать таблицу дат с регистром Продажи по полю Дата, чтобы показать дни без продаж. |
Используйте ЛЕВОЕ СОЕДИНЕНИЕ в запросе, чтобы не терять даты без данных. |
| График платежей по кредиту | Генерировать даты платежей с учётом выходных (перенос на следующий рабочий день). | Добавьте колонку СуммаПлатежа и рассчитывайте её динамически. |
| Календарь событий | Связать с таблицей дат справочник События для визуализации в отчёте. |
Используйте управляемые формы с элементом Календарь. |
| Анализ посещаемости | Сравнить фактическую посещаемость (из регистра) с плановой (из таблицы дат). | Добавьте колонки План и Факт для построения графиков. |
| Расчёт пеней по договорам | Для каждой даты просрочки рассчитать сумму пени с учётом количества дней. | Используйте колонку КоличествоДнейПросрочки. |
Пример запроса для отчёта по продажам с учётом всех дат (включая дни без продаж):
ВЫБРАТЬ
Календарь.Дата КАК Дата,
ВЫБОР
КОГДА Продажи.Количество ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Продажи.Количество
Конец КАК КоличествоПродаж,
ВЫБОР
КОГДА Продажи.Сумма ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Продажи.Сумма
Конец КАК СуммаПродаж
ИЗ
Календарь КАК Календарь
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи КАК Продажи
ПО Календарь.Дата = Продажи.Дата
ГДЕ
Календарь.Дата МЕЖДУ &ДатаНачало И &ДатаКонец
Всегда используйте ЛЕВОЕ СОЕДИНЕНИЕ при связывании таблицы дат с фактическими данными. Это гарантирует, что в отчёте будут показаны ВСЕ даты из диапазона, даже если по ним нет записей.
FAQ: Частые вопросы по работе с таблицами дат в 1С
Как учесть перенос праздничных дней на рабочие?
В типовых конфигурациях (1С:ЗУП, 1С:ERP) перенос праздников уже учтён в справочнике ПроизводственныйКалендарь. Если вы создаёте календарь самостоятельно, добавьте в справочник Праздники поле ПеренесёнНа (тип Дата) и обрабатывайте его в коде:
Если Праздники.НайтиПоРеквизиту("ПеренесёнНа", ТекущаяДата) Тогда
ЭтоПраздник = Истина;
КонецЕсли;
Можно ли создать таблицу дат без программирования?
Да, если в вашей конфигурации есть виртуальная таблица Календарь. Используйте конструктор запросов, как описано в первом разделе. Если такой таблицы нет, попробуйте:
- Создать таблицу в Excel и импортировать её в 1С.
- Использовать внешние обработки (например, "Универсальный отчёт" из 1С:ИТС).
Как добавить в таблицу дат номер недели?
Используйте функцию НеделяГода() в запросе или при программном заполнении таблицы:
НоваяСтрока.НомерНедели = НеделяГода(ТекущаяДата);
Для ISO-недель (где неделя начинается с понедельника) используйте:
НоваяСтрока.НомерНеделиISO = НеделяГода(ТекущаяДата, 2); // Параметр 2 - режим ISO
Почему при генерации дат через запрос некоторые даты пропускаются?
Это может происходить по двум причинам:
- Ошибка в условии
МЕЖДУ: Убедитесь, что конечная дата включена в диапазон. В 1С условиеМЕЖДУ A И Bвключает обе границы, но иногда из-за округления времени даты могут "выпадать". ИспользуйтеДата <= &ДатаКонец. - Ограничение функции
Числа(N): Если диапазон слишком большой (например, 50 лет), разбейте запрос на части по 10 000 строк.
Как создать таблицу дат с шагом в 1 час (для почасового учёта)?summary>
Для генерации почасового расписания модифицируйте цикл добавления дат:
ТекущееВремя = ДатаНачала;
Пока ТекущееВремя <= ДатаКонца Цикл
НоваяСтрока = ТаблицаДат.Добавить();
НоваяСтрока.ДатаВремя = ТекущееВремя;
ТекущееВремя = ТекущееВремя + 3600; // +1 час в секундах
КонецЦикла;
Для удобства добавьте колонки Дата (без времени) и Час:
НоваяСтрока.Дата = НачалоДня(ТекущееВремя);
НоваяСтрока.Час = Час(ТекущееВремя);
ТекущееВремя = ДатаНачала;
Пока ТекущееВремя <= ДатаКонца Цикл
НоваяСтрока = ТаблицаДат.Добавить();
НоваяСтрока.ДатаВремя = ТекущееВремя;
ТекущееВремя = ТекущееВремя + 3600; // +1 час в секундах
КонецЦикла;
Дата (без времени) и Час:НоваяСтрока.Дата = НачалоДня(ТекущееВремя);
НоваяСтрока.Час = Час(ТекущееВремя);