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


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

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

    ТестовыйРежим = Истина;

    // 1. ОДИН ЗАПРОС: собираем все EAN13 для каждой характеристики (владелец + характеристика)
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |    Штрихкоды.Владелец КАК Номенклатура,
    |    Штрихкоды.Характеристика КАК Характеристика,
    |    Штрихкоды.Штрихкод КАК Штрихкод
    |ПОМЕСТИТЬ ВТ_Штрихкоды
    |ИЗ
    |    РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |    Штрихкоды.Штрихкод <> """" 
    |    И СтрДлина(Штрихкоды.Штрихкод) = 13
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТ_Штрихкоды.Номенклатура,
    |    ВТ_Штрихкоды.Характеристика,
    |    ""0"" + ВТ_Штрихкоды.Штрихкод КАК GTIN
    |ИЗ
    |    ВТ_Штрихкоды КАК ВТ_Штрихкоды
    |ГДЕ
    |    ВТ_Штрихкоды.Штрихкод <> """" 
    |    И СтрДлина(ВТ_Штрихкоды.Штрихкод) = 13
    |СГРУППИРОВАТЬ ПО
    |    ВТ_Штрихкоды.Номенклатура,
    |    ВТ_Штрихкоды.Характеристика,
    |    ВТ_Штрихкоды.Штрихкод";

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

    // 2. Выгружаем результат в таблицу значений для быстрой обработки
    ТаблицаEAN13 = Результат.Выгрузить();

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

    // 4. Группируем EAN13 по характеристике (для отчётов)
    ГруппыПоХарактеристике = Новый Соответствие; // Ключ = Номенклатура|Характеристика, Значение = Массив GTIN

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

    // Переменные статистики
    КоличествоХарактеристик = 0;
    КоличествоСEAN13 = 0;
    КоличествоБезEAN13 = 0; // в этой версии не используется
    ВсегоУникальныхEAN13 = 0;
    КоличествоУжеСуществует = 0;
    КоличествоДобавленных = 0;

    // 6. Обрабатываем каждую строку таблицы
    Для каждого Строка Из ТаблицаEAN13 Цикл
        НоменклатураСсылка = Строка.Номенклатура;
        ХарактеристикаСсылка = Строка.Характеристика;
        GTIN = Строка.GTIN;

        // Ключ для группировки по характеристике
        КлючХарактеристики = Строка(НоменклатураСсылка) + "|" + Строка(ХарактеристикаСсылка);

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

            КоличествоДобавленных = КоличествоДобавленных + 1;
            СуществующиеGTIN.Вставить(GTIN, Истина); // помечаем как добавленный, чтобы не дублировать в рамках текущего сеанса

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

            // Для отчёта
            СтруктураОтчета = Новый Структура;
            СтруктураОтчета.Вставить("Номенклатура", НоменклатураСсылка.Наименование);
            СтруктураОтчета.Вставить("Характеристика", ?(ХарактеристикаСсылка.Пустая(), "Без характеристики", ХарактеристикаСсылка.Наименование));
            СтруктураОтчета.Вставить("GTIN", GTIN);
            ОтчетныеЗаписи.Добавить(СтруктураОтчета);
        Иначе
            КоличествоУжеСуществует = КоличествоУжеСуществует + 1;
        КонецЕсли;

        // Собираем группы для отчёта
        МассивGTIN = ГруппыПоХарактеристике.Получить(КлючХарактеристики);
        Если МассивGTIN = Неопределено Тогда
            МассивGTIN = Новый Массив;
            ГруппыПоХарактеристике.Вставить(КлючХарактеристики, МассивGTIN);
        КонецЕсли;
        МассивGTIN.Добавить(GTIN);
    КонецЦикла;

    // 7. Статистика по характеристикам (из групп)
    КоличествоХарактеристик = ГруппыПоХарактеристике.Количество();
    КоличествоСEAN13 = КоличествоХарактеристик; // т.к. группа создаётся только если есть EAN13
    ВсегоУникальныхEAN13 = 0;
    Для каждого Элемент Из ГруппыПоХарактеристике Цикл
        ВсегоУникальныхEAN13 = ВсегоУникальныхEAN13 + Элемент.Значение.Количество();
    КонецЦикла;

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

    Если ОтчетныеЗаписи.Количество() > 0 Тогда
        СохранитьОтчетПоДобавленным(ОтчетныеЗаписи);
    КонецЕсли;

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

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

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

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