1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

Выборка номенклатуры

Тема в разделе "1C и всё что с ней связано", создана пользователем ITShef, 27 окт 2010.

  1. ITShef

    ITShef Гость

    Репутация:
    0
    Есть 1С 7.7. Торговля + склад
    Нужно выполнить выборку данных номенклатуры с их ценами, которые передаются ввиде текстовой переменной

    ТипЦены = "Розничкая";
    КодЦены = "00000001";

    Выборку необходимо сделать без использования запроса. Раньше делал, но никак не могу вспомнить, а завтра надо

    Что мне надо получить
    Артикул Товара
    Код Товара
    Наименование товара
    Цена
    Валюта

    Все, задача элементарна, но как писал выше, вид цены выбирается не на форме, а задается ввиде переменной. Т.е. актуально использование "НайтиПо Коду


    Выручайте, нужна обработка очень срочно
     
  2. Дайнеко

    Дайнеко Well-Known Member

    Репутация:
    0
    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Подсказал бы, да не знаю как в типовой ТиС хранятся цены.
     
  3. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А кто запретил ?

    Тогда делай так :
    Цены = СоздатьОбъект("Справочник.Цены");
    ТипыЦен = СоздатьОбъект("Справочник.ТипыЦен");
    Если ТипыЦен.НайтиПонаименованию("Розничная",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;
    Товары = СоздатьОбъект("Справочник.Номенклатура");
    Товары.ВыбратьЭлементы();
    Пока Товары.ПолучитьЭлемент() = 1 Цикл
    Если Товары.ЭтоГруппа() = 0 тогда
    Цены.ИспользоватьВладельца(Товары.ТекущийЭлемент());
    глВернутьЦену(Товары.ТекущийЭлемент(),РознЦена, НужнаяДата, ЦенаЦены,,ВалЦены,, ОбЦена);
    Если ПустоеЗначение(ОбЦена) = 0 Тогда
    НайденнаяЕдиница= ОбЦена.Единица.Получить(ДатаКонца);
    Цена1 = ЦенаЦены/?(НайденнаяЕдиница.Коэффициент = 0, 1, НайденнаяЕдиница.Коэффициент);
    Иначе
    Цена1 = 0;
    КонецЕсли;
    // Далее выбрать из Товары нужные реквизиты
    // ну и описать переменные вверху
    КонецЕсли;
    КонецЦикла

    КонецЕсли
     
  4. SaschaL

    SaschaL Гость

    Репутация:
    0
    если без использования запроса, тогда только цикл
    Обрабатывай справочник в цикле и все тут
     
  5. puh14

    puh14 Well-Known Member

    Репутация:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    неколько странно, что нет упоминания вывода единицы измерения номенклатуры - цены ведь для неё хранятся. А без встроенной функции глВернутьЦену() сделать несколько геморно - цены могут быть динамическими, да и периодика вдобавок.
     
  6. ITShef

    ITShef Гость

    Репутация:
    0
    Да вот с кодом проблемки, я его подкорректировал

    Процедура Сформировать()

    Код:
     НужнаяДата = '01.10.2010';
    ДатаКонца = '01.10.2010';
    Цены	  = СоздатьОбъект("Справочник.Цены");	
    ТипыЦен	= СоздатьОбъект("Справочник.ТипыЦен");	
    Если ТипыЦен.НайтиПонаименованию("Розничные",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;
    
    Товары = СоздатьОбъект("Справочник.Номенклатура");
    Товары.ВыбратьЭлементы();
    Пока Товары.ПолучитьЭлемент() = 1 Цикл
    Если Товары.ЭтоГруппа() = 0 тогда
    Цены.ИспользоватьВладельца(Товары.ТекущийЭлемент());
    глВернутьЦену(Товары.ТекущийЭлемент(),РознЦена, НужнаяДата, ЦенаЦены,,ВалЦены,, ОбЦена); 
    Если ПустоеЗначение(ОбЦена) = 0 Тогда
    НайденнаяЕдиница= ОбЦена.Единица.Получить(ДатаКонца);
    Цена1 = ЦенаЦены/?(НайденнаяЕдиница.Коэффициент = 0, 1, НайденнаяЕдиница.Коэффициент);
    Иначе
    Цена1 = 0;
    КонецЕсли; 
    Сообщить(Товары.Наименование);
    Сообщить(Цена1);
    КонецЕсли;
    КонецЦикла;
    
    
    КонецПроцедуры
    Но цена возвращается со значением 0 :(
    Информация заполнена только по "Редактируемые цены"
    "Расчетные цены" - пустая

    Необходимо условие, при котором если не указана расчетная цена, то берется редактируемая

    В принципе, можно попробовать и ввиде запроса, не знаю как отнесется Delphi к тому, но... Пока вопрос актуален по самые н*цензура*уйся <_<


    Блин, как плохо быть склерозником :( Ну и тормозом немного :)
     
  7. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Грамотнее написать :

    Если глВернутьЦену(Товары.ТекущийЭлемент(),РознЦена, НужнаяДата, ЦенаЦены,,ВалЦены,, ОбЦена) = 1 тогда

    Конецесли

    // залезть в отладчик этой функции глВернутьЦену
    // и посмотреть, как выглядит переменная НайденнаяЦена
     
  8. ITShef

    ITShef Гость

    Репутация:
    0
    Кажется не на долго я смог переключить мозг с Delphi на 1С и вот что получилось:

    Код:
    //*******************************************
    Процедура Сформировать()
    Перем ОбЦена;
    Перем ВалЦены;
    Перем ЕдИзм;
    
    Цены	  = СоздатьОбъект("Справочник.Цены");	
    ТипыЦен	= СоздатьОбъект("Справочник.ТипыЦен");	
    Товары	 = СоздатьОбъект("Справочник.Номенклатура");
    
    Если ТипыЦен.НайтиПонаименованию("Розничные",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;
    
    Товары.ВыбратьЭлементы();
    Пока Товары.ПолучитьЭлемент() = 1 Цикл
    Если Товары.ЭтоГруппа() = 0 тогда
    Цены.ИспользоватьВладельца(Товары.ТекущийЭлемент());
    глВернутьЦену(Товары.ТекущийЭлемент(),РознЦена,РабочаяДата(),ОбЦена, ЕдИзм, ВалЦены); 
    Если ПустоеЗначение(ОбЦена) = 0 Тогда
    Цена1 = ОбЦена;
    Иначе
    Цена1 = 0;
    КонецЕсли; 
    Сообщить(Товары.Наименование);
    Сообщить(ЕдИзм);
    Сообщить(Цена1);
    КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры
    Все возвращает вроде так, как мне надо, но думаю, чот меня может одидать? Какой глюк? и в каких ситуациях?
     
  9. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А почему боишься ? Если механизм понял, волноваться нэту
     
  10. ITShef

    ITShef Гость

    Репутация:
    0
    Это все сделал, но задачку мне усложнили.... теперь надо не только список номенклатуры с ценами, но и количеством на складе...

    Можно и с запросом
    Т.е.
    Перем аКодТовара = "000001";

    Нужно получить фактический остаток товара на складе, при этом, чтобы это все работало очень быстро

    1С 7.7 ТиС
     
  11. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Код:
    	ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с ДатаКонца по ДатаКонца;
    |Номенклатура	= Регистр.ОстаткиТМЦ.Номенклатура;	 
    |Склад			= Регистр.ОстаткиТМЦ.Склад;			 
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);  
    |Condition (Склад в ВыбСклад); // если необходимо	
    |Группировка Номенклатура;";
    А при работе запроса вызываешь поиск нужной цены
     
  12. ITShef

    ITShef Гость

    Репутация:
    0
    Спасибо, но можно уж до конца. у меня от Delphi уже просто крыша едит и синтаксис дельфы никак не расцеплю с 1с. короче туплю уже страшенно ибо 4 сутки сижу над прогой перерабатывая почти 10к строк

    применимо к коду выше что и как сделать
     
  13. ITShef

    ITShef Гость

    Репутация:
    0
    А если точнее. дабы не морочить голову, то скорректируйте исходник

    Код:
    //*******************************************
    Процедура Сформировать()
    Перем ОбЦена;
    Перем ВалЦены;
    Перем ЕдИзм;
    
    Цены	  = СоздатьОбъект("Справочник.Цены");	
    ТипыЦен	= СоздатьОбъект("Справочник.ТипыЦен");	
    Товары	 = СоздатьОбъект("Справочник.Номенклатура");
    
    Если ТипыЦен.НайтиПонаименованию("Розничные",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;
    
    Товары.ВыбратьЭлементы();
    Пока Товары.ПолучитьЭлемент() = 1 Цикл
    Если Товары.ЭтоГруппа() = 0 тогда
    Цены.ИспользоватьВладельца(Товары.ТекущийЭлемент());
    глВернутьЦену(Товары.ТекущийЭлемент(),РознЦена,РабочаяДата(),ОбЦена, ЕдИзм, ВалЦены); 
    Если ПустоеЗначение(ОбЦена) = 0 Тогда
    Цена1 = ОбЦена;
    Иначе
    Цена1 = 0;
    КонецЕсли; 
    Сообщить(Товары.Наименование);
    Сообщить(ЕдИзм);
    Сообщить(Цена1);
    КонецЕсли;
    КонецЦикла;
    
    КонецПроцедуры
    Мне надо в конечном итоге получить:

    Наименование товара
    Артикул
    Код
    Цена
    Ед. изм
    Остаток на складе

    Можно мою процедуру полностью переделать - что угодно, главное условие теперь - сделать это одной процедурой.

    Указанные выше значения должны быть в переменных
    т.е.
    ТовАртикул = ...
    ТовНаименование = ...

    Добавлено: Я готов проставится пивом. меня так это прижало. просто финиш
     
  14. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Ну, ты иждивенец :facepalm: :welcome:
    Код:
     Если ТипыЦен.НайтиПонаименованию("Розничные",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;
    
    Запрос = СоздатьОбъект("Запрос"); 
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с ДатаКонца по ДатаКонца;
    |Номенклатура	= Регистр.ОстаткиТМЦ.Номенклатура;	 
    |Склад			= Регистр.ОстаткиТМЦ.Склад;			 
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);  
    |Condition (Склад в ВыбСклад); // если необходимо	
    |Группировка Номенклатура;";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;							  
    КонецЕсли;								 
    Пока (Запрос.Группировка("Номенклатура") = 1) Цикл 
    ТМЦ = Запрос.Номенклатура;
    Если Запрос.ЭтоГруппа("Номенклатура") = 0 Тогда 
    Кол = Запрос.КоличествоКонОст; 
    глВернутьЦену(ТМЦ,РознЦена,РабочаяДата(),ОбЦена, ЕдИзм, ВалЦены); 
    КонецЕсли;	 
    Если ПустоеЗначение(ОбЦена) = 0 Тогда
    Цена1 = ОбЦена;
    Иначе
    Цена1 = 0;
    КонецЕсли; 
    Сообщить(ТМЦ.Наименование);
    Сообщить(ЕдИзм);
    Сообщить(Цена1);
    Сообщить(Кол);
    КонецЦикла;
     
  15. ITShef

    ITShef Гость

    Репутация:
    0
    Спасибо огромное! Все, сделал. чть подшаманил и все работает на ура! Даже бестрее, чем я предполагал! С меня пиво :facepalm:
     
  16. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Жду в баре "Шемрок" напротив Мариинского театра. Предлагай день и час :facepalm:
     
  17. ITShef

    ITShef Гость

    Репутация:
    0
    Эмммм.....а это где такое? Город.ю страна...
     
  18. vbs

    vbs Well-Known Member

    Репутация:
    0
    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    В интернете Мариинский театр пробовал поискать ? :facepalm:
     
  19. ITShef

    ITShef Гость

    Репутация:
    0
    Ну извините, я с Волгоградской области и сразу не догадался ;) Жаль, что так далеко. Но тем не менее мне полегчало, но не на долго.

    При выполнении вышеуказанного запроса, выбираются не все товары. Пропали товары. остаток которых равен 0. Хотя не все. из 250000 товаров, 6 просочились с нулевым остатком.
    Мне надо выбирать все товары вне зависимости от их количества. Просто это количество надо выводить отдельным значением
     
  20. puh14

    puh14 Well-Known Member

    Репутация:
    0
    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Вариант раз |Группировка Номенклатура Все;
    Вариант 2 |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура,Справочник.Номенклатура.ТекущийЭлемент;

    Чтобы не было групп номенклатуры надо в группировку дописать БезГрупп
     
Загрузка...

Поделиться этой страницей