Загрузка данных
&НаСервере
Процедура Создать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 = >IN";
Запрос.УстановитьПараметр("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 сохранён: " + ИмяФайла);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьНаклиенте(Команда)
ВыполнитьНаСервере();
КонецПроцедуры