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