Приветствую всех, недавно ко мне обратился один из моих клиентов, торгующий обувью и одеждой с просьбой установить товароучетное ПО, в связи с предстоящим запуском разрешительного режима системы Честный знак. Используемое у него сейчас оборудование ККТ Атол 91Ф не сможет работать в этом режиме. Поэтому было принято решение о приобретении лицензий Атол на использование ККТ в качестве фискальных регистраторов, установлены ПЭВМ(ноутбуки) с 1С Розницей 2.3 базовой. Справочник номенклатуры с штрихкодами (GTIN) был создан из из файлов выгрузки честного знака (Ссылка)
Код обработки прилагается, при необходимости можно адаптировать для любой типовой конфигурации 1С.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если НомерСтолбцаGTIN=0 Тогда
НомерСтолбцаGTIN=1;
КонецЕсли;
Если НомерСтолбцаНаименование=0 Тогда
НомерСтолбцаНаименование=2;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыбратьФайлы(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.МножественныйВыбор=Истина;
Если Диалог.Выбрать() Тогда
Для Каждого ИмяФайла Из Диалог.ВыбранныеФайлы Цикл
ФайлыЗагрузки.Добавить(ИмяФайла);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВсе(Команда)
Для каждого стр из Объект.Товары Цикл
стр.Флаг=Истина;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СнятьВсе(Команда)
Для каждого стр из Объект.Товары Цикл
стр.Флаг=Ложь;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзФайлов(Команда)
МассивZIP=Новый Массив;
МассивXLS=Новый Массив;
Для каждого Файл из ФайлыЗагрузки Цикл
ФайлЗагрузки=Новый Файл(Файл.Значение);
Если ВРЕГ(ФайлЗагрузки.Расширение)=".ZIP" Тогда
Архив=Новый ЧтениеZipФайла(Файл.Значение);
Для каждого Эл из Архив Цикл
ФайлCSV=КаталогВременныхФайлов()+Эл.Имя;
Если НайтиФайлы(ФайлCSV).Количество()=0 Тогда
Попытка
Архив.Извлечь(Эл,КаталогВременныхФайлов(),РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
Исключение
КонецПопытки;
КонецЕсли;
Текст = Новый ЧтениеТекста(ФайлCSV, КодировкаТекста.UTF8);
МассивZIP.Добавить(Текст.Прочитать());
КонецЦикла;
ИначеЕсли ЛЕВ(ВРЕГ(ФайлЗагрузки.Расширение),4)=".XLS" Тогда
ДвоичныеДанные=Новый ДвоичныеДанные(Файл.Значение);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
МассивXLS.Добавить(Новый Структура("Адрес,Расширение",Адрес,ФайлЗагрузки.Расширение));
КонецЕсли;
КонецЦикла;
Если МассивZIP.Количество()>0 Тогда
Объект.Товары.Очистить();
ЗагрузитьДанныеНаСервере(МассивZIP,Неопределено);
КонецЕсли;
Если МассивXLS.Количество()>0 Тогда
ЗагрузитьДанныеНаСервере(Неопределено,МассивXLS);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДанныеНаСервере(МассивZIP,МассивXLS)
ТЗ=Объект.Товары.Выгрузить();
СписокКМ.Очистить();
Если МассивZIP<>Неопределено Тогда
Для каждого Эл из МассивZIP Цикл
ЭтоФайлОтчетаПоКарточкам=Ложь;
НомерСтроки=1;
Для каждого Строка из СтрРазделить(Эл,Символы.ПС) Цикл
Если НомерСтроки=1 И СтрНайти(Строка,"""")=0 Тогда
ЭтоФайлОтчетаПоКарточкам=Истина;
КонецЕсли;
Если ЭтоФайлОтчетаПоКарточкам Тогда
НачЗК=СтрНайти(Строка,",""");
КонЗК=СтрНайти(Строка,""",");
Если НачЗК>0 И КонЗК>0 Тогда
Строка=Лев(Строка,НачЗК-1)+","+
СтрЗаменить(Сред(Строка,НачЗК+2,КонЗК-НачЗК-2),","," ")+","+
Сред(Строка,КонЗК+2);
КонецЕсли;
Данные=СтрРазделить(Строка,",",Истина);
Иначе
Строка=""","+Строка;
Строка=СтрЗаменить(Строка,""",""",
Символы.Таб);
Строка=СтрЗаменить(Строка,""",,""",
Символы.Таб+Символы.Таб);
Строка=СтрЗаменить(Строка,""",,,""",
Символы.Таб+Символы.Таб+Символы.Таб);
Строка=СтрЗаменить(Строка,""",,,,""",
Символы.Таб+Символы.Таб+Символы.Таб+Символы.Таб);
Строка=СтрЗаменить(Строка,""",,,,,""",
Символы.Таб+Символы.Таб+Символы.Таб+Символы.Таб+Символы.Таб);
Данные=СтрРазделить(Строка,Символы.Таб,Истина);
КонецЕсли;
Если Данные.Количество()>10 Тогда
НовСтр=ТЗ.Добавить();
НовСтр.Количество=1;
Если ЭтоФайлОтчетаПоКарточкам Тогда
НовСтр.GTIN=Данные[1];
НовСтр.Наименование=Данные[3];
Иначе
НовСтр.GTIN=Данные[2];
НовСтр.Наименование=Данные[10];
НовСтр=СписокКМ.Добавить();
НовСтр.GTIN=Данные[2];
НовСтр.КМ=Данные[1];
КонецЕсли;
КонецЕсли;
НомерСтроки=НомерСтроки+1
КонецЦикла;
КонецЦикла;
КонецЕсли;
Если МассивXLS<>Неопределено Тогда
Для каждого Эл из МассивXLS Цикл
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Эл.Адрес);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Эл.Расширение);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ТабДок=Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла);
Для Сч=1 По ТабДок.ВысотаТаблицы Цикл
Ячейка="R"+xmlстрока(Сч)+"C"+xmlстрока(НомерСтолбцаGTIN);
GTIN=ТабДок.Область(Ячейка).Текст;
Ячейка="R"+xmlстрока(Сч)+"C"+xmlстрока(НомерСтолбцаНаименование);
Наименование=ТабДок.Область(Ячейка).Текст;
Если СтрДлина(GTIN)=13 или СтрДлина(GTIN)=14 Тогда
GTIN=?(СтрДлина(GTIN)=13,"0","")+GTIN;
НовСтр=ТЗ.Добавить();
НовСтр.GTIN=GTIN;
НовСтр.Наименование=Наименование;
НовСтр.Количество=1;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЕсли;
ТЗ.Свернуть("GTIN,Наименование","Количество");
ЗаполнитьНоменклатуру(ТЗ);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНоменклатуру(ТЗ)
ШК=Новый Массив;
Для каждого стр из ТЗ Цикл
Штрихкод=Сред(стр.GTIN,2);
Если СтрДлина(Штрихкод)>6 И СтрРазделить(Штрихкод,"0123456789",Ложь).Количество()=0 Тогда
НовСтр=Объект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр,стр);
НовСтр.Штрихкод=Штрихкод;
ШК.Добавить(Штрихкод);
КонецЕсли;
КонецЦикла;
Запрос=Новый Запрос;
Запрос.УстановитьПараметр("ШК",ШК);
Запрос.Текст="ВЫБРАТЬ
| Штрихкоды.Штрихкод КАК Штрихкод,
| Штрихкоды.Владелец КАК Владелец
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Штрихкод В(&ШК)";
Выборка=Запрос.Выполнить().Выбрать();
Соответствие=Новый Соответствие;
Массив=Новый Массив;
Пока Выборка.Следующий() Цикл
Соответствие.Вставить(Выборка.Штрихкод,Выборка.Владелец);
Массив.Добавить(Выборка.Владелец);
КонецЦикла;
Для каждого стр из Объект.Товары Цикл
стр.Номенклатура=Соответствие.Получить(стр.Штрихкод);
КонецЦикла;
Запрос=Новый Запрос;
Запрос.УстановитьПараметр("Массив",Массив);
Запрос.Текст="ВЫБРАТЬ
| Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В(&Массив)
|
|СГРУППИРОВАТЬ ПО
| Номенклатура.ВидНоменклатуры
|
|УПОРЯДОЧИТЬ ПО
| Количество УБЫВ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Номенклатура.Родитель КАК Родитель,
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В(&Массив)
|
|СГРУППИРОВАТЬ ПО
| Номенклатура.Родитель
|
|УПОРЯДОЧИТЬ ПО
| Количество УБЫВ";
МассивРезультатов = Запрос.ВыполнитьПакет();
ТЗ_ВидыНоменклатур=МассивРезультатов[0].Выгрузить();
ТЗ_Группы=МассивРезультатов[1].Выгрузить();
Если ТЗ_ВидыНоменклатур.Количество()>0 Тогда
Если ЗначениеЗаполнено(ТЗ_ВидыНоменклатур[0].ВидНоменклатуры) Тогда
ВидНоменклатуры=ТЗ_ВидыНоменклатур[0].ВидНоменклатуры;
КонецЕсли;
КонецЕсли;
Если ТЗ_Группы.Количество()>0 Тогда
Если ЗначениеЗаполнено(ТЗ_Группы[0].Родитель) Тогда
Группа=ТЗ_Группы[0].Родитель;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьНоменклатуру(Команда)
ЭлементыИндикации=Новый Массив;
ЭлементыИндикации.Добавить(Элементы.Инфо);
ЭлементыИндикации.Добавить(Элементы.Индикатор);
ВсегоСтрок=Объект.Товары.Количество();
ПараметрыНоменклатуры=Новый Структура;
ЗаполнитьПараметрыНоменклатуры(ПараметрыНоменклатуры);
Для каждого стр из Объект.Товары Цикл
Если стр.Флаг И НЕ ЗначениеЗаполнено(стр.Номенклатура) Тогда
СоздатьНоменклатуру(ПараметрыНоменклатуры,стр.Наименование,стр.Штрихкод,стр.GTIN,
стр.Номенклатура);
КонецЕсли;
Индикатор=Цел(стр.НомерСтроки/ВсегоСтрок*100);
Инфо=""+xmlстрока(стр.НомерСтроки)+"/"+xmlстрока(ВсегоСтрок)+" "+
стр.Наименование+" "+стр.Штрихкод;
ОбновитьОтображениеДанных(ЭлементыИндикации);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПараметрыНоменклатуры(ПараметрыНоменклатуры)
ПараметрыНоменклатуры.Вставить("ВидНоменклатуры",ВидНоменклатуры);
ПараметрыНоменклатуры.Вставить("ОсобенностьУчета",ВидНоменклатуры.ОсобенностьУчета);
ПараметрыНоменклатуры.Вставить("СтавкаНДС",ВидНоменклатуры.СтавкаНДС);
ПараметрыНоменклатуры.Вставить("ЕдиницаИзмерения",ВидНоменклатуры.ЕдиницаИзмерения);
ПараметрыНоменклатуры.Вставить("Родитель",Группа);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура СоздатьНоменклатуру(ПараметрыНоменклатуры,Наименование,Штрихкод,GTIN,Номенклатура)
Эл=Справочники.Номенклатура.СоздатьЭлемент();
ЗаполнитьЗначенияСвойств(Эл,ПараметрыНоменклатуры);
Эл.Наименование=Наименование;
Эл.НаименованиеПолное=Наименование;
Эл.Записать();
Номенклатура=Эл.Ссылка;
Рег=РегистрыСведений.Штрихкоды.СоздатьМенеджерЗаписи();
Рег.Владелец=Номенклатура;
Рег.Штрихкод=Штрихкод;
ТипЕАН="Code39";
Если СтрДлина(Штрихкод)=13 Тогда
ТипЕАН="EAN13";
ИначеЕсли СтрДлина(Штрихкод)=8 Тогда
ТипЕАН="EAN8";
КонецЕсли;
Рег.ТипШтрихкода=ПланыВидовХарактеристик.ТипыШтрихкодов[ТипЕАН];
Рег.Записать();
Рег=РегистрыСведений.ОписаниеGTINИС.СоздатьМенеджерЗаписи();
Рег.GTIN=GTIN;
Рег.ВидУпаковки=Перечисления.ВидыУпаковокИС.Потребительская;
Рег.КоличествоПотребительскихУпаковок=1;
Рег.Записать();
КонецПроцедуры
&НаКлиенте
Процедура ВыгрузитьКМ_xls(Команда)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Если Диалог.Выбрать() Тогда
КаталогВыгрузки = Диалог.Каталог;
Иначе
Возврат;
КонецЕсли;
Для каждого стр из Объект.Товары Цикл
Если стр.Флаг Тогда
стрНайд=СписокКМ.НайтиСтроки(Новый Структура("GTIN",стр.GTIN));
Если стрНайд.Количество()>0 Тогда
ТабДок=Новый ТабличныйДокумент;
Сч=1;
Для каждого стрКМ из стрНайд Цикл
Ячейка="R"+xmlстрока(Сч)+"C1";
ТабДок.Область(Ячейка).Текст=стрКМ.КМ;
Сч=Сч+1;
КонецЦикла;
ИмяФайла=КаталогВыгрузки+"\"+стр.GTIN+".xlsx";
Попытка
ТабДок.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX);
Сообщить(ИмяФайла);
Исключение
Сообщить("ошибка записи - "+ИмяФайла);
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОчиститьСписокФайлыЗагрузки(Команда)
ФайлыЗагрузки.Очистить();
КонецПроцедуры
&НаКлиенте
Процедура НоменклатураНеЗаполнена(Команда)
ОтборСтрок=Элементы.Товары.ОтборСтрок;
Если ОтборСтрок=Неопределено Тогда
ОтборСтрок=Новый ФиксированнаяСтруктура("Номенклатура",ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"));
Элементы.Товары.ОтборСтрок=ОтборСтрок;
Элементы.ТоварыНоменклатураНеЗаполнена.Заголовок="Вся номенклатура";
Иначе
Элементы.Товары.ОтборСтрок=Неопределено;
Элементы.ТоварыНоменклатураНеЗаполнена.Заголовок="Номенклатура незаполнена";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзБуфераОбмена(Команда)
ОбъектВставки = Новый COMОбъект("htmlfile");
Текст = ОбъектВставки.ParentWindow.ClipboardData.Getdata("Text");
Оповещение=Новый ОписаниеОповещения("ЗагрузитьИзБуфераОбменаЗавершение",ЭтаФорма);
ПоказатьВводСтроки(Оповещение,Текст,"Вставка из буфера обмена",,Истина);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьИзБуфераОбменаЗавершение(Результат,ДопПараметры) ЭКСПОРТ
Текст=СокрЛП(""+Результат);
ОбработкаТекстаБуфераОбменаНаСервере(Текст);
КонецПроцедуры
&НаСервере
Процедура ОбработкаТекстаБуфераОбменаНаСервере(Текст)
ТЗ=Объект.Товары.Выгрузить();
ТЗ.Очистить();
Массив=СтрРазделить(Текст,Символы.ПС);
Для Сч=0 ПО Массив.Количество()-1 Цикл
Строка=СокрЛП(Массив[Сч]);
Если СтрДлина(Строка)=14 И СтрРазделить(Строка,"0123456789",Ложь).Количество()=0 Тогда
Если Объект.Товары.НайтиСтроки(Новый Структура("GTIN",Строка)).Количество()=0 Тогда
НовСтр=ТЗ.Добавить();
НовСтр.GTIN=Строка;
НовСтр.Количество=1;
НовСтр.Наименование=СокрЛП(Массив[Сч+1]);
КонецЕсли;
Сч=Сч+1;
КонецЕсли;
КонецЦикла;
ЗаполнитьНоменклатуру(ТЗ);
КонецПроцедуры
03.10.2024 Добавлена возможность загрузки своих GTIN и наименований товаров из Национального каталога:
1). В списке - Экспорт - краткий отчет,
2). Через копирование содержимого страницы в браузере и вставку в поле ввода 1с.
Выгрузка отчета по карточкам товарав в режиме Маркировка - нужная группа - вкладка отчет - Отчет по карточкам товаров.
Добавлена возможность выгрузки кодов маркировки в xls в разрезе GTIN, при условии, что загрузка производилась по кодам маркировки (архив с CSV). В дальнейшем эти файлы с кодами можно использовать при создании документа ввода в оборот и импорта данных из внешнего файла.
Всем желаю успехов, критика и пожелания приветствуются.
Проверено на следующих конфигурациях и релизах:
- Розница, редакция 2.3, релизы 2.3.18.23