Доброго времени суток. Платформа 8.3.4.465, Конфигурация "Управление торговлей для Украины", (2.3.20.1)
При проведении документа "Реализация товаров и услуг" хочу воспользоваться уже готовыми данными из регистра "Продажи", но
элементарный запрос не дает никаких результатов...
Движения документа по регистру "продажи" есть.
Свою процедуру (с запросом) ставлю в самом конце стандартной процедуры "ОбработкаПроведения()"
Данные по регистру "Партии товаров" получить удается, а "Продажи" - нет.
В чем может быть причина?
Рабочий код (регистр "Партии"):
"ВЫБРАТЬ
| ПартииТоваровНаСкладах.Номенклатура,
| ПартииТоваровНаСкладах.Количество,
| ПартииТоваровНаСкладах.Стоимость
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
|ГДЕ
| ПартииТоваровНаСкладах.Регистратор = &Регистратор";
"ВЫБРАТЬ
| Продажи.Номенклатура,
| Продажи.Количество,
| Продажи.Стоимость
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", Ссылка);
Например
Движения по партиям записываются из подписки.
А по продажам допустим в этот момент движения не записаны.
Хм... из любопытства в рабочей базе прогнал запрос через консоль - всё работает... Посмотрите внимательнее движения по регистру "Продажи"...
// Движения по документу
Если Не Отказ Тогда
// Подготовим таблицу скидок для проведения.
ТаблицаПоСкидкам = ПодготовитьТаблицуСкидок(ТаблицаПоТоварам, ТаблицаПоУслугам, СтруктураШапкиДокумента);
ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, ТаблицаПоТаре,
ТаблицаПоУслугам, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок);
КонецЕсли;
// мой запрос...
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| Продажи.Номенклатура,
| Продажи.Количество,
| Продажи.Стоимость
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Регистратор = &ТекДок";
Запрос.УстановитьПараметр("ТекДок", Ссылка);
тз = Запрос.Выполнить().Выгрузить();
тз.ВыбратьСтроку();
rpodgornyy, когда вы делаете запрос в консоли, то движения документа уже записаны в базу.
maxst22, на момент когда вы выполняете запрос движения в базу ещё не записаны.
Попробуйте другим путем.
НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
НаборЗаписей.Прочитать();
Для каждого Запись из НаборЗаписей Цикл
//анализируем информацию и что-то с ней делаем
КонецЦикла;
Не получается
Еще раз: вот кусок модуля процедуры "ОбработкаПроведения()"
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// ...............
// прочие стандартные действия....
// ...........
// в процедуре ДвиженияПоРегистрам(...) записываются движения в т.ч. по регистру "Продажи". Проверял даже в отладчике!
// Конфигурация ТИПОВАЯ УТ для Украины!!! Ничего в движениях документа и тем более в глобальных процедурах НЕ менялось
// Движения по документу
Если Не Отказ Тогда
// Подготовим таблицу скидок для проведения.
ТаблицаПоСкидкам = ПодготовитьТаблицуСкидок(ТаблицаПоТоварам, ТаблицаПоУслугам, СтруктураШапкиДокумента);
ДвиженияПоРегистрам(РежимПроведения, СтруктураШапкиДокумента, ТаблицаПоТоварам, ТаблицаПоСкидкам, ТаблицаПоТаре,
ТаблицаПоУслугам, ТаблицаПоВзаиморасчетам, ТаблицаПоРасчетам, Отказ, Заголовок);
КонецЕсли;
// НЕ рабочий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура,
| Продажи.Количество,
| Продажи.Стоимость
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Регистратор = &ТекДок";
Запрос.УстановитьПараметр("ТекДок", Ссылка);
тз = Запрос.Выполнить().Выгрузить();
тз.ВыбратьСтроку();
// Рабочий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПартииТоваровНаСкладах.Номенклатура,
| ПартииТоваровНаСкладах.Количество,
| ПартииТоваровНаСкладах.Стоимость
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
|ГДЕ
| ПартииТоваровНаСкладах.Регистратор = &ТекДок";
Запрос.УстановитьПараметр("ТекДок", Ссылка);
тз = Запрос.Выполнить().Выгрузить();
тз.ВыбратьСтроку();
// совет от "Rayne" (не сработало...)
НаборЗаписей = РегистрыНакопления.Продажи.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Ссылка);
НаборЗаписей.Прочитать();
Для каждого Запись из НаборЗаписей Цикл
//анализируем информацию и что-то с ней делаем
Сообщить("Тов. = "+Запись.Номенклатура+"; Стоимость = "+Запись.Стоимость);
КонецЦикла;
Обратись тогда к коллекции движений.
Для каждого Движение из Движения.Продажи Цикл
//...
//что-то делаем
КонецЦикла;
Что-то тут не клеится
Что в наборе записей в отладчике?
Что в коллекции движений Продажи в отладчике?
Продажи в этом плане проще регистра партий должны быть.
Я в шоке!!! Попробовал в УПП
Точно так же в конце процедуры "ОбработкаПроведения(...)" втавляю код
// НЕ рабочий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Продажи.Номенклатура,
| Продажи.Количество,
| Продажи.Стоимость
|ИЗ
| РегистрНакопления.Продажи КАК Продажи
|ГДЕ
| Продажи.Регистратор = &ТекДок";
Запрос.УстановитьПараметр("ТекДок", Ссылка);
тз = Запрос.Выполнить().Выгрузить();
тз.ВыбратьСтроку("рег. Продажи");
// Рабочий код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПартииТоваровНаСкладах.Номенклатура,
| ПартииТоваровНаСкладах.Количество,
| ПартииТоваровНаСкладах.Стоимость
|ИЗ
| РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
|ГДЕ
| ПартииТоваровНаСкладах.Регистратор = &ТекДок";
Запрос.УстановитьПараметр("ТекДок", Ссылка);
тз = Запрос.Выполнить().Выгрузить();
тз.ВыбратьСтроку("рег. Партии");
Видимо, разница все-таки есть... Стало интересно, проверила на УТ.
Движения.Продажи - заполнены, можно обратиться к ним.
Для каждого Движение из Движения.Продажи Цикл
//...
КонецЦикла;
Для каждого Движение из Движения.Продажи Цикл
//...
КонецЦикла;
Видимо, не записаны еще. Лучше не стоит в обработке проведения запросами обращаться к движениям по регистрам этого же документа. Надежнее взять либо набор записей или коллекцию движений.
Наверное, в разных конфигурациях в разное время вызывается процедура типа "ЗаписатьДвиженияДокументаВРегистр"...
А в чем разница, чем получить результат? Чем так принципиален запрос?
Если Не Отказ Тогда
Движения.Продажи.ВыполнитьДвижения();
КонецЕсли;
Все же интересно узнать, чем принципиально получение данных запросом
|ГДЕ
| Продажи.Регистратор = &ТекДок";
|ГДЕ
| Продажи.ДокументПродажи = &ТекДок";
maxst22, я ж спрашиваю не о безуспешных результатах, а почему данные, которые можно получить из коллекции движений, не напрягаясь, нужно получать именно запросом? Их точно так же можно обработать, как и выборку или выгрузку из запроса.
А если параметр устанавливать:
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.Ссылка);
Ну блин. Делайте запросы в подписке на событие и делайте оттуда свои проводки.
Кому интересно задача в принципе решилась следующим способом.
Создал ТЗ с типизированными полями
с помощью конструкции
Для каждого Движение из Движения.Продажи Цикл
// заполняем таблицу
КонецЦикла;
тзПартии = Движения.ПартииТоваровНаСкладах.Выгрузить();
Никаких фокусов нет, у партий один алгоритм записи регистров, у продаж другой.
Когда что-то непонятно - учитесь читать код.
Партии пишутся с помощью отдельной процедуры, которая подготавливает и записывает набор записей,
при этом он уже доступен для чтения запросами.
Продажи скорее всего пишутся именно из коллекции Движения.Продажи, т.е.
заполнятся коллекция Движения.Продажи а потом уже автоматом фиксируется в регистре при окончании транзакции проведения,
следовательно запросом получить нельзя.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua