Это фрагмент кода. Если кому нужна вся внешняя обработка (находится в стадии доработки. Но выгрузка работает уже.) напишите почту вышлю.
Суть метода достичь логического понимания и прозрачности кода, основные вычисления перенести на сервер.
Данная процедура четко показывает что за чем идет и легко менять порядок не задумываясь ни о чем:
- Код: Выделить всё
&НаСервереБезКонтекста
Процедура ПодготовитьТекст(СтруктураДанных)
ТекстФайла = Новый ТекстовыйДокумент();
ТекстФайла.ДобавитьСтроку("!!!DNCUPLOAD");
ТекстФайла.ДобавитьСтроку("#UPLOADED_STATE");
ТекстФайла.ДобавитьСтроку("not loaded");
ТекстФайла.ДобавитьСтроку("#RECORD_COUNT");
ТекстФайла.ДобавитьСтроку("1074"); // после выгрузки - заменить на реальное кол-во строк с командами и параметрами
ТекстФайла.ДобавитьСтроку("!!!DELETEFIXDISCOUNTS"); //удалить все фиксированные скидки
ТекстФайла.ДобавитьСтроку("!!!DELETEDISCSCHEMES"); //удалить все схемы скидок и условия в них
ТекстФайла.ДобавитьСтроку("!!!DELETEPRICES"); //удалить все дополнительные типы цен и цены товаров (при перезагрузке)
ТекстФайла.ДобавитьСтроку("!!!DELETEPROFILES"); //удалить все профили (кроме «Администратора») и пользователей (кроме пользователей с набором прав «Администратор»)
ТекстФайла.ДобавитьСтроку("!!!DELETEUSERS"); //удалить всех пользователей, кроме «Администратора»
ТекстФайла.ДобавитьСтроку("!!!ADDPROFILES"); //добавить профили пользователей
ДобавитьADDPROFILES(ТекстФайла);
ТекстФайла.ДобавитьСтроку("!!!ADDUSERS"); //добавить пользователей
ДобавитьADDUSERS(ТекстФайла);
ТекстФайла.ДобавитьСтроку("!!!ADDDISCSCHEMES"); //добавить схемы скидок
ДобавитьADDDISCSCHEMES(ТекстФайла);
ТекстФайла.ДобавитьСтроку("!!!ADDPRICETYPES"); //добавить дополнительные типы цен
ДобавитьADDPRICETYPES(ТекстФайла);
ТекстФайла.ДобавитьСтроку("!!!ADDDISCCONDITIONS"); //добавить правила (условия) применения скидок в схемы
ДобавитьADDDISCCONDITIONS(ТекстФайла);
ТекстФайла.ДобавитьСтроку("!!!ADDWAREGROUPS"); //добавить / заменить информацию о группах товаров
ДобавитьADDWAREGROUPS(ТекстФайла);
//Данные для выгрузку подготавливаются разными вариантами:
//1. Недавно измененные из регистра оборотов за период с добавлением конечного остатка и последней цены.
//2. Полный перечень остатков:
//2.1 С заменой
//2.1 С предварительным удалением. Проводить только или рано утром или после закрытия касс.
ТекстФайла.ДобавитьСтроку("!!!REPLACEWARES"); //добавить / заменить всю информацию о товаре (с замещением остатков)
ДобавитьREPLACEWARES(ТекстФайла,СтруктураДанных);
ТекстФайла.ДобавитьСтроку("!!!ADDWAREBARCODES"); //Команда добавления штрих-кодов товаров
ДобавитьADDWAREBARCODES(ТекстФайла,СтруктураДанных);
ТекстФайла.ДобавитьСтроку("!!!ADDWAREPRICES"); //добавить дополнительные цены товаров
ДобавитьADDWAREPRICES(ТекстФайла,СтруктураДанных);
ТекстФайла.ДобавитьСтроку("!!!DELETEFIXDISCOUNTS"); //добавить / заменить информацию о фиксированных скидках
ТекстФайла.ДобавитьСтроку("!!!ADDFIXDISCOUNTS"); //добавить / заменить информацию о фиксированных скидках
ДобавитьADDFIXDISCOUNTS(ТекстФайла);
ТекстФайла.ДобавитьСтроку("!!!DNCUPLOAD_END");
СтруктураДанных.Вставить("ТекстФайла",ТекстФайла);
КонецПроцедуры // ВыгрузитьТовары()
Далее пример процедур добавления групп товаров и самих товаров. Группы добавляются с учет глубины иерархии 3, если более то запрос можно переписать через ВЫБОР где бедет проверятся родитель родителя и в зависимости от результат ставить глубину уровня, далее по ней сортировать и выгружать.
- Код: Выделить всё
&НаСервереБезКонтекста
Процедура ДобавитьADDWAREGROUPS(ТекстФайла)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Код КАК ВнутреннийКод,
| Номенклатура.Наименование,
| Номенклатура.Наименование КАК НаименованиеПечати,
| ВЫБОР
| КОГДА Номенклатура.Родитель = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| ТОГДА """"
| ИНАЧЕ Номенклатура.Родитель.Код
| КОНЕЦ КАК РодительКод
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| РодительКод";
Результат = Запрос.Выполнить().Выгрузить();
ДобавитьСекцию(Результат,ТекстФайла,"ADDWAREGROUPS");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ДобавитьREPLACEWARES(ТекстФайла,СтруктураДанных)
// Подготовим данные для выгрузки
Если СтруктураДанных.Остатки = Истина Тогда //выгрузим все остатки
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыВРозницеОстатки.Номенклатура,
| ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры,
| СУММА(ЕСТЬNULL(ТоварыВРозницеОстатки.КоличествоОстаток, 0)) КАК Остаток,
| ТоварыВРозницеОстатки.Номенклатура.Родитель.Код КАК КодРодительскойГруппы,
| ТоварыВРозницеОстатки.Номенклатура.Код КАК Код,
| ЗначенияСвойствОбъектовСклад.Значение.Код КАК КодСклада,
| ЦеныНоменклатурыСрезПоследних.Цена
|ПОМЕСТИТЬ СписокНоменклатуры
|ИЗ
| РегистрНакопления.ТоварыВРознице.Остатки(, Склад = ЗНАЧЕНИЕ(Справочник.Склады.ВыстовочныйЗал)) КАК ТоварыВРозницеОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектовСклад
| ПО ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры = ЗначенияСвойствОбъектовСклад.Объект
| И (ЗначенияСвойствОбъектовСклад.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.Склад))
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.Розница)) КАК ЦеныНоменклатурыСрезПоследних
| ПО ТоварыВРозницеОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ТоварыВРозницеОстатки.Номенклатура,
| ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры,
| ЗначенияСвойствОбъектовСклад.Значение.Код,
| ТоварыВРозницеОстатки.Номенклатура.Родитель.Код,
| ТоварыВРозницеОстатки.Номенклатура.Код,
| ЦеныНоменклатурыСрезПоследних.Цена
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СписокНоменклатуры.Код + "" "" + СписокНоменклатуры.КодСклада КАК ВнутреннийКодТовара,
| """" КАК ШтрихКоды,
| ""1"" КАК Коэффициент,
| ВЫРАЗИТЬ(СписокНоменклатуры.Номенклатура.НаименованиеПолное КАК СТРОКА(100)) КАК Наименование,
| СписокНоменклатуры.Номенклатура.Наименование КАК ТекстДляЧека,
| """" КАК Артикул,
| СписокНоменклатуры.Цена,
| СписокНоменклатуры.Остаток КАК Остаток,
| ""0,1,1,0,1,1,0,1"" КАК Флаги,
| """" КАК МинимальнаяЦена,
| """" КАК СрокГодности,
| СписокНоменклатуры.КодРодительскойГруппы КАК КодРодительскойГруппы,
| """" КАК КодНалоговойГруппы,
| """" КАК КоднабораДопХарактеристик,
| """" КАК НомерСекции,
| """" КАК КодОграничения,
| ""0"" КАК КодСАС,
| СписокНоменклатуры.Код КАК ПутьКартинки
|ИЗ
| СписокНоменклатуры КАК СписокНоменклатуры";
Результат = Запрос.Выполнить().Выгрузить();
//бегаем по изменениям и собираем перечень изменившихся товаров
ИначеЕсли СтруктураДанных.Обороты = Истина Тогда
ДатаНачала = СтруктураДанных.ДатаНачала;
ДатаКонца = СтруктураДанных.ДатаКонца;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыВРозницеОбороты.Номенклатура,
| ТоварыВРозницеОбороты.ХарактеристикаНоменклатуры
|ПОМЕСТИТЬ ОборотнаяНоменклатура
|ИЗ
| РегистрНакопления.ТоварыВРознице.Обороты(&ДатаН, &ДатаК, , ) КАК ТоварыВРозницеОбороты
|
|СГРУППИРОВАТЬ ПО
| ТоварыВРозницеОбороты.ХарактеристикаНоменклатуры,
| ТоварыВРозницеОбороты.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОборотнаяНоменклатура.Номенклатура,
| ОборотнаяНоменклатура.ХарактеристикаНоменклатуры,
| СУММА(ЕСТЬNULL(ТоварыВРозницеОстатки.КоличествоОстаток, 0)) КАК Остаток,
| ОборотнаяНоменклатура.Номенклатура.Родитель.Код КАК КодРодительскойГруппы,
| ОборотнаяНоменклатура.Номенклатура.Код КАК Код,
| ЗначенияСвойствОбъектовСклад.Значение.Код КАК КодСклада,
| ЦеныНоменклатурыСрезПоследних.Цена
|ПОМЕСТИТЬ СписокНоменклатуры
|ИЗ
| ОборотнаяНоменклатура КАК ОборотнаяНоменклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектовСклад
| ПО (ОборотнаяНоменклатура.ХарактеристикаНоменклатуры = ЗначенияСвойствОбъектовСклад.Объект
| И ЗначенияСвойствОбъектовСклад.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.Склад))
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРознице.Остатки(, Склад = ЗНАЧЕНИЕ(Справочник.Склады.ВыстовочныйЗал)) КАК ТоварыВРозницеОстатки
| ПО ОборотнаяНоменклатура.Номенклатура = ТоварыВРозницеОстатки.Номенклатура
| И ОборотнаяНоменклатура.ХарактеристикаНоменклатуры = ТоварыВРозницеОстатки.ХарактеристикаНоменклатуры
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦенНоменклатуры.Розница)) КАК ЦеныНоменклатурыСрезПоследних
| ПО ОборотнаяНоменклатура.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ЗначенияСвойствОбъектовСклад.Значение.Код,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ОборотнаяНоменклатура.Номенклатура,
| ОборотнаяНоменклатура.ХарактеристикаНоменклатуры,
| ОборотнаяНоменклатура.Номенклатура.Родитель.Код,
| ОборотнаяНоменклатура.Номенклатура.Код
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СписокНоменклатуры.Код + "" "" + СписокНоменклатуры.КодСклада КАК ВнутреннийКодТовара,
| """" КАК ШтрихКоды,
| ""1"" КАК Коэффициент,
| ВЫРАЗИТЬ(СписокНоменклатуры.Номенклатура.НаименованиеПолное КАК СТРОКА(100)) КАК Наименование,
| СписокНоменклатуры.Номенклатура.Наименование КАК ТекстДляЧека,
| """" КАК Артикул,
| СписокНоменклатуры.Цена,
| СписокНоменклатуры.Остаток КАК Остаток,
| ""0,1,1,0,1,1,0,1"" КАК Флаги,
| """" КАК МинимальнаяЦена,
| """" КАК СрокГодности,
| СписокНоменклатуры.КодРодительскойГруппы КАК КодРодительскойГруппы,
| """" КАК КодНалоговойГруппы,
| """" КАК КоднабораДопХарактеристик,
| """" КАК НомерСекции,
| """" КАК КодОграничения,
| ""0"" КАК КодСАС,
| СписокНоменклатуры.Код КАК ПутьКартинки
|ИЗ
| СписокНоменклатуры КАК СписокНоменклатуры";
Запрос.УстановитьПараметр("ДатаН", ДатаНачала);
Запрос.УстановитьПараметр("ДатаК", ДатаКонца);
Результат = Запрос.Выполнить().Выгрузить();
КонецЕсли;
ДобавитьСекцию(Результат,ТекстФайла,"REPLACEWARES");
КонецПроцедуры
Далее окончательная процедура куда передаются результаты запроса и в ней формируются сами строки файла и проводится необходимая обработка данных типа Цен и кодов:
- Код: Выделить всё
&НаСервереБезКонтекста
Процедура ДобавитьСекцию(Результат,ТекстФайла,НазваниеСекции)
Колонки = Результат.Колонки;
Для каждого Строка Из Результат Цикл
СтрокаТекста = "";
Для Каждого Колонка из Колонки Цикл
Текст = СокрЛП(Строка[Колонка.Имя]);
Если Колонка.Имя = "Цена" Тогда
Попытка
Текст = Формат(Число(Текст),"ЧЦ=8; ЧДЦ=2; ЧРД=.; ЧГ=0");
Исключение
Сообщить("Ошибка в секции " + НазваниеСекции + " - " + Текст);
КонецПопытки
ИначеЕсли Колонка.Имя = "Остаток" Тогда
Попытка
Текст = Формат(Число(Текст),"ЧЦ=7; ЧДЦ=3; ЧРД=.; ЧН=0.000; ЧГ=0");
Исключение
Сообщить("Ошибка в секции " + НазваниеСекции + " - " + Текст);
КонецПопытки;
ИначеЕсли Колонка.Имя = "ПутьКартинки" Тогда
БазаТовара = Лев(Текст,2);
Если БазаТовара = "11" Тогда
КодТовараС5 = Формат(Число(Текст) - 11300000000,"ЧГ=0");
Текст = "/mnt/db_image/games/" + КодТовараС5 + ".jpg";
ИначеЕсли БазаТовара = "12" Тогда
КодТовараС5 = Формат(Число(Текст) - 12300000000,"ЧГ=0");
Текст = "/mnt/db_image/kanci/" + КодТовараС5 + ".jpg";
ИначеЕсли БазаТовара = "13" Тогда
КодТовараС5 = Формат(Число(Текст) - 13300000000,"ЧГ=0");
Текст = "/mnt/db_image/book/" + КодТовараС5 + ".jpg";
КонецЕсли;
ИначеЕсли Найти(Колонка.Имя, "КодВЧисло") > 0 Тогда
Попытка
Текст = Формат(Число(Текст),"ЧЦ=11; ЧДЦ=; ЧРД=.; ЧГ=0");
Исключение
Сообщить("Ошибка в секции " + НазваниеСекции + " - " + Текст);
КонецПопытки;
Иначе
// Текст = СтрЗаменить(Текст," ","*");
КонецЕсли;
Текст = СокрЛП(Текст);
СтрокаТекста = СтрокаТекста + "" + Текст + ";";
КонецЦикла;
ТекстФайла.ДобавитьСтроку(СтрокаТекста);
КонецЦикла;
КонецПроцедуры
Код выложен как вариант подхода к выгрузке.
Загрузку так же выложу как получу все необходимые данные от Техподдержки.