gifts2017

Загрузка товара с ценами и штрих-кодами EAN-13 в весы серии "Масса-К" для УТ 11.2.2.116 в формате dbf (переписана из обработки ТиС 9.2) на УФ для серверной базы

Опубликовал Константин Юрин (kostyaomsk) в раздел Обмен - Обмен через DBF

В процессе внедрения УТ 11.2 была задача переписать обработку загрузки товаров в весы с печатью этикеток серии "Масса-К" для формирования файла "massa.dbf" из 1С 7.7: Торговля+Склад 9.2. Обработка написана с учетом универсальности работы как в файловом, так и в клиент-серверном режиме. Также учтен возможный отказ от модальности в последующих релизах УТ 11.2. Подробно разбирается формат весов серии "Масса-К". Выгружаются только корректные данные (ШК, Цены). Предусмотрен режим выгрузки только весового товара или по конкретной единице измерения (кг, 0.1 кг). Дополнительно для печати этикетки выгружается информация по каталогу продукции.

Интерфейс обработки для УТ 11.2 нижеследующий:

Для удобства эксплуатации есть проверка заполнения реквизитов и поддержка, связанная с отсутствием модальности в диалоге (тут в помощь стандартный рефакторинг платформы 1С 8.3.7).

В исходных данных к задаче была обработка для ТиС 9.2 и образец файла "massa.dbf" - далее уже сторонним ПО этот файл подгружается в весы серии "Масса-К".

Внешний вид обработки-прототипа для 7.7:

 

Контрольный пример в dbf-редакторе:

 

Скриншот описания полей из dbf-редактора:

 

 

Описание формата из 7.7 следующее (из кода 7.7):

_ИмяФайла = "massa.dbf";
	_РабКаталог=_РабКаталог+_ИмяФайла;
	
	_ДБФ_Товар=СоздатьОбъект("XBase"); 
	
    _ДБФ_Товар.ДобавитьПоле("PRD_ID",  "S", 12,0);              // код товара, реально в типовых не больше 9 
    _ДБФ_Товар.ДобавитьПоле("PRD_NAME","S",255,0);              // наименование товара, реально в типовых не больше 50 
    _ДБФ_Товар.ДобавитьПоле("FLG_CNTR","S",  1,0);              // флаг центровки наименования
	
	_ДБФ_Товар.ДобавитьПоле("PRD_CODE","S", 32,0);              // код товара (дополнительно, опционально) 
    _ДБФ_Товар.ДобавитьПоле("PRD_PLU", "S",  8,0);              // код быстрого вызова товара (опционально)

	_ДБФ_Товар.ДобавитьПоле("PRD_PREF","S",  2,0);           	// префикс штрихкода (опционально)
	_ДБФ_Товар.ДобавитьПоле("PRD_BAR", "S", 13,0);              // штрих-код товара, обычно EAN13         
	                 
    _ДБФ_Товар.ДобавитьПоле("GRP_ID",  "S", 12,0);              // код группы товара
    _ДБФ_Товар.ДобавитьПоле("GRP_NAME","S",255,0);              // наименование группы товара
	
    _ДБФ_Товар.ДобавитьПоле("MSR_ID",  "S",  3,0);              // код базовой единицы измерения товара по ОКЕИ
    _ДБФ_Товар.ДобавитьПоле("MSR_NAME","S", 25,0);              // наименование базовой единицы измерения товара по ОКЕИ
	
    _ДБФ_Товар.ДобавитьПоле("PRD_PRCE","S", 15,0);              // цена товара     
    _ДБФ_Товар.ДобавитьПоле("PRD_CERT","S",  4,0);              // код органа сертификации    
    _ДБФ_Товар.ДобавитьПоле("PRD_CMP1","S",255,0);              // cостав товара - часть 1    
    _ДБФ_Товар.ДобавитьПоле("PRD_CMP2","S",255,0);              // cостав товара - часть 2  
    _ДБФ_Товар.ДобавитьПоле("PRD_TARE","S", 15,0);              // вес тары (упаковки)   
    _ДБФ_Товар.ДобавитьПоле("PRD_LIFE","S", 16,0);              // срок годности 
    _ДБФ_Товар.ДобавитьПоле("PRD_DATE","S", 16,0);              // дата упаковки 
    _ДБФ_Товар.ДобавитьПоле("PRD_INFO","S",255,0);              // информационно-рекламное сообщение
	

Примечание: обработка, видимо, переработанная от фирмы-производителя, раз есть поддержка многих конфигураций: "// 1-ТиС, 2-Комплекс, 3-ПУБ, 4-Бухгалтерия, 5-УСН, 6-Предприниматель, 0-что-то оригинальное"

 Пример номенклатуры для выгрузки в весы:

 

Можно посмотреть, что в УТ 11.2 предусмотрены более гибкие возможности по работе именно с ВЕСОВЫМ товаром - указание веса "невесовой" единицы.

НО, в целях упрощения задачи я выбрал в качестве источника данных УТ 11.2 регистр штрихкодов номенклатуры:

Во-первых, есть запрет в конфигураторе на пустые записи по реквизиту регистра ШК "номенклатура":

 

Во-вторых, не все ШК могут быть заполнены в результате переноса и эксплуатации (лично наткнулся на такие). Дальше то же самое касается и цен номенклатуры (это чаще). Отборы проводятся по нижеприведенным запросам, а окончательная фильтрация с выбросом в лог ошибок:

        Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ВидЦены", Объект.ВидЦены); // Общий параметр!
	
	Если Объект.ФлагВыгрВесового Тогда
		Запрос.Текст =
		"ВЫБРАТЬ
		|	ШК.Штрихкод,
		|	ШК.Номенклатура,
		|	ЕСТЬNULL(ЦеныПрайс.Цена, 0) КАК Цена,
		|	ШК.Номенклатура.Код КАК Код,
		|	ШК.Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
		|	ШК.Номенклатура.Родитель КАК Родитель,
		|	ШК.Номенклатура.Наименование КАК Наименование,
		|	ШК.Номенклатура.Артикул КАК Артикул,
		|	ШК.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
		|	ШК.Номенклатура.ЕдиницаИзмерения.Код КАК ЕдиницаИзмеренияКод,
		|	ШК.Номенклатура.ЕдиницаИзмерения.Наименование КАК ЕдиницаИзмеренияНаименование,
		|	ШК.Номенклатура.Родитель.Наименование КАК РодительНаименование,
		|	ШК.Номенклатура.Родитель.Код КАК РодительКод
		|ИЗ
		|	РегистрСведений.ШтрихкодыНоменклатуры КАК ШК
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныПрайс
		|		ПО ШК.Номенклатура = ЦеныПрайс.Номенклатура
		|ГДЕ
		|	ЦеныПрайс.ВидЦены = &ВидЦены
		|	И ШК.Номенклатура.ВесИспользовать
		|
		|УПОРЯДОЧИТЬ ПО
		|	ЭтоГруппа УБЫВ,
		|	Наименование";
	Иначе
		Запрос.УстановитьПараметр("парЕдиницаИзмерения", Объект.ЕдИзмер);
		Запрос.Текст = 
		"ВЫБРАТЬ
		|	ШК.Штрихкод,
		|	ШК.Номенклатура,
		|	ЕСТЬNULL(ЦеныПрайс.Цена, 0) КАК Цена,
		|	ШК.Номенклатура.Код КАК Код,
		|	ШК.Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
		|	ШК.Номенклатура.Родитель КАК Родитель,
		|	ШК.Номенклатура.Наименование КАК Наименование,
		|	ШК.Номенклатура.Артикул КАК Артикул,
		|	ШК.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
		|	ШК.Номенклатура.ЕдиницаИзмерения.Код КАК ЕдиницаИзмеренияКод,
		|	ШК.Номенклатура.ЕдиницаИзмерения.Наименование КАК ЕдиницаИзмеренияНаименование,
		|	ШК.Номенклатура.Родитель.Наименование КАК РодительНаименование,
		|	ШК.Номенклатура.Родитель.Код КАК РодительКод
		|ИЗ
		|	РегистрСведений.ШтрихкодыНоменклатуры КАК ШК
		|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ) КАК ЦеныПрайс
		|		ПО ШК.Номенклатура = ЦеныПрайс.Номенклатура
		|ГДЕ
		|	ЦеныПрайс.ВидЦены = &ВидЦены
		|	И ШК.Номенклатура.ЕдиницаИзмерения = &парЕдиницаИзмерения
		|
		|УПОРЯДОЧИТЬ ПО
		|	ЭтоГруппа УБЫВ,
		|	Наименование";
	КонецЕсли;
	
	//ТЗ = Запрос.Выполнить().Выгрузить(); // ОТЛАДКА Закомментить!!!
	
	Выборка = Запрос.Выполнить().Выбрать(); // Внимание!!! Могут (обязательно) быть дубли по Штрих-кодам (это измерение регистра)
	
	Структ.Вставить("КолЗапросом", Выборка.Количество() );
	Сказать("Получено запросом (с дублями ШК) из базы: "+Структ.КолЗапросом);
	
	Возврат Выборка;

 

В третьих, лог ошибок ведется в ОЗУ на сервере (с целью оптимизации при больших объемах базы). Примечание: в серверном режиме файл создается во временном каталоге Сервера 1С, далее, если все прошло без ошибок, копируется на локальный компьютер по заданному пути. Замечу, что у объекта XBase что в 1С 7.7, что в 1С 8.х есть особенность, что нужно или устанавливать флаг "Автосохранение", или при добавлении каждой записи сохранять программно. В результате такого подхода можно получить в случае сбоя урезанный вариант. В случае фатальной ошибке в моей обработке мы подобного не получим: на локальный ПК с Сервера 1С ничего скопировано не будет, а будет попытка стереть временный файл.


При переносе функционала для УТ 11.2.2.116 предусмотрена выгрузка информации по структуре каталога:

  • поле "GRP_ID" - код группы товара;
  • поле "GRP_NAME" - наименование группы товара.

 Может быть полезной при печати этикеток.

 

Недостатки (в виду упрощения задачи):

1. Отсутствие гибкого отбора: либо только весовой товар (реквизит типа "булево" справочника УТ 11.2 "ВесИспользовать"), либо по конкретной весовой единице измерения (следствие первоначального переноса данных из ТиС 9.2 при переходе на УТ 11.2

По-хорошему все-таки нужно наводить порядок и использовать стандартные возможности УТ 11.2 устанавляивая галочку "весовой" и указывать в карточке номенклатуры массу для невесовых единиц (это уже методология учета пошла).

2. Нет поддержки характеристик. Делалось для продуктовых магазинов, где количество номенклатуры превышает десятки тысяч.

3. Нет индикации процесса выгрузки. По-максимуму предусмотрен контроль ошибок, если произойдет сбой на сервере 1С, через конструкции попытка-исключение. Фрагмент кода ниже

&НаКлиенте
Процедура ПоказатьОшибкиНаКлиенте(Знач Структ, КонецПрограммы = Ложь)
	
	Перем Кол, СписокОшибок, т, Текст;
	
	СписокОшибок = Структ.СписокОшибок;
	Кол = СписокОшибок.Количество();
	Структ.Вставить("КолОшибок", Кол);
	КолЗапросом = Структ.КолЗапросом;
	Если Кол = 0 Тогда
		Если КонецПрограммы Тогда
			Текст = "Все в порядке. Выгрузили "+Структ.КолЗап+" записей о товарах в файл! Ошибок нет!";
			Сказать(Текст);
		КонецЕсли;
	Иначе
		Текст = "--->Файл получен, но есть ошибки! НЕ выгружено: "+Кол+". Подробно: "+Символы.ПС;
		Для т=1 По Кол Цикл
			Текст = Текст +Символы.Таб+т+". - "+СписокОшибок.Получить(т-1).Значение+Символы.ПС; // С отступом и нумерацией!
		КонецЦикла;	
		Текст = Текст + "===>Конец";
		Сказать(Текст);
	КонецЕсли;
	

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

 

Принимаются пожелания и предложения по модификации данной обработке и написанию аналогичных.

Ссылка на первоисточник и документацию тут:

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ВыгрузкаВВесыМассаДляУТ_11_2_версия 1.0.0.1
.epf 34,81Kb
25.01.16
6
.epf 1.0.0.1 34,81Kb 6 Скачать
Загрузка в весы МассаК для 7.7
.ert 190,50Kb
25.01.16
4
.ert 1.0.0.0 190,50Kb 4 Скачать

См. также

Подписаться Добавить вознаграждение
В этой теме еще нет сообщений.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа