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


&НаСервере
Процедура СоздатьGTINs()
	
	ВыгрузитьРегистрВCSV();

    ТестовыйРежим = Истина;  // ← поменяйте на Ложь, когда проверите

    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |    ТоварыНаСкладахОстатки.Характеристика КАК Характеристика,
    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК СуммаОстатка
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    |ГДЕ
    |    ТоварыНаСкладахОстатки.КоличествоОстаток > 0
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.Характеристика";

    РезультатЗапроса = Запрос.Выполнить();
    Если РезультатЗапроса.Пустой() Тогда
        Сообщить("Нет товаров с положительным остатком.");
        Возврат;
    КонецЕсли;

    Выборка = РезультатЗапроса.Выбрать();

    ОбщаяСуммаОстатков = 0;
    КоличествоХарактеристик = 0;
    КоличествоНайденныхGTIN = 0;
    КоличествоБезGTIN = 0;
    КоличествоУжеСуществует = 0;
    КоличествоДобавленных = 0;

    НаборЗаписей = РегистрыСведений.ОписаниеGTINИС.СоздатьНаборЗаписей();   
	СписокДобавляемых = Новый Массив;

    Пока Выборка.Следующий() Цикл
        НоменклатураСсылка = Выборка.Номенклатура;
        ХарактеристикаСсылка = Выборка.Характеристика;
        СуммаОстатка = Выборка.СуммаОстатка;

        ОбщаяСуммаОстатков = ОбщаяСуммаОстатков + СуммаОстатка;
        КоличествоХарактеристик = КоличествоХарактеристик + 1;

        GTIN = ПолучитьGTIN(НоменклатураСсылка, ХарактеристикаСсылка);
        Если ПустаяСтрока(GTIN) Тогда
            КоличествоБезGTIN = КоличествоБезGTIN + 1;
            Продолжить;
        КонецЕсли;
        КоличествоНайденныхGTIN = КоличествоНайденныхGTIN + 1;

        Если НайтиЗаписьПоГТИН(GTIN) Тогда
            КоличествоУжеСуществует = КоличествоУжеСуществует + 1;
            Продолжить;
        КонецЕсли;

        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.GTIN = GTIN;
        НоваяЗапись.ВидУпаковки = Перечисления.ВидыУпаковокИС.Потребительская;
        НоваяЗапись.КоличествоПотребительскихУпаковок = 1;   // точное имя поля

        КоличествоДобавленных = КоличествоДобавленных + 1;     
		СписокДобавляемых.Добавить(НоваяЗапись);
	КонецЦикла;      
	
	   // --- Сохраняем список добавляемых в CSV (если есть) ---
    Если СписокДобавляемых.Количество() > 0 Тогда
        СохранитьСписокВCSV(СписокДобавляемых);
    КонецЕсли;

    Если НаборЗаписей.Количество() > 0 Тогда
        Если ТестовыйРежим Тогда
            Сообщить("*** ТЕСТ: запись отключена. Будет добавлено: " + НаборЗаписей.Количество());
        Иначе
			НаборЗаписей.Записать();
            Сообщить("Данные записаны. Добавлено: " + НаборЗаписей.Количество());
        КонецЕсли;
    Иначе
        Сообщить("Нет новых записей.");
    КонецЕсли;

    Сообщить("========== СТАТИСТИКА ==========");
    Сообщить("Общая сумма остатков: " + ОбщаяСуммаОстатков);
    Сообщить("Характеристик с остатком: " + КоличествоХарактеристик);
    Сообщить("Найдено GTIN: " + КоличествоНайденныхGTIN);
    Сообщить("Без GTIN: " + КоличествоБезGTIN);
    Сообщить("Уже существовали: " + КоличествоУжеСуществует);
    Сообщить("Добавлено новых: " + КоличествоДобавленных);
    Сообщить("=================================");

    ЗаписьЖурналаРегистрации("Заполнение GTIN", УровеньЖурналаРегистрации.Информация,,
        "Тест: " + ?(ТестовыйРежим, "да", "нет") + " | Добавлено: " + КоличествоДобавленных);

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

// ============================================================
// Получение GTIN из регистра "Штрихкоды"
// ============================================================
Функция ПолучитьGTIN(НоменклатураСсылка, ХарактеристикаСсылка)

    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Штрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    |    РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |    Штрихкоды.Владелец = &Номенклатура
    |    И Штрихкоды.Характеристика = &Характеристика
    |    И Штрихкоды.Штрихкод <> """"";

    Запрос.УстановитьПараметр("Номенклатура", НоменклатураСсылка);
    Запрос.УстановитьПараметр("Характеристика", ХарактеристикаСсылка);

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат "";
    КонецЕсли;

    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
        Штрихкод = СокрЛП(Выборка.Штрихкод);
        Если СтрДлина(Штрихкод) = 13 Тогда
            Возврат "0" + Штрихкод;
        ИначеЕсли СтрДлина(Штрихкод) = 14 Тогда
            Возврат Штрихкод;
        КонецЕсли;
    КонецЦикла;

    Возврат "";
КонецФункции

// ============================================================
// Проверка существования записи по GTIN
// ============================================================
Функция НайтиЗаписьПоГТИН(GTIN)

    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    ОписаниеGTINИС.GTIN
    |ИЗ
    |    РегистрСведений.ОписаниеGTINИС КАК ОписаниеGTINИС
    |ГДЕ
    |    ОписаниеGTINИС.GTIN = &GTIN";
    Запрос.УстановитьПараметр("GTIN", GTIN);
    Возврат НЕ Запрос.Выполнить().Пустой();

КонецФункции 


Процедура ВыгрузитьРегистрВCSV()
    ИмяФайла = "F:\ОписаниеGTINИС_бэкап_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".csv";
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ ОписаниеGTINИС.GTIN, ОписаниеGTINИС.ВидУпаковки, ОписаниеGTINИС.КоличествоПотребительскихУпаковок ИЗ РегистрСведений.ОписаниеGTINИС КАК ОписаниеGTINИС";
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда Сообщить("Регистр пуст."); Возврат; КонецЕсли;
    Выборка = Результат.Выбрать();
    ТекстCSV = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
    ТекстCSV.ЗаписатьСтроку("GTIN;ВидУпаковки;КоличествоУпаковок");
    Пока Выборка.Следующий() Цикл
        ТекстCSV.ЗаписатьСтроку(Выборка.GTIN + ";" + Строка(Выборка.ВидУпаковки) + ";" + Строка(Выборка.КоличествоПотребительскихУпаковок));
    КонецЦикла;
    ТекстCSV.Закрыть();
    Сообщить("Бэкап сохранён: " + ИмяФайла);
КонецПроцедуры    



      // ============================================================
// Сохраняет массив структур (GTIN, Номенклатура, Характеристика) в CSV
// ============================================================
Процедура СохранитьСписокВCSV(СписокЗаписей)

    ИмяФайла = "F:\Добавляемые_GTIN_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".csv";

    ТекстCSV = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
    ТекстCSV.ЗаписатьСтроку("GTIN;Номенклатура;Характеристика");

    Для каждого Запись Из СписокЗаписей Цикл
        Строка = Запись.GTIN + ";" + Строка(Запись.ВидУпаковки) + ";" + Строка(Запись.КоличествоПотребительскихУпаковок);
        ТекстCSV.ЗаписатьСтроку(Строка);
    КонецЦикла;

    ТекстCSV.Закрыть();
    Сообщить("Список добавляемых GTIN сохранён: " + ИмяФайла);

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

&НаКлиенте
Процедура ВыполнитьНаклиенте(Команда)   
	
	
ВыполнитьНаСервере();   
	
	
КонецПроцедуры