Имя: Пароль:
1C
1С v8
Печатная форма
0 Gomodrila
 
04.04.13
10:12
Создайте внешнюю печатную форму документа "Заказ клиента" на основе
существующей. В новой форме необходимо выделять курсивом те товары, которых нет в
свободном остатке в нужном количестве на момент времени счета. Для получения
данных о свободном остатке используйте регистр "СвободныеОстатки".
1 salvator
 
04.04.13
10:12
(0) Понятно.
2 butterbean
 
04.04.13
10:13
создал, какие дальше будут указания??
3 Gomodrila
 
04.04.13
10:15
вобщем сделал вн.обработку, которая выводит стандартный макет.
я так понял надо отдельной процедурой сделать запрос на кол-во свободных остатноков, и при формировании формы сравнивать с запросом из заказа клиента. Проблема в том, что не могу найти где взять данные из запроса и как их интегрировать в существующий код, поставив  условие.


// Процедура заполняет табличный документ  счета, заказа.
//
Процедура ЗаполнитьТабличныйДокументСчетЗаказ(ТабличныйДокумент, Запрос, ОбъектыПечати, Тип) Экспорт
   
   ДанныеПечати = Запрос.Выполнить().Выбрать();
   
   ИспользоватьРучныеСкидки         = ПолучитьФункциональнуюОпцию("ИспользоватьРучныеСкидкиВПродажах");
   ИспользоватьАвтоматическиеСкидки = ПолучитьФункциональнуюОпцию("ИспользоватьАвтоматическиеСкидкиВПродажах");
   
   ПервыйДокумент = Истина;
   КолонкаКодов   = ФормированиеПечатныхФорм.ИмяДополнительнойКолонки();
   
   Пока ДанныеПечати.Следующий() Цикл
       
       Макет = ПолучитьМакет("ПФ_MXL_СчетЗаказ");
       
       Если Не ПервыйДокумент Тогда
           ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
       КонецЕсли;
       
       ПервыйДокумент = Ложь;
       
       НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
       
       ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаказКлиента_СчетЗаказ";
       
       ТаблицаЭтапыОплаты = ДанныеПечати.ЭтапыГрафикаОплаты.Выгрузить();
       ТаблицаЭтапыОплаты.Сортировать("НомерСтроки");
       
       ТаблицаТовары = ДанныеПечати.Товары.Выгрузить();
       ТаблицаТовары.Сортировать("НомерСтроки");
       
       ЕстьСкидки    = ФормированиеПечатныхФорм.НужноВыводитьСкидки(ТаблицаТовары, ИспользоватьРучныеСкидки Или ИспользоватьАвтоматическиеСкидки);
       ВыводитьКоды  = ЗначениеЗаполнено(КолонкаКодов);
       
       Если ЕстьСкидки И ДанныеПечати.УчитыватьНДС Тогда
           ОбластьКолонкаТовар = Макет.Область("ТоварСНДССоСкидкой");
       ИначеЕсли ЕстьСкидки Или ДанныеПечати.УчитыватьНДС Тогда
           ОбластьКолонкаТовар = Макет.Область("ТоварСНДСИлиСоСкидкой");
       Иначе
           ОбластьКолонкаТовар = Макет.Область("Товар");
       КонецЕсли;
           
       Если Не ВыводитьКоды Тогда
           
           Если ЕстьСкидки И ДанныеПечати.УчитыватьНДС Тогда
               ОбластьКолонкаТовар.ШиринаКолонки = ОбластьКолонкаТовар.ШиринаКолонки * 1.35;
           ИначеЕсли ЕстьСкидки Или ДанныеПечати.УчитыватьНДС Тогда
               ОбластьКолонкаТовар.ШиринаКолонки = ОбластьКолонкаТовар.ШиринаКолонки * 1.2;
           Иначе
               ОбластьКолонкаТовар.ШиринаКолонки = ОбластьКолонкаТовар.ШиринаКолонки * 1.14;
           КонецЕсли;
           
       КонецЕсли;
       
       Если ЕстьСкидки И ДанныеПечати.УчитыватьНДС Тогда
           
           ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицыСНДССоСкидкой|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ШапкаТаблицыСНДССоСкидкой|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ШапкаТаблицыСНДССоСкидкой|ТоварСНДССоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицыСНДССоСкидкой|ДанныеСНДССоСкидкой");
           
       ИначеЕсли ЕстьСкидки Тогда
       
           ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицыСоСкидкой|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ШапкаТаблицыСоСкидкой|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ШапкаТаблицыСоСкидкой|ТоварСНДСИлиСоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицыСоСкидкой|ДанныеСНДСИлиСоСкидкой");
           
       ИначеЕсли ДанныеПечати.УчитыватьНДС Тогда
           
           ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицыСНДС|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ШапкаТаблицыСНДС|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ШапкаТаблицыСНДС|ТоварСНДСИлиСоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицыСНДС|ДанныеСНДСИлиСоСкидкой");
           
       Иначе
           
           ОбластьНомера = Макет.ПолучитьОбласть("ШапкаТаблицы|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ШапкаТаблицы|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ШапкаТаблицы|Товар");
           ОбластьДанных = Макет.ПолучитьОбласть("ШапкаТаблицы|Данные");
           
       КонецЕсли;
           
       ЗаполнитьРеквизитыШапкиСчетЗаказ(ДанныеПечати, Макет, ТабличныйДокумент, Тип, ТаблицаЭтапыОплаты);
       
       ТабличныйДокумент.Вывести(ОбластьНомера);
       
       Если ВыводитьКоды Тогда
           
           ОбластьКодов.Параметры.ИмяКолонкиКодов = КолонкаКодов;
           ТабличныйДокумент.Присоединить(ОбластьКодов);
           
       КонецЕсли;
       
       ОбластьТовар.Параметры.Товар = НСтр("ru='Товары (работы, услуги)'");
       ТабличныйДокумент.Присоединить(ОбластьТовар);
       ТабличныйДокумент.Присоединить(ОбластьДанных);
       
       Если ЕстьСкидки И ДанныеПечати.УчитыватьНДС Тогда
           
           ОбластьНомера = Макет.ПолучитьОбласть("СтрокаТаблицыСНДССоСкидкой|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("СтрокаТаблицыСНДССоСкидкой|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("СтрокаТаблицыСНДССоСкидкой|ТоварСНДССоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("СтрокаТаблицыСНДССоСкидкой|ДанныеСНДССоСкидкой");
           
       ИначеЕсли ЕстьСкидки Тогда
       
           ОбластьНомера = Макет.ПолучитьОбласть("СтрокаТаблицыСоСкидкой|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("СтрокаТаблицыСоСкидкой|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("СтрокаТаблицыСоСкидкой|ТоварСНДСИлиСоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("СтрокаТаблицыСоСкидкой|ДанныеСНДСИлиСоСкидкой");
           
       ИначеЕсли ДанныеПечати.УчитыватьНДС Тогда
           
           ОбластьНомера = Макет.ПолучитьОбласть("СтрокаТаблицыСНДС|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("СтрокаТаблицыСНДС|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("СтрокаТаблицыСНДС|ТоварСНДСИлиСоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("СтрокаТаблицыСНДС|ДанныеСНДСИлиСоСкидкой");
           
       Иначе
           
           ОбластьНомера = Макет.ПолучитьОбласть("СтрокаТаблицы|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("СтрокаТаблицы|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("СтрокаТаблицы|Товар");
           ОбластьДанных = Макет.ПолучитьОбласть("СтрокаТаблицы|Данные");
           
       КонецЕсли;

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

           Если ВыводитьКоды Тогда
               
               ОбластьКодов.Параметры.Артикул = СтрокаТовары[КолонкаКодов];
               ТабличныйДокумент.Присоединить(ОбластьКодов);
               
           КонецЕсли;

           ОбластьТовар.Параметры.Товар = ФормированиеПечатныхФорм.ПолучитьПредставлениеНоменклатурыДляПечати(СтрокаТовары.НаименованиеПолное, СтрокаТовары.Характеристика);
           ТабличныйДокумент.Присоединить(ОбластьТовар);

           ОбластьДанных.Параметры.Заполнить(СтрокаТовары);
           ТабличныйДокумент.Присоединить(ОбластьДанных);
           
           Сумма          = Сумма          + СтрокаТовары.Сумма;
           СуммаНДС       = СуммаНДС       + СтрокаТовары.СуммаНДС;
           
           Если ЕстьСкидки Тогда
               ВсегоСкидок    = ВсегоСкидок    + СтрокаТовары.СуммаСкидки;
               ВсегоБезСкидок = ВсегоБезСкидок + СтрокаТовары.СуммаБезСкидки;
           КонецЕсли;

       КонецЦикла;
       
       Если ЕстьСкидки И ДанныеПечати.УчитыватьНДС Тогда
           
           ОбластьНомера = Макет.ПолучитьОбласть("ПодвалТаблицыСНДССоСкидкой|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ПодвалТаблицыСНДССоСкидкой|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ПодвалТаблицыСНДССоСкидкой|ТоварСНДССоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("ПодвалТаблицыСНДССоСкидкой|ДанныеСНДССоСкидкой");
           
       ИначеЕсли ЕстьСкидки Тогда
       
           ОбластьНомера = Макет.ПолучитьОбласть("ПодвалТаблицыСоСкидкой|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ПодвалТаблицыСоСкидкой|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ПодвалТаблицыСоСкидкой|ТоварСНДСИлиСоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("ПодвалТаблицыСоСкидкой|ДанныеСНДСИлиСоСкидкой");
           
       ИначеЕсли ДанныеПечати.УчитыватьНДС Тогда
           
           ОбластьНомера = Макет.ПолучитьОбласть("ПодвалТаблицыСНДС|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ПодвалТаблицыСНДС|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ПодвалТаблицыСНДС|ТоварСНДСИлиСоСкидкой");
           ОбластьДанных = Макет.ПолучитьОбласть("ПодвалТаблицыСНДС|ДанныеСНДСИлиСоСкидкой");
           
       Иначе
           
           ОбластьНомера = Макет.ПолучитьОбласть("ПодвалТаблицы|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ПодвалТаблицы|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ПодвалТаблицы|Товар");
           ОбластьДанных = Макет.ПолучитьОбласть("ПодвалТаблицы|Данные");
           
       КонецЕсли;

       ТабличныйДокумент.Вывести(ОбластьНомера);
       
       Если ВыводитьКоды Тогда
           ТабличныйДокумент.Присоединить(ОбластьКодов);
       КонецЕсли;
       
       ТабличныйДокумент.Присоединить(ОбластьТовар);
       
       Если ЕстьСкидки Тогда
           
           ОбластьДанных.Параметры.ВсегоСкидок    = ВсегоСкидок;
           ОбластьДанных.Параметры.ВсегоБезСкидок = ВсегоБезСкидок;
           
           Если ДанныеПечати.УчитыватьНДС Тогда
               ОбластьДанных.Параметры.ВсегоСуммаНДС = СуммаНДС;
           КонецЕсли;
       
       КонецЕсли;
       
       ОбластьДанных.Параметры.Всего = ФормированиеПечатныхФорм.ФорматСумм(Сумма);

       ТабличныйДокумент.Присоединить(ОбластьДанных);

       // Вывести ИтогоНДС
       
       СоответствиеСтавокНДС = ПолучитьСоответствиеСтавокНДС();
           
       Если ДанныеПечати.УчитыватьНДС Тогда
           
           ОбластьНомера = Макет.ПолучитьОбласть("ПодвалТаблицыНДС|НомерСтроки");
           ОбластьКодов  = Макет.ПолучитьОбласть("ПодвалТаблицыНДС|КолонкаКодов");
           ОбластьТовар  = Макет.ПолучитьОбласть("ПодвалТаблицыНДС|Товар");
           ОбластьДанных = Макет.ПолучитьОбласть("ПодвалТаблицыНДС|Данные");
           
           Для Каждого ТекСтавкаНДС Из СоответствиеСтавокНДС Цикл
               
               ПараметрыОтбора = Новый Структура();
               ПараметрыОтбора.Вставить("СтавкаНДС", ТекСтавкаНДС.Ключ);
               ПараметрыОтбора.Вставить("Отменено",  Ложь);
               НайденныеСтроки = ТаблицаТовары.НайтиСтроки(ПараметрыОтбора);
               Если НайденныеСтроки.Количество() > 0 Тогда
                   ТаблицаТоварыНДС = ТаблицаТовары.Скопировать(НайденныеСтроки, "СуммаНДС");
                   ТаблицаТоварыНДС.Свернуть(,"СуммаНДС");
                   СоответствиеСтавокНДС.Вставить(ТекСтавкаНДС.Ключ, ТаблицаТоварыНДС[0].СуммаНДС);
                   
                   ТабличныйДокумент.Вывести(ОбластьНомера);
                   
                   Если ВыводитьКоды Тогда
                       ТабличныйДокумент.Присоединить(ОбластьКодов);
                   КонецЕсли;
                   
                   ТабличныйДокумент.Присоединить(ОбластьТовар);
                   
                   ОбластьДанных.Параметры.НДС = ТекстНДСПоСтавке(ТекСтавкаНДС.Ключ, ДанныеПечати.ЦенаВключаетНДС);
                   ОбластьДанных.Параметры.ВсегоНДС = ФормированиеПечатныхФорм.ФорматСумм(ТаблицаТоварыНДС[0].СуммаНДС);
                   ТабличныйДокумент.Присоединить(ОбластьДанных);
                   
               КонецЕсли;
               
           КонецЦикла;
           
       КонецЕсли;

       // Вывести Сумму прописью
       ОбластьМакета = Макет.ПолучитьОбласть("СуммаПрописью");
       СуммаКПрописи = Сумма + ?(ДанныеПечати.ЦенаВключаетНДС, 0, СуммаНДС);
       
       ИтоговаяСтрока = НСтр("ru='Всего наименований %Количество%, на сумму %Сумма%'");
       ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%Количество%", НомерСтроки);
       ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%Сумма%",      ФормированиеПечатныхФорм.ФорматСумм(СуммаКПрописи, ДанныеПечати.Валюта));
       
       ОбластьМакета.Параметры.ИтоговаяСтрока = ИтоговаяСтрока;
       
       ОбластьМакета.Параметры.СуммаПрописью = ФормированиеПечатныхФорм.СформироватьСуммуПрописью(СуммаКПрописи, ДанныеПечати.Валюта);
       ТабличныйДокумент.Вывести(ОбластьМакета);
       
        ЗаполнитьРеквизитыПодвалаСчетЗаказ(ДанныеПечати, Макет, ТабличныйДокумент, Тип, ТаблицаЭтапыОплаты, СоответствиеСтавокНДС);
       
       УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка);
       
   КонецЦикла;
   
   ТабличныйДокумент.АвтоМасштаб = Истина;
   
КонецПроцедуры // ЗаполнитьТабличныйДокументСчетЗаказ()
4 Фокусник
 
04.04.13
10:22
(3) Смотри снизу вверх: в ТаблицаТовары находятся данные для вывода строк в счет, а ТаблицаТовары берется из ДанныеПечати.Товары. ДанныеПечати формируются в запросе, которого нет в этой процедуре.

Чтобы не менять типовой запрос можно сделать так:
Перед циклом Для Каждого ... из ТаблицаТовары
получи всю номенклатуру, которая есть в ТаблицаТовары + количество.
Сделай новый запрос, в котором сравни данные из ТаблицаТовары  и свободные остатки.

Можно сделать это в отдельной процедуре, в которую на входе передать ТаблицаТовары, в процедуре добавить и заполнить колонку "СвободныйОстаток".  При выводе на печать будешь сравнивать Количество и СвободныйОстаток, если хватает, то "курсив".
5 Gomodrila
 
04.04.13
10:48
так всё легко, на словах))

у меня стаж 2 недели)

Говоришь сделать запрос о СвобОстатках , я так понял с условием по номенклатуре, что она должна быть равна данным из ТаблицаТовары.Номенклатура, но это же массив, а же не могу передать Массив как параметр запроса.

    Процедура СвободныеОстатки(ТаблицаТовары)

   Остатки = Новый Запрос;
   Остатки.Текст =
       "ВЫБРАТЬ
       |    СвободныеОстаткиОстатки.Номенклатура,
       |    СвободныеОстаткиОстатки.ВНаличииОстаток    КАК Остаток
       |ИЗ
       |    РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура = &Номенклатура) КАК СвободныеОстаткиОстатки";

   Остатки.УстановитьПараметр("Номенклатура", ТаблицаТовары.Номенклатура);

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

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

   Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
       
   КонецЦикла;

       
    КонецПроцедуры
6 Фокусник
 
04.04.13
11:38
(5) >это же массив, а же не могу передать Массив как параметр запроса.

Можешь.

Остатки.УстановитьПараметр("мНоменклатура", ТаблицаТовары.Выгрузить("Номенклатура"));

в запросе: "Номенклатура в (&мНоменклатура)"
AdBlock убивает бесплатный контент. 1Сергей