Загрузка данных
&НаСервере
Процедура Создать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", УровеньЖурналаРегистрации.Информация,,
"Тест: " + ?(ТестовыйРежим, "да", "нет") + " | Добавлено: " + КоличествоДобавленных);
КонецПроцедуры