Функция СведенияОВнешнейОбработке() Экспорт // Объявим переменную, в которой мы сохраним и вернем "наружу" необходимые данные ПараметрыРегистрации = Новый Структура; // Объявим еще одну переменную, которая нам потребуется ниже МассивНазначений = Новый Массив; // Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать. // Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); // Теперь нам необходимо передать в виде массива имен, к чему будет подключена наша ВПФ МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг"); ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); // Теперь зададим имя, под которым ВПФ будет зарегистрирована в справочнике внешних обработок ПараметрыРегистрации.Вставить("Наименование", "Товарный чек"); // Следующие два параметра играют больше информационную роль, т.е. это то, что будет видеть пользователь в информации к обработке ПараметрыРегистрации.Вставить("Версия", "1.0.1"); ПараметрыРегистрации.Вставить("Информация", "Товарный чек"); // Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим) ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); // Создадим таблицу команд (подробнее смотрим ниже) ТаблицаКоманд = ПолучитьТаблицуКоманд(); // Добавим команду в таблицу ДобавитьКоманду(ТаблицаКоманд, "Товарный чек", "ИмяПечатнойФормы", "ВызовСерверногоМетода", Истина, "ПечатьMXL"); // Сохраним таблицу команд в параметры регистрации обработки ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); // Теперь вернем системе наши параметры Возврат ПараметрыРегистрации; КонецФункции Функция ПолучитьТаблицуКоманд() // Создадим пустую таблицу команд и колонки в ней Команды = Новый ТаблицаЗначений; // Как будет выглядеть описание печатной формы для пользователя Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); // Имя нашего макета, что бы могли отличить вызванную команду в обработке печати Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //Тут задается, как должна вызваться команда обработки // Возможные варианты: // - ОткрытиеФормы - в этом случае в колонке идентификатор должно быть указано имя формы, которое должна будет открыть система // - ВызовКлиентскогоМетода - вызвать клиентскую экспортную процедуру из модуля формы обработки // - ВызовСерверногоМетода - вызвать серверную экспортную процедуру из модуля объекта обработки Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); // Следующий параметр указывает, необходимо ли показывать оповещение при начале и завершению работы обработки. Не имеет смысла при открытии формы Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); // Для печатной формы должен содержать строку ПечатьMXL Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); Возврат Команды; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") // Добавляем команду в таблицу команд по переданному описанию. // Параметры и их значения можно посмотреть в функции ПолучитьТаблицуКоманд НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры // Сформировать печатные формы объектов // // ВХОДЯЩИЕ: // ИменаМакетов - Строка - Имена макетов, перечисленные через запятую // МассивОбъектов - Массив - Массив ссылок на объекты которые нужно распечатать // ПараметрыПечати - Структура - Структура дополнительных параметров печати // // ИСХОДЯЩИЕ: // КоллекцияПечатныхФорм - Таблица значений - Сформированные табличные документы // ПараметрыВывода - Структура - Параметры сформированных табличных документов // Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт ПараметрыПечати = Неопределено; Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ИмяПечатнойФормы") Тогда УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ИмяПечатнойФормы", "Товарный чек", СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)); КонецЕсли; КонецПроцедуры // Печать() Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ПараметрыПечати) //Здесь вы определяете алгоритм для печатной формы Запрос = Новый Запрос( "ВЫБРАТЬ | РеализацияТоваровУслуг.Ссылка КАК Ссылка, | РеализацияТоваровУслуг.Номер, | РеализацияТоваровУслуг.Дата, | РеализацияТоваровУслуг.Организация КАК Организация, | РеализацияТоваровУслуг.Контрагент КАК Поставщик, | РеализацияТоваровУслуг.Склад, | РеализацияТоваровУслуг.Менеджер КАК ОтветственныйПредставление, | РеализацияТоваровУслуг.Валюта, | РеализацияТоваровУслуг.СуммаДокумента |ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Ссылка В (&МассивДокументов) |УПОРЯДОЧИТЬ ПО | Ссылка |; |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВложенныйЗапрос.Ссылка КАК Ссылка, | ВложенныйЗапрос.Номенклатура КАК Номенклатура, | ВложенныйЗапрос.Номенклатура.НаименованиеПолное КАК Товар, | ВложенныйЗапрос.Номенклатура.Код КАК Код, | ВложенныйЗапрос.Номенклатура.Артикул КАК Артикул, | ВложенныйЗапрос.ЕдиницаИзмерения.Наименование КАК ЕдиницаЦены, | ВложенныйЗапрос.ЕдиницаИзмерения КАК ЕдиницаИзмерения, | ВложенныйЗапрос.Упаковка.Наименование КАК Упаковка, | ВложенныйЗапрос.Цена КАК Цена, | ВложенныйЗапрос.Количество КАК Количество, | ВложенныйЗапрос.СуммаБезСкидки КАК СуммаБезСкидки, | ВложенныйЗапрос.СуммаСкидки КАК Скидка, | ВложенныйЗапрос.Сумма КАК Сумма, | ВложенныйЗапрос.НомерСтроки КАК НомерСтроки |ИЗ | (ВЫБРАТЬ | РеализацияТоваровУслуг.Ссылка КАК Ссылка, | РеализацияТоваровУслуг.Номенклатура КАК Номенклатура, | ВЫБОР | КОГДА РеализацияТоваровУслуг.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка) | ТОГДА 1 | ИНАЧЕ РеализацияТоваровУслуг.Упаковка.Коэффициент | КОНЕЦ КАК Коэффициент, | ВЫБОР | КОГДА РеализацияТоваровУслуг.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка) | ТОГДА РеализацияТоваровУслуг.Номенклатура.ЕдиницаИзмерения | ИНАЧЕ РеализацияТоваровУслуг.Упаковка.ЕдиницаИзмерения | КОНЕЦ КАК ЕдиницаИзмерения, | РеализацияТоваровУслуг.ПроцентРучнойСкидки КАК ПроцентСкидки, | РеализацияТоваровУслуг.Характеристика КАК Характеристика, | РеализацияТоваровУслуг.Упаковка КАК Упаковка, | РеализацияТоваровУслуг.СтавкаНДС КАК СтавкаНДС, | РеализацияТоваровУслуг.Цена КАК Цена, | РеализацияТоваровУслуг.КоличествоУпаковок КАК Количество, | РеализацияТоваровУслуг.Сумма КАК Сумма, | РеализацияТоваровУслуг.СуммаРучнойСкидки КАК СуммаРучнойСкидки, | РеализацияТоваровУслуг.СуммаАвтоматическойСкидки КАК СуммаАвтоматическойСкидки, | РеализацияТоваровУслуг.СуммаАвтоматическойСкидки + РеализацияТоваровУслуг.СуммаРучнойСкидки КАК СуммаСкидки, | РеализацияТоваровУслуг.Сумма + РеализацияТоваровУслуг.СуммаРучнойСкидки + РеализацияТоваровУслуг.СуммаАвтоматическойСкидки КАК СуммаБезСкидки, | РеализацияТоваровУслуг.СуммаНДС КАК СуммаНДС, | РеализацияТоваровУслуг.НомерСтроки КАК НомерСтроки |ИЗ | Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслуг |ГДЕ | РеализацияТоваровУслуг.Ссылка В(&МассивДокументов) | И РеализацияТоваровУслуг.Номенклатура.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)) КАК ВложенныйЗапрос |УПОРЯДОЧИТЬ ПО | ВложенныйЗапрос.Ссылка, | НомерСтроки |ИТОГИ | СУММА(СуммаБезСкидки), | СУММА(Скидка), | СУММА(Сумма) |ПО | Ссылка |"); Запрос.УстановитьПараметр("МассивДокументов", МассивОбъектов); ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ТоварныйЧек"; ТабличныйДокумент = Новый ТабличныйДокумент; МассивРезультатов = Запрос.ВыполнитьПакет(); ДанныеПечати = МассивРезультатов[0].Выбрать(); ВыборкаПоДокументам = МассивРезультатов[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); // ПервыйДокумент = Истина; Макет = ПолучитьМакет("Макет"); Пока ДанныеПечати.Следующий() Цикл // Найдем в выборке товары по текущему документу СтруктураПоиска = Новый Структура("Ссылка", ДанныеПечати.Ссылка); НайденСледующий = ВыборкаПоДокументам.НайтиСледующий(СтруктураПоиска); // Если в накладной только услуги - перейдем к следующему документу Если НайденСледующий Тогда ВыборкаПоТоварам = ВыборкаПоДокументам.Выбрать(); ВыборкаПоТоварам.Сбросить(); Иначе Продолжить; КонецЕсли; Если Не ПервыйДокумент Тогда ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); КонецЕсли; ПервыйДокумент = Ложь; НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1; // Выводим шапку накладной ОбластьМакета = Макет.ПолучитьОбласть("Заголовок"); ОбластьМакета.Параметры.Заполнить(ДанныеПечати); ТекстЗаголовка = ОбщегоНазначенияУТКлиентСервер.СформироватьЗаголовокДокумента(ДанныеПечати, НСтр("ru='Товарный чек'")); НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(ДанныеПечати.Номер); ОбластьМакета.Параметры.ТекстЗаголовка = ТекстЗаголовка; ТабличныйДокумент.Вывести(ОбластьМакета); ОбластьМакета = Макет.ПолучитьОбласть("Поставщик"); ПредставлениеПоставщика = ФормированиеПечатныхФорм.ОписаниеОрганизации(ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Организация, ДанныеПечати.Дата), "ПолноеНаименование, ЮридическийАдрес, Телефоны"); ОбластьМакета.Параметры.ПредставлениеПоставщика = ПредставлениеПоставщика; ТабличныйДокумент.Вывести(ОбластьМакета); ОбластьМакета = Макет.ПолучитьОбласть("Магазин"); ОбластьМакета.Параметры.Магазин = ДанныеПечати.Склад; ТабличныйДокумент.Вывести(ОбластьМакета); ОбластьМакета = Макет.ПолучитьОбласть("Покупатель"); ПредставлениеПолучателя = ФормированиеПечатныхФорм.ОписаниеОрганизации(ФормированиеПечатныхФорм.СведенияОЮрФизЛице(ДанныеПечати.Поставщик, ДанныеПечати.Дата), "ПолноеНаименование, ЮридическийАдрес, Телефоны"); ОбластьМакета.Параметры.ПредставлениеПолучателя = ПредставлениеПолучателя; ТабличныйДокумент.Вывести(ОбластьМакета); // Выводим заголовок таблицы Товары ОбластьМакета = Макет.ПолучитьОбласть("ШапкаТаблицы"); ТабличныйДокумент.Вывести(ОбластьМакета); // Выводим строки таблицы Товары ОбластьМакета = Макет.ПолучитьОбласть("Строка"); НомерСтроки = 0; Пока ВыборкаПоТоварам.Следующий() Цикл НомерСтроки = НомерСтроки + 1; ОбластьМакета.Параметры.НомерСтроки = НомерСтроки; ОбластьМакета.Параметры.Заполнить(ВыборкаПоТоварам); ТабличныйДокумент.Вывести(ОбластьМакета); КонецЦикла; // Выводим подвал ОбластьМакета = Макет.ПолучитьОбласть("Итого"); ОбластьМакета.Параметры.ВсегоБезСкидок = ВыборкаПоДокументам.СуммаБезСкидки; ОбластьМакета.Параметры.ВсегоСкидок = ВыборкаПоДокументам.Скидка; ОбластьМакета.Параметры.Сумма = ВыборкаПоДокументам.Сумма; ТабличныйДокумент.Вывести(ОбластьМакета); ОбластьМакета = Макет.ПолучитьОбласть("СуммаПрописью"); СуммаПрописью = РаботаСКурсамиВалют.СформироватьСуммуПрописью(ДанныеПечати.СуммаДокумента, ДанныеПечати.Валюта); ОбластьМакета.Параметры.СуммаПрописью = СуммаПрописью; ТабличныйДокумент.Вывести(ОбластьМакета); ОбластьМакета = Макет.ПолучитьОбласть("Подписи"); ОбластьМакета.Параметры.ОтветственныйПредставление = ФизическиеЛица.ФамилияИнициалыФизЛица(Строка(ДанныеПечати.ОтветственныйПредставление)); ТабличныйДокумент.Вывести(ОбластьМакета); УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ДанныеПечати.Ссылка); КонецЦикла; ТабличныйДокумент.АвтоМасштаб = Истина; Если ПривилегированныйРежим() Тогда УстановитьПривилегированныйРежим(Ложь); КонецЕсли; Возврат ТабличныйДокумент; КонецФункции // СформироватьПечатнуюФормуНакладная()