Регистрация изменений для узла обмена с ККМOffline

1. MaCCapAkIII 30.06.17 19:05 Сейчас в теме
Добрый день.
Есть задача. Организовать в УТ11.1 выгрузку в ККМOffline актуальных остатков. То есть, вечером магазины присылают продажи, УТ их загружает и утром, перед открытием магазина, выгружает справочники с актуальными остатками.
Что сделал:
1. Завел рабочее место ХХХ, к которому подключил все ККМOffline, работающие на Штрих-М:Кассире (которым нужны файлы со справочником товаров);
2. Сделал регламентное задание, которое использует типовые механизмы формирования списка товаров для выгрузки.

В результате РЗ отрабатывает, но файлы пустые. Ни продажи, ни перемещения товаров по складам никакой реакции не вызывают - файлы справочников пустые. такое ощущение, что для узла обмена с ККМ, который я завел, не регистрируются изменения остатков товаров при движениях...

Прошу подсказать каким образом вообще регистрируются изменения остатков по каждой ККМ в УТ (не могу разобраться в принципе) или как можно решить подобную проблему? Возможно принудительно регистрировать изменения для узла...

В УТ есть штатная функция, которая возвращает список товаров для выгрузки, возможно в ней что-то не так... Для моего случая...

// Функция возвращает таблицу товаров с данными к выгрузке в устройство
//
// Параметры:
//  Устройство - <СправочникСсылка.ПодключаемоеОборудование> - Устройство для которого необходимо получить данные
//  ТолькоИзмененные - <Булево> - Флаг получения только измененных данных
//  ОбновитьКодыТоваров - <Булево> - Флаг обновления кодов товаров перед получением данных.
//
// Возвращаемое значение:
//  <ТаблицаЗначений> товаров к выгрузке
//
Функция ПолучитьТаблицуТоваровКВыгрузке(Устройство, Параметры, ОбновитьКодыТоваров = Ложь) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	ПрефиксУзлаШтрихкода                      = РегистрыСведений.ШтрихкодыНоменклатуры.ПрефиксУзлаШтрихкода();
	МаксимальноеЗначениеКодаВесовыхШтрихкодов = РегистрыСведений.ШтрихкодыНоменклатуры.ПолучитьМаксимальноеЗначениеКодаВесовыхШтрихкодов();
	МаксимальныйКодВесовогоТовара             = РегистрыСведений.ШтрихкодыНоменклатуры.МаксимальныйКодВесовогоТовара();
	
	ИспользоватьСерииНоменклатуры = ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатурыСклад", Новый Структура("Склад", Параметры.Склад));
	
	Если ОбновитьКодыТоваров Тогда
		ОбновитьКодыТоваров(Параметры.ПравилоОбмена);
	КонецЕсли;
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	КодыТоваровПодключаемогоОборудованияOffline.Используется КАК Используется,
	|	КодыТоваровПодключаемогоОборудованияOffline.Код КАК Код,
	|	КодыТоваровПодключаемогоОборудованияOffline.Номенклатура КАК Номенклатура,
	|	ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Номенклатура.Наименование,"""")       КАК НоменклатураНаименование,
	|	ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Номенклатура.НаименованиеПолное,"""") КАК НоменклатураНаименованиеПолное,
	|	КодыТоваровПодключаемогоОборудованияOffline.Характеристика КАК Характеристика,
	|	ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Характеристика.Наименование, """")       КАК ХарактеристикаНаименование,
	|	ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Характеристика.НаименованиеПолное, """") КАК ХарактеристикаНаименованиеПолное,
	|	ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Номенклатура.ЕдиницаИзмерения.Наименование, """") КАК ЕдиницаИзмеренияНаименование,
	|	КодыТоваровПодключаемогоОборудованияOffline.Упаковка КАК Упаковка,
	|	ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Упаковка.Наименование, """") КАК УпаковкаНаименование,
	|	ЕСТЬNULL(ШтрихкодыНоменклатуры.Штрихкод, """") КАК Штрихкод,
	|	(ЕСТЬNULL(КодыТоваровПодключаемогоОборудованияOffline.Упаковка.Коэффициент, 1)
	|		/ ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Упаковка.Коэффициент, 1)) *
	|	ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
	|	ЕСТЬNULL(СвободныеОстатки.ВНаличииОстаток - СвободныеОстатки.ВРезервеСоСкладаОстаток - СвободныеОстатки.ВРезервеПодЗаказОстаток, 0) КАК Остаток,
	|	ВЫБОР
	|		КОГДА КодыТоваровПодключаемогоОборудованияOffline.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка)
	|			ТОГДА ВЫБОР КОГДА КодыТоваровПодключаемогоОборудованияOffline.Номенклатура.ЕдиницаИзмерения.ТипЕдиницыИзмерения = ЗНАЧЕНИЕ(Перечисление.ТипыЕдиницИзмерения.Весовая) ТОГДА Истина Иначе Ложь КОНЕЦ
	|		ИНАЧЕ ВЫБОР КОГДА КодыТоваровПодключаемогоОборудованияOffline.Упаковка.ЕдиницаИзмерения.ТипЕдиницыИзмерения = ЗНАЧЕНИЕ(Перечисление.ТипыЕдиницИзмерения.Весовая) ТОГДА Истина Иначе Ложь КОНЕЦ
	|	КОНЕЦ КАК Весовой,
	|	
	|	//ИспользованиеСерий ВЫБОР КОГДА 1 В (ВЫБРАТЬ ПЕРВЫЕ 1 1 ИЗ Справочник.ВидыНоменклатуры.ПолитикиУчетаСерий КАК Т ГДЕ Т.Склад = &ПравилоОбменаСклад И Т.ПолитикаУчетаСерий.УказыватьПриОтгрузкеВРозницу И Т.Ссылка = КодыТоваровПодключаемогоОборудованияOffline.Номенклатура.ВидНоменклатуры) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ КАК УказыватьСерииПриОтгрузкеВРозницу,
	|	
	|	ВЫБОР
	|		КОГДА КодыТоваровПодключаемогоОборудованияOfflineИзменения.Узел = &УзелИнформационнойБазы
	|			ТОГДА 1
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК ИндексКартинкиЕстьИзменения
	|ИЗ
	|	РегистрСведений.КодыТоваровПодключаемогоОборудованияOffline КАК КодыТоваровПодключаемогоОборудованияOffline
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(&ТекущаяДата, Склад = &ПравилоОбменаСклад) КАК СвободныеОстатки
	|		ПО КодыТоваровПодключаемогоОборудованияOffline.Номенклатура = СвободныеОстатки.Номенклатура
	|			И КодыТоваровПодключаемогоОборудованияOffline.Характеристика = СвободныеОстатки.Характеристика
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
	|		ПО КодыТоваровПодключаемогоОборудованияOffline.Номенклатура = ШтрихкодыНоменклатуры.Номенклатура
	|			И КодыТоваровПодключаемогоОборудованияOffline.Характеристика = ШтрихкодыНоменклатуры.Характеристика
	|			И КодыТоваровПодключаемогоОборудованияOffline.Упаковка = ШтрихкодыНоменклатуры.Упаковка
	|			//ВесыСПечатьюЭтикеток И ШтрихкодыНоменклатуры.Штрихкод ПОДОБНО &ФорматШтрихкода
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ТекущаяДата, ВидЦены = &ВидЦены) КАК ЦеныНоменклатурыСрезПоследних
	|		ПО КодыТоваровПодключаемогоОборудованияOffline.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
	|			И КодыТоваровПодключаемогоОборудованияOffline.Характеристика = ЦеныНоменклатурыСрезПоследних.Характеристика
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КодыТоваровПодключаемогоОборудованияOffline.Изменения КАК КодыТоваровПодключаемогоОборудованияOfflineИзменения
	|		ПО КодыТоваровПодключаемогоОборудованияOffline.Код = КодыТоваровПодключаемогоОборудованияOfflineИзменения.Код
	|		И КодыТоваровПодключаемогоОборудованияOfflineИзменения.ПравилоОбмена = &ПравилоОбмена
	|		И КодыТоваровПодключаемогоОборудованияOfflineИзменения.Узел = &УзелИнформационнойБазы
	|ГДЕ
	|	КодыТоваровПодключаемогоОборудованияOffline.ПравилоОбмена = &ПравилоОбмена
	|	И КодыТоваровПодключаемогоОборудованияOffline.Номенклатура <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
	
	|//ТолькоИзмененные И КодыТоваровПодключаемогоОборудованияOfflineИзменения.ПравилоОбмена = &ПравилоОбмена
	|//ТолькоИзмененные И КодыТоваровПодключаемогоОборудованияOfflineИзменения.Узел = &УзелИнформационнойБазы
	
	|ИТОГИ
	|	МАКСИМУМ(Штрихкод)
	|ПО
	|	Код");
	
	Если Параметры.ЧастичнаяВыгрузка Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"//ТолькоИзмененные","");
	КонецЕсли;
	
	Если ИспользоватьСерииНоменклатуры Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"//ИспользованиеСерий","");
	КонецЕсли;
	
	Если Параметры.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ВесыСПечатьюЭтикеток Тогда
		Запрос.Текст = СтрЗаменить(Запрос.Текст,"//ВесыСПечатьюЭтикеток","");
	КонецЕсли;
	
	Если Параметры.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ВесыСПечатьюЭтикеток Тогда
		Запрос.УстановитьПараметр("ФорматШтрихкода", РегистрыСведений.ШтрихкодыНоменклатуры.ФорматВесовогоШтрихкода("_"));
	КонецЕсли;
	
	Запрос.УстановитьПараметр("ПравилоОбмена",          Параметры.ПравилоОбмена);
	Запрос.УстановитьПараметр("ПравилоОбменаСклад",     Параметры.Склад);
	Запрос.УстановитьПараметр("ВидЦены",                Параметры.ВидЦены);
	Запрос.УстановитьПараметр("УзелИнформационнойБазы", Параметры.УзелИнформационнойБазы);
	Запрос.УстановитьПараметр("ТекущаяДата",            КонецДня(ТекущаяДата()));
	
	ТаблицаТоваров = Новый ТаблицаЗначений;
	ТаблицаТоваров.Колонки.Добавить("Используется",       Новый ОписаниеТипов("Булево"));
	ТаблицаТоваров.Колонки.Добавить("Код",                Новый ОписаниеТипов("Число"));
	ТаблицаТоваров.Колонки.Добавить("Номенклатура",       Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
	ТаблицаТоваров.Колонки.Добавить("Характеристика",     Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"));
	ТаблицаТоваров.Колонки.Добавить("Упаковка",           Новый ОписаниеТипов("СправочникСсылка.УпаковкиНоменклатуры"));
	ТаблицаТоваров.Колонки.Добавить("ЕдиницаИзмерения",   Новый ОписаниеТипов("Строка"));
	ТаблицаТоваров.Колонки.Добавить("Наименование",       Новый ОписаниеТипов("Строка"));
	ТаблицаТоваров.Колонки.Добавить("НаименованиеПолное", Новый ОписаниеТипов("Строка"));
	ТаблицаТоваров.Колонки.Добавить("Штрихкод",           Новый ОписаниеТипов("Строка"));
	ТаблицаТоваров.Колонки.Добавить("МассивШтрихкодов",   Новый ОписаниеТипов("Массив"));
	ТаблицаТоваров.Колонки.Добавить("Цена",               Новый ОписаниеТипов("Число"));
	ТаблицаТоваров.Колонки.Добавить("Остаток",            Новый ОписаниеТипов("Число"));
	ТаблицаТоваров.Колонки.Добавить("Весовой",            Новый ОписаниеТипов("Булево"));
	
	ТаблицаТоваров.Колонки.Добавить("ТребуетсяУказаниеСерий", Новый ОписаниеТипов("Булево"));
	
	ТаблицаТоваров.Колонки.Добавить("ЕстьОшибки",                  Новый ОписаниеТипов("Булево"));
	ТаблицаТоваров.Колонки.Добавить("ИндексКартинкиЕстьИзменения", Новый ОписаниеТипов("Число"));
	
	ВыборкаПоКодам = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	Пока ВыборкаПоКодам.Следующий() Цикл
		
		НоваяСтрока = ТаблицаТоваров.Добавить();
		
		Выборка = ВыборкаПоКодам.Выбрать();
		Пока Выборка.Следующий() Цикл
			
			Штрихкод = СокрЛП(Выборка.Штрихкод);
			
			Если Не ЗначениеЗаполнено(НоваяСтрока.Код) Тогда
				
				НоваяСтрока.Используется                = Выборка.Используется;
				НоваяСтрока.Код                         = Выборка.Код;
				НоваяСтрока.Номенклатура                = Выборка.Номенклатура;
				НоваяСтрока.Характеристика              = Выборка.Характеристика;
				НоваяСтрока.Упаковка                    = Выборка.Упаковка;
				НоваяСтрока.Наименование                = НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати(Выборка.НоменклатураНаименование, Выборка.ХарактеристикаНаименование) + ?(ЗначениеЗаполнено(Выборка.УпаковкаНаименование),", " + Выборка.УпаковкаНаименование + ")","");
				НоваяСтрока.НаименованиеПолное          = НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати(Выборка.НоменклатураНаименованиеПолное, Выборка.ХарактеристикаНаименованиеПолное) + ?(ЗначениеЗаполнено(Выборка.УпаковкаНаименование),", " + Выборка.УпаковкаНаименование + ")","");
				НоваяСтрока.Цена                        = Выборка.Цена;
				НоваяСтрока.Остаток                     = Выборка.Остаток;
				НоваяСтрока.Весовой                     = Выборка.Весовой;
				НоваяСтрока.ИндексКартинкиЕстьИзменения = Выборка.ИндексКартинкиЕстьИзменения;
				НоваяСтрока.Штрихкод                    = Штрихкод;
				
				Если ИспользоватьСерииНоменклатуры Тогда
					НоваяСтрока.ТребуетсяУказаниеСерий  = Выборка.УказыватьСерииПриОтгрузкеВРозницу;
				КонецЕсли;
				
			Иначе
				НоваяСтрока.Штрихкод = НоваяСтрока.Штрихкод + ", " + Штрихкод;
			КонецЕсли;
			
			Если ЗначениеЗаполнено(Штрихкод) Тогда
				НоваяСтрока.МассивШтрихкодов.Добавить(Штрихкод);
			КонецЕсли;
			
		КонецЦикла;
		
		Если НоваяСтрока.Весовой
			И ОбновитьКодыТоваров
			И (Не ЗначениеЗаполнено(НоваяСтрока.Штрихкод)) Тогда
			
				Если МаксимальноеЗначениеКодаВесовыхШтрихкодов = Неопределено ИЛИ МаксимальноеЗначениеКодаВесовыхШтрихкодов >= МаксимальныйКодВесовогоТовара Тогда
					ВызватьИсключение РегистрыСведений.ШтрихкодыНоменклатуры.ТекстСообщенияНетСвободныхКодовВесовыхШтрихкодов();
				КонецЕсли;
					
				МаксимальноеЗначениеКодаВесовыхШтрихкодов = МаксимальноеЗначениеКодаВесовыхШтрихкодов + 1;
			
				Штрихкод = РегистрыСведений.ШтрихкодыНоменклатуры.ПолучитьШтрихкодВесовогоТовараПоКоду(МаксимальноеЗначениеКодаВесовыхШтрихкодов, ПрефиксУзлаШтрихкода);
			
				НоваяСтрока.Штрихкод = Штрихкод;
				НоваяСтрока.МассивШтрихкодов.Добавить(НоваяСтрока.Штрихкод);
				
				Попытка
					МенеджерЗаписиШтрихкода = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
					МенеджерЗаписиШтрихкода.Номенклатура   = НоваяСтрока.Номенклатура;
					МенеджерЗаписиШтрихкода.Характеристика = НоваяСтрока.Характеристика;
					МенеджерЗаписиШтрихкода.Упаковка       = НоваяСтрока.Упаковка;
					МенеджерЗаписиШтрихкода.Штрихкод       = НоваяСтрока.Штрихкод;
					МенеджерЗаписиШтрихкода.Записать();
				Исключение
					НоваяСтрока.Штрихкод = "";
					НоваяСтрока.МассивШтрихкодов.Очистить();
				КонецПопытки;
				
		КонецЕсли;
		
		Если НоваяСтрока.Весовой Тогда
			
			Если НоваяСтрока.МассивШтрихкодов.Количество() = 0 Тогда
				НоваяСтрока.ЕстьОшибки = Истина;
			КонецЕсли;
			
		КонецЕсли;
		
		Если Не ЗначениеЗаполнено(НоваяСтрока.Цена)
			ИЛИ НоваяСтрока.ТребуетсяУказаниеСерий
			ИЛИ Не ЗначениеЗаполнено(НоваяСтрока.Наименование)
			ИЛИ (Не ЗначениеЗаполнено(НоваяСтрока.Штрихкод) И Параметры.ТипОборудования = Перечисления.ТипыПодключаемогоОборудования.ВесыСПечатьюЭтикеток)
			ИЛИ (ЗначениеЗаполнено(Параметры.МаксимальныйКод) И НоваяСтрока.Код > Параметры.МаксимальныйКод) Тогда
			НоваяСтрока.ЕстьОшибки = Истина;
		КонецЕсли;
		
	КонецЦикла;
	
	УстановитьПривилегированныйРежим(Ложь);
	
	Возврат ТаблицаТоваров;
	
КонецФункции
Показать
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот