Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вывод в одну колонку значений
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
wmatik
1С Предприятие 7.7(сетевая версия) - 7.70.027,Конф: ПУБ(7.70.010)
Необходимо в отчет в отдельную колонку вывести значения реквизитов из двух документов. Из дока "ПриходнаяНакладнаяЗапасы" значение реквизита ТМЦ, а из документа "БанковскаяВыписка" содержание.
Вот такая процедура отчета:
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы Проведенные;
    |Док = Документ.ПриходнаяНакладнаяЗапасы.ТекущийДокумент, Документ.БанковскаяВыписка.ТекущийДокумент;
    |Группировка Док;
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    //Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
  
    Табл = СоздатьОбъект("ТаблицаЗначений");  

    ФорматЧисел = "Ч020.3";

    Табл.НоваяКолонка("КодДК");
    Табл.НоваяКолонка("Закупки");
    Табл.НоваяКолонка("СуммаСНДС");
    Табл.НоваяКолонка("ДатаДок");
    Табл.НоваяКолонка("Наименование");

    Док = "";
    Пока Запрос.Группировка(1) = 1 Цикл
        Док = Запрос.Док;    
        
        Если (Док.Вид() = "БанковскаяВыписка") ИЛИ
            (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
            Док.ВыбратьСтроки();
            Сумма = 0;
            Пока Док.ПолучитьСтроку() = 1 Цикл
                Если ПустоеЗначение(Док.КодДК) = 1 Тогда
                    Продолжить;
                КонецЕсли;
                Если (ПустоеЗначение(ВыбКод) = 0)и((Лев(СокрЛП(Док.КодДК),СтрДлина(СокрЛП(ВыбКод))) <> СокрЛП(ВыбКод))или(СтрДлина(СокрЛП(ВыбКод))>СтрДлина(СокрЛП(Док.КодДК)))) Тогда
                    Продолжить;
                КонецЕсли;
                
                Табл.НоваяСтрока();
                Табл.КодДК = Док.КодДК;
                Табл.СуммаСНДС = Док.СуммаСНДС;
                Табл.ДатаДок = Док.ДатаДок;
                Табл.Наименование = Док.Содержание;
                Таб.ВывестиСекцию("Строка");
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;        

    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");  
КонецПроцедуры

Когда я добавляю в строку Табл.Наименование = Док.Содержание; выводится содержание, когда тмц, выводится тмц, а вот каким образом указать и оба реквизита. Я пробовала так:
Табл.Наименование = Док.Содержание;
Табл.Наименование = Док.ТМЦ;

Выдает ошибку
Flexy
Дык может в ТЗ надо добавить новую колонку "Содержание"?
Табл.НоваяКолонка("Содержание);

далее
Табл.Содержание = Док.Содержание;
Табл.Наименование = Док.ТМЦ;
wmatik
Тогда получится две колонки, в одной будет отражаться содержание в другой тмц, я так понимаю, а мне желательно чтобы в одной колонке было. Но все же я сделала так, но выдает ошибку не обнаружено поле агрегатного объекта. Причем есть еще одна особенность, в приходе коды ДК одни, в банковских выписках они другие, конфликт происходит из-за этого. Только вот как его нейтрализовать(
endru
Цитата
Табл.Наименование = Док.ТМЦ;


Попробуйте так

Табл.Наименование = сокрлп(Док.ТМЦ.Наименование);
wmatik
поле агрегатного объекта не обнаружено

причем когда выбираю код который есть 100% в приходе (т.е. тмц) пишет "Поле агрегатного объекта не обнаружено (Содержание)", а когда выбираю код который есть в банковской выписке (т.е. содержание) пишет "Поле агрегатного объекта не обнаружено (ТМЦ)"
endru
Значит проверяйте
(Док.Вид() = "БанковскаяВыписка")

или (Док.Вид() = "ПриходнаяНакладнаяЗапасы")

и в зависимости от этого пишите или ТМЦ или Содержание
wmatik
не совсем поняла зачем проверять, если и так понятно, что если поставить тмц, будут отбираться только с прихода,
endru
Вы в запросе проходите по двум видам документов, при этом в "БанковскаяВыписка" нет поля ТМЦ, а в "ПриходнаяНакладнаяЗапасы"
наверно нет поля содержание.
wmatik
да, все так, может я не правильно вас поняла, как мне проверить?
Цитата
Значит проверяйте
(Док.Вид() = "БанковскаяВыписка")

или (Док.Вид() = "ПриходнаяНакладнаяЗапасы")

и в зависимости от этого пишите или ТМЦ или Содержание
endru
     Если (Док.Вид() = "БанковскаяВыписка") Тогда
            Табл.Наименование = сокрлп(Док.Содержание);
     ИначЕсли  (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
            Табл.Наименование = сокрлп(Док.ТМЦ.Наименование);
     КонецЕсли;


как то так
kalyamov
У Вас в запросе сначала всегда будет документ одного вида, потом другого. Одновременно два - не получится. В БанковскойВыписке, наверное, есть в строке реквизит с основанием оплаты (или что-то подобное), в котором указана Ваша ПрихНакладнаяЗапасы. Вот через это значение надо пробовать и найти Наименование ТМЦ.
wmatik
Да в том то и дело, что в банковской выписке тмц нет и быть не может, потому что в банковской выписке указываются услуги, с тмц они не связаны. Так что получается только два отчета разные делать?
endru
Не совсем понятно что вы хотите сделать, но
отчеты делать лучше на основании данных регистров, а не на основании документов.

Цитата
банковской выписке указываются услуги


не совсем понял какие такие услуги?
wmatik
сейчас в отчет выводятся следующие поля: код, наименование кода, сумма и дата документа. Эти все реквизиты есть в этих двух документах (приходная накл и банк выписка). Мне надо еще вывести колонку в которой указывалось бы, если это приходная накладная - тмц, соответствующая коду, и если это банковская выписка - содержание, также соответствующее коду.

Цитата
не совсем понял какие такие услуги?

в реквизит содержание вручную вводятся услуги
endru
А какая перед вами стоит задача в целом.
Что нужно в отчете видеть?
kalyamov
Цитата(endru @ 16.08.11, 11:09) необходимо зарегистрироваться для просмотра ссылки
     Если (Док.Вид() = "БанковскаяВыписка") Тогда
            Табл.Наименование = сокрлп(Док.Содержание);
     ИначЕсли  (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
            Табл.Наименование = сокрлп(Док.ТМЦ.Наименование);
     КонецЕсли;


Вам же уже ответили на вопрос. Хотя с такой постановкой его трудно было понять, что Вы вообще хотите добиться.
wmatik
Цитата
А какая перед вами стоит задача в целом.
Что нужно в отчете видеть?

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

Цитата
Если (Док.Вид() = "БанковскаяВыписка") Тогда
Табл.Наименование = сокрлп(Док.Содержание);
ИначЕсли (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
Табл.Наименование = сокрлп(Док.ТМЦ.Наименование);
КонецЕсли;

Та же ошибка
endru
поставьте точку останова и в отладчике посмотрите что там за значения
kalyamov
А почему бы Вам в условие запроса не вставить ВыбКод ? Чтоб не перебирать строки и лишние проверки не писать ?

Я не уверен, но может быть такое, что он не получает документ в этом моменте Док = Запрос.Док и не выбирает строки. Может его надо будет найти. СоздатьОбъект("Документ."+Запрос.Док.Вид()) и НайтиДокумент(Запрос.Док). И уже тут перебирать строки. Но лучше в запросе описать все условия и получить по возможности конечный результат.
wmatik
выводит коды только с приходных накладных, т.е. с тмц, причем в отчете колонка пустая
kalyamov
Цитата(wmatik @ 16.08.11, 12:16) необходимо зарегистрироваться для просмотра ссылки
выводит коды только с приходных накладных, т.е. с тмц, причем в отчете колонка пустая


Можно узнать назначение этих кодов их тип и как они интегрировались в конфигурацию (как реквизит диалога или ТЧ).
igmig65
Цитата
|Док = Документ.ПриходнаяНакладнаяЗапасы.ТекущийДокумент, Документ.БанковскаяВыписка.ТекущийДокумент;

Цитата
Если (Док.Вид() = "БанковскаяВыписка") ИЛИ
(Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда

Зачем эта проверка, это раз.
Цитата
Табл.НоваяСтрока();
Табл.КодДК = Док.КодДК;
Табл.СуммаСНДС = Док.СуммаСНДС;
Табл.ДатаДок = Док.ДатаДок;
Табл.Наименование = Док.Содержание;
Таб.ВывестиСекцию("Строка");

А зачем вам таблица, если сразу выводите в отчет, - 2
Цитата
Если (Док.Вид() = "БанковскаяВыписка") Тогда
Табл.Наименование = сокрлп(Док.Содержание);
ИначЕсли (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
Табл.Наименование = сокрлп(Док.ТМЦ.Наименование);
КонецЕсли;

Та же ошибка

Конечно, а где группировка по строкам, ну или в выборке выбрать строки.
Цитата
выводит коды только с приходных накладных, т.е. с тмц, причем в отчете колонка пустая

А как это понять, выводит??? а колонка все равно пустая???? куда тада и что выводит.
Выражайтесь яснее.
А вообще, без мд на гадание кофе нехватит.
kalyamov
Цитата(igmig65 @ 16.08.11, 12:39) необходимо зарегистрироваться для просмотра ссылки
Зачем эта проверка, это раз.

А зачем вам таблица, если сразу выводите в отчет, - 2

Конечно, а где группировка по строкам, ну или в выборке выбрать строки.

А как это понять, выводит??? а колонка все равно пустая???? куда тада и что выводит.
Выражайтесь яснее.
А вообще, без мд на гадание кофе нехватит.


Наконец то хоть кто-то написал то что на языке вертится на протяжении всей темы.
wmatik
ну простите меня пожалуйста за мою тупость, не туда вводила
Цитата
Если (Док.Вид() = "БанковскаяВыписка") Тогда
Табл.Наименование = сокрлп(Док.Содержание);
ИначЕсли (Док.Вид() = "ПриходнаяНакладнаяЗапасы") Тогда
Табл.Наименование = сокрлп(Док.ТМЦ.Наименование);
КонецЕсли;

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