0

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

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

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

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

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

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

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

 1856 10
Добавленоgamograff445 дней назад
Последняя активность443 дня назад


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

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

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

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

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

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

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

Ответить

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

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

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

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

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

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

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

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

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

Так верно?

Ответить

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

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

Ответить

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

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

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

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

Ответить

gamograff написал:444 дня назад0

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

&НаСервере

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  Возврат ТЗ;

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

Ответить

gamograff написал:444 дня назад0

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

Ответить

gamograff написал:444 дня назад0

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

Ответить

Кирилл написал:444 дня назад0

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

Ответить

gamograff написал:443 дня назад0

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

Ответить

Кирилл написал:443 дня назад0

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

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

Ответить

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

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

Наш канал на Youtube

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

Похожее

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

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

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

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

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

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

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

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

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

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

Новое

1С: Бухгалтерию 8.2 дёшево

Программа 1С: Бухгалетрия 8.2 По поводу приобретения программы обращайтесь на по...

Курсы

Добрый день! Осталось 2 ключа для активации курса “Профессиональный учёт в 1С:З...

"Наряд на хозтранспорт и спецтехнику" Путевые листы

Здравствуйте, Форумчане, прошу вашего совета. В организации такая ситуация: ест...

Создание обработки

Помогите с задачей. Суть такова - нужно создать внешнею обработку которая будет ...

Заполнение раздела 3 Расчет налоговой базы Книги доходов и расходов

Добрый день! Меня зовут Наталья. Про заполнение Кудир в КА очень все хорошо пишу...