Имя: Пароль:
1C
1С v8
ПодпискаНаСобытие при проведении документа.
0 Ткачев
 
10.02.12
14:14
"Управление торговлей", редакция 10.3 (10.3.8.9)
Делаю выгрузку цен в Set Retail, при проведении документа надо выгрузить цены, но если документ перед проведением не Проведен, тогда в регистре нету еще записей, брать из ТЧ не могу т.к. могут проводиться документы прошлых цен.
Делал подписку ПриПроведении, ПриЗаписи, не выходит, цены в регистре есть только когда док уже был проведен, а при подписки на ПриПроведении и этого нет.
Как выйти из этой ситуации ?
1 shuhard
 
10.02.12
14:15
(0) что мешает сделать подписку перед записью Рг сведений ?
2 Fragster
 
гуру
10.02.12
14:15
записывать регистр в обработке проведения (или в своей подписке)
3 Ткачев
 
10.02.12
14:19
(1)По одной записи будет приходить, не устраивает, много файлов надо будет формировать тогда.
4 Живой Ископаемый
 
10.02.12
14:20
2(0) показывай код, которым видишь в ПриПроведении, что записей в Регистре нет
5 Живой Ископаемый
 
10.02.12
14:21
а, еще момент - в этот РС как пишутся движения? этот документ выступает регистратором или РС независимый?
6 Dmitrii
 
гуру
10.02.12
14:22
(3) >> По одной записи будет приходить

Что за фигня? У регистров подписки на наборы записей. У каждой записи подписок нет.
7 Ткачев
 
10.02.12
14:23
Запрос = Новый Запрос("
               |ВЫБРАТЬ
               |    ЦеныТоваров.Номенклатура
               |ПОМЕСТИТЬ Товары
               |ИЗ
               |    &Товары КАК ЦеныТоваров
               |ГДЕ
               |    ЦеныТоваров.ТипЦен = &ТипЦен
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               |    Товары.Номенклатура.Код КАК Код,
               |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, ""0"") КАК Цена
               |ИЗ Товары КАК Товары
               |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен
               |                        И Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ Товары)) КАК ЦеныНоменклатурыСрезПоследних
               |        ПО Товары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура");
               Запрос.УстановитьПараметр("Дата"    , ТекущаяДата());
               Запрос.УстановитьПараметр("ТипЦен"    , ТипЦенРетейл);
               Запрос.УстановитьПараметр("Товары"    , Источник.Товары);
8 Ткачев
 
10.02.12
14:23
(6)Сейчас посмотрю
9 Живой Ископаемый
 
10.02.12
14:25
не, если он независимый, тогда тока как (1)
10 milan
 
10.02.12
14:25
В подписке можно видеть то что запишется в свойстве Движеия.ТвойРегистр, с другой стороны документ распровели - тоже надо ловить, причем получится сложнее понять что именно поменялось ;) А если провели док потом удалили 10 строк, опять провели ???
11 Dmitrii
 
гуру
10.02.12
14:27
(0) >> Делал подписку ПриПроведении, ПриЗаписи, не выходит, цены в регистре есть только когда док уже был проведен, а при подписки на ПриПроведении и этого нет.

Вообще ни чего  не понял...
В подписке ПриПроведении Движения уже должны быть заполнены (если конечно движения делаются только в обработке проведения и нет других подписок ПриПроведении).
Конечно наборы из Движений могут быть еще не записаны в базу (если их только принудительно не записали типа Движения.Хозрасчетный.Записать()), но и не надо их читать из базы - их через коллекцию Движения надо смотреть.
12 Живой Ископаемый
 
10.02.12
14:28
2(11) у него похоже РС независимый...
13 Ткачев
 
10.02.12
14:29
(12)Подчинение регистратору
14 Живой Ископаемый
 
10.02.12
14:29
то есть он не учавствует в Движениях, записи там появляются через НаборЗаписей.. наверное.. я так себе навоображал. Потому что если я ошибся, тогда да, не понятно какая трудность у автора
15 milan
 
10.02.12
14:29
я бы использовал план обмена, там и по одной записи выгружать не надо и сразу видно - чего поменялось.
16 Живой Ископаемый
 
10.02.12
14:30
2(13) Тогда просто (7) удали и получай записи РС через Движения... елки.
17 milan
 
10.02.12
14:32
(16) Как обработать ситуацию создали док 100 строк, провели, потом открыли удалили 10 строк, провели, на 10 товаров будет неактуальная цена ?
18 Живой Ископаемый
 
10.02.12
14:33
2(17) что-что? не будет в движениях 100 строк, будет 90... перестаньте бредить
19 milan
 
10.02.12
14:34
(18) ну первый
20 milan
 
10.02.12
14:35
раз ты выгрузил цену на 100 товаров, потом из дока удалил 10 товаров, срез последних покажет тебе цену из предыдущего дока, а во внешней проге будут несуществующие цены
21 milan
 
10.02.12
14:36
закладывается приличная грабля ;) вчера только тема на хабре была по синхронизации каталога товаров с инетмагазином, не все там так радужно ;)
22 Живой Ископаемый
 
10.02.12
14:37
2(20)я понял... тогда внешняя прога тоже не должна забрать цены по одной а наборами с привязкой к регистрации
23 Ткачев
 
10.02.12
14:57
(17)Может подписку перед записью ?
Проверить что в базе и что таблице ?
24 Ткачев
 
10.02.12
15:01
Вот так пока сделал, буду про Планы обмена читать.

               Запрос = Новый Запрос("
               |ВЫБРАТЬ
               |    ЦеныТоваров.Номенклатура,
               |    ЦеныТоваров.Цена
               |ПОМЕСТИТЬ Товары
               |ИЗ
               |    &Товары КАК ЦеныТоваров
               |ГДЕ
               |    ЦеныТоваров.ТипЦен = &ТипЦен
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               |    Товары.Номенклатура.Код КАК Код,
               |ВЫБОР
               |    КОГДА &Проведен И (ЦеныНоменклатурыСрезПоследних.Период < &ДатаДок
               |                        ИЛИ ЦеныНоменклатурыСрезПоследних.Период ЕСТЬ NULL) ТОГДА Товары.Цена
               |    ИНАЧЕ ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, ""0"")
               |КОНЕЦ КАК Цена
               |ИЗ Товары КАК Товары
               |    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ТипЦен = &ТипЦен
               |                        И Номенклатура В (ВЫБРАТЬ Номенклатура ИЗ Товары)) КАК ЦеныНоменклатурыСрезПоследних
               |        ПО Товары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура");
               Запрос.УстановитьПараметр("Дата"    , ТекущаяДата());
               Запрос.УстановитьПараметр("Проведен", Источник.Проведен);
               Запрос.УстановитьПараметр("ДатаДок" , НачалоДня(Источник.Дата));
               Запрос.УстановитьПараметр("ТипЦен"    , ТипЦенРетейл);
               Запрос.УстановитьПараметр("Товары"    , Источник.Товары);
25 Fragster
 
гуру
10.02.12
15:55
на самом деле надо формировать подписку ПослеЗаписи, ведь если отвалится транзакция - файл будет сформирован а докуметна - не будет ;)
26 milan
 
10.02.12
16:31
(25) ПослеЗаписи тоже срабатывает до завершения транзакции, так что...
27 Ткачев
 
14.02.12
13:17
Можно сократить запрос, объединения и группировки по 2-м временным таблицам ?
       Запрос = Новый Запрос("
       |ВЫБРАТЬ
       |    ТаблицаТоваров.Номенклатура
       |ПОМЕСТИТЬ СтараяТаблица
       |ИЗ
       |    &ТаблицаТоваров КАК ТаблицаТоваров
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ЦеныНоменклатуры.Номенклатура
       |ПОМЕСТИТЬ НоваяТаблица
       |ИЗ
       |    РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
       |ГДЕ
       |    ЦеныНоменклатуры.Регистратор = &Регистратор
       |    И ЦеныНоменклатуры.ТипЦен = &ТипЦен
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    НоваяТаблица.Номенклатура
       |ПОМЕСТИТЬ ОбщаяТаблица
       |ИЗ
       |    НоваяТаблица КАК НоваяТаблица
       |
       |ОБЪЕДИНИТЬ ВСЕ
       |
       |ВЫБРАТЬ
       |    СтараяТаблица.Номенклатура
       |ИЗ
       |    СтараяТаблица КАК СтараяТаблица
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ОбщаяТаблица.Номенклатура
       |ПОМЕСТИТЬ ТаблицаДляЦен
       |ИЗ
       |    ОбщаяТаблица КАК ОбщаяТаблица
       |
       |СГРУППИРОВАТЬ ПО
       |    ОбщаяТаблица.Номенклатура
       |;
       |
       |////////////////////////////////////////////////////////////////////////////////
       |ВЫБРАТЬ
       |    ТаблицаДляЦен.Номенклатура.Код КАК Код,
       |    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, ""0"") КАК Цена
       |ИЗ
       |    ТаблицаДляЦен КАК ТаблицаДляЦен
       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
       |                &Дата,
       |                ТипЦен = &ТипЦен
       |                    И Номенклатура В
       |                        (ВЫБРАТЬ
       |                            ТаблицаДляЦен.Номенклатура
       |                        ИЗ
       |                            ТаблицаДляЦен)) КАК ЦеныНоменклатурыСрезПоследних
       |        ПО ТаблицаДляЦен.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура");
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший