Как с наименьшими потерями преобразовать дату в миллисекунды при обновлении БСП на больших объемах данных?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При обновлении Библиотеки Стандартных Подсистем (БСП) разработчики регулярно сталкиваются с изменением структуры метаданных. Одно из наиболее критичных изменений в подсистеме «Оценка производительности» — перенос измерений и реквизитов регистра сведений замеров времени с типа Дата на составное числовое значение Число(14,0). В новой логике БСП время фиксируется как универсальная дата в миллисекундах (количество миллисекунд, прошедших с 01.01.0001 00:00:00 UTC).

Если база данных содержит десятки миллионов записей в регистре замеров, стандартный процесс реструктуризации через Конфигуратор может затянуться на долгие часы, вызвать переполнение журнала транзакций СУБД (LDF), разрастание TempDB или привести к падению сеанса по таймауту блокировок. Рассмотрим основные способы решения этой задачи с минимальными простоями базы данных.

Суть преобразования формата даты в миллисекунды

Разберем, как платформенно рассчитывается значение универсальной даты в миллисекундах. Функция 1С ТекущаяУниверсальнаяДатаВМиллисекундах() возвращает интервал в миллисекундах от начала нашей эры по UTC. Для преобразования обычной даты из формата 1С в миллисекунды необходимо привести локальную дату к часовому поясу UTC и перевести полученную разницу секунд в миллисекунды.

В коде 1С такое преобразование выглядит следующим образом:


ДатаUTC = УниверсальноеВремя(ИсходнаяДата);
КоличествоМиллисекунд = (ДатаUTC - Дата(1, 1, 1)) * 1000;

Способ 1. Сокращение и очистка исторических замеров (Рекомендуемый)

Прежде чем планировать сложные технические операции по конвертации гигантской таблицы, проанализируем необходимость хранения старых замеров производительности. Замеры времени пятиминутной давности двухмесячной давности чаще всего не несут практической ценности для анализа текущей системы.

В подсистеме БСП предусмотрены штатные инструменты оптимизации объема данных:

  1. Регламентное задание очистки замеров: Перейдем в настройки подсистемы оценки производительности, уменьшим период хранения исторических данных и запустим штатное процедурное задание очистки замеров до выполнения обновления. Это позволит законными средствами сократить объем регистра в несколько раз.
  2. Штатный экспорт и очистка: Если замеры за определенный период все же требуется сохранить, воспользуемся стандартной формой экспорта замеров БСП. Выгрузим данные в файл, полностью очистим регистр сведений, применим обновление конфигурации (которое пройдет мгновенно на пустой таблице) и при необходимости подгрузим актуальный срез обратно.

Способ 2. Реструктуризация на уровне СУБД (MS SQL Server)

Если данные очищать нельзя, а стандартная реструктуризация 1С приводит к зависанию базы, применим вариант переноса таблицы средствами СУБД. Прямое изменение типов колонок через ALTER COLUMN в базе 1С недопустимо, так как приведет к расхождению структуры метаданных. Схема работы через СУБД выглядит следующим образом:

  1. Скопируем таблицу регистра во временную таблицу базы данных SQL.
  2. Выполним команду TRUNCATE TABLE для исходной таблицы регистра в SQL (или очистим регистр на стороне 1С).
  3. Применим обновление конфигурации в 1С через Конфигуратор. Платформа изменит структуру пустой таблицы и назначит колонке новый тип Число(14,0) без нагрузочной реструктуризации.
  4. Заполним обновленную таблицу 1С данными из временной таблицы SQL с помощью запроса INSERT INTO ... SELECT, применив конвертацию даты в миллисекунды средствами SQL.
  5. Удалим временную таблицу СУБД.

Способ 3. Двухэтапная смена типов метаданных (Без применения SQL)

Рассмотрим вариант, когда прямого доступа к консоли СУБД нет, а обновлять систему приходится штатными средствами Конфигуратора. Выполнять операцию в один релиз рискованно, поэтому разделим процесс на два этапа:

  1. Первый релиз: Не меняем тип существующего измерения напрямую. Изменим тип измерения на составной (добавим к типу Дата тип Число(14,0)). Такая операция проходит значительно быстрее полной реструктуризации с изменением типа.
  2. Заполнение данных: В рабочем режиме запустим фоновое или порционное обработочный сценарий, который считывает записи, рассчитывает значение в миллисекундах и перезаписывает измерение уже числовым значением.
  3. Второй релиз: После того как все записи регистра преобразованы в числовой формат, выходящим релизом удаляем тип Дата из состава типов измерения.Платформа зафиксирует тип как чистое Число(14,0).

Выбор конкретного метода зависит от требований к доступности системы, объема регистра замеров и наличии у администратора прав доступа к управлению СУБД.

← На главную