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