Интерфейс обработки для УТ 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).Значение+Символы.ПС; // С отступом и нумерацией!
КонецЦикла;
Текст = Текст + "===>Конец";
Сказать(Текст);
КонецЕсли;
КонецПроцедуры
Принимаются пожелания и предложения по модификации данной обработке и написанию аналогичных.
Ссылка на первоисточник и документацию тут: