0

Выбрать значение табличной части документа

#1С 8.3#Документ

Нужно выбрать из всех документов “РеализацияТоваровУслуг” документы по параметрам и в них найти дату и количество определённой номенклатуры и записать в табличную часть. Запрос был составлен с помощью конструктора:

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

Дальше нужно у всех чисел в колонке “Количество” поменять знак, то есть все числа сделать отрицательными. Но при следующем коде:

 Для каждого Строка из ВыборкаРеализация Цикл
         Строка.Товары.Колонки.Количество = 0 - Строка.Товары.Колонки.Количество;
КонецЦикла;

возникает ошибка, так как Строка.Товары.Колонки.Количество имеет тип “КолонкаТаблицыЗначений”. Как получить значение, которое там содержится? Строка - “СтрокаТаблицыЗначений” Строка.Товары - “ТаблицаЗначений” Строка.Товары.Колонки - “КоллекцияКолонокТаблицыЗначений”. Сама выборка запроса - таблица значений с колонками “Дата” и “Товары”. Подскажите, пожалуйста, как получить нужное значение?

 2945 10
Добавленоgamograff618 дней назад
Последняя активность616 дней назад


Добавить комментарий

Кирилл написал:617 дней назад0

Вы делаете всё не правильно :)

Что бы в 1С что то менять, нужно получить объект. Объект получить можно по ссылке.

Я бы делал тремя итерациями:

  1. Получил список документов, где есть данная номенклатура.
  2. Перебрал список этих документов и изменял уже конкретный документ. Например, так:

    ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    
             Для каждого СтрокаТЧ из ДокументОбъект.Товары Цикл
                    Если СтрокаТЧ.Номенклатура = Объект.Номенклатура Тогда
                     СтрокаТЧ.Количество = 0 - СтрокаТЧ.Количество;
                    КонецЕсли;
            КонецЦикла;
    
            ДокументОбъект.Записать();
    

Ответить

gamograff написал:617 дней назад0

То есть сначала мы делаем запрос:

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

Получаем ТЗ с ссылками на подходящие документы, затем:

РезультатРеализация = ЗапросРеализация.Выполнить();

     ВыборкаРеализация = РезультатРеализация.Выгрузить();

     ВыборкаРеализация.Колонки.Добавить("Количество");

     Для каждого Строка из ВыборкаРеализация Цикл
         ДокументОбъект = Строка.Ссылка.ПолучитьОбъект();

         Для каждого СтрокаТЧ из ДокументОбъект.Товары Цикл
                Если СтрокаТЧ.Номенклатура = Объект.Номенклатура Тогда
                 ВыборкаРеализация.Количество = 0 - СтрокаТЧ.Количество;
                КонецЕсли;
        КонецЦикла;    
КонецЦикла;
ВыборкаРеализация.Колонки.Удалить(1);

Так верно?

Ответить

gamograff написал:617 дней назад0

Так стопорится на ДокументОбъект = Строка.Ссылка.ПолучитьОбъект(); Строка при отладке выдаёт на дате и ссылке “Неопределено”, хотя Количество находит.

Ответить

Кирилл написал:617 дней назад0

Зачем вы что то пытаетесь сделать с колонками? В ТЧ с товарами уже есть количество, добавлять эту колонку не требуется.

Запрос вы не совсем правильно делаете. Попробуйте вот так:

ВЫБРАТЬ
                               |    РеализацияТоваровУслугТовары.Дата,
                               |    РеализацияТоваровУслугТовары.Ссылка
                               |ИЗ
|    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                               |ГДЕ
                               |    РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &НачДата И &КонДата
                               |    И РеализацияТоваровУслугТовары.Ссылка.Организация = &Организация
                               |    И РеализацияТоваровУслугТовары.Номенклатура = &Номенклатура

Ответить

gamograff написал:617 дней назад0

При таком виде запроса выводится ошибка вызова метода контекста “Выполнить”. Думаю потому, что дата и ссылка относятся не к ТЧ Товары, поэтому выбрать из них эти данные нельзя. С колонками пытаюсь сделать что-то, чтобы они были в итоге приведены к виду: Дата, Количество. Остальное и не нужно. В итоге, ошибка в функции не вылетает, а вот там, где она вызывается, ошибка в вызове метода контекста. После чего программа зависает. Думаю, это из-за неправильности заполнения общей ТЗ, так как в итоге значения ширины колонок “0”. Приведу код всей функции, наверняка в ней всё не так :) Смысл функции - это найти даты и приход/расход выбранного товара и привести всё полученное в таблицу Дата, Количество, упорядочив по дате и времени документа. Причём, количество прихода оставить неизменным, а у количества расхода сменить знак, чтобы в последствии можно было следить, как изменяется остаток товара.

&НаСервере

Функция ВыбратьДокументы(Организация, ДатаНачала, ДатаКонца)

//Выбираем документы с поступлением
ЗапросПоступление = Новый Запрос;

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

 ЗапросПоступление.УстановитьПараметр("Организация", Организация);
 ЗапросПоступление.УстановитьПараметр("НачДата", ДатаНачала);
 ЗапросПоступление.УстановитьПараметр("КонДата", ДатаКонца);
 ЗапросПоступление.УстановитьПараметр("Номенклатура", Объект.Номенклатура);

 РезультатПоступление = ЗапросПоступление.Выполнить();

 ВыборкаПоступление = РезультатПоступление.Выгрузить();

 ВыборкаПоступление.Колонки.Добавить("Количество");

 Для каждого Строка из ВыборкаПоступление Цикл
     ДокументОбъект = Строка.Ссылка.ПолучитьОбъект();

     Для каждого СтрокаТЧ из ДокументОбъект.Товары Цикл
            Если СтрокаТЧ.Номенклатура = Объект.Номенклатура Тогда
                НоваяСтрока = ВыборкаПоступление.Добавить();
                НоваяСтрока.Количество = СтрокаТЧ.Количество;
            КонецЕсли;
    КонецЦикла;    
 КонецЦикла;

 ВыборкаПоступление.Колонки.Удалить(1);

 //Выбираем документы с реализацией
 ЗапросРеализация = Новый Запрос;

 ЗапросРеализация.Текст =  "ВЫБРАТЬ
                           |    РеализацияТоваровУслуг.Дата,
                           |    РеализацияТоваровУслуг.Ссылка
                           |ИЗ
                           |    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
                           |ГДЕ
                           |    РеализацияТоваровУслуг.Дата МЕЖДУ &НачДата И &КонДата
                           |    И РеализацияТоваровУслуг.Организация = &Организация
                           |    И РеализацияТоваровУслуг.Товары.Номенклатура = &Номенклатура";

  ЗапросРеализация.УстановитьПараметр("Организация", Организация);
  ЗапросРеализация.УстановитьПараметр("НачДата", ДатаНачала);
  ЗапросРеализация.УстановитьПараметр("КонДата", ДатаКонца);
  ЗапросРеализация.УстановитьПараметр("Номенклатура", Объект.Номенклатура);

  РезультатРеализация = ЗапросРеализация.Выполнить();

  ВыборкаРеализация = РезультатРеализация.Выгрузить();

  ВыборкаРеализация.Колонки.Добавить("Количество");

  Для каждого Строка из ВыборкаРеализация Цикл
     ДокументОбъект = Строка.Ссылка.ПолучитьОбъект();

     Для каждого СтрокаТЧ из ДокументОбъект.Товары Цикл
            Если СтрокаТЧ.Номенклатура = Объект.Номенклатура Тогда
             ВыборкаРеализация.Количество = 0 - СтрокаТЧ.Количество;
            КонецЕсли;
    КонецЦикла;    
  КонецЦикла;  

  ВыборкаРеализация.Колонки.Удалить(1);

  //Соединяем все документы
  ТЗ = Новый ТаблицаЗначений;

  ТЗ.Колонки.Добавить("Количество");
  ТЗ.Колонки.Добавить("Дата");

  Для каждого СтрокаТЗ Из ВыборкаПоступление Цикл 
     ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), СтрокаТЗ) 
  КонецЦикла;

  Для каждого СтрокаТЗ Из ВыборкаРеализация Цикл 
     ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), СтрокаТЗ) 
  КонецЦикла;

  ТЗ.Сортировать("Дата Возр");

  Сообщить(ТЗ.Получить(0));

  Возврат ТЗ;

КонецФункции

Ответить

gamograff написал:616 дней назад0

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

Ответить

gamograff написал:616 дней назад0

С горем пополам эта функция добита и работает отлично :)

Ответить

Кирилл написал:616 дней назад0

Только, пожалуйста, не трите свои ветки. Кому нибудь точно пригодится) Мы стараемся, отвечаем - а вы вот так их просто… Без души… )))

Ответить

gamograff написал:616 дней назад0

Разве деактивация - стирание? Прошу тогда прощения, хотелось просто закрыть.

Ответить

Кирилл написал:616 дней назад0

Ну да, вроде скрыть из вида и видят только админы :)

Спасибо за хорошие вопросы Вам)

Ответить

Добавить комментарий

Задать вопрос!

Наш канал на Youtube

Изучаете 1С? Скачайте 200 видео по 1С бесплатно:

Похожее

Как получить значение реквизита формы и передать его в запрос 1С

Задача: при открытии элемента справочника нужно получить значение поля Код этого...

Как получить кпс счета в 1С 8.3?

Делаю ВПФ для РКО мне нужно получить кпс кредита по счету 201.4(касса) , реквизи...

1С 8.2: Ошибка при вызове метода контекста (Выполнить) Ожидается выражение "ВЫБРАТЬ"

Всем привет. Помогите пожалуйста!!!!!!!!!!!!!!! Выдает ошибку. Была пропущена т...

Проблема с расчетом себестоимости в УТ 11.1.10.131

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

Построение запроса из регистра бухгалтерии

Добрый день. У элементов справочника ОсновныеСредства есть вкладка “Драгметаллы”...

Новое

Срочно! Нижний Новгород! Нужен опытный программист 1С

Крупная и развивающаяся кампания находится в поисках Программиста 1С (Финансовы...

Бюджетирование - статьи бюджета по произвольным данным

Помогите, пожалуйста! Создаю статью бюджета с произвольными данными. Загружаю с...

егаис

Добрый вечер. Прошу Вас помочь. Для получения накладных от производителя делаю з...

Концептуальная модель (инфологическая) распределенной БД

Очень нужна ваша помощь. Создала распределенную 1С БД( хоть она и не распределен...

Где находится анткетирование клиентов в УТ 11?

Подскажите где почитать про анкетирование в УТ. Нужно изучить как оно устроено....