• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы ITShef
  • Дата начала
I

ITShef

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

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

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

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

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


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

Дайнеко

Подсказал бы, да не знаю как в типовой ТиС хранятся цены.
 
V

vbs

Выборку необходимо сделать без использования запроса.
А кто запретил ?

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

КонецЕсли
 
S

SaschaL

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

puh14

неколько странно, что нет упоминания вывода единицы измерения номенклатуры - цены ведь для неё хранятся. А без встроенной функции глВернутьЦену() сделать несколько геморно - цены могут быть динамическими, да и периодика вдобавок.
 
I

ITShef

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

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

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

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


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

Но цена возвращается со значением 0 :(
Информация заполнена только по "Редактируемые цены"
"Расчетные цены" - пустая

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

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


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

vbs

Грамотнее написать :

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

Конецесли

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

ITShef

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

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

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

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

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

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

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

ITShef

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

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

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

1С 7.7 ТиС
 
V

vbs

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

А при работе запроса вызываешь поиск нужной цены
 
I

ITShef

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

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

ITShef

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

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

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

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

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

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

Мне надо в конечном итоге получить:

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

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

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

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

vbs

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

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

ITShef

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

ITShef

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

vbs

В интернете Мариинский театр пробовал поискать ? :facepalm:
 
I

ITShef

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

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

puh14

Вариант раз |Группировка Номенклатура Все;
Вариант 2 |Номенклатура = Регистр.ОстаткиТМЦ.Номенклатура,Справочник.Номенклатура.ТекущийЭлемент;

Чтобы не было групп номенклатуры надо в группировку дописать БезГрупп
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!