Помогите разобраться с выборкой цен по оле

1. N_s_s 2 23.05.17 19:45 Сейчас в теме
Буду очень признателен если кто направит на путь истинный. Пишу обработку по переносу номенклатуры с штрихкодами и ценами, номенклатуры выбрал, штрихкода тоже, а вот с ценой не могу справиться.
ункция ПолучитьЦену(Номенклатура)
	
	Цена = 0;
	СпрOLE = База7.CreateObject("Справочник.Цены");
	СпрНом = База7.CreateObject("Справочник.Номенклатура");
	Если СпрНом.НайтиПоКоду(Номенклатура.Код,0) = 1 Тогда
		ЭлНом = СпрНом.ТекущийЭлемент();	
	КонецЕсли;;
	СпрOLE.ВыбратьЭлементы(); 
	СпрOLE.ИспользоватьВладельца(ЭлНом);
	//СпрOLE.ИспользоватьДату(ТекущаяДата());
	Цена = СпрOLE.Цена.Получить(ТекущаяДата());
	//Пока СпрOLE.ПолучитьЭлемент()=1 Цикл
	//	Если СпрOLE.Наименование = "Розничные" Тогда
	//		Цена = СпрOLE.Цена;
	//	КонецЕсли;
	//КонецЦикла;
	Возврат(Цена);
КонецФункции

Процедура КнопкаВыполнитьНажатие(Кнопка)
	
	
	ПутьБазы = "e:\1C\Base\ZaRulem\zarulem\";
	Пользователь = "admin";
	Пароль = "admin";
	МонопольныйРежимOLE = ""; 
	ЗапускБезЗаставки = 1;
	База7 = Новый COMОбъект("V77.Application");

	Попытка
	 	РезультатПодключения = База7.Initialize ( База7.RMTrade , "/d" +
	                      ПутьБазы + " /n" + Пользователь+
	                      " /p" + Пароль + МонопольныйРежимOLE,
	                      ?(ЗапускБезЗаставки = 1,"NO_SPLASH_SHOW",""));
	Исключение
	   Предупреждение(ОписаниеОшибки());
	   РезультатПодключения=Ложь;
	   Возврат;
	КонецПопытки;
	
	//Сообщить(РезультатПодключения);
	Запрос = База7.CreateObject("Запрос");
	ТекстЗапроса=

	"//{{ЗАПРОС(Сформировать)
	|Обрабатывать НеПомеченныеНаУдаление;
	|Номенклатура = Справочник.Номенклатура.ТекущийЭлемент;
	//|Код = Справочник.Номенклатура.Код;
	//|Наименование = Справочник.Номенклатура.Наименование;
	//|Штрихкод = Справочник.Номенклатура.БазоваяЕдиница.Штрихкод;
	//|Родитель = Справочник.Номенклатура.Родитель.Наименование;
	//|РодительКод = Справочник.Номенклатура.Родитель.Код;
	|Группировка Номенклатура;
	|";//}}ЗАПРОС
	
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
	    ОбщегоНазначения.СообщитьОбОшибке("Ошибка выпонения запроса номенклатуры в базе-источнике");
	    Возврат;
	КонецЕсли;
	
	Таблица = Новый ТаблицаЗначений;
	Таблица.Колонки.Добавить("Код",,,15);
	Таблица.Колонки.Добавить("Наименование",,,50);
	Таблица.Колонки.Добавить("Штрихкод",,,15);	
	Таблица.Колонки.Добавить("Родитель",,,50);	
	Таблица.Колонки.Добавить("РодительКод",,,15);
	Таблица.Колонки.Добавить("ЭтоГруппа",,,1);
	Таблица.Колонки.Добавить("Цена",,,);
	
	Пока Запрос.Группировка() Цикл
	    
		Строка = Таблица.Добавить();
		Строка.ЭтоГруппа = Запрос.Номенклатура.ЭтоГруппа();
		Строка.Код = Запрос.Номенклатура.Код;
		Строка.Наименование = Запрос.Номенклатура.Наименование;
		Попытка 
			Если Число(Запрос.Номенклатура.БазоваяЕдиница.Штрихкод) <> 0 Тогда
				Строка.Штрихкод = Запрос.Номенклатура.БазоваяЕдиница.Штрихкод;	
			КонецЕсли;	
		Исключение 	
		    Строка.Штрихкод = "";
		КонецПопытки;
		Строка.Родитель = Запрос.Номенклатура.Родитель.Наименование;
		Строка.РодительКод = Запрос.Номенклатура.Родитель.Код;
		Если Строка.ЭтоГруппа = 0 Тогда
			Строка.Цена = ПолучитьЦену(Запрос.Номенклатура);
		КонецЕсли;	
	КонецЦикла;	
	База7 = "";
	
КонецПроцедуры
Показать
+
По теме из базы знаний
Найденные решения
5. E_Johnny 24.05.17 02:56 Сейчас в теме
Может это поможет. Писал давно для "Из ТИС 7.7 ред. 9.2 в УТ 10.3"

Функция СформироватьЦены_1()Экспорт   //Срез розничных и закупочных цен на дату
	НачатьТранзакцию();
	ТЗ = Новый ТаблицаЗначений;
	ТаблицаОстатков = Новый ТаблицаЗначений;
	
	ТЗ.Колонки.Добавить("Номенклатура");
	ТЗ.Колонки.Добавить("Количество");
	ТЗ.Колонки.Добавить("ТипЦены");
	ТЗ.Колонки.Добавить("Цена");
	ТЗ.Колонки.Добавить("День");
	
	ТекстЗапроса = " Период с '"+КонецДня(ДатаНач)+ "' по '"+КонецДня(ДатаКон)+"';
	|Номенклатура	= Регистр.ОстаткиТМЦ.Номенклатура;      
	//|Склад			= Регистр.ОстаткиТМЦ.Склад;
	|Количество = Регистр.ОстаткиТМЦ.Количество;
	|Функция КоличествоКонОст = КонОст(Количество);
	|Группировка Номенклатура упорядочить по Номенклатура.Наименование Без Групп;  
	//|Группировка Склад упорядочить по Склад.Наименование;
	|Без Итогов;
	|";
	
	Запрос = БазаОле.CreateObject("Запрос");
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
		#Если Клиент Тогда
			Предупреждение("Запрос безутешен!");
		#КонецЕсли	
		Возврат Неопределено;
	КонецЕсли;
	#Если Клиент Тогда
		Сообщить("   Запрос выполнен. Обработка таблицы: " + ТекущаяДата());
	#КонецЕсли	
	Пока Запрос.Группировка()=1 Цикл	
		#Если Клиент Тогда
			ОбработкаПрерыванияПользователя();
		#КонецЕсли	
		ТекСпр = Запрос.Номенклатура.ТекущийЭлемент();
		Номенклатура = ПолучитьНоменклатуру(ТекСпр);
		
		//НоваяСтрока = ТЗ.Добавить() ;
		//НоваяСтрока.Номенклатура = Номенклатура;
		//НоваяСтрока.Количество=Запрос.КоличествоКонОст;
		
		СпрНом =  БазаОле.CreateObject("Справочник.Номенклатура");
		СпрНом.НайтиПоКоду(ТекСпр.Код);  
		
		
		//СпрЦены =""""+СтрЗаменить(БазаОле.ЗначениеВстроку(БазаОле.Константа.РозничныйТипЦен),"""", """""")+"""";
		ТипЦены = БазаОле.EvalExpr("глЗначениеПоУмолчанию(""ОсновнойТипЦенПокупки"")");
		СпрЦены = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(ТипЦены.ТекущийЭлемент()),"""", """""")+"""";
		
		СпрНоменклатура = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(СпрНом.ТекущийЭлемент()),"""", """""")+"""";
		ЦенаЦены=БазаОле.EvalExpr("глПолучитьЦену(ЗначениеИзСтроки("+СпрНоменклатура+"),ЗначениеИзСтроки("+СпрЦены+"),'"+Лев(Формат(ДатаКон,"ДФДДММГГГГ"),10)+"')");
		
		Если ЦенаЦены > 0 Тогда
			НоваяСтрока = ТЗ.Добавить() ;
			НоваяСтрока.Номенклатура = Номенклатура;
			НоваяСтрока.Цена = ЦенаЦены;
			НоваяСтрока.ТипЦены=КонвертироватьОбъектОЛЕРеализация(ТипЦены);
			НоваяСтрока.День = ДатаНач;
			НоваяСтрока.Количество=1;
		КонецЕсли;
		
		ТипЦены = БазаОле.EvalExpr("глЗначениеПоУмолчанию(""ОсновнойТипЦенПродажи"")");
		СпрЦены = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(ТипЦены.ТекущийЭлемент()),"""", """""")+"""";
		
		СпрНоменклатура = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(СпрНом.ТекущийЭлемент()),"""", """""")+"""";
		ЦенаЦены1=БазаОле.EvalExpr("глПолучитьЦену(ЗначениеИзСтроки("+СпрНоменклатура+"),ЗначениеИзСтроки("+СпрЦены+"),'"+Лев(Формат(ДатаКон,"ДФДДММГГГГ"),10)+"')");
		
		Если ЦенаЦены1 > 0 Тогда
			НоваяСтрока = ТЗ.Добавить() ;
			НоваяСтрока.Номенклатура = Номенклатура;
			НоваяСтрока.Цена = ЦенаЦены1;
			НоваяСтрока.ТипЦены=КонвертироватьОбъектОЛЕРеализация(ТипЦены);
			НоваяСтрока.День = ДатаНач;
			НоваяСтрока.Количество=1;
		КонецЕсли;
		
	КонецЦикла;
	#Если Клиент Тогда
		Состояние("Сортировка значений");
	#КонецЕсли
	ТЗ.Сортировать("Номенклатура");
	//ТЗ.Очистить();
	ЗафиксироватьТранзакцию();
	ОтключитьсяОтБазы();
	#Если Клиент Тогда
		Сообщить("   Обработка таблицы завершена: " + ТекущаяДата());
	#КонецЕсли
	Возврат ТЗ;
	
КонецФункции
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YNik 23.05.17 21:15 Сейчас в теме
(1)
    Цена = 0;
    СпрOLE = База7.CreateObject("Справочник.Цены");
    СпрOLE.ИспользоватьВладельца(Номенклатура);
    СпрOLE.ВыбратьЭлементы(); 
    Если СпрOLE.ПолучитьЭлемент()=1 Тогда
        Цена = СпрOLE.Цена.Получить(ТекущаяДата());
    КонецЕсли;
    Возврат(Цена);
+
7. N_s_s 2 24.05.17 19:10 Сейчас в теме
3. starjevschik 23.05.17 21:32 Сейчас в теме
(1) не взлетит, потому что
    Если СпрНом.НайтиПоКоду(Номенклатура.Код,0) = 1 Тогда
        ЭлНом = СпрНом.ТекущийЭлемент();    
    КонецЕсли;;
    СпрOLE.ВыбратьЭлементы(); 
    СпрOLE.ИспользоватьВладельца(ЭлНом);

ЭлНом в базе-приемнике имеет тип OleObject, а нужен элемент справочника в той базе-источнике.
Как лучше сделать, я не знаю, я бы, наверное, делал выборку всех цен и потом искал им владельца уже в этой базе по коду или что там у них уникальное.
+
4. quick 583 23.05.17 22:37 Сейчас в теме
Делал подобное. Самый простой способ оказался написать класс для 1С++ в нем методы для получения таблицы значений с нужными тебе колонками и простыми типами (число, строка).
Модификации конфы это не требует, так как классы во внешних файлах.
А для загрузки примерно так

КлассОбмена = База77.CreateObject("Обмен.Цены");
тз = КлассОбмена.ПолучитьЦеныХХХ(ДатаВыборки, Группа,..);


Этот подход позволяет не тащить на сторону приемника код выборки. У меня к тому же там используются прямые запросы и другие извращения, что через OLE проблематичны.
+
5. E_Johnny 24.05.17 02:56 Сейчас в теме
Может это поможет. Писал давно для "Из ТИС 7.7 ред. 9.2 в УТ 10.3"

Функция СформироватьЦены_1()Экспорт   //Срез розничных и закупочных цен на дату
	НачатьТранзакцию();
	ТЗ = Новый ТаблицаЗначений;
	ТаблицаОстатков = Новый ТаблицаЗначений;
	
	ТЗ.Колонки.Добавить("Номенклатура");
	ТЗ.Колонки.Добавить("Количество");
	ТЗ.Колонки.Добавить("ТипЦены");
	ТЗ.Колонки.Добавить("Цена");
	ТЗ.Колонки.Добавить("День");
	
	ТекстЗапроса = " Период с '"+КонецДня(ДатаНач)+ "' по '"+КонецДня(ДатаКон)+"';
	|Номенклатура	= Регистр.ОстаткиТМЦ.Номенклатура;      
	//|Склад			= Регистр.ОстаткиТМЦ.Склад;
	|Количество = Регистр.ОстаткиТМЦ.Количество;
	|Функция КоличествоКонОст = КонОст(Количество);
	|Группировка Номенклатура упорядочить по Номенклатура.Наименование Без Групп;  
	//|Группировка Склад упорядочить по Склад.Наименование;
	|Без Итогов;
	|";
	
	Запрос = БазаОле.CreateObject("Запрос");
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
		#Если Клиент Тогда
			Предупреждение("Запрос безутешен!");
		#КонецЕсли	
		Возврат Неопределено;
	КонецЕсли;
	#Если Клиент Тогда
		Сообщить("   Запрос выполнен. Обработка таблицы: " + ТекущаяДата());
	#КонецЕсли	
	Пока Запрос.Группировка()=1 Цикл	
		#Если Клиент Тогда
			ОбработкаПрерыванияПользователя();
		#КонецЕсли	
		ТекСпр = Запрос.Номенклатура.ТекущийЭлемент();
		Номенклатура = ПолучитьНоменклатуру(ТекСпр);
		
		//НоваяСтрока = ТЗ.Добавить() ;
		//НоваяСтрока.Номенклатура = Номенклатура;
		//НоваяСтрока.Количество=Запрос.КоличествоКонОст;
		
		СпрНом =  БазаОле.CreateObject("Справочник.Номенклатура");
		СпрНом.НайтиПоКоду(ТекСпр.Код);  
		
		
		//СпрЦены =""""+СтрЗаменить(БазаОле.ЗначениеВстроку(БазаОле.Константа.РозничныйТипЦен),"""", """""")+"""";
		ТипЦены = БазаОле.EvalExpr("глЗначениеПоУмолчанию(""ОсновнойТипЦенПокупки"")");
		СпрЦены = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(ТипЦены.ТекущийЭлемент()),"""", """""")+"""";
		
		СпрНоменклатура = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(СпрНом.ТекущийЭлемент()),"""", """""")+"""";
		ЦенаЦены=БазаОле.EvalExpr("глПолучитьЦену(ЗначениеИзСтроки("+СпрНоменклатура+"),ЗначениеИзСтроки("+СпрЦены+"),'"+Лев(Формат(ДатаКон,"ДФДДММГГГГ"),10)+"')");
		
		Если ЦенаЦены > 0 Тогда
			НоваяСтрока = ТЗ.Добавить() ;
			НоваяСтрока.Номенклатура = Номенклатура;
			НоваяСтрока.Цена = ЦенаЦены;
			НоваяСтрока.ТипЦены=КонвертироватьОбъектОЛЕРеализация(ТипЦены);
			НоваяСтрока.День = ДатаНач;
			НоваяСтрока.Количество=1;
		КонецЕсли;
		
		ТипЦены = БазаОле.EvalExpr("глЗначениеПоУмолчанию(""ОсновнойТипЦенПродажи"")");
		СпрЦены = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(ТипЦены.ТекущийЭлемент()),"""", """""")+"""";
		
		СпрНоменклатура = """"+СтрЗаменить(БазаОле.ЗначениеВстроку(СпрНом.ТекущийЭлемент()),"""", """""")+"""";
		ЦенаЦены1=БазаОле.EvalExpr("глПолучитьЦену(ЗначениеИзСтроки("+СпрНоменклатура+"),ЗначениеИзСтроки("+СпрЦены+"),'"+Лев(Формат(ДатаКон,"ДФДДММГГГГ"),10)+"')");
		
		Если ЦенаЦены1 > 0 Тогда
			НоваяСтрока = ТЗ.Добавить() ;
			НоваяСтрока.Номенклатура = Номенклатура;
			НоваяСтрока.Цена = ЦенаЦены1;
			НоваяСтрока.ТипЦены=КонвертироватьОбъектОЛЕРеализация(ТипЦены);
			НоваяСтрока.День = ДатаНач;
			НоваяСтрока.Количество=1;
		КонецЕсли;
		
	КонецЦикла;
	#Если Клиент Тогда
		Состояние("Сортировка значений");
	#КонецЕсли
	ТЗ.Сортировать("Номенклатура");
	//ТЗ.Очистить();
	ЗафиксироватьТранзакцию();
	ОтключитьсяОтБазы();
	#Если Клиент Тогда
		Сообщить("   Обработка таблицы завершена: " + ТекущаяДата());
	#КонецЕсли
	Возврат ТЗ;
	
КонецФункции
Показать
+
8. N_s_s 2 24.05.17 19:27 Сейчас в теме
(5)
Может это поможет. Писал давно для "Из ТИС 7.7 ред. 9.2 в УТ 10.


Получилось, спасибо огромное.

	Цена = 0;
	СпрOLE = База7.CreateObject("Справочник.Цены");
	СпрНом = База7.CreateObject("Справочник.Номенклатура");
	СпрНом.НайтиПоКоду(Номенклатура.Код,0);
	ТипЦены = База7.EvalExpr("глЗначениеПоУмолчанию(""ОсновнойТипЦенПродажи"")");
	СпрЦены = """"+СтрЗаменить(База7.ЗначениеВстроку(ТипЦены.ТекущийЭлемент()),"""", """""")+"""";
    СпрНоменклатура = """"+СтрЗаменить(База7.ЗначениеВстроку(СпрНом.ТекущийЭлемент()),"""", """""")+"""";
    ЦенаЦены=База7.EvalExpr("глПолучитьЦену(ЗначениеИзСтроки("+СпрНоменклатура+"),ЗначениеИзСтроки("+СпрЦены+"),'"+Лев(Формат(ТекущаяДата(),"ДФДДММГГГГ"),10)+"')");	
Показать
+
6. N_s_s 2 24.05.17 05:38 Сейчас в теме
Может быть как то запросом можно выдернуть цену с передачей параметра, как в 8?
+
Внимание! Тема сдана в архив

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