Имя: Пароль:
1C
1C 7.7
v7: Сделал выгрузку из базы. Попинайте.
,
0 bizon2008
 
25.08.11
15:38
Сделал выгрузку из базы. Попинайте. А то давно я шашек в руках не держал. Работает. Но что-то мне не нравится, не пойму. Интуиция.
Заранее признателен.
Процедура Сформировать()
   Перем Запрос, ТекстЗапроса, Таб;
   СпрЕдиницы = СоздатьОбъект("Справочник.Единицы");
   СпрЦены = СоздатьОбъект("Справочник.Цены");
   
   тзТовар.Очистить();
   тзТовар.НоваяКолонка("Товар");
   тзТовар.НоваяКолонка("Ед");
   тзТовар.НоваяКолонка("Цена");
   тзТовар.НоваяКолонка("ШтрихКод");
   тзТовар.НоваяКолонка("Кф");
   
   тзТовар.УстановитьПараметрыКолонки("Товар", , , , ,60);
   тзТовар.УстановитьПараметрыКолонки("Ед", , , , ,5);
   тзТовар.УстановитьПараметрыКолонки("Цена","Число",10,2, ,15);
   тзТовар.УстановитьПараметрыКолонки("Ед", , , , ,5);
   тзТовар.УстановитьПараметрыКолонки("ШтрихКод", , , , ,15);
   тзТовар.УстановитьПараметрыКолонки("Кф","Число",10,3, ,10);
   
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с ВыбНачПериода по ВыбКонПериода;
   |Обрабатывать НеПомеченныеНаУдаление;
   |Товар = Регистр.ОстаткиТоваров.Товар;
   |Склад = Регистр.ОстаткиТоваров.Склад;
   |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
   |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
   |Группировка Товар без групп;
   |Условие(Склад = ВыбСклад);
   |"//}}ЗАПРОС
   ;
   // Если ошибка в запросе, то выход из процедуры
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;

   Пока Запрос.Группировка(1) = 1 Цикл
     
     тзТовар.НоваяСтрока();
     тзТовар.Товар = Запрос.Товар;
     
     СпрЕдиницы.ИспользоватьВладельца(Запрос.Товар);
       Если СпрЕдиницы.НайтиЭлемент(Запрос.Товар.ЕдиницаПоУмолчанию)=1 Тогда
       СпрЕдиницы.ТекущийЭлемент();
       тзТовар.Ед = СпрЕдиницы.ТекущийЭлемент();
       тзТовар.ШтрихКод = СпрЕдиницы.ШтрихКод;
       тзТовар.Кф = СпрЕдиницы.Коэффициент;
     Иначе
       Сообщить("Проблема при поиске элемента" + Запрос.Товар + "в справочнике единицы измерения");
     КонецЕсли;
     
     СпрЦены.ИспользоватьВладельца(Запрос.Товар);
       Если СпрЦены.НайтиПоРеквизиту("КатегорияЦены",ВыбТипЦены, 0)=1 Тогда
       СпрЦены.ТекущийЭлемент();
       тзТовар.Цена = СпрЦены.Цена.Получить(ВыбКонПериода);
     Иначе
       Сообщить("Проблема при поиске элемента" + Запрос.Товар + "в справочнике цены");
     КонецЕсли;
     
   КонецЦикла;
КонецПроцедуры
1 filh
 
25.08.11
15:40
а это что?
Если СпрЕдиницы.НайтиЭлемент(Запрос.Товар.ЕдиницаПоУмолчанию)=1 Тогда
       СпрЕдиницы.ТекущийЭлемент();
2 1Сергей
 
25.08.11
15:40
тзТовар.НоваяКолонка("Товар");
   тзТовар.НоваяКолонка("Ед");
   тзТовар.НоваяКолонка("Цена");
   тзТовар.НоваяКолонка("ШтрихКод");
   тзТовар.НоваяКолонка("Кф");
   
   тзТовар.УстановитьПараметрыКолонки("Товар", , , , ,60);
   тзТовар.УстановитьПараметрыКолонки("Ед", , , , ,5);
   тзТовар.УстановитьПараметрыКолонки("Цена","Число",10,2, ,15);
   тзТовар.УстановитьПараметрыКолонки("Ед", , , , ,5);
   тзТовар.УстановитьПараметрыКолонки("ШтрихКод", , , , ,15);
   тзТовар.УстановитьПараметрыКолонки("Кф","Число",10,3, ,10);

можно сократить вдвое


        Если СпрЕдиницы.НайтиЭлемент(Запрос.Товар.ЕдиницаПоУмолчанию)=1 Тогда
       СпрЕдиницы.ТекущийЭлемент();

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

Чушь!
3 filh
 
25.08.11
15:40
Если СпрЦены.НайтиПоРеквизиту("КатегорияЦены",ВыбТипЦены, 0)=1 Тогда
       СпрЦены.ТекущийЭлемент();
4 bizon2008
 
25.08.11
15:41
(2)Можно. Но так наглядней.
Ага. Точно перебор уже.
5 bizon2008
 
25.08.11
15:43
Если СпрЕдиницы.НайтиЭлемент(Запрос.Товар.ЕдиницаПоУмолчанию)=1 Тогда
       СпрЕдиницы.ТекущийЭлемент();
Если СпрЦены.НайтиПоРеквизиту("КатегорияЦены",ВыбТипЦены, 0)=1 Тогда
       СпрЦены.ТекущийЭлемент();

Угу. Перестарался. Привычка.
6 bizon2008
 
25.08.11
15:46
Меня еще вот эта строчка смущает.
Если СпрЦены.НайтиПоРеквизиту("КатегорияЦены",ВыбТипЦены, 0)=1 Тогда

Тут ноль правильно. Или лучше единица?
7 filh
 
25.08.11
15:47
(6) смотря что надо...
У тебя СП украли?
8 1Сергей
 
25.08.11
15:48
(6) ноль - правильно
9 bizon2008
 
25.08.11
15:51
(7)Там трактовка неоднозначная.
10 filh
 
25.08.11
15:53
(9) что неоднозначного увидел?
<ФлагГлобальногоПоиска> - флаг поиска:
 0 - поиск выполняется в пределах подчинения справочника,
 1 - поиск выполняется по всему справочнику.
11 bizon2008
 
25.08.11
15:55
ВыбратьЭлементыПоРеквизиту(<?>,,,)
Синтаксис:
ВыбратьЭлементыПоРеквизиту(<ИмяРеквизита>,<Значение>,<РежимИерархии>,<РежимГрупп>)
Назначение:
Открыть выборку элементов справочника по значению реквизита.
Возвращает: 1 - если действие выполнено и в выборке есть хотя бы один элемент;
0 - если действие не выполнено или в выборке нет ни одного элемента.
Параметры:
<ИмяРеквизита> - строка с именем реквизита, по которому выполняется выборка;
<Значение> - значение реквизита для выборки;
<РежимИерархии> - как выбирать:
1 - выбирать элементы с учетом иерархии,
0 - выбирать элементы без учета иерархии (необязателен, по умолчанию - 1);
<РежимГрупп> - что выбирать:
1 - выбирать среди групп справочника,
0 - выбирать только среди элементов справочника.
Замечание:
Метод можно использовать только для реквизитов с установленным признаком ''Сортировка''.
Метод  можно использовать только для объектов, созданных функцией СоздатьОбъект.
12 filh
 
25.08.11
15:59
(11) ты это, заканчивай бухать или закусывай. Твоё ВыбратьЭлементыПоРеквизиту ни раз нет в гКоде из (0).
13 Black Dragon
 
25.08.11
16:09
(12) да ну нет же, все нормально, есть
      СпрЦены.ИспользоватьВладельца(Запрос.Товар);
        Если СпрЦены.НайтиПоРеквизиту("КатегорияЦены",ВыбТипЦены, 0)=1 Тогда
       СпрЦены.ТекущийЭлемент();
       тзТовар.Цена = СпрЦены.Цена.Получить(ВыбКонПериода);
     Иначе
        Сообщить("Проблема при поиске элемента" + Запрос.Товар + "в справочнике цены");
      КонецЕсли;
14 bizon2008
 
25.08.11
16:09
(12)А ну да. Прошу прощения. Но все рано неоднозначно.
Если я указываю СпрЦены.ИспользоватьВладельца(Запрос.Товар); и ставлю 1, то что пофик? Все равно по всему справочнику бегать будет?
15 Black Dragon
 
25.08.11
16:10
наверное с 8 перепутал :)
16 Ёпрст
 
25.08.11
16:11
(14) да
17 Black Dragon
 
25.08.11
16:12
может вложенными запросами надо выбрать из остальных двух?
18 Black Dragon
 
25.08.11
16:15
однако если верить встроенной справке

НайтиПоРеквизиту(<?>,,);
Синтаксис:
НайтиПоРеквизиту(<ИмяРеквизита>,<Значение>,<ФлагГлобальногоПоиска>)
Назначение:
Найти элемент справочника по значению реквизита.
Возвращает: 1 - если действие выполнено;
0 - если действие не выполнено (элемент не найден).
Параметры:
<ИмяРеквизита> - строка с наименованием реквизита;
<Значение> - значение реквизита для поиска;
<ФлагГлобальногоПоиска> - флаг поиска:
 0 - поиск выполняется в пределах подчинения справочника,
 1 - поиск выполняется по всему справочнику.
Замечание:
Метод можно использовать только для реквизитов с установленным признаком ''Сортировка''.
Метод  можно использовать только для объектов, созданных функцией СоздатьОбъект.
19 bizon2008
 
25.08.11
16:26
(16)Круто. Всегда ставил ноль и даже не задумывался.