Доработка стандартной обработки "ТОВыгрузкаТСД" БГУ

1. user868783 05.12.17 16:05 Сейчас в теме
Добрый день! Ближе к концу кода выгрузки в "Процедура ОсновныеДействияФормыВыгрузить(Кнопка)" (выделил подчеркиванием) хотим чтобы выгружалась цена и Характеристика номенклатуры, но не знаем как сделать :)
Пробовали в "СтрокаТаблицы.Цена" вносить "СтрокаОбъекта.Объект.ПервоначальнаяСтоимость", не получилось.
Были попытки взять ХарактеристикуНоменклатуры, но тоже неудачные.
Сейчас выгружает только Наименование Номенклатуры(ОС) и штрихкод

/////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ

Перем мСписокТерминалов;

////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

// Процедура получает основной запрос
//
// Параметры нет
Процедура ЗаполнитьНачальныеНастройки()

	ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	               |	ИСТИНА КАК Выгружать,
	               |	Штрихкоды.Штрихкод,
	               |	ПРЕДСТАВЛЕНИЕ(Штрихкоды.Владелец) КАК Объект,
	               |	ПРЕДСТАВЛЕНИЕ(Штрихкоды.ИнвентарныйНомер) КАК ИнвентарныйНомер,
	               |	Штрихкоды.КодОбъекта
	               |ИЗ
	               |	РегистрСведений.Штрихкоды КАК Штрихкоды
	               |{ГДЕ
	               |	Штрихкоды.Владелец.Учреждение.* КАК Учреждение,
	               |	Штрихкоды.Владелец.* КАК Объект}";
	

	ПостроительОтчета.Текст = ТекстЗапроса;

	СоответствиеИменОтбора = Новый Структура();

	СоответствиеИменОтбора.Вставить("Объект", "Объект");
	СоответствиеИменОтбора.Вставить("Учреждение", "Учреждение");

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

КонецПроцедуры // ЗаполнитьНачальныеНастройки()

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

////////////////////////////////////////////////////////////­/////////////////
// ФУНКЦИИ ВЗАИМОДЕЙСТВИЯ С ТОРГОВЫМ ОБОРУДОВАНИЕМ (ОБЩИЕ ФУНКЦИИ API)

// Функция возвращает признак того, что клиент поддерживает работу с видом ТО,
// переданным в качестве параметра.
//
// Параметры:
//  Вид      - <ПеречислениеСсылка.ВидыТорговогоОборудования>
//           - Вид торгового оборудования, информация о поддержке
//             которого запрашивается.
//
// Возвращаемое значение:
//  <Булево> - Признак поддержки указанного класса торгового оборудования.
//
Функция ПоддерживаетсяВидТО(Вид) Экспорт

	Результат = Ложь;

	Если Вид = Перечисления.ВидыТорговогоОборудования.ТерминалСбораДанных Тогда
		Результат = Истина;
	КонецЕсли;

	Возврат Результат;
КонецФункции // ПоддерживаетсяВидТО()

////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНОЙ ПАНЕЛИ "ДействияФормы"

// Процедура - обработчик события "ПриНажатии" кнопки "Заполнить"
// командной панели "ДействияФормы"
//
// Параметры
//  Кнопка - <КнопкаКоманднойПанели>
//         - кнопка "Заполнить"
//
Процедура ДействияФормыЗаполнить(Кнопка)
	Если СписокОбъектов.Количество() > 0 Тогда
		ответ = Вопрос("Перед заполнением табличная часть будет очищена. Заполнить?", РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Нет, "Проверка заполнения табличной части");
		Если ответ = КодВозвратаДиалога.Нет Тогда
			возврат;
		КонецЕсли;
	КонецЕсли;
	ПостроительОтчета.Выполнить();
	СписокОбъектов = ПостроительОтчета.Результат.Выгрузить();
КонецПроцедуры // ДействияФормыЗаполнить()


////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНОЙ ПАНЕЛИ "КомандыТоваров"

// Процедура - обработчик события "ПриНажатии" кнопки "ВыделитьВсе"
// командной панели "КомандыТоваров"
//
// Параметры
//  Кнопка - <КнопкаКоманднойПанели>
//         - кнопка "ВыделитьВсе"
//
Процедура КомандыТоваровВыделитьВсе(Кнопка)

	СписокОбъектов.ЗаполнитьЗначения(Истина, "Выгружать");

КонецПроцедуры // КомандыТоваровВыделитьВсе()

// Процедура - обработчик события "ПриНажатии" кнопки "ОчиститьВыделение"
// командной панели "КомандыТоваров"
//
// Параметры
//  Кнопка - <КнопкаКоманднойПанели>
//         - кнопка "ОчиститьВыделение"
//
Процедура КомандыТоваровОчиститьВыделение(Кнопка)

	СписокОбъектов.ЗаполнитьЗначения(Ложь, "Выгружать");

КонецПроцедуры // КомандыТоваровОчиститьВыделение()

////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ КОМАНДНОЙ ПАНЕЛИ "ОсновныеДействияФормы"

// Процедура - обработчик события "ПриНажатии" кнопки "Выгрузить"
// командной панели "ОсновныеДействияФормы"
//
// Параметры
//  Кнопка - <КнопкаКоманднойПанели>
//         - кнопка "Выгрузить"
//
Процедура ОсновныеДействияФормыВыгрузить(Кнопка)

	Результат = Неопределено;

	Если СписокОбъектов.Количество() = 0 Тогда
		Предупреждение("Нет данных для выгрузки.");
		Возврат;
	КонецЕсли;

	Ошибка     = "";
	КолвоСтрок = 0;

	ТаблицаДляТСД = Новый ТаблицаЗначений;
	ТаблицаДляТСД.Колонки.Добавить("Штрихкод");
	ТаблицаДляТСД.Колонки.Добавить("Наименование");
	ТаблицаДляТСД.Колонки.Добавить("ЕдиницаИзмерения");
	ТаблицаДляТСД.Колонки.Добавить("ХарактеристикаНоменклатуры");
	ТаблицаДляТСД.Колонки.Добавить("СерияНоменклатуры");
	ТаблицаДляТСД.Колонки.Добавить("Качество");
	ТаблицаДляТСД.Колонки.Добавить("Цена");
	ТаблицаДляТСД.Колонки.Добавить("Количество");

	Для Каждого СтрокаОбъекта Из СписокОбъектов Цикл
		Если СтрокаОбъекта.Выгружать Тогда
			Если НЕ ЗначениеЗаполнено(СтрокаОбъекта.ШтрихКод) Тогда
				Предупреждение("В таблице есть объекты, не имеющие штрихкода.
							|Выгрузка таких объектов не производится!
							|Отключите выгрузку таких объектов.", 60);
				Возврат;			
			КонецЕсли;	
					
			СтрокаТаблицы = ТаблицаДляТСД.Добавить();
			СтрокаТаблицы.Штрихкод                   = СтрокаОбъекта.Штрихкод;
			СтрокаТаблицы.Наименование               = СтрокаОбъекта.Объект;
			
			СтрокаТаблицы.ЕдиницаИзмерения           = "";
			СтрокаТаблицы.ХарактеристикаНоменклатуры = ""
			СтрокаТаблицы.СерияНоменклатуры          = "";
			СтрокаТаблицы.Качество                   = "";
			СтрокаТаблицы.Цена                       = 0;
			СтрокаТаблицы.Количество                 = 0;
		КонецЕсли;
			КонецЦикла;

	Результат = ПолучитьСерверТО().ВыгрузитьТаблицуТСД(ТерминалСбораДанных, ТаблицаДляТСД);
	Если Не ЗначениеЗаполнено(Результат) Тогда
		Предупреждение("Выгрузка успешно завершена.
					   |Выгружено строк: " + Формат(ТаблицаДляТСД.Количество(), "ЧГ=0") + ".");
	Иначе
		Предупреждение("ВНИМАНИЕ! Произошла ошибка.
					   |Возможно объекты не выгружены, либо выгружены частично
					   |Ошибка: " + ПолучитьСерверТО().ПолучитьТекстОшибкиТСДТО(Результат));
	КонецЕсли;

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

////////////////////////////////////////////////////////////­////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

// Процедура - обработчик события "ПередОткрытием" формы
//
// Параметры
//  Отказ                – <Булево> 
//                       – признак отказа от открытия формы; если в теле 
//                         процедуры-обработчика установить данному параметру 
//                         значение Истина, открытие формы выполнено не будет.
//
//  СтандартнаяОбработка – <Булево> 
//                       –  в данный параметр передается признак выполнения 
//                          стандартной (системной) обработки события; если в 
//                          теле процедуры-обработчика установить данному 
//                          параметру значение Ложь, стандартная обработка 
//                          события производиться не будет. Отказ от 
//                          стандартной обработки не отменяет открытие формы.
//
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

	Отказ = (мСписокТерминалов.Количество() = 0);
	Если Отказ Тогда
		Предупреждение("Терминал сбора данных не подключен.");
	КонецЕсли;

КонецПроцедуры // ПередОткрытием()

// Процедура - обработчик события "ПриОткрытии" формы
//
// Параметры
//  Нет
//
Процедура ПриОткрытии()

	ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);

	СписокТерминалов = РаботаСТорговымОборудованием.ПолучитьСписокУстройствТОДляВыбора(мСписокТерминалов);

	ЭлементыФормы.ТерминалСбораДанных.СписокВыбора = СписокТерминалов;

	ТерминалСбораДанных                              = СписокТерминалов[0].Значение;
	ЭлементыФормы.ТерминалСбораДанных.ТолькоПросмотр = (СписокТерминалов.Количество() = 1);

	ЗаполнитьНачальныеНастройки();

	ЗаполнитьИзТабЧасти();
КонецПроцедуры // ПриОткрытии()

// Процедура - обработчик события "При закрытии" формы.
//
// Параметры:
//  Нет.
//
Процедура ПриЗакрытии()

	СтруктураСохраняемыхНастроек = Новый Структура();
	СтруктураСохраняемыхНастроек.Вставить("ПостроительОтчетаНастройки", ПостроительОтчета.ПолучитьНастройки(Истина, Ложь, Ложь, Ложь, Ложь));
	СохранитьЗначение("ТорговоеОборудование.ТОВыгрузкаТСД.Настройки." + ИмяПользователя(), СтруктураСохраняемыхНастроек);

	ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма);

КонецПроцедуры // ПриЗакрытии()

////////////////////////////////////////////////////////////­////////////////////
// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ

мСписокТерминалов = ПолучитьСерверТО().ПолучитьСписокУстройств(Перечисления.ВидыТорговогоОборудования.ТерминалСбораДанных);
Показать
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Robofinans1c 08.12.17 10:29 Сейчас в теме
Предполагаю, что у вас версия БГУ 1.0 на обычны формах. В таком случае между вашей конфигурацией и ТСД есть ещё внешняя обработка обслуживания непосредственно отвечающая за выгрузку данных. Она загружается отдельно при настройке ТСД в 1С и выгрузить для изучения её можно из справочника "Обработки обслуживания ТО". В принципе в такие обработки даже отладчик проваливается при некоторой сноровке. Вам нужен примерно вот такой участок кода
Функция ВыгрузитьСтроку(Объект, Штрихкод, Номенклатура, ЕдиницаИзмерения,
                        ХарактеристикаНоменклатуры, СерияНоменклатуры,
                        Качество, Цена, Количество) Экспорт

	Результат         = мНетОшибки;

	ФорматВыгрузки    = Объект.Параметры.ФорматБазы.ПолучитьОбъект();
	СоответствиеПолей = ФорматВыгрузки.ПолучитьСоответствиеПолейТСД(Штрихкод,
	                                                                Номенклатура,
	                                                                ЕдиницаИзмерения,
	                                                                ХарактеристикаНоменклатуры,
	                                                                СерияНоменклатуры,
	                                                                Качество,
	                                                                Цена,
	                                                                Количество);
	Поле1 = СоответствиеПолей["Поле1"];
	Поле2 = СоответствиеПолей["Поле2"];
	Поле3 = СоответствиеПолей["Поле3"];
	Поле4 = СоответствиеПолей["Поле4"];
	Поле5 = СоответствиеПолей["Поле5"];
	Поле6 = СоответствиеПолей["Поле6"];
	Поле7 = СоответствиеПолей["Поле7"];
	Поле8 = СоответствиеПолей["Поле8"];

	Объект.Драйвер.Поле1 = ?(Поле1 = Неопределено, "", Поле1);
	Объект.Драйвер.Поле2 = ?(Поле2 = Неопределено, "", Поле2);
	Объект.Драйвер.Поле3 = ?(Поле3 = Неопределено, "", Поле3);
	Объект.Драйвер.Поле4 = ?(Поле4 = Неопределено, "", Поле4);
	Объект.Драйвер.Поле5 = ?(Поле5 = Неопределено, "", Поле5);
	Объект.Драйвер.Поле6 = ?(Поле6 = Неопределено, "", Поле6);
	Объект.Драйвер.Поле7 = ?(Поле7 = Неопределено, "", Поле7);
	Объект.Драйвер.Поле8 = ?(Поле8 = Неопределено, "", Поле8);
	Ответ = Объект.Драйвер.ЗагрузитьЗапись(Объект.Параметры.НомерБазы);
	Если Ответ = 0 Тогда
		Объект.ОписаниеОшибки = Объект.Драйвер.ОписаниеРезультата;
		Результат = мОшибкаЗагрузкиСтроки;
	КонецЕсли;

	Возврат Результат;

КонецФункции // ВыгрузитьСтроку()
Показать

И смотреть значения Полей у Объект.Драйвер
Вообще ситуация в том что как минимум должен быть заполнен справочник "Форматы выгрузки для терминалов сбора данных" и там добавлено соответствие в какое поле базы ТСД записывать вашу цену и характеристику, по идее после этого должно сработать ваши изменения в коде. Вопрос в том что какая структура баз у вас сейчас на ТСД пользовались ли программатором? Как вы проверяете что цена у вас не выгрузилась?
Сам решал аналогичную задачу для CipherLab
3. user868783 05.03.18 14:47 Сейчас в теме
Спасибо, проблему решили допилив конфигурацию и обработку обмена с ТСД.
Оставьте свое сообщение

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