Имя: Пароль:
1C
1C 7.7
v7: Выгрузка из ТиС
0 Alex1979rak
 
19.06.14
13:17
Здравствуйте, уважаемые коллеги.

Нужна ваша помощь.

Есть типовая конфа ТиС 7.70.942.

Из нее нужно получать выгрузку информации для интернет-магазина в формате файла CSV.

За основу взял типовую обработку "Печать прайса".

Вот фрагменты кода обработки:
    // текст запроса по выбранным ценам
    ТекстЗапроса = "//{{ЗАПРОС(ОтборЦен)
    |Период с ДатаОтчета по ДатаОтчета;
    |Номенклатура    = Справочник.Цены.Владелец;
    |Тип            = Справочник.Цены.ТипЦен;
    |Цена            = Справочник.Цены.Цена;
    |Единица        = Справочник.Цены.Единица;
    |Валюта            = Справочник.Цены.Валюта;
    |Функция ЦенаСумма    = Сумма(Цена);
    |Группировка Номенклатура Упорядочить по Номенклатура.Наименование;
    |Группировка Тип;
    |"//}}ЗАПРОС
    ;
    
    Если ПоНаличию = 1 Тогда
        
        ТекстЗапросаОстатков = "
        |Номенклатура    = Регистр.ОстаткиТМЦ.Номенклатура;
        |Количество        = Регистр.ОстаткиТМЦ.Количество;
        |
        |Функция КоличествоКонОст = КонОст(Количество);
        |
        |Группировка Номенклатура без групп;";
            
    
        ЗапросПоОстаткам = СоздатьОбъект("Запрос");
        Если ЗапросПоОстаткам.Выполнить(ТекстЗапросаОстатков) = 0 Тогда
            Возврат;
        КонецЕсли;
        
        СписокНоменклатуры = СоздатьОбъект("СписокЗначений");
        Пока ЗапросПоОстаткам.Группировка(1) = 1 Цикл
            Если ЗапросПоОстаткам.КоличествоКонОст > 0 Тогда
                СписокНоменклатуры.ДобавитьЗначение(ЗапросПоОстаткам.Номенклатура);
            КонецЕсли;
        КонецЦикла;
        
            
        Если СписокНоменклатуры.РазмерСписка() = 0 Тогда
            Предупреждение("Заданным условиям фильтра не удовлетворяет ни одна позиция номенклатуры.",60);
            Возврат;
        КонецЕсли;
        
        ТекстЗапроса = ТекстЗапроса + "Условие(Номенклатура в СписокНоменклатуры);"
        
    КонецЕсли;


В алгоритме обработки видно, что запросом из справочника Цены сначала отбирается информация о самом товаре и о ценах на товар.

Потом, если прайс строится по товару, который есть в наличии, то дополнительно собирается список значений из регистра ОстаткиТМЦ.

Вопрос 1: как можно объединить данные о товаре, цене и остатке?

Вопрос 2: возможно ли данные в файл CSV записывать по определенной структуре в ячейки как это хранится в экселе?
1 Ясный перец
 
19.06.14
13:24
В глобальном модуле ТиС есть 2 функции: глПолучитьЦену() и глВернутьЦену.
Попробуй воспользоваться какой-нибудь из них при обработке запроса по остаткам.
А вот запрос по ценам я бы не делал вообще... (но это только моё мнение)
2 Alex1979rak
 
19.06.14
13:31
(1) за идею спасибо. но все таки хочется для себя понять можно ли одним запросом вытянуть информацию о товаре, цене и остатке?
3 Ясный перец
 
19.06.14
13:41
Очевидно, что нельзя.
И да - из глобального более подходит функция глВернутьЦену()
4 mehfk
 
19.06.14
13:48
(2) Да, если вместо черного запроса использовать прямой запрос.
5 Pit0n_08
 
19.06.14
13:54
Можно, только нужно ли? Если для выгрузки информации достаточно данных по остаткам на ТА, то в запрос остатки включать смысла нет - получишь их при обходе результатов. Если нужны только позиции с остатками, то танцевать надо от запроса к регистру "ОстаткиТМЦ". Будет как-то быстрее (речь о черном запросе). ИМХО
6 Alex1979rak
 
19.06.14
13:55
(5) согласен. была такая мысль.
7 Alex1979rak
 
19.06.14
13:56
(4) прямыми запросами пользоваться не умею.
8 Злой Бобр
 
19.06.14
13:59
(2) Можно. Тебе ж уже даже функции указали. Добавляй их в запрос по остаткам и будет тебе счастье.
9 Ёпрст
 
19.06.14
14:00
(2) Можно. И обычным чорным запросом в том числе.
10 DCKiller
 
19.06.14
14:01
А если так?

"Товар = Регистр.ОстаткиТМЦ.Товар, Справочник.Цены.Владелец;
Количество        = Регистр.ОстаткиТМЦ.Количество;
Тип            = Справочник.Цены.ТипЦен;
|Цена            = Справочник.Цены.Цена;
|Единица        = Справочник.Цены.Единица;
|Валюта            = Справочник.Цены.Валюта;
|Функция ЦенаСумма    = Сумма(Цена);
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура Упорядочить по Номенклатура.Наименование Без Групп;
|Группировка Тип;"
11 Ясный перец
 
19.06.14
14:02
(10) Не взлетит. Цена - реквизит периодический
12 Alex1979rak
 
19.06.14
14:03
(10) я так пробовал. не работает.
13 DCKiller
 
19.06.14
14:04
(11) Так он там в запросе цену получает!
14 DCKiller
 
19.06.14
14:04
(12) Что не работает? Запрос пустой или что?
15 Ясный перец
 
19.06.14
14:04
(13) Не получает! ))
Оптимально штатными методами как посоветовали в (5).
16 Alex1979rak
 
19.06.14
14:06
(14) результат не тот, который нужен.
17 Pit0n_08
 
19.06.14
14:06
(10) я сейчас заплачу... (ударение на 2 гласной)
18 DCKiller
 
19.06.14
14:14
(15) в (5) первая половина вообще для мозга неусваеваема. Если  имелось в виду, что нужно получить данные из справочника цен, включая номенклатуру, потом сделать запрос к остаткам, и выгружая данные из первого запроса, позиционироваться на результатах второго методом Получить() для выдергивания из него остатков - то да.
19 Pit0n_08
 
19.06.14
14:22
(18) Обходя итоги запроса к номенклатуре получить Регистр.ОстаткиТМЦ.СводныйОстаток(,Запрос.Товар,,,"Количество") без всяких вторых запросов.
20 Ясный перец
 
19.06.14
14:22
(18) ...неусваеваема...
Но мы же умные люди? И поди разберёмся, что к чему? ))
21 DCKiller
 
19.06.14
14:26
(19) Ага, в цикле. На каждом шаге в базу лезть.
22 Pit0n_08
 
19.06.14
14:42
(21) не обижайтесь, но остатки на ТА как пенки а молоке - всегда сверху...
23 Pit0n_08
 
19.06.14
14:45
+(22) в молоке
24 Злой Бобр
 
19.06.14
16:49
(22) А еще "лучше" в цикле вызывать запрос. Эх ... молодежь. )
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший