Версия для печати темы (https://pro1c.org.ua/index.php?s=71c3c37644ad12baf42d961bf052fd09&showtopic=18298)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Данные по регистру при проведении документа

Автор: maxst22 11.06.14, 19:35

Доброго времени суток. Платформа 8.3.4.465, Конфигурация "Управление торговлей для Украины", (2.3.20.1)

При проведении документа "Реализация товаров и услуг" хочу воспользоваться уже готовыми данными из регистра "Продажи", но
элементарный запрос не дает никаких результатов...
Движения документа по регистру "продажи" есть.

Свою процедуру (с запросом) ставлю в самом конце стандартной процедуры "ОбработкаПроведения()"

Данные по регистру "Партии товаров" получить удается, а "Продажи" - нет.
В чем может быть причина?

Рабочий код (регистр "Партии"):

    "ВЫБРАТЬ
    |    ПартииТоваровНаСкладах.Номенклатура,
    |    ПартииТоваровНаСкладах.Количество,
    |    ПартииТоваровНаСкладах.Стоимость
    |ИЗ
    |    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |ГДЕ
    |    ПартииТоваровНаСкладах.Регистратор = &Регистратор";


тоже самое с регистром "Продажи" - НЕ РАБОТАЕТ icon_cuss.gif
    "ВЫБРАТЬ
    |    Продажи.Номенклатура,
    |    Продажи.Количество,
    |    Продажи.Стоимость
    |ИЗ
    |    РегистрНакопления.Продажи КАК Продажи
    |ГДЕ
    |    Продажи.Регистратор = &Регистратор";

Понятно, в конце добавляю
Запрос.УстановитьПараметр("Регистратор", Ссылка);

Автор: Ardi 11.06.14, 21:23

Например
Движения по партиям записываются из подписки.
А по продажам допустим в этот момент движения не записаны.

Автор: rpodgornyy 11.06.14, 21:35

Хм... из любопытства в рабочей базе прогнал запрос через консоль - всё работает... Посмотрите внимательнее движения по регистру "Продажи"...

Автор: maxst22 11.06.14, 22:20

Цитата(rpodgornyy @ 11.06.14, 22:35) *
Хм... из любопытства в рабочей базе прогнал запрос через консоль - всё работает... Посмотрите внимательнее движения по регистру "Продажи"...


Через консоль понятно все будет работать, и у меня работает... проблема что не работает в модуле документа при проведении
В самом конце процедуры "ОбработкаПроведения" после всех движений, пишу свой запрос к обращению к регистру "Продажи"

вот так сказать весь текст моего азпроса + кусочек типового...
    // Движения по документу
    Если Не Отказ Тогда

        // Подготовим таблицу скидок для проведения.
        ТаблицаПоСкидкам = ПодготовитьТаблицуСкидок(ТаблицаПоТоварам, ТаблицаПоУслугам, СтруктураШапкиДокумента);

        ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, ТаблицаПоТаре,
                            ТаблицаПоУслугам, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок);
    КонецЕсли;

    // мой запрос...
    Запрос = Новый Запрос;
    Запрос.Текст ="ВЫБРАТЬ
                  |    Продажи.Номенклатура,
                  |    Продажи.Количество,
                  |    Продажи.Стоимость
                  |ИЗ
                  |    РегистрНакопления.Продажи КАК Продажи
                  |ГДЕ
                  |    Продажи.Регистратор = &ТекДок";
                  
    Запрос.УстановитьПараметр("ТекДок", Ссылка);
    тз = Запрос.Выполнить().Выгрузить();
    тз.ВыбратьСтроку();


Процедура ДвиженияПоРегистрам() делает движения по регистру "Продажи" 100%

Автор: Vofka 12.06.14, 7:43

rpodgornyy, когда вы делаете запрос в консоли, то движения документа уже записаны в базу.

maxst22, на момент когда вы выполняете запрос движения в базу ещё не записаны.

Автор: Rayne 12.06.14, 7:45

Попробуйте другим путем.

НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
НаборЗаписей.Прочитать();

Для каждого Запись из НаборЗаписей Цикл
    //анализируем информацию и что-то с ней делаем
КонецЦикла;


Или набор записей в таблицу значений выгрузить.

Также можно обратиться к коллекции движений документа: Движения.Продажи (дальше перебрать, выгрузить или что там еще).

Странно, что партии по вашему запросу доступны. У меня несколько раз возникала необходимость получать движения по партиям в обработке проведения - запросом не удалось (УТП, УПП).


И да - консолью проверять бесполезно, присоединяюсь, момент уже не тот... smile.gif

Автор: maxst22 12.06.14, 12:04

Не получается sad.gif
Еще раз: вот кусок модуля процедуры "ОбработкаПроведения()"

 Процедура ОбработкаПроведения(Отказ, РежимПроведения)
         //                 ...............
        // прочие стандартные действия....
       //        ...........


    // в процедуре ДвиженияПоРегистрам(...) записываются движения в т.ч. по регистру "Продажи". Проверял даже в отладчике!
    // Конфигурация ТИПОВАЯ УТ для Украины!!! Ничего в движениях документа и тем более в глобальных процедурах НЕ менялось

    // Движения по документу
    Если Не Отказ Тогда

        // Подготовим таблицу скидок для проведения.
        ТаблицаПоСкидкам = ПодготовитьТаблицуСкидок(ТаблицаПоТоварам, ТаблицаПоУслугам, СтруктураШапкиДокумента);

        ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, ТаблицаПоТаре,
                            ТаблицаПоУслугам, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок);
                            
    КонецЕсли;
    
    // НЕ рабочий код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Продажи.Номенклатура,
    |    Продажи.Количество,
    |    Продажи.Стоимость
    |ИЗ
    |    РегистрНакопления.Продажи КАК Продажи
    |ГДЕ
    |    Продажи.Регистратор = &ТекДок";
    
    Запрос.УстановитьПараметр("ТекДок", Ссылка);
    тз = Запрос.Выполнить().Выгрузить();
    тз.ВыбратьСтроку();
    
    // Рабочий код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровНаСкладах.Номенклатура,
    |    ПартииТоваровНаСкладах.Количество,
    |    ПартииТоваровНаСкладах.Стоимость
    |ИЗ
    |    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |ГДЕ
    |    ПартииТоваровНаСкладах.Регистратор = &ТекДок";
    
    Запрос.УстановитьПараметр("ТекДок", Ссылка);
    тз = Запрос.Выполнить().Выгрузить();
    тз.ВыбратьСтроку();
    
    // совет от "Rayne"  (не сработало...)
    НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
    НаборЗаписей.Прочитать();
    
    Для каждого Запись из НаборЗаписей Цикл
        //анализируем информацию и что-то с ней делаем
        Сообщить("Тов. = "+Запись.Номенклатура+"; Стоимость = "+Запись.Стоимость);
    КонецЦикла;


Попробуйте кто-нибудь в типовой УТ такое сделать...
Может прикол в том, что "Продажи" - это регистр оборотов?

Почему хочу именно запросом, потому что на самом деле мне нужно вычислить довольно много всяких данных на основе уже сформированных движений по регистрам этого документа
там будет и "партии" и др. данные. Дальше мне надо будет записать полученные данные в собственный регистр...
Вот получается "споткнулся" в самом начале, на самом элементарном smile.gif.

Автор: Rayne 12.06.14, 12:21

Обратись тогда к коллекции движений.

Для каждого Движение из Движения.Продажи Цикл
         //...
         //что-то делаем
КонецЦикла;


УТ ставить не буду ради "попробовать" smile.gif В УПП отладчиком коллекция движений видна.


Цитата
Не получается sad.gif


Ээ... А у меня получается. Ради интереса не поленилась написать кусок и проверить отладчиком, что у меня в наборе записей. Конфа УПП, серверный вариант. Не думаю, что по части регистра Продажи есть совсем уж кардинальные различия... Я через набор записей обращалась к регистру Партии в УТ. В обработке проведения.

А что у вас в наборе записей? Он пустой?

Автор: maxst22 12.06.14, 12:29

Цитата(Rayne @ 12.06.14, 13:21) *
обращалась к регистру Партии в УТ


так партии у меня тоже срабатывают. Не могу получить по "Продажи"

Автор: Rayne 12.06.14, 12:34

Что-то тут не клеится smile.gif

Что в наборе записей в отладчике?
Что в коллекции движений Продажи в отладчике?

Продажи в этом плане проще регистра партий должны быть.

Автор: maxst22 12.06.14, 12:41

Я в шоке!!! Попробовал в УПП
Точно так же в конце процедуры "ОбработкаПроведения(...)" втавляю код

    // НЕ рабочий код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    Продажи.Номенклатура,
    |    Продажи.Количество,
    |    Продажи.Стоимость
    |ИЗ
    |    РегистрНакопления.Продажи КАК Продажи
    |ГДЕ
    |    Продажи.Регистратор = &ТекДок";
    
    Запрос.УстановитьПараметр("ТекДок", Ссылка);
    тз = Запрос.Выполнить().Выгрузить();
    тз.ВыбратьСтроку("рег. Продажи");
    
    // Рабочий код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПартииТоваровНаСкладах.Номенклатура,
    |    ПартииТоваровНаСкладах.Количество,
    |    ПартииТоваровНаСкладах.Стоимость
    |ИЗ
    |    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |ГДЕ
    |    ПартииТоваровНаСкладах.Регистратор = &ТекДок";
    
    Запрос.УстановитьПараметр("ТекДок", Ссылка);
    тз = Запрос.Выполнить().Выгрузить();
    тз.ВыбратьСтроку("рег. Партии");


Все РАБОТАЕТ!!! ПОЧЕМУ??? Где волшебство?

Автор: Rayne 12.06.14, 12:48

Видимо, разница все-таки есть... Стало интересно, проверила на УТ.

Движения.Продажи - заполнены, можно обратиться к ним.

Для каждого Движение из Движения.Продажи Цикл
   //...
КонецЦикла;

Автор: maxst22 12.06.14, 12:55

Цитата(Rayne @ 12.06.14, 13:48) *
Видимо, разница все-таки есть... Стало интересно, проверила на УТ.

Движения.Продажи - заполнены, можно обратиться к ним.

Для каждого Движение из Движения.Продажи Цикл
   //...
КонецЦикла;



Блин, ПОЛУЧАЕТСЯ!!!
а чего же тогда запрос не работает?

Буду дальше "долбать". ОЧЕНЬ нужно все это дело запросом вытаскивать... (ранее объяснял почему)

Автор: Rayne 12.06.14, 12:56

Видимо, не записаны еще. Лучше не стоит в обработке проведения запросами обращаться к движениям по регистрам этого же документа. Надежнее взять либо набор записей или коллекцию движений.

Наверное, в разных конфигурациях в разное время вызывается процедура типа "ЗаписатьДвиженияДокументаВРегистр"...

А в чем разница, чем получить результат? Чем так принципиален запрос?

Автор: maxst22 12.06.14, 13:05

Цитата(Rayne @ 12.06.14, 13:56) *
Видимо, не записаны еще. Лучше не стоит в обработке проведения запросами обращаться к движениям по регистрам этого же документа. Надежнее взять либо набор записей или коллекцию движений.

Наверное, в разных конфигурациях в разное время вызывается процедура типа "ЗаписатьДвиженияДокументаВРегистр"...

А в чем разница, чем получить результат? Чем так принципиален запрос?


Так запрос пишу в самом конце процедуры. Уже все должно быть записано.
Где тогда (в какой момент времени) 1С записывает движения в регистр?
В процедуре ДвиженияПоРегистрам(...) вызывается процедура ДвиженияПоРегистрамУпр(...)
и вот в ней уже идет запись в "Продажи":
            Если Не Отказ Тогда
                Движения.Продажи.ВыполнитьДвижения();
            КонецЕсли;


И уже после всего этого я пытаюсь получить данные из "Продажи"

Ладно... тема пока открыта. Напишу, если получится через запрос решить ситуацию.

Большое спасибо "Rayne" за совет.

Автор: Rayne 12.06.14, 13:11

Все же интересно узнать, чем принципиально получение данных запросом smile.gif

Автор: maxst22 12.06.14, 13:19

Цитата(Rayne @ 12.06.14, 14:11) http://pro1c.org.ua/index.php?act=findpost&pid=87690
Единственное, что я заметил, так это то, что в запросе я указывал условие
    |ГДЕ
    |    Продажи.ДокументПродажи = &ТекДок";


Сори, первоначально было
    |ГДЕ
    |    Продажи.Регистратор = &ТекДок";


Переделал на
    |ГДЕ
    |    Продажи.ДокументПродажи = &ТекДок";

Автор: Rayne 12.06.14, 13:22

maxst22, я ж спрашиваю не о безуспешных результатах, а почему данные, которые можно получить из коллекции движений, не напрягаясь, нужно получать именно запросом? Их точно так же можно обработать, как и выборку или выгрузку из запроса.


Автор: maxst22 12.06.14, 16:14

Цитата(Rayne @ 12.06.14, 14:22) *
maxst22, я ж спрашиваю не о безуспешных результатах, а почему данные, которые можно получить из коллекции движений, не напрягаясь, нужно получать именно запросом? Их точно так же можно обработать, как и выборку или выгрузку из запроса.

Почему хочу именно запросом, потому что на самом деле мне нужно вычислить довольно много всяких данных на основе уже сформированных движений по регистрам этого документа
там будет и "партии" и др. данные. Дальше мне надо будет записать полученные данные в собственный регистр...

Автор: rpodgornyy 12.06.14, 20:17

А если параметр устанавливать:

Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);


Как вариант попробовать вынести запрос в отдельную процедуру или прописать в конце процедуры "ДвиженияПоРегистрам"...

Автор: maxst22 12.06.14, 23:03

Цитата(rpodgornyy @ 12.06.14, 21:17) *
А если параметр устанавливать:

Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);


Как вариант попробовать вынести запрос в отдельную процедуру или прописать в конце процедуры "ДвиженияПоРегистрам"...


именно так и сделал. Не помогает sad.gif

Автор: Ardi 12.06.14, 23:10

Ну блин. Делайте запросы в подписке на событие и делайте оттуда свои проводки.

Автор: maxst22 13.06.14, 11:23

Кому интересно задача в принципе решилась следующим способом.
Создал ТЗ с типизированными полями
с помощью конструкции

    Для каждого Движение из Движения.Продажи Цикл
// заполняем таблицу
    КонецЦикла;

заполнил таблицу
Дальше запрос по внешней таблице

------------------------------------------------------
Ранее я писал что по партиям запрос получается.
Но заметил такую штуку, если попытаться выгрузить движения по партиям в таблицу, то таблица будет пустой!!!
тзПартии = Движения.ПартииТоваровНаСкладах.Выгрузить();

а запросом получается...
Вот такие фокусы.
Принцип получения данных я так и не понял. Получается нужно пробовать.
По одним регистрам нужно делать запрос, по другим выгрузку движений в таблицу значений.
Может кто сталкивался и знает какую-то закономерность, поделитесь.
Пока все... вопрос относительно решен.

Автор: Batchir 16.06.14, 11:59

Никаких фокусов нет, у партий один алгоритм записи регистров, у продаж другой.
Когда что-то непонятно - учитесь читать код.

Партии пишутся с помощью отдельной процедуры, которая подготавливает и записывает набор записей,
при этом он уже доступен для чтения запросами.
Продажи скорее всего пишутся именно из коллекции Движения.Продажи, т.е.
заполнятся коллекция Движения.Продажи а потом уже автоматом фиксируется в регистре при окончании транзакции проведения,
следовательно запросом получить нельзя.

Автор: maxst22 16.06.14, 22:52

Цитата(Batchir @ 16.06.14, 12:59) *
Никаких фокусов нет, у партий один алгоритм записи регистров, у продаж другой.
Когда что-то непонятно - учитесь читать код.

Партии пишутся с помощью отдельной процедуры, которая подготавливает и записывает набор записей,
при этом он уже доступен для чтения запросами.
Продажи скорее всего пишутся именно из коллекции Движения.Продажи, т.е.
заполнятся коллекция Движения.Продажи а потом уже автоматом фиксируется в регистре при окончании транзакции проведения,
следовательно запросом получить нельзя.

Отловить бы это на простом примере... или увидеть в каких конкретно строках все это происходит...
Ладно, я понял. Буду изучать. Спасибо.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua