Имя: Пароль:
1C
Админ
Внешняя печатная форма спецификации
0 TAN1990
 
26.11.13
08:12
Добрый день!
Работаю в упп82

Сделала внешнюю печатную форму печати спецификации. Вызывается из справочника «Спецификации». Работает.

А надо, чтобы эта печатная форма вызывалась из «требовании- накладной» при условии, что эта требование-накладная сформирована на основании заказа на производство. Т.е.  в ТН на закладке «дополнительно» заполнено поле «основание». Поля с ссылкой на спецификацию в ТН нет. Оно есть только в табличной части «заказа на производство».

Подскажите, пожалуйста, с чего начать?
Можно ли просто переделать уже работающую внешнюю форму, вызываемую из справочника «спецификации»?
1 shuhard
 
26.11.13
08:13
(0)[Можно ли просто переделать]
разрешаю
2 butterbean
 
26.11.13
08:14
эээ, а если там несколько спецификаций?
3 TAN1990
 
26.11.13
08:14
(2) у нас так не бывает
4 TAN1990
 
26.11.13
08:16
(1) как? подскажите, пожалуйста
5 Diamond905
 
26.11.13
08:17
(4) Так же как для справочника
6 Любопытная
 
26.11.13
08:19
док основание получаешь и для каждой строки ТЧ выводишь печатную форму как для справочника. Вроде все просто
7 TAN1990
 
26.11.13
08:21
(6) к одному заказу на производство может быть несколько ТН. Надо, чтобы выводилось не содержимое ТН, а именно спецификация на которую ссылается "заказ на производство"
8 butterbean
 
26.11.13
08:22
(7) твоя задача просто найти спецификацию, из первой строки заказа например
9 butterbean
 
26.11.13
08:23
(8)+ типа Основание.ТвояТабЧасть[0].Спецификация
10 butterbean
 
26.11.13
08:24
(8)+ сначала конечно проверить, что основание заполнено и это именно заказ на пр-во
11 TAN1990
 
26.11.13
08:29
Это код ВПФ, который работает из справочника "спецификации". Где начать 8, 9, 10?:

Процедура ВывестиРазделСпецификации(ТабДокумент, Макет, ВыборкаСтрок, ТекстЗаголовка)
    
    Если ВыборкаСтрок.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    ДопКолонка = Константы.ДополнительнаяКолонкаПечатныхФормДокументов.Получить();
    Колонка = "";
    Если ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Артикул Тогда
        ВыводитьКоды = Истина;
        Колонка = "Артикул";
    ИначеЕсли ДопКолонка = Перечисления.ДополнительнаяКолонкаПечатныхФормДокументов.Код Тогда
        ВыводитьКоды = Истина;
        Колонка = "Код";
    Иначе
        ВыводитьКоды = Ложь;
    КонецЕсли;
    
    ОбластьМакета = Макет.ПолучитьОбласть("ШапкаЗаголовок");
    ОбластьМакета.Параметры.ТекстЗаголовка = ТекстЗаголовка;
    ТабДокумент.Вывести(ОбластьМакета);
    
    Область = Макет.ПолучитьОбласть(?(ВыводитьКоды, "ШапкаСКодом", "Шапка"));
    
    Если ВыводитьКоды Тогда
        //Область.Параметры.ИмяКолонкиКодов = Колонка;
    КонецЕсли;
    ТабДокумент.Вывести(Область);
    
    Область = Макет.ПолучитьОбласть(?(ВыводитьКоды, "СтрокаСКодом", "Строка"));

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

//Функция ПечатьСпецификации()
    Функция Печать() Экспорт

    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Спецификация";

    Макет = ПолучитьМакет("Спецификация");
    
    Запрос = Новый Запрос;
    //Запрос.УстановитьПараметр("ТекущийЭлемент", ЭтотОбъект.Ссылка);
    Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект);

    Запрос.Текст = "
    |ВЫБРАТЬ
    |    СпецификацииНоменклатуры.Код                          КАК Код,
    |    СпецификацииНоменклатуры.Наименование                 КАК Наименование,
    |    СпецификацииНоменклатуры.Ответственный.Наименование КАК ОтветственныйНаименование
    |ИЗ
    |    Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
    |ГДЕ
    |    СпецификацииНоменклатуры.Ссылка = &ТекущийЭлемент
    |";
    
    Шапка = Запрос.Выполнить().Выбрать();
    Шапка.Следующий();
    
    // Выводим шапку накладной
    ОбластьМакета = Макет.ПолучитьОбласть("Заголовок");
    ОбластьМакета.Параметры.ТекстЗаголовка = "Спецификация номенклатуры: " + Шапка.Наименование;
    ТабДокумент.Вывести(ОбластьМакета);
    
    Запрос = Новый Запрос;
    //Запрос.УстановитьПараметр("ТекущийЭлемент", ЭтотОбъект.Ссылка);
    
    Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект);

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

    
    Запрос = Новый Запрос;
    //Запрос.УстановитьПараметр("ТекущийЭлемент", ЭтотОбъект.Ссылка);
    
    Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект);

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

    
    Запрос = Новый Запрос;
    //Запрос.УстановитьПараметр("ТекущийЭлемент", ЭтотОбъект.Ссылка);
    Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект);

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

    
    // Вывести подписи
    ОбластьМакета = Макет.ПолучитьОбласть("Подписи");
    ОбластьМакета.Параметры.Заполнить(Шапка);
    ТабДокумент.Вывести(ОбластьМакета);
            
    // Зададим параметры макета.
    ТабДокумент.ОбластьПечати = ТабДокумент.Область(2,2,ТабДокумент.ВысотаТаблицы, ТабДокумент.ШиринаТаблицы);
    ТабДокумент.ПолеСверху              = 5;
    ТабДокумент.ПолеСлева               = 15;
    ТабДокумент.ПолеСнизу               = 0;
    ТабДокумент.ПолеСправа              = 0;
    ТабДокумент.РазмерКолонтитулаСверху = 0;
    ТабДокумент.РазмерКолонтитулаСнизу  = 0;
    ТабДокумент.ОриентацияСтраницы      = ОриентацияСтраницы.Портрет;
    
    Возврат ТабДокумент;

КонецФункции // ПечатьСпецификации()
12 TAN1990
 
26.11.13
08:52
справочник "спецификация" уже не будет являться текущим документом

переделать код быстро, наверное не получится
13 Thorn-deep
 
26.11.13
09:05
(1) Забыл написать "Первый нах" ....
14 TAN1990
 
26.11.13
09:14
(13) что первый?
15 Krendel
 
26.11.13
09:17
(9) Раскрою секрет, ТН не содержит спецификации ;-)
16 butterbean
 
26.11.13
09:18
(15) именно поэтому там написано Основание....
17 TAN1990
 
26.11.13
09:21
Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект);

     Запрос.Текст = "
     |ВЫБРАТЬ
     |    
     |    ТребованиеНакладная.ДокументОснование КАК ДокументОснование      
     |ИЗ
     |    Документ.ТребованиеНакладная КАК ТребованиеНакладная
     |ГДЕ
     |    ТребованиеНакладная.Ссылка = &ТекущийЭлемент
     |";

    //

что дальше с этим делать?
18 butterbean
 
26.11.13
09:22
(17) зачем это??
19 TAN1990
 
26.11.13
09:28
(18) А как по другому добраться до заказа на производство?
20 PaulBC
 
26.11.13
09:29
(17) Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект.ДокументОснование.Продукция[0].Спецификация);
Перед этим куча разных условий.
21 butterbean
 
26.11.13
09:30
(19) СсылкаНаОбъект.ДокументОснование
22 TAN1990
 
26.11.13
09:39
(20) но в ТН нет ни продукции, ни спецификации
23 TAN1990
 
26.11.13
09:40
+(22) а! Дошло!
24 Любопытная
 
26.11.13
09:40
(22) зато есть ДокументОснование. Или просто Основание. Или какой-то другой реквизит, который хранит в себе ссылку на документ Заказ в производство.
25 TAN1990
 
26.11.13
09:48
(21)

ЗаказНаПроизводство=СсылкаНаОбъект.ДокументОснование;

Заказ на производства вытащили. Как теперь через него добраться до спецификации?
26 Artful Den
 
26.11.13
09:51
(25) сделать запрос по ТЧ Продукция документа заказ на производство.
27 TAN1990
 
26.11.13
10:15
Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("ТекущийЭлемент", ЗаказНаПроизводство.Продукция[0].Спецификация);

     Запрос.Текст = "ВЫБРАТЬ
                    |    ЗаказНаПроизводство.Продукция.(
                    |        Спецификация
                    |    ) КАК Спецификация
                    |ИЗ
                    |    Документ.ЗаказНаПроизводство КАК ЗаказНаПроизводство";

Так работает. А если вместо ЗаказНаПроизводство подставляем ЗаказНаПроизводство ругается
28 TAN1990
 
26.11.13
10:20
(27) там все не правильно написала

Запрос = Новый Запрос;
    
    Запрос.УстановитьПараметр("ТекущийЭлемент", СсылкаНаОбъект.ДокументОснование.Продукция[0].Спецификация);

     Запрос.Текст = "ВЫБРАТЬ
                    |    ЗаказНаПроизводство.Продукция.(
                    |        Спецификация
                    |    ) КАК Спецификация
                    |ИЗ
                    |    Документ.ЗаказНаПроизводство КАК ЗаказНаПроизводство";

Так работает. А если вместо ЗаказНаПроизводство подставляем СсылкаНаОбъект.ДокументОснование ругается
29 TAN1990
 
26.11.13
10:33
+(28) вернее не работает, а хоть ошибок не выдает при сохранении обработки.
30 butterbean
 
26.11.13
10:43
(29) вроде бы в (23) написала, что дошло :-)

тебе нужно анализировать тип значения СсылкаНаОбъект, ну т.е. ТипЗнч(СсылкаНаОбъект)
и если он равен Тип("СправочникСсылка.Спецификации"), то будет твой код из (11), а если Тип("ДокументСсылка.ТребованиеНакладная"), то будет такой же код, просто в запросах будет параметр не СсылкаНаОбъект, а СсылкаНаОбъект.ДокументОснование.Продукция[0].Спецификация...
тебе об этом в (20) и написали
31 TAN1990
 
26.11.13
11:08
(30)
Выдает ошибку:
Не удалось сформировать внешнюю печатную форму!
Поле объекта не обнаружено (ДокументОснование)


хотя в ТН поле "основание" заполнено
32 butterbean
 
26.11.13
11:09
(31) явно забыла тип значения реквизита СсылкаНаОбъект сделать составным :-)
33 Serg_1960
 
26.11.13
11:09
(имхо) Не вижу практического смысла в (0). Имеет смысл только для очень специфичного случая заполнения документов.

Если в заказе на производство только одна строка продукции; если ТЧ с материалами заполнена по спецификации; если не используются аналоги материалов; если соблюдается соответствие "один заказ - одно требование"; если...

Короче: не вижу смысла печатать спецификацию "из-под" требования-накладной.
34 TAN1990
 
26.11.13
11:19
(30, 32) А я вообще не стала проверять ТипЗнч(СсылкаНаОбъект)

Зачем? У меня во внешней печатной форме есть реквизит "СсылкаНаОбъект" и его тип уже "ДокументСсылка.ТребованиеНакладная"

Просто до (31) тип у меня был равен "СправочникСсылка.СпецификацииНоменклатуры"

Сейчас изменила на "ДокументСсылка.ТребованиеНакладная"
и ВСЕ ЗАРАБОТАЛО! СПАСИБО ВАМ БОЛЬШОЕ!!!!
35 TAN1990
 
26.11.13
11:26
(33)
"если ТЧ с материалами заполнена по спецификации; если не используются аналоги материалов; если соблюдается соответствие " с этим согласна - это у нас все соблюдается.


"один заказ - одно требование" - а с этим не согласна.

Какая разница, сколько ТН. Хоть 150 шт. Заказ то все равно один. И печать спецификаций по нему.
36 butterbean
 
26.11.13
11:44
(34) просто теперь все это не будет работать из справочника Спецификации
37 Serg_1960
 
26.11.13
12:03
"...А надо, чтобы эта печатная форма вызывалась из «требовании- накладной»"(0)
38 TAN1990
 
26.11.13
12:30
(36) прицепила разные печатные формы с соответствующим типом реквизита СсылкаНаОбъект и к ТН, и к спецификации. Так что и там, и там работает
39 TAN1990
 
26.11.13
12:34
Да. Еще. Если поле основание пустое или не равно "Заказ на производство" ошибку выдает.
"Не удалось сформировать внешнюю печатную форму!
Поле объекта не обнаружено (Продукция)"

Проверку же надо вставить
40 TAN1990
 
26.11.13
13:04
Функция Печать() Экспорт
     Если Тип(СсылкаНаОбъект.ДокументОснование)=Тип("ДокументСсылка.ЗаказНаПроизводство") Тогда
    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Спецификация";
.........

Возврат ТабДокумент;
Иначе
        ОбщегоНазначения.Сообщение("НЕТ!!!", СтатусСообщения.Важное);

    КонецЕсли;

КонецФункции // ПечатьСпецификации()


Что то у меня это не работает
41 TAN1990
 
26.11.13
14:01
Функция Печать() Экспорт
                             
                        
                Если  ТипЗнч(СсылкаНаОбъект.ДокументОснование) = Тип("ДокументСсылка.ЗаказНаПроизводство")

    Тогда
        
               
          
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Спецификация";

    Макет = ПолучитьМакет("Спецификация");
...
...
...
Возврат ТабДокумент;
    
     Иначе
           Предупреждение(НСтр("ru = 'Требование-накладная сформирована НЕ по ЗАКАЗУ НА ПРОИЗВОДСТВО'"));
          КонецЕсли;


КонецФункции // ПечатьСпецификации()

// А вот это работает! Ура!
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.