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

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

  1. ITShef

    ITShef Гость

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

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

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

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

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


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

    Дайнеко Well-Known Member
    1C Team

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

    vbs Well-Known Member

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

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

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

    SaschaL Гость

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

    puh14 Well-Known Member
    1C Team

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

    ITShef Гость

    Да вот с кодом проблемки, я его подкорректировал

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

    Код (Text):
     НужнаяДата = '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

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

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

    Конецесли

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

    ITShef Гость

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

    Код (Text):
    //*******************************************
    Процедура Сформировать()
    Перем ОбЦена;
    Перем ВалЦены;
    Перем ЕдИзм;

    Цены      = СоздатьОбъект("Справочник.Цены");   
    ТипыЦен  = СоздатьОбъект("Справочник.ТипыЦен");   
    Товары     = СоздатьОбъект("Справочник.Номенклатура");

    Если ТипыЦен.НайтиПонаименованию("Розничные",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;

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

    КонецПроцедуры
    Все возвращает вроде так, как мне надо, но думаю, чот меня может одидать? Какой глюк? и в каких ситуациях?
     
  9. vbs

    vbs Well-Known Member

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

    ITShef Гость

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

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

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

    1С 7.7 ТиС
     
  11. vbs

    vbs Well-Known Member

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

    ITShef Гость

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

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

    ITShef Гость

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

    Код (Text):
    //*******************************************
    Процедура Сформировать()
    Перем ОбЦена;
    Перем ВалЦены;
    Перем ЕдИзм;

    Цены      = СоздатьОбъект("Справочник.Цены");   
    ТипыЦен  = СоздатьОбъект("Справочник.ТипыЦен");   
    Товары     = СоздатьОбъект("Справочник.Номенклатура");

    Если ТипыЦен.НайтиПонаименованию("Розничные",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;

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

    КонецПроцедуры
    Мне надо в конечном итоге получить:

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

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

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

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Ну, ты иждивенец :facepalm: :welcome:
    Код ( (Unknown Language)):
     Если ТипыЦен.НайтиПонаименованию("Розничные",0,1) = 1 тогда
    РознЦена = ТипыЦен.ТекущийЭлемент()
    КонецЕсли;

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

    ITShef Гость

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

    vbs Well-Known Member

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

    ITShef Гость

    Эмммм.....а это где такое? Город.ю страна...
     
  18. vbs

    vbs Well-Known Member

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

    ITShef Гость

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

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

    puh14 Well-Known Member
    1C Team

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

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

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