Имя: Пароль:
1C
1С v8
Внешняя печатная форма.
0 FREEZZEE
 
18.11.13
16:04
Добрый день, товарищи программисты!
Создаю внешнюю печатную форму для УТ 10.3.
Делал на основе типовой. В Макете требовалось отразить сравнении цены продажи и цены закупки.
Цену продажи брал из реализации, а цену закупки, из регистра накопления "ПартииТоваровНаСкладах", т.к. цену поступления в номенклатуре никто не задавал. Зарегистрировал внешнюю печатную форму в документе "Реализация товаров и услуг". Но заполняет не все колонки. Проверяю по документам, данные поля есть, но при вызове которых выдается ошибка об их отсутствии (в самом предприятии). Плюсом добавилась беда с циклом, который применил я неправильно. Каждая позиция дублируется по несколько раз.
Братья, форумчане, дайте пинка просветления, наставьте на путь истинный!
1 FREEZZEE
 
18.11.13
16:05
// Функция формирует табличный документ с печатной формой накладной,
// разработанной методистами
//
// Возвращаемое значение:
//  Табличный документ - печатная форма накладной
//
Функция Печать()  Экспорт
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.СсылкаНаОбъект);
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РеализацияТоваровУслугТовары.Ссылка,
    |    РеализацияТоваровУслугТовары.Номенклатура,
    |    РеализацияТоваровУслугТовары.СерияНоменклатуры,
    |    РеализацияТоваровУслугТовары.Цена,
    |    ВЫБОР
    |        КОГДА ПартииТоваровНаСкладах.Количество = 0
    |            ТОГДА 0
    |        ИНАЧЕ ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество
    |    КОНЕЦ КАК ЦенаПоступления,
    |    ПартииТоваровНаСкладах.Регистратор КАК ПриходныйДокумент
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |        ПО РеализацияТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
    |            И РеализацияТоваровУслугТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
    |ГДЕ
    |    РеализацияТоваровУслугТовары.Ссылка = &ТекущийДокумент
    |    И ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    |    И (ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
    |            ИЛИ ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ОприходованиеТоваров)";

    ЗапросТовары = Запрос.Выполнить().Выгрузить();
        
    ТабДокумент = Новый ТабличныйДокумент;
    
    
    Макет = ПолучитьМакет("СравнениеЦенЗакупкаПродажа");

    // Выводим шапку накладной

    ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
    ОбластьМакета.Параметры.ТекстЗаголовка = "Сравнение цен закупка\продажа";
    ТабДокумент.Вывести(ОбластьМакета);

    

    ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ТабДокумент.Вывести(ОбластьШапка);
        
    
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
        //НомерСтроки = 0;
        ДЛЯ КАЖДОГО СтрокаТовара ИЗ ЗапросТовары ЦИКЛ
            Выборка = Запрос.Выполнить().Выбрать();
            СчСтрок = 1;
            Пока Выборка.Следующий() Цикл
            ОбластьСтрока.Параметры.НомерСтроки = СчСтрок;    
            ЗаполнитьЗначенияСвойств(ОбластьСтрока,Выборка);
            ОбластьСтрока.Параметры.Артикул = СтрокаТовара.Номенклатура.Артикул;  
            ОбластьСтрока.Параметры.Товар = СтрокаТовара.Номенклатура.Наименование;
            ОбластьСтрока.Параметры.Серия = СтрокаТовара.СерияНоменклатуры.Наименование;
            //ОбластьСтрока.Параметры.Количество = СтрокаТовара.СтрокаТовар.Количество;
            //ОбластьСтрока.Параметры.Цена = СтрокаТовара.Номенклатура.Цена;
            ОбластьСтрока.Параметры.ЦенаПоступления = СтрокаТовара.ЦенаПоступления;
            //ОбластьСтрока.Параметры.Сумма = ВыборкаСтрокТовары.Сумма;
            //ОбластьСтрока.Параметры.СуммаПродажи = СтрокаТовара.РеализацияТоваровУслугТовары.СуммаПродажи;
    
            
            СчСтрок = СчСтрок+1;          
                  
            ТабДокумент.Вывести(ОбластьСтрока);

        КонецЦикла;
        
                

    КонецЦикла;
    
    ////////
        
                   
    

    
    
    Возврат ТабДокумент;

КонецФункции Печать()   ;
2 Wobland
 
18.11.13
16:11
медитируй над полным текстом ошибки. и да пребудет с тобой сила
3 Шапокляк
 
18.11.13
16:11
А что вы хотели, если поступлений может быть несколько? Может, лучше движения по партиям именно этого документа анализировать?
4 Wobland
 
18.11.13
16:14
ДЛЯ КАЖДОГО СтрокаТовара ИЗ ЗапросТовары ЦИКЛ
вот это выплюнуть

получение данных из документа на экзамене автоматически приводит к провалу
5 Wobland
 
18.11.13
16:17
(4) ВПФ же, сторно
6 FREEZZEE
 
18.11.13
16:34
Wobland, не подскажете, как получить из регистра накопления?
7 Wobland
 
18.11.13
16:38
(6) сторно же ;) запрос возвращает желаемое?
8 FREEZZEE
 
18.11.13
17:00
по 4м пунктам да, но не в таком виде, как хотелось бы.
9 Wobland
 
18.11.13
17:07
то есть, нет. бери консоль и насилуй запрос, пока он не станет выдавать нужное
10 FREEZZEE
 
18.11.13
17:11
в самом цикле не устраивает то, что каждая позиция дублируется, но это пол беды. Проблема возникает с выбором нужных данных не из самого документа, а из регистра.
11 Wobland
 
18.11.13
17:12
во-первых, соединение надо левое. во-вторых, соединять нужно по всем измерениям
12 FREEZZEE
 
18.11.13
18:27
со сторонней помощью, исправил в такой вид. Но теперь Предприятие отказывается регистрировать ВПФ. "Выбранный файл не является внешней обработкой. Либо, данная обработка не предназначена для запуска в этой конфигурации".
   Wobland, подскажите, что я сделал не так?

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

Выборка = Запрос.Выполнить().Выбрать();

ТабДокумент = Новый ТабличныйДокумент;


Макет = ПолучитьМакет("СравнениеЦенЗакупкаПродажа");

// Выводим шапку накладной

ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
ОбластьМакета.Параметры.ТекстЗаголовка = "Сравнение цен закупка\продажа";
ТабДокумент.Вывести(ОбластьМакета);



ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");
ТабДокумент.Вывести(ОбластьШапка);


ОбластьСтрока = Макет.ПолучитьОбласть("Строка");


Пока Выборка.Следующий() Цикл

ЗаполнитьЗначенияСвойств(ОбластьСтрока,Выборка);
ТабДокумент.Вывести(ОбластьСтрока);

КонецЦикла;

Возврат ТабДокумент;

КонецФункции Печать()   ;
13 Wobland
 
18.11.13
18:29
не в той платформе редактировал?
14 FREEZZEE
 
18.11.13
23:02
я свой листинг скинул другу, он ее подредактировал. Но выходит, что платформы разные. Но что странно, если бы он в 8.1 делал, то оно переконвертировалась бы, а тут я теряюсь в догадках.
15 FREEZZEE
 
18.11.13
23:10
>>получение данных из документа на экзамене автоматически приводит к провалу
-------------------
хотелось бы проконсультироваться и по этому поводу. А разве при создании обыкновенной ВПФ, не всё ли равно откуда мы берем данные? мы же не создаем новый документ ил что то подобное, обращаясь к документам, а не к регистрам? Тогда да, систему бы это подгружало. Или я не прав?
16 FREEZZEE
 
18.11.13
23:19
в последнем листинге по факту, что то я переначудил! Удалось таки её подключить, но результат неутешительный.
17 Wobland
 
19.11.13
06:11
(16) каких-то товаров нет, какие-то двоятся?
18 anaed
 
19.11.13
07:20
(16)
1) В РН Партии товаров ДокументОприходования заполняется?
2) замени внутренее соединение по номенклатуре и серии на левое соединения по регистратор=ссылка, номенклатуре и серии, и убери все условия кроме ссылка=&текущийдокумент
19 FREEZZEE
 
19.11.13
07:39
по второму коду, таблица вообще не заполняется. Сейчас бью я старый код, который выкладывал. Просто для меня сейчас главное, что бы работало, а вот каааак это будет работать, быстро или медленно, это уже второй вопрос. Не могу понять, откуда взять количество товара и сумму? ну сумму, я так понимаю умножением посчитали и всё? а кол-во? с регистра оприходованных товаров?
// Функция формирует табличный документ с печатной формой накладной,

// разработанной методистами

//

// Возвращаемое значение:

//  Табличный документ - печатная форма накладной

//

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

    ЗапросТовары = Запрос.Выполнить().Выгрузить();
        
    ТабДокумент = Новый ТабличныйДокумент;
    
    
    Макет = ПолучитьМакет("СравнениеЦенЗакупкаПродажа");

    // Выводим шапку накладной


    ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
    ОбластьМакета.Параметры.ТекстЗаголовка = "Сравнение цен закупка\продажа";
    ТабДокумент.Вывести(ОбластьМакета);

    

    ОбластьШапка = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ТабДокумент.Вывести(ОбластьШапка);
        
    
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
        СчСтрок = 0;
        ДЛЯ КАЖДОГО СтрокаТовара ИЗ ЗапросТовары ЦИКЛ
            СчСтрок = СчСтрок+1;
            ОбластьСтрока.Параметры.НомерСтроки = СчСтрок;    
            ОбластьСтрока.Параметры.Артикул = СтрокаТовара.Номенклатура.Артикул;  
            ОбластьСтрока.Параметры.Товар = СтрокаТовара.Номенклатура.Наименование;
            ОбластьСтрока.Параметры.Серия = СтрокаТовара.СерияНоменклатуры.Наименование;
            //ОбластьСтрока.Параметры.Количество = СсылкаНаОбъект.Количество;
            ОбластьСтрока.Параметры.Цена = СтрокаТовара.Цена;
            ОбластьСтрока.Параметры.ЦенаПоступления = СтрокаТовара.ЦенаПоступления;
            //ОбластьСтрока.Параметры.Сумма = СтрокаТовара.Сумма;
            //ОбластьСтрока.Параметры.СуммаПродажи = СтрокаТовара.СуммаПродажи;
            
                      
            
            ТабДокумент.Вывести(ОбластьСтрока);
            
                        
            
            
        КонецЦикла;
  
    Возврат ТабДокумент;

КонецФункции Печать()   ;
20 FREEZZEE
 
19.11.13
07:43
anaed, заполняется РН Товары на складах, в нем документы реализации. Но вызов этого документа, ничего не дает.
21 Godofsin
 
19.11.13
07:44
(19) Не пойму, зачем тебе таблица ТЧ документа? Делай выборку из регистра партий, там вся информация есть.
22 Wobland
 
19.11.13
07:45
(21) печатная форма у него
23 Godofsin
 
19.11.13
07:46
(22) ага, вчитался уже )
24 FREEZZEE
 
19.11.13
07:47
>>печатная форма у него
сарказм?) Научите, как правильно быть то

>>Делай выборку из регистра партий
как к нему обратиться?
25 anaed
 
19.11.13
07:48
(20) РН Товары на складах и РН Партии товаров на складах несколько разные вещи.
26 Godofsin
 
19.11.13
07:51
|ИЗ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
27 anaed
 
19.11.13
07:54
(24) Для определения возможности решить твою задачу правильно нужен ответ какой метод списания партий используется в программе? Если не понимаешь что это, ответь на вопрос в (18) - документоприходования в РН ПартииТоваровНаСкладах  заполнен?
28 FREEZZEE
 
19.11.13
09:29
Списание по ФИФО. Сначала списываются собственные, далее принятые. Более, никакие пункты не отражены.
29 FREEZZEE
 
19.11.13
09:31
Документ оприходования заполнен.
30 anaed
 
19.11.13
09:31
(28)ндс в партиях есть?
31 FREEZZEE
 
19.11.13
09:45
(30) Товар поступает без НДС, при продаже НДС учитывается.
32 FREEZZEE
 
19.11.13
09:52
написал запрос в таком виде, но значение он берет общее по складу, а нужно при реализации.
Запрос.Текст =
    "ВЫБРАТЬ
    |    РеализацияТоваровУслугТовары.Ссылка,
    |    РеализацияТоваровУслугТовары.Номенклатура,
    |    РеализацияТоваровУслугТовары.СерияНоменклатуры,
    |    РеализацияТоваровУслугТовары.Цена,
    |    ВЫБОР
    |        КОГДА ПартииТоваровНаСкладах.Количество = 0
    |            ТОГДА 0
    |        ИНАЧЕ ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество
    |    КОНЕЦ КАК ЦенаПоступления,
    |    ПартииТоваровНаСкладах.Регистратор КАК ПриходныйДокумент,
    |    ПартииТоваровНаСкладах.Количество
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |        ПО РеализацияТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
    |            И РеализацияТоваровУслугТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
    |ГДЕ
    |    РеализацияТоваровУслугТовары.Ссылка = &ТекущийДокумент
    |    И ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    |    И (ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
    |            ИЛИ ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ОприходованиеТоваров)";
33 FREEZZEE
 
19.11.13
09:56
вот, исправил, всё работает, осталось теперь только сумму рассчитать:
Функция Печать()  Экспорт
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТекущийДокумент", ЭтотОбъект.СсылкаНаОбъект);
    Запрос.Текст =
    "ВЫБРАТЬ
    |    РеализацияТоваровУслугТовары.Ссылка,
    |    РеализацияТоваровУслугТовары.Номенклатура,
    |    РеализацияТоваровУслугТовары.СерияНоменклатуры,
    |    РеализацияТоваровУслугТовары.Цена,
    |    ВЫБОР
    |        КОГДА ПартииТоваровНаСкладах.Количество = 0
    |            ТОГДА 0
    |        ИНАЧЕ ПартииТоваровНаСкладах.Стоимость / ПартииТоваровНаСкладах.Количество
    |    КОНЕЦ КАК ЦенаПоступления,
    |    ПартииТоваровНаСкладах.Регистратор КАК ПриходныйДокумент,
    |    РеализацияТоваровУслугТовары.Количество
    |ИЗ
    |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
    |        ПО РеализацияТоваровУслугТовары.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
    |            И РеализацияТоваровУслугТовары.СерияНоменклатуры = ПартииТоваровНаСкладах.СерияНоменклатуры
    |ГДЕ
    |    РеализацияТоваровУслугТовары.Ссылка = &ТекущийДокумент
    |    И ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    |    И (ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
    |            ИЛИ ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ОприходованиеТоваров)";
34 Wobland
 
19.11.13
10:04
левое, говорят тебе
35 anaed
 
19.11.13
10:17
(33) а если  проданный товар куплен по авансовому отчету ему в печатную форму путь закрыт?
36 FREEZZEE
 
19.11.13
11:06
(34)   Wobland, почитал, понял, исправил.
(35)   anaed, я не понимаю вас. Я ВПФ прикрутил только к документу РТиУ. В авансов отчете отражены у нас только внутренние расходы и выдачи подотчетному лицу, продаж товара там клиенту нет. Опишите суть возможной проблемы подробнее, пожалуйста.
37 anaed
 
19.11.13
12:02
(36) если в документе РТиУ будет товар который оприходован только документом АвансовыйОтчет, либо любым другим по которому товар может оприходоваться то условие     |    И (ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
    |            ИЛИ ПартииТоваровНаСкладах.Регистратор ССЫЛКА Документ.ОприходованиеТоваров)";

отсекет его, то есть в результат запроса эта номенклатура не попадет.

1) Условий кроме РТиУ.Ссылка = &ТекущийДокумент быть не должно.
2) Соединяться по Партии.Регистратор = РТиУ.Ссылка, и далее по номенклатура, характеристика, серия. Документом прихода будет Партии.ДокументОприходования, а не регистратор.
3) На тот случай если продается товар нескольких партий сумму продаж нужно считать через ртиу.товары.цена*партии.количество, а суммойзакупа в таком случае будет партии.стоимость, цена закупа соответсвенно партии.стоимость/партии.количество.
38 FREEZZEE
 
19.11.13
12:38
(37) Понял, доходчиво объяснили. Спасибо большое!