Работа с датами в 1С:Предприятие — одна из самых частых задач, с которыми сталкиваются как программисты, так и обычные пользователи.hether вам нужно сформировать отчёт по дням, рассчитать график платежей, построить календарь с выходными или просто получить список дат между двумя значениями — без правильно организованной таблицы дат не обойтись. В этой статье мы разберём 5 практических способов создания таблиц дат в 1С: от простейших методов для новичков до оптимизированных решений для крупных баз данных.

Особенность работы с датами в 1С заключается в том, что платформа предоставляет как встроенные инструменты (например, функции языка запросов), так и требует ручного программирования для нестандартных задач. Мы покажем, как получить таблицу дат без программирования (через конструкторы запросов), а также приведём готовые 1С-код и SQL-запросы для типичных сценариев. Все примеры протестированы на актуальных версиях платформы 1С:Предприятие 8.3.

Важно: если вы работаете с большими временными интервалами (например, 10+ лет), некоторые методы могут тормозить. В таких случаях мы рекомендуем использовать виртуальные таблицы или предварительно рассчитанные календари. Об этом — в соответствующих разделах статьи.

1. Простейший способ: диапазон дат через конструктор запросов

Если вам нужна таблица дат без учёта выходных и праздников, самый быстрый способ — воспользоваться конструктором запросов в конфигураторе. Этот метод не требует знания языка программирования и подходит для формирования отчётов или временных выборок.

Инструкция:

  • 📌 Откройте КонфигураторФайлНовыйЗапрос.
  • 🔍 В конструкторе перейдите на вкладку Таблицы и добавьте виртуальную таблицу Календарь (доступна в большинстве типовых конфигураций, например, в 1С:Бухгалтерии или 1С:ЗУП).
  • 📅 В поле Период укажите начальную и конечную даты (например, ДатаНачала = '2026-01-01', ДатаКонца = '2026-12-31').
  • 📊 На вкладке Поля добавьте поле Дата (оно будет содержать каждую дату из диапазона).

Пример готового запроса:

ВЫБРАТЬ

Календарь.Дата КАК Дата

ИЗ

Календарь КАК Календарь

ГДЕ

Календарь.Дата МЕЖДУ &НачалоПериода И &КонецПериода

⚠️ Внимание: Виртуальная таблица Календарь может отсутствовать в некоторых конфигурациях (например, в 1С:УТ 10.3). В этом случае используйте методы из следующих разделов.
📊 Какой способ создания таблиц дат вы используете чаще?
Конструктор запросов
Ручной ввод в Excel с импортом
Программный код на 1С
Внешние обработки
Не работал с таблицами дат

2. Генерация таблицы дат через язык 1С (встроенные функции)

Для программистов самый гибкий способ — создание таблицы дат непосредственно в коде . Этот метод позволяет учитывать выходные дни, праздники, а также добавлять дополнительные поля (например, "номер недели" или "день недели").

Базовый алгоритм:

  1. Создать новую таблицу значений (ТаблицаЗначений).
  2. Добавить колонки (например, Дата, ДеньНедели, ЭтоВыходной).
  3. Заполнить таблицу циклoм от начальной до конечной даты.

Пример кода:

Процедура СоздатьТаблицуДат(ДатаНачала, ДатаКонца)

ТаблицаДат = Новый ТаблицаЗначений;

ТаблицаДат.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));

ТаблицаДат.Колонки.Добавить("ДеньНедели", Новый ОписаниеТипов("Строка"));

ТаблицаДат.Колонки.Добавить("ЭтоВыходной", Новый ОписаниеТипов("Булево"));

ТекущаяДата = ДатаНачала;

Пока ТекущаяДата <= ДатаКонца Цикл

НоваяСтрока = ТаблицаДат.Добавить();

НоваяСтрока.Дата = ТекущаяДата;

НоваяСтрока.ДеньНедели = Формат(ТекущаяДата, "ДФ=dddd"); // Полное название дня недели

НоваяСтрока.ЭтоВыходной = (ДеньНедели(ТекущаяДата) = 6) ИЛИ (ДеньНедели(ТекущаяДата) = 7); // 6=суббота, 7=воскресенье

ТекущаяДата = ТекущаяДата + 86400; // +1 день в секундах

КонецЦикла;

Возврат ТаблицаДат;

КонецПроцедуры

Чтобы учесть праздничные дни, добавьте проверку через функцию ЭтоПраздник() (если она есть в вашей конфигурации) или создайте свой справочник праздников. Пример расширенной проверки:

НоваяСтрока.ЭтоВыходной = (ДеньНедели(ТекущаяДата) >= 6) ИЛИ ЭтоПраздник(ТекущаяДата);

☑️ Подготовка к генерации таблицы дат

Выполнено: 0 / 4

3. Использование временных таблиц в запросах 1С

Если вам нужна таблица дат внутри SQL-запроса (например, для дальнейшей обработки или соединения с другими данными), можно использовать временные таблицы. Этот метод особенно полезен при работе с управляемыми формами или когда данные нужны непосредственно в отчёте.

Пример запроса с генерацией дат "на лету":

ВЫБРАТЬ

ДобавитьКДате('2026-01-01', ЧИСЛООТ(1) КАК Число) КАК Дата

ПОМЕСТИТЬ ВТ_Дата

ИЗ

Числа(ДатаКонец - ДатаНачало + 1) КАК Числа

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ

ВТ_Дата.Дата КАК Дата,

ДеньНедели(ВТ_Дата.Дата) КАК НомерДняНедели,

ВЫРАЗИТЬ(ДеньНедели(ВТ_Дата.Дата) В ("Воскресенье", "Понедельник", ..., "Суббота")) КАК ДеньНеделиТекст

ИЗ

ВТ_Дата КАК ВТ_Дата

ГДЕ

ВТ_Дата.Дата МЕЖДУ &ДатаНачало И &ДатаКонец

Особенности метода:

  • 🔹 Работает быстрее, чем программное заполнение таблицы значений (особенно для больших диапазонов).
  • 🔹 Позволяет сразу добавлять вычисляемые поля (например, номер недели или квартал).
  • 🔹 Можно использовать в ОБЪЕДИНЕНИИ с другими таблицами для анализа данных по датам.
⚠️ Внимание: Функция Числа(N) генерирует последовательность чисел от 1 до N. В некоторых версиях платформы она может быть ограничена (например, до 10 000 строк). Для больших диапазонов разбивайте запрос на части.

4. Таблица дат с учётом производственного календаря

В задачах расчёта зарплаты, графиков работы или планирования часто требуется таблица дат с учётом производственного календаря (выходные, праздники, сокращённые дни). В типовых конфигурациях (1С:ЗУП, 1С:ERP) для этого есть готовый инструмент — справочник ПроизводственныеКалендари.

Как получить таблицу дат с учётом календаря:

  1. Откройте справочник ПроизводственныеКалендари (обычно находится в разделе Нормативно-справочная информация).
  2. Выберите нужный календарь (например, "Основной график работы").
  3. Используйте метод ПолучитьДниКалендаря() для генерации таблицы.

Пример кода:

Процедура ПолучитьТаблицуПоКалендарю(Календарь, ДатаНачала, ДатаКонца)

ТаблицаДат = Новый ТаблицаЗначений;

ТаблицаДат.Колонки.Добавить("Дата");

ТаблицаДат.Колонки.Добавить("ТипДня"); // Рабочий, Выходной, Праздник

МассивДней = Календарь.ПолучитьДниКалендаря(ДатаНачала, ДатаКонца);

Для Каждого День Из МассивДней Цикл

Строка = ТаблицаДат.Добавить();

Строка.Дата = День.Дата;

Строка.ТипДня = День.ВидДня; // Например, "Рабочий день", "Выходной"

КонецЦикла;

Возврат ТаблицаДат;

КонецПроцедуры

Если в вашей конфигурации нет справочника ПроизводственныеКалендари, можно создать упрощённую версию:

  • 📅 Создайте справочник Праздники с полем Дата.
  • 📋 Заполните его датами официальных праздников (можно импортировать из Excel).
  • 🔄 В коде генерации таблицы добавляйте проверку на присутствие даты в этом справочнике.
💡

Если вам нужно учитывать региональные праздники (например, День города), добавьте в справочник Праздники поле Регион и фильтруйте по нему при генерации таблицы.

5. Оптимизация для больших диапазонов (10+ лет)

При генерации таблиц дат за длительные периоды (например, 2000–2030 годы) стандартные методы могут работать медленно или вызывать ошибки переполнения памяти. В таких случаях рекомендуется:

  1. Использовать виртуальные таблицы (если они поддерживаются конфигурацией). Например, в 1С:ERP есть виртуальная таблица Календарь.Дни, которая оптимизирована для больших выборок.
  2. Генерировать данные частями (по годам или кварталам) и объединять результаты.
  3. Сохранять готовый календарь в регистр сведений и обновлять его раз в год (например, 1 января).

Пример оптимизированного кода для генерации по годам:

Процедура СоздатьБольшойКалендарь(ДатаНачала, ДатаКонца)

ТаблицаДат = Новый ТаблицаЗначений;

ТекущийГод = Год(ДатаНачала);

Пока ТекущийГод <= Год(ДатаКонца) Цикл

ДатаНачалаГода = НачалоГода(ТекущийГод);

ДатаКонцаГода = КонецГода(ТекущийГод);

Если ДатаКонцаГода > ДатаКонца Тогда

ДатаКонцаГода = ДатаКонца;

КонецЕсли;

// Генерация дат для текущего года

ЧастьТаблицы = СоздатьТаблицуДат(ДатаНачалаГода, ДатаКонцаГода);

ТаблицаДат.Объединить(ЧастьТаблицы);

ТекущийГод = ТекущийГод + 1;

КонецЦикла;

Возврат ТаблицаДат;

КонецПроцедуры

Для крайне больших диапазонов (50+ лет) рассмотрите вариант хранения календаря во внешней базе данных (например, PostgreSQL) с подключением через 1С:Адаптер интеграции.

⚠️ Внимание: При работе с диапазонами более 10 лет проверьте ограничения вашей версии платформы 1С:Предприятие. В некоторых конфигурациях могут возникать ошибки при обработке более 1 000 000 строк.

6. Экспорт и импорт таблиц дат (Excel, JSON, XML)

Иногда таблицу дат удобнее создать во внешней программе (например, в Microsoft Excel), а затем импортировать в 1С. Это актуально, если:

  • 📊 Вам нужно визуально редактировать даты (например, отмечать события).
  • 🔄 Данные поступают из другой системы (например, корпоративного календаря).
  • 📅 Вы используете нестандартные форматы (например, буддистский или исламский календарь).

Как импортировать таблицу дат из Excel:

  1. Создайте в Excel столбец с датами (формат ячеек — Дата).
  2. Добавьте дополнительные столбцы (например, "Тип дня", "Примечание").
  3. Сохраните файл в формате .xlsx или .csv.
  4. В 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) перенос праздников уже учтён в справочнике ПроизводственныйКалендарь. Если вы создаёте календарь самостоятельно, добавьте в справочник Праздники поле ПеренесёнНа (тип Дата) и обрабатывайте его в коде:

Если Праздники.НайтиПоРеквизиту("ПеренесёнНа", ТекущаяДата) Тогда

ЭтоПраздник = Истина;

КонецЕсли;

Можно ли создать таблицу дат без программирования?

Да, если в вашей конфигурации есть виртуальная таблица Календарь. Используйте конструктор запросов, как описано в первом разделе. Если такой таблицы нет, попробуйте:

  1. Создать таблицу в Excel и импортировать её в 1С.
  2. Использовать внешние обработки (например, "Универсальный отчёт" из 1С:ИТС).
Как добавить в таблицу дат номер недели?

Используйте функцию НеделяГода() в запросе или при программном заполнении таблицы:

НоваяСтрока.НомерНедели = НеделяГода(ТекущаяДата);

Для ISO-недель (где неделя начинается с понедельника) используйте:

НоваяСтрока.НомерНеделиISO = НеделяГода(ТекущаяДата, 2); // Параметр 2 - режим ISO
Почему при генерации дат через запрос некоторые даты пропускаются?

Это может происходить по двум причинам:

  1. Ошибка в условии МЕЖДУ: Убедитесь, что конечная дата включена в диапазон. В 1С условие МЕЖДУ A И B включает обе границы, но иногда из-за округления времени даты могут "выпадать". Используйте Дата <= &ДатаКонец.
  2. Ограничение функции Числа(N): Если диапазон слишком большой (например, 50 лет), разбейте запрос на части по 10 000 строк.
Как создать таблицу дат с шагом в 1 час (для почасового учёта)?summary>

Для генерации почасового расписания модифицируйте цикл добавления дат:

ТекущееВремя = ДатаНачала;

Пока ТекущееВремя <= ДатаКонца Цикл

НоваяСтрока = ТаблицаДат.Добавить();

НоваяСтрока.ДатаВремя = ТекущееВремя;

ТекущееВремя = ТекущееВремя + 3600; // +1 час в секундах

КонецЦикла;

Для удобства добавьте колонки Дата (без времени) и Час:

НоваяСтрока.Дата = НачалоДня(ТекущееВремя);

НоваяСтрока.Час = Час(ТекущееВремя);