Загрузка данных


&НаКлиенте
Процедура ВыполнитьАрхивацию(Команда)
    
    // Проверяем ввод
    Если Месяц = 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.Закрыть();
    
    Сообщить("Архив сохранён: " + ПутьКФайлу);
    
КонецПроцедуры