Имя: Пароль:
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 = 'Требование-накладная сформирована НЕ по ЗАКАЗУ НА ПРОИЗВОДСТВО'"));
          КонецЕсли;


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

// А вот это работает! Ура!
2 + 2 = 3.9999999999999999999999999999999...