Загрузка данных
&НаКлиенте
Процедура ВыполнитьАрхивацию(Команда)
// Проверяем ввод
Если Месяц = 0 Или Год = 0 Тогда
Сообщить("Введите месяц и год для архивации!");
Возврат;
КонецЕсли;
Если Месяц < 1 Или Месяц > 12 Тогда
Сообщить("Месяц должен быть от 1 до 12!");
Возврат;
КонецЕсли;
// Вызываем серверную процедуру
АрхивацияНаСервере(Месяц, Год);
КонецПроцедуры
&НаСервере
Процедура АрхивацияНаСервере(МесяцАрхивации, ГодАрхивации)
// Определяем границы месяца
ДатаНачала = Дата(ГодАрхивации, МесяцАрхивации, 1);
ДатаОкончания = КонецМесяца(ДатаНачала);
// Формируем имя архивного регистра (будет создан динамически)
ИмяАрхива = "Архив_Заказов_" + Формат(МесяцАрхивации, "ЧЦ=2") + "_" + ГодАрхивации;
// Шаг 1. Создаём регистр сведений (если ещё не создан)
СоздатьАрхивныйРегистр(ИмяАрхива);
// Шаг 2. Запрос на выборку заказов за месяц
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказПокупателя.Ссылка КАК Ссылка,
| ЗаказПокупателя.Дата КАК Дата,
| ЗаказПокупателя.Заказчик КАК Заказчик,
| ЗаказПокупателя.Исполнитель КАК Исполнитель,
| ЗаказПокупателя.ИтогСумма КАК ИтогСумма,
| ЗаказПокупателя.Номер КАК НомерЗаказа
|ИЗ
| Документ.ЗаказПокупателя КАК ЗаказПокупателя
|ГДЕ
| ЗаказПокупателя.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
// Подсчитываем количество
КоличествоЗаказов = 0;
// Шаг 3. Переносим в архив (таблицу значений)
АрхивныеДанные = Новый ТаблицаЗначений;
АрхивныеДанные.Колонки.Добавить("НомерЗаказа", Новый ОписаниеТипов("Строка"));
АрхивныеДанные.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
АрхивныеДанные.Колонки.Добавить("Заказчик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
АрхивныеДанные.Колонки.Добавить("Исполнитель", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
АрхивныеДанные.Колонки.Добавить("ИтогСумма", Новый ОписаниеТипов("Число"));
Пока Выборка.Следующий() Цикл
НоваяСтрока = АрхивныеДанные.Добавить();
НоваяСтрока.НомерЗаказа = Выборка.НомерЗаказа;
НоваяСтрока.Дата = Выборка.Дата;
НоваяСтрока.Заказчик = Выборка.Заказчик;
НоваяСтрока.Исполнитель = Выборка.Исполнитель;
НоваяСтрока.ИтогСумма = Выборка.ИтогСумма;
КоличествоЗаказов = КоличествоЗаказов + 1;
КонецЦикла;
// Сохраняем в XML-файл (как аналог архивной таблицы)
Если КоличествоЗаказов > 0 Тогда
СохранитьАрхивВФайл(АрхивныеДанные, ИмяАрхива);
// Шаг 4. Удаляем перенесённые заказы из основной таблицы
ЗапросУдаления = Новый Запрос;
ЗапросУдаления.Текст =
"УДАЛИТЬ ИЗ
| Документ.ЗаказПокупателя
|ГДЕ
| Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
ЗапросУдаления.УстановитьПараметр("ДатаНачала", ДатаНачала);
ЗапросУдаления.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
ЗапросУдаления.Выполнить();
Сообщить("Архивация выполнена успешно!");
Сообщить("Перенесено заказов: " + КоличествоЗаказов);
Сообщить("Архив сохранён в файл: " + ИмяАрхива + ".xml");
Иначе
Сообщить("Заказов за указанный период не найдено.");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СоздатьАрхивныйРегистр(ИмяРегистра)
// В 1С нельзя динамически создать объект метаданных программно
// Поэтому используем альтернативу - сохраняем в файл XML
// Этот метод - заглушка для демонстрации логики
// Реальный архив можно делать через:
// 1. Выгрузку в XML/Excel
// 2. Регистр сведений с предварительным созданием
// 3. Отдельный справочник "АрхивЗаказов"
// Для простоты оставим заглушку
Возврат;
КонецПроцедуры
&НаСервере
Процедура СохранитьАрхивВФайл(ТаблицаДанных, ИмяФайла)
// Формируем путь к файлу
ПутьКФайлу = "C:\Archives\" + ИмяФайла + ".xml";
// Создаём каталог если не существует
Каталог = "C:\Archives\";
Если Не РаботаСФайлами.Существует(Каталог) Тогда
РаботаСФайлами.СоздатьКаталог(Каталог);
КонецЕсли;
// Записываем таблицу значений в XML
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ПутьКФайлу, "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("АрхивЗаказов");
ЗаписьXML.ЗаписатьАтрибут("ДатаАрхивации", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd"));
Для Каждого Строка Из ТаблицаДанных Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Заказ");
ЗаписьXML.ЗаписатьНачалоЭлемента("Номер");
ЗаписьXML.ЗаписатьТекст(Строка.НомерЗаказа);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Дата");
ЗаписьXML.ЗаписатьТекст(Формат(Строка.Дата, "ДФ=yyyy-MM-dd"));
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Заказчик");
ЗаписьXML.ЗаписатьТекст(Строка.Заказчик.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Исполнитель");
ЗаписьXML.ЗаписатьТекст(Строка.Исполнитель.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьНачалоЭлемента("Сумма");
ЗаписьXML.ЗаписатьТекст(Строка.ИтогСумма);
ЗаписьXML.ЗаписатьКонецЭлемента();
ЗаписьXML.ЗаписатьКонецЭлемента(); // Заказ
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // АрхивЗаказов
ЗаписьXML.Закрыть();
Сообщить("Архив сохранён: " + ПутьКФайлу);
КонецПроцедуры