Сделать форму с настройками перед печатью

1. user1302499 31.07.20 12:54 Сейчас в теме
Есть такая задачка. Необходимо сделать внешнюю обработку. На форме списка документа выбираются несколько документов при нажатиии на кнопку печать выбирается моя внешняя обработка открывается форма внешней обработки и там указывается еще пару параметров. Как сделать вызов этой формы внешней обработки?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Vegner 26 31.07.20 13:06 Сейчас в теме
если есть справочник для хранения внешних печатных форм и обработок то как то так, название реквизитов могут отличаться
ВременныйФайл = ПолучитьИмяВременногоФайла();
ЭлСпр = Справочники.ВнешниеПечатныеФормы.НайтиПоКоду("Код");
ДвоичныеДанныеОбработки = ЭлСпр.Хранилище.Получить();
ДвоичныеДанныеОбработки.Записать(ВременныйФайл);
ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ВременныйФайл);
ФормаЗаписи = ВнешняяОбработкаОбъект.ПолучитьФорму("НазваниеФормы");
ФормаЗаписи .Открыть();
3. user1302499 31.07.20 13:17 Сейчас в теме
(2) Еще проблема возникла, не находит процедуру Печать

ВнешняяОбработкаОбъект.Печать(
		ПараметрыИсточника.ОбъектыНазначения,
		КоллекцияПечатныхФорм,
		ОбъектыПечати,
		ПараметрыВывода);
	


На этой строке ругается, что печать не обнаружено. В чем проблема?
4. Z_Denis 31.07.20 13:20 Сейчас в теме
(3) Нет такой процедуры в твоей внешней обработке, или не стоит "Экспорт"
6. user1302499 31.07.20 13:24 Сейчас в теме
(4)
Процедура Печать() Экспорт
      ФормаОбработки = ПолучитьФорму("ВнешняяОбработка.МТД_ПечатьНаОбработку.Форма.Форма");
      ФормаОбработки.Открыть();
    
КонецПроцедуры  
5. Z_Denis 31.07.20 13:23 Сейчас в теме
+ Зачем делать именно через внешнюю обработку? Посмотри как реализована печать к примеру в "РеализацияТоваровУслуг", там тоже в некоторых печатных формах вызывается сперва предварительная форма с параметрами.
7. user1302499 31.07.20 13:25 Сейчас в теме
(5)
Зачем делать именно через внешнюю обработку?

Так надо
8. user1302499 31.07.20 13:26 Сейчас в теме
(5)
Посмотри как реализована печать к примеру в "РеализацияТоваровУслуг"

Не нашел. БП 3.0 если что
9. Z_Denis 31.07.20 13:28 Сейчас в теме
(8) Что не нашел? Я тоже про БП 3.0. К примеру печать комплекта документов.
10. user1302499 31.07.20 13:38 Сейчас в теме
(9) Спасибо, нашел, но почему у меня ошибка взникает здесь. Не понимаю
ВнешняяОбработкаОбъект.Печать(
        ПараметрыИсточника.ОбъектыНазначения,
        КоллекцияПечатныхФорм,
        ОбъектыПечати,
        ПараметрыВывода);
    
11. user1302499 31.07.20 13:42 Сейчас в теме
12. user1302499 31.07.20 13:53 Сейчас в теме
(9)
К примеру печать комплекта документов.


В модуле объекта не получается вызвать открытие формы. Может можно иным способом?
13. Z_Denis 31.07.20 14:19 Сейчас в теме
(12) Модуль обьекта - это серверная сторона, там форму не открыть, тебе надо это на стороне клиента делать. Так почему не устраивает существующий механизм? Добавляешь свою команду печати, в ней прописываешь свой обработчик и все.
15. user1302499 31.07.20 15:21 Сейчас в теме
(13)
в ней прописываешь свой обработчик и все.

Не понял. Где прописывать?
17. user1302499 31.07.20 15:46 Сейчас в теме
(13) Я так же решил попробовать через расширение сделать. Но открыть форму работает только на клиенте, а в МодулеМенеджера не работает. Попробовал с модуля менеджера сослаться в созданный общий модуль но там так же не работает
19. Z_Denis 31.07.20 16:15 Сейчас в теме
(17) А галочка стоит "Клиент" в общем модуле и все остальные сняты? Должно работать оттуда.
20. user1302499 03.08.20 13:49 Сейчас в теме
14. VZyryanov 31.07.20 14:20 Сейчас в теме
(12) В функции СведенияОВнешнейОбработке использовать "ВызовКлиентскогоМетода", вместо "ВызовСерверногоМетода". В примере ниже при печати будет открыта форма "ФормаПодписей" обработки.

Функция СведенияОВнешнейОбработке() Экспорт
	
...
    
    // Создадим таблицу команд (подробнее смотрим ниже)
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Добавим команду в таблицу
   	ДобавитьКоманду(ТаблицаКоманд, НаименованиеДляПользователя, "ФормаПодписей", "ВызовКлиентскогоМетода", Истина, "ПечатьMXL");
   	//ДобавитьКоманду(ТаблицаКоманд, НаименованиеДляПользователя, Наименование, "ВызовСерверногоМетода", Истина, "ПечатьMXL");
    
    // Сохраним таблицу команд в параметры регистрации обработки
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    // Теперь вернем системе наши параметры
    Возврат ПараметрыРегистрации;
КонецФункции
Показать
16. user1302499 31.07.20 15:30 Сейчас в теме
(14)
 {ВнешняяОбработка.МТД_ПечатьНаОбработку.МодульОбъекта(11,21)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуКоманд)
    ТаблицаКоманд = <<?>>ПолучитьТаблицуКоманд(); (Проверка: Сервер)
{ВнешняяОбработка.МТД_ПечатьНаОбработку.МодульОбъекта(14,5)}: Процедура или функция с указанным именем не определена (ДобавитьКоманду)
   	<<?>>ДобавитьКоманду(ТаблицаКоманд, "Нов печать", "Форма", "ВызовКлиентскогоМетода", Истина, "ПечатьMXL"); (Проверка: Сервер)
 
18. VZyryanov 31.07.20 15:46 Сейчас в теме
(16) Обычно берешь готовую внешнюю печатную форму и переделываешь ее для текущих нужд. Весь код модуля объекта внешней печатной формы М-11 для БП 3.0

Функция ПолучитьТаблицуКоманд()

   // Создадим пустую таблицу команд и колонки в ней
   Команды = Новый ТаблицаЗначений;

   // Как будет выглядеть описание печатной формы для пользователя
   Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); 

   // Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
   Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));

   // Тут задается, как должна вызваться команда обработки
   // Возможные варианты:
   // - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
   // - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
   // - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
   Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));

   // Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
   Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));

   // Для печатной формы должен содержать строку ПечатьMXL 
   Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
   Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  // Добавляем команду в таблицу команд по переданному описанию.
  // Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;

КонецПроцедуры

&НаСервере

//////////////////////////////////////////////
//ОБРАБОТКИ ПОДКЛЮЧЕНИЯ ВНЕШНЕЙ ПЕЧАТНОЙ ФОРМЫ

Функция СведенияОВнешнейОбработке() Экспорт
	
	//---------------
	Наименование = "(ИС КФ) М-11";
	НаименованиеДляПользователя = "(ИС КФ) М-11";
	Версия = "3.0";
	//---------------	
	
	// Объявим переменную, в которой мы сохраним и вернем "наружу" необходимые данные
    ПараметрыРегистрации = Новый Структура;

    // Объявим еще одну переменную, которая нам потребуется ниже
    ////МассивНазначений = Новый Массив;
    
    // Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать. 
    // Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов
    ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");

    // Теперь нам необходимо передать в виде массива имен, к чему будет подключена наша ВПФ
    // Имейте ввиду, что можно задать имя в таком виде: Документ.* - в этом случае обработка будет подключена ко всем документам в системе, 
    // которые поддерживают механизм ВПФ
	МассивНазначений = Новый Массив;
	МассивНазначений.Добавить("Документ.ПередачаМатериаловВЭксплуатацию");
	МассивНазначений.Добавить("Документ.ТребованиеНакладная");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    
    // Теперь зададим имя, под которым ВПФ будет зарегистрирована в справочнике внешних обработок
    ПараметрыРегистрации.Вставить("Наименование", Наименование);
    
    // Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим)
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);

    // Следующие два параметра играют больше информационную роль, т.е. это то, что будет видеть пользователь в информации к обработке
    ПараметрыРегистрации.Вставить("Версия", Версия);    
    ПараметрыРегистрации.Вставить("Информация", НаименованиеДляПользователя);
    
    // Создадим таблицу команд (подробнее смотрим ниже)
    ТаблицаКоманд = ПолучитьТаблицуКоманд();
    
    // Добавим команду в таблицу
   	ДобавитьКоманду(ТаблицаКоманд, НаименованиеДляПользователя, "ФормаПодписей", "ВызовКлиентскогоМетода", Истина, "ПечатьMXL");
   	//ДобавитьКоманду(ТаблицаКоманд, НаименованиеДляПользователя, Наименование, "ВызовСерверногоМетода", Истина, "ПечатьMXL");
    
    // Сохраним таблицу команд в параметры регистрации обработки
    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
    
    // Теперь вернем системе наши параметры
    Возврат ПараметрыРегистрации;
КонецФункции

Функция ПолучитьТаблицуКоманд()

   // Создадим пустую таблицу команд и колонки в ней
   Команды = Новый ТаблицаЗначений;

   // Как будет выглядеть описание печатной формы для пользователя
   Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); 

   // Имя нашего макета, что бы могли отличить вызванную команду в обработке печати
   Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));

   // Тут задается, как должна вызваться команда обработки
   // Возможные варианты:
   // - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система
   // - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки
   // - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки
   Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));

   // Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы
   Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));

   // Для печатной формы должен содержать строку ПечатьMXL 
   Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
   Возврат Команды;
КонецФункции

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  // Добавляем команду в таблицу команд по переданному описанию.
  // Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;

КонецПроцедуры

//////////////////////////////////////////////
//ПРОЦЕДУРЫ ВНЕШЕЙ ПЕЧАТНОЙ ФОРМЫ

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


Функция СформироватьТабличныйДокумент(МассивОбъектов, ОбъектыПечати = неопределено, СтруктураПодписей = неопределено) Экспорт	
	Перем ЧерезКогоДолжность;
	Перем ЧерезКогоФИО;
	Перем ЗатребовалДолжность;
	Перем ЗатребовалФИО;
	Перем РазрешилДолжность;
	Перем РазрешилФИО;
	Перем ОтпустилДолжность;
	Перем ОтпустилФИО;
	Перем ПолучилДолжность;
	Перем ПолучилФИО;
	
	//ВЗ 20170215 УстановитьПривилегированныйРежим(Истина);
	
	Макет=ПолучитьМакет("М11");	
	ТабДокумент=Новый ТабличныйДокумент;
	ТабДокумент.АвтоМасштаб=Истина;
	ТабДокумент.ОриентацияСтраницы=ОриентацияСтраницы.Ландшафт;
	ТабДокумент.ИмяПараметровПечати="ПАРАМЕТРЫ_ПЕЧАТИ_ТребНаклСПодписями_М11­";	
	КФСервер.ТабДокНижнийКолонтитул(ТабДокумент, ОриентацияСтраницы.Ландшафт, Макет);
			
	ПервыйДокумент=Истина;	
	Для каждого ТекДокумент из МассивОбъектов Цикл
		Если Не ПервыйДокумент Тогда
			ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		ПервыйДокумент = Ложь;		
		//Если МассивОбъектов.Количество() > 1 Тогда
			СтруктураПодписей=ПрочитатьДанныеРегистраПодписи(ТекДокумент);
		//КонецЕсли;		
		ЧерезКого=СтруктураПодписей.ЧерезКого;
		Затребовал=СтруктураПодписей.Затребовал;
		Разрешил=СтруктураПодписей.Разрешил;
		Отпустил=СтруктураПодписей.Отпустил;
		Получил=СтруктураПодписей.Получил;		
		Заказ = Неопределено;
		Если ТипЗнч(ТекДокумент)=Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
			Запрос=Новый Запрос;
			Запрос.Текст= 	
				"ВЫБРАТЬ ПЕРВЫЕ 1
				|	Инвентарь.СпособОтраженияРасходов
				|ИЗ
				|	Документ.ПередачаМатериаловВЭксплуатацию.ИнвентарьИХозяйственныеПринадлежности КАК Инвентарь
				|ГДЕ
				|	Инвентарь.Ссылка = &Ссылка
				|	И Инвентарь.СпособОтраженияРасходов <> """"";
			Запрос.УстановитьПараметр("Ссылка", ТекДокумент);
			Результат=Запрос.Выполнить();
			Если НЕ Результат.Пустой() Тогда
				Выборка=Результат.Выбрать();
				Выборка.Следующий();
				Заказ=Выборка.СпособОтраженияРасходов;
				Заказ=СтрЗаменить(Заказ, ТекДокумент.Местонахождение.Наименование+", ", "");
			КонецЕсли;
		Иначе
			Если ТипЗнч(ТекДокумент.Субконто1)=Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
				Заказ=ТекДокумент.Субконто1;
			ИначеЕсли ТипЗнч(ТекДокумент.Субконто2)=Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
				Заказ=ТекДокумент.Субконто2;
			ИначеЕсли ТипЗнч(ТекДокумент.Субконто3)=Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
				Заказ=ТекДокумент.Субконто3;
			КонецЕсли;			
		КонецЕсли;		
		КФСервер.ПолучитьПодписи2Сервер(ЧерезКого, Затребовал, ЧерезКогоДолжность, ЧерезКогоФИО, ЗатребовалДолжность, ЗатребовалФИО);
		КФСервер.ПолучитьПодписи2Сервер(Разрешил, Отпустил, РазрешилДолжность, РазрешилФИО, ОтпустилДолжность, ОтпустилФИО);
		КФСервер.ПолучитьПодписи1Сервер(Получил, ПолучилДолжность, ПолучилФИО);
		ПолучилДолжность=КФСерверВызов.ПолучитьДолжность(Получил, Истина);

		КФСерверВызов.ДобавитьВЖурналАктивностиПользователей(ТекДокумент,"Документ",
			"М-11, "+КФСерверВызов.ИмяДокумента(ТекДокумент)+", "+ЧерезКогоФИО+", "+ЗатребовалФИО+", "
			+РазрешилФИО+", "+ОтпустилФИО+", "+ПолучилФИО);
			
		Область = Макет.ПолучитьОбласть("Шапка");
		Область.Параметры.Заголовок="ТРЕБОВАНИЕ-НАКЛАДНАЯ № " +ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ТекДокумент.Номер);
		Область.Параметры.КодОКПО=ТекДокумент.Организация.КодПоОКПО;
		СведенияОбОрганизации=БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(ТекДокумент.Организация, ТекДокумент.Дата);
		ПредставлениеОрганизации=ОбщегоНазначенияБПВызовСервера.ОписаниеОрганизации(СведенияОбОрганизации, "НаименованиеДляПечатныхФорм,");
		Область.Параметры.ПредставлениеОрганизации=ПредставлениеОрганизации;
		Область.Параметры.ДатаСоставления=Формат(ТекДокумент.Дата, "ДФ=dd.MM.yy");
		Область.Параметры.Склад=ТекДокумент.Склад;
		Если ТипЗнч(ТекДокумент)=Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
			Область.Параметры.КоррСчет="";
			Область.Параметры.ПредставлениеПодразделения=ТекДокумент.Местонахождение.Наименование;
		Иначе
			Область.Параметры.КоррСчет=ТекДокумент.СчетЗатрат.Код;
			Область.Параметры.ПредставлениеПодразделения=ТекДокумент.ПодразделениеЗатрат.Наименование;
		КонецЕсли;
		Область.Параметры.Заказ=Заказ; 
		Область.Параметры.ЧерезКого=ЧерезКогоФИО;
		Область.Параметры.Затребовал=ЗатребовалФИО;
		Область.Параметры.Разрешил=РазрешилФИО;
		ТабДокумент.Вывести(Область);
		СтруктураПолей=Новый Структура;
		Если ТипЗнч(ТекДокумент)=Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
			СтруктураПолей.Вставить("Счет","СчетУчета");
		Иначе
			СтруктураПолей.Вставить("Счет","Счет");
		КонецЕсли;
		СтруктураПолей.Вставить("Материал","Номенклатура");
		СтруктураПолей.Вставить("МатериалНаименование","Номенклатура.НаименованиеПолное");
		СтруктураПолей.Вставить("НоменклатурныйНомер","Номенклатура.Код");
		СтруктураПолей.Вставить("ЕдиницаИзмеренияНаименование","Номенклатура.ЕдиницаИзмерения");
		СтруктураПолей.Вставить("ЕдиницаИзмеренияКод","Номенклатура.ЕдиницаИзмерения.Код");
		СтруктураПолей.Вставить("Количество","Количество");
		СтруктураПолей.Вставить("Партия","ДокументОприходования");
		Область=Макет.ПолучитьОбласть("Строка");		
		Если ТипЗнч(ТекДокумент)=Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
			ТаблицаМатериалов=УчетОС.СформироватьЗапросПоТабличнойЧасти(ТекДокумент,"ИнвентарьИХозяйственныеПринадлежности",СтруктураПолей).Выгрузить();
		Иначе
			ТаблицаМатериалов=УчетОС.СформироватьЗапросПоТабличнойЧасти(ТекДокумент,"Материалы",СтруктураПолей).Выгрузить();
		КонецЕсли;
		//ВЗ 20171101 ТаблицаМатериалов.Свернуть("Материал,МатериалНаименование,Счет,НоменклатурныйНомер,ЕдиницаИзмеренияКод,ЕдиницаИзмеренияНаименование","Количество");
		//ТаблицаСуммСписания=БухгалтерскийУчетПереопределяемый.ПолучитьСуммуСписанияАктивов(ТекДокумент,'00010101','00010101');
		ТаблицаМатериалов.Свернуть("Материал,МатериалНаименование,Счет,НоменклатурныйНомер,ЕдиницаИзмеренияКод,ЕдиницаИзмеренияНаименование,Партия",
			"Количество");
		ТаблицаСуммСписания=КФСервер.ПолучитьСуммуСписанияАктивовПоПартиям(ТекДокумент,'00010101','00010101');
		//ВЗ 20171101;
		Сумма=0;		
		Для Каждого СтрокаТЧ Из ТаблицаМатериалов Цикл
			Область.Параметры.Заполнить(СтрокаТЧ);
			//ВЗ 20171101 СтрокаСуммСписания=ТаблицаСуммСписания.Найти(СтрокаТЧ.Материал, "Номенклатура");
			Строки=ТаблицаСуммСписания.НайтиСтроки(Новый Структура("Номенклатура,Партия",СтрокаТЧ.Материал,СтрокаТЧ.Партия));
			Если Строки.Количество()>0 Тогда
				СтрокаСуммСписания=Строки[0];
			Иначе
				СтрокаСуммСписания=Неопределено;
			КонецЕсли;
			//ВЗ 20171101;
			Если СтрокаСуммСписания=Неопределено Тогда
				Область.Параметры.Цена=0;
				Область.Параметры.Сумма=0;
			Иначе
				Цена=?(СтрокаСуммСписания.Количество=0,0,СтрокаСуммСписания.Сумма/СтрокаСуммСписания.Количество);
				Область.Параметры.Цена=Цена;
				Область.Параметры.Сумма=Цена*СтрокаТЧ.Количество;
				Сумма=Сумма+Цена*СтрокаТЧ.Количество;
			КонецЕсли;
			ТабДокумент.Вывести(Область);
		КонецЦикла;		
		Если ТипЗнч(ТекДокумент)=Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
			ТаблицаМатериалов=УчетОС.СформироватьЗапросПоТабличнойЧасти(ТекДокумент, "Спецодежда", СтруктураПолей).Выгрузить();
			//ВЗ 20171101 ТаблицаМатериалов.Свернуть("Материал,МатериалНаименование,Счет,НоменклатурныйНомер,ЕдиницаИзмеренияКод,ЕдиницаИзмеренияНаименование","Количество");
			ТаблицаМатериалов.Свернуть("Материал,МатериалНаименование,Счет,НоменклатурныйНомер,ЕдиницаИзмеренияКод,ЕдиницаИзмеренияНаименование,Партия","Количество");
			Для Каждого СтрокаТЧ Из ТаблицаМатериалов Цикл
				Область.Параметры.Заполнить(СтрокаТЧ);
				//ВЗ 20171101 СтрокаСуммСписания=ТаблицаСуммСписания.Найти(СтрокаТЧ.Материал,"Номенклатура");
				Строки=ТаблицаСуммСписания.НайтиСтроки(Новый Структура("Номенклатура,Партия",СтрокаТЧ.Материал,СтрокаТЧ.Партия));
				Если Строки.Количество()>0 Тогда
					СтрокаСуммСписания=Строки[0];
				Иначе
					СтрокаСуммСписания=Неопределено;
				КонецЕсли;
				//ВЗ 20171101;
				Если СтрокаСуммСписания=Неопределено Тогда
					 Область.Параметры.Цена=0;
					 Область.Параметры.Сумма=0;
				Иначе
					Цена=?(СтрокаСуммСписания.Количество=0,0,СтрокаСуммСписания.Сумма/СтрокаСуммСписания.Количество);
					Область.Параметры.Цена=Цена;
					Область.Параметры.Сумма=Цена*СтрокаТЧ.Количество;
					Сумма=Сумма+Цена*СтрокаТЧ.Количество;
				КонецЕсли;
				ТабДокумент.Вывести(Область);
			КонецЦикла;
		КонецЕсли;		
		//ВЗ 20171101
		СтруктураПолей.Удалить("Партия");
		ТаблицаСуммСписания.Свернуть("Регистратор,Номенклатура","Количество,Сумма");	
		//ВЗ 20171101;
		Если ТипЗнч(ТекДокумент)=Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
			ТаблицаМатериалов=УчетОС.СформироватьЗапросПоТабличнойЧасти(ТекДокумент,"Спецоснастка",СтруктураПолей).Выгрузить();
		Иначе
			ТаблицаМатериалов=УчетОС.СформироватьЗапросПоТабличнойЧасти(ТекДокумент,"МатериалыЗаказчика",СтруктураПолей).Выгрузить();
		КонецЕсли;
		ТаблицаМатериалов.Свернуть("Материал,МатериалНаименование,Счет,НоменклатурныйНомер,ЕдиницаИзмеренияКод,ЕдиницаИзмеренияНаименование","Количество");
		Для Каждого СтрокаТЧ Из ТаблицаМатериалов Цикл
			Область.Параметры.Заполнить(СтрокаТЧ);
			СтрокаСуммСписания=ТаблицаСуммСписания.Найти(СтрокаТЧ.Материал, "Номенклатура");
			Если СтрокаСуммСписания=Неопределено Тогда
				 Область.Параметры.Цена=0;
				 Область.Параметры.Сумма=0;
			Иначе
				Цена=?(СтрокаСуммСписания.Количество=0,0,СтрокаСуммСписания.Сумма/СтрокаСуммСписания.Количество);
				Область.Параметры.Цена=Цена;
				Область.Параметры.Сумма=Цена*СтрокаТЧ.Количество;
				Сумма=Сумма+Цена*СтрокаТЧ.Количество;
			КонецЕсли;
			ТабДокумент.Вывести(Область);
		КонецЦикла;
		Область=Макет.ПолучитьОбласть("Подвал");
		Область.Параметры.Сумма=Сумма;
		Область.Параметры.ОтпустилДолжность=ОтпустилДолжность;
		Область.Параметры.Отпустил=ОтпустилФИО;
		Область.Параметры.ПолучилДолжность=ПолучилДолжность;
		Область.Параметры.Получил=ПолучилФИО;
		ТабДокумент.Вывести(Область);
	КонецЦикла;	
	Возврат ТабДокумент;	
КонецФункции

&НаСервере
Функция ПрочитатьДанныеРегистраПодписи(ТекДокумент) Экспорт	
	СтруктураПодписеей=Новый Структура("ЧерезКого,Затребовал,Разрешил,Отпустил,Получил");	
	Если ТекДокумент=Неопределено Тогда
		Возврат СтруктураПодписеей;
	КонецЕсли;		
	Журнал=РегистрыСведений.ПодписиТребованийНакладных.СоздатьНаборЗаписей();
	Журнал.Отбор.Пользователь.Установить(КФСерверВызов.ТекущийПользователь());
	Журнал.Отбор.Документ.Установить(ТекДокумент.Ссылка);
	Журнал.Прочитать();
	Если Журнал.Количество()=0 Тогда
		Журнал.Отбор.Сбросить();
		Журнал.Отбор.Документ.Установить(ТекДокумент.Ссылка);
		Журнал.Прочитать();
	КонецЕсли;
	Если Журнал.Количество()>0 Тогда
		стрЖурнал=Журнал[Журнал.Количество()-1];
		СтруктураПодписеей.ЧерезКого=стрЖурнал.ЧерезКого;
		СтруктураПодписеей.Затребовал=стрЖурнал.Затребовал;
		СтруктураПодписеей.Разрешил=стрЖурнал.Разрешил;
		СтруктураПодписеей.Отпустил=стрЖурнал.Отпустил;
		СтруктураПодписеей.Получил=стрЖурнал.Получил;
	Иначе
		Запрос=Новый Запрос;
		Запрос.УстановитьПараметр("Пользователь",КФСерверВызов.ТекущийПользователь());
		Заказ=Справочники.НоменклатурныеГруппы.ПустаяСсылка();
		Если ТипЗнч(ТекДокумент)=Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда
			Запрос.УстановитьПараметр("Подразделение",ТекДокумент.Местонахождение);
        Иначе
			Запрос.УстановитьПараметр("Подразделение",ТекДокумент.ПодразделениеЗатрат);
			Если ТипЗнч(ТекДокумент.Субконто1)=Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
				Заказ = ТекДокумент.Субконто1;
			ИначеЕсли ТипЗнч(ТекДокумент.Субконто2)=Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
				Заказ = ТекДокумент.Субконто2;
			ИначеЕсли ТипЗнч(ТекДокумент.Субконто3)=Тип("СправочникСсылка.НоменклатурныеГруппы") Тогда
				Заказ = ТекДокумент.Субконто3;
			КонецЕсли;			
		КонецЕсли;
		Запрос.УстановитьПараметр("Заказ",Заказ);
		
		ЗапросТекст=
			"ВЫБРАТЬ ПЕРВЫЕ 1
			|	Подписи.ЧерезКого,
			|	Подписи.Затребовал,
			|	Подписи.Разрешил,
			|	Подписи.Отпустил,
			|	Подписи.Получил
			|ИЗ
			|	РегистрСведений.ПодписиТребованийНакладных.СрезПоследних(, &Условие) КАК Подписи
			|ГДЕ
			|	Подписи.Отпустил <> ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)
			|
			|УПОРЯДОЧИТЬ ПО
			|	Подписи.Период УБЫВ";
		Запрос.Текст=СтрЗаменить(ЗапросТекст,"&Условие","Пользователь = &Пользователь И Подразделение = &Подразделение");
		Результат=Запрос.Выполнить();
		Если Результат.Пустой() Тогда
			Запрос.Текст=СтрЗаменить(ЗапросТекст,"&Условие","Подразделение = &Подразделение");
			Результат=Запрос.Выполнить();
		КонецЕсли;
		Если НЕ Результат.Пустой() Тогда
			Выборка=Результат.Выбрать();
			Выборка.Следующий();
			СтруктураПодписеей.Затребовал=Выборка.Затребовал;
			СтруктураПодписеей.Разрешил=Выборка.Разрешил;
			СтруктураПодписеей.Отпустил=Выборка.Отпустил;
			СтруктураПодписеей.Получил=Выборка.Получил;
		КонецЕсли;
		Если ТипЗнч(ТекДокумент)<>Тип("ДокументСсылка.ПередачаМатериаловВЭксплуатацию") Тогда		
			Запрос.Текст=СтрЗаменить(ЗапросТекст,"&Условие","Пользователь = &Пользователь И Заказ = &Заказ");
			Результат=Запрос.Выполнить();
			Если Результат.Пустой() Тогда
				Запрос.Текст=СтрЗаменить(ЗапросТекст,"&Условие","Заказ = &Заказ");
				Результат=Запрос.Выполнить();
			КонецЕсли;
			Если НЕ Результат.Пустой() Тогда
				Выборка=Результат.Выбрать();
				Выборка.Следующий();
				СтруктураПодписеей.ЧерезКого=Выборка.ЧерезКого;
				Если Не ЗначениеЗаполнено(СтруктураПодписеей.Разрешил) Тогда
					СтруктураПодписеей.Разрешил=Выборка.Разрешил;
				КонецЕсли;			
				Если Не ЗначениеЗаполнено(СтруктураПодписеей.Отпустил) Тогда
					СтруктураПодписеей.Отпустил=Выборка.Отпустил;
				КонецЕсли;			
			КонецЕсли;
		КонецЕсли;
		Запрос.Текст=СтрЗаменить(ЗапросТекст,"&Условие","Пользователь = &Пользователь");
		Результат=Запрос.Выполнить();
		Если НЕ Результат.Пустой() Тогда
			Выборка=Результат.Выбрать();
			Выборка.Следующий();
			СтруктураПодписеей.Отпустил=Выборка.Отпустил;
		КонецЕсли;
		Если Не ЗначениеЗаполнено(СтруктураПодписеей.Отпустил) Тогда
			СтруктураПодписеей.Отпустил=КФСерверВызов.ТекущийПользователь().ФизическоеЛицо;
		КонецЕсли;				
		Если Не ЗначениеЗаполнено(СтруктураПодписеей.Разрешил) Тогда
			СтруктураПодписеей.Разрешил=Справочники.ФизическиеЛица.НайтиПоНаименованию("Комаров Игорь Сергеевич");
		КонецЕсли;			
	КонецЕсли;	
	Возврат СтруктураПодписеей;	
КонецФункции
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот