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


&НаСервере
Процедура СоздатьGTINs()

    ВыгрузитьРегистрВCSV();

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

    // 1. Загружаем все существующие GTIN из регистра в массив
    ЗапросСущ = Новый Запрос;
    ЗапросСущ.Текст = "ВЫБРАТЬ ОписаниеGTINИС.GTIN ИЗ РегистрСведений.ОписаниеGTINИС КАК ОписаниеGTINИС";
    РезультатСущ = ЗапросСущ.Выполнить();
    СуществующиеGTIN = Новый Массив;
    Если РезультатСущ.Пустой() = Ложь Тогда
        ВыборкаСущ = РезультатСущ.Выбрать();
        Пока ВыборкаСущ.Следующий() Цикл
            СуществующиеGTIN.Добавить(ВыборкаСущ.GTIN);
        КонецЦикла;
    КонецЕсли;

    // 2. Запрос: уникальные пары (Владелец, Характеристика, Штрихкод) для EAN13
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    Штрихкоды.Владелец КАК Номенклатура,
    |    Штрихкоды.Характеристика КАК Характеристика,
    |    Штрихкоды.Штрихкод КАК Штрихкод
    |ИЗ
    |    РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |    Штрихкоды.Штрихкод <> """" 
    |    И Штрихкоды.Характеристика <> ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)";

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

    Выборка = Результат.Выбрать();
    НаборЗаписей = РегистрыСведений.ОписаниеGTINИС.СоздатьНаборЗаписей();
    КоличествоДобавленных = 0;
    СписокДобавляемых = Новый Массив;
    ДобавленныеGTIN = Новый Массив;  // ← всё ещё нужен для контроля дублей между разными характеристиками

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

        Если СуществующиеGTIN.Найти(GTIN) <> Неопределено Тогда
            Продолжить;
        КонецЕсли;
        Если ДобавленныеGTIN.Найти(GTIN) <> Неопределено Тогда
            Продолжить;
        КонецЕсли;

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

        // Для CSV-списка (с привязкой к характеристике)
        Структура = Новый Структура;
        Структура.Вставить("Номенклатура", Выборка.Номенклатура.Наименование);
        Структура.Вставить("Характеристика", ?(Выборка.Характеристика.Пустая(), "Без характеристики", Выборка.Характеристика.Наименование));
        Структура.Вставить("GTIN", GTIN);
        СписокДобавляемых.Добавить(Структура);
    КонецЦикла;

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

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

    Сообщить("========== СТАТИСТИКА ==========");
    Сообщить("Добавлено новых записей: " + КоличествоДобавленных);
    Сообщить("=================================");

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

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

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

// ============================================================
// Сохраняет список добавляемых GTIN с номенклатурой и характеристикой
// ============================================================
Процедура СохранитьСписокВCSV(СписокЗаписей)
    ИмяФайла = "F:\Добавляемые_GTIN_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd_HHmmss") + ".csv";
    ТекстCSV = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
    ТекстCSV.ЗаписатьСтроку("Номенклатура;Характеристика;GTIN");
    Для каждого Запись Из СписокЗаписей Цикл
        ТекстCSV.ЗаписатьСтроку(Запись.Номенклатура + ";" + Запись.Характеристика + ";" + Запись.GTIN);
    КонецЦикла;
    ТекстCSV.Закрыть();
    Сообщить("Список добавляемых GTIN сохранён: " + ИмяФайла);
КонецПроцедуры

// ============================================================
// Обработчик кнопки на клиенте
// ============================================================
&НаКлиенте
Процедура ВыполнитьНаКлиенте(Команда)
    СоздатьGTINs();
КонецПроцедуры