Группа: Пользователи
Сообщений: 10
Спасибо сказали: 0 раз
Рейтинг: 0
Доброго времени суток. 1С: Предприятие 8.3 Конфигурация: УТ 11.1
Возникла необходимость при печати "Счет на оплату" выводить и штрих-код. Решил все сделать внешней обработкой, для этого согласно уроку прошелся по "Обработка" - "ПечатьСчетовНаОплату". Выбрал все функции и процедуры, перенес их вместе с макетом во внешнюю обработку. Все работает хорошо, кроме самого основного штрих-кода.
Пересматривая код, заметил, что данные не вытягиваются запросом, а берутся с табличной части формы . Уже хотел сделать через функцию и всеодно ниче не вышло.
// Вывести ИтогоНДС СоответствиеСтавокНДС = Новый Соответствие; Если ДанныеПечати.УчитыватьНДС И НЕ ТолькоЗалогЗаТару Тогда ОбластьИтогоНДС = Макет.ПолучитьОбласть("ПодвалТаблицыНДС"); Для Каждого СтрокаТовара Из ТаблицаТовары Цикл СуммаНДС = СоответствиеСтавокНДС[СтрокаТовара.СтавкаНДС]; Если СуммаНДС = Неопределено Тогда СуммаНДС = СтрокаТовара.СуммаНДС; Иначе СуммаНДС = СуммаНДС + СтрокаТовара.СуммаНДС; КонецЕсли; СоответствиеСтавокНДС.Вставить(СтрокаТовара.СтавкаНДС, СуммаНДС); КонецЦикла; Для Каждого ТекСтавкаНДС Из СоответствиеСтавокНДС Цикл СтруктураДанныхИтогоНДС = Новый Структура; СтруктураДанныхИтогоНДС.Вставить("НДС", ФормированиеПечатныхФорм.ТекстНДСПоСтавке(ТекСтавкаНДС.Ключ, ДанныеПечати.ЦенаВключаетНДС)); Если ЗначениеЗаполнено(ТекСтавкаНДС.Значение) Тогда СтруктураДанныхИтогоНДС.Вставить("ВсегоНДС", ФормированиеПечатныхФорм.ФорматСумм(ТекСтавкаНДС.Значение /100 * ДанныеПечати.ПроцентОплаты)); Иначе СтруктураДанныхИтогоНДС.Вставить("ВсегоНДС","-"); КонецЕсли; ОбластьИтогоНДС.Параметры.Заполнить(СтруктураДанныхИтогоНДС); ТабличныйДокумент.Вывести(ОбластьИтогоНДС); КонецЦикла; ОбластьПодвалСНДС = Макет.ПолучитьОбласть("ПодвалТаблицыВсего"); СтруктураДанныхПодвалСНДС = Новый Структура("ВсегоСНДС", ФормированиеПечатныхФорм.ФорматСумм(ДанныеПечати.СуммаДокумента)); ОбластьПодвалСНДС.Параметры.Заполнить(СтруктураДанныхПодвалСНДС); ТабличныйДокумент.Вывести(ОбластьПодвалСНДС); КонецЕсли;
// Вывести Сумму прописью ОбластьМакета = Макет.ПолучитьОбласть("СуммаПрописьюЧастичныйСчет"); СуммаПрописью = НСтр("ru='Всего на сумму %СуммаПрописью%'"); СуммаПрописью = СтрЗаменить(СуммаПрописью, "%СуммаПрописью%", РаботаСКурсамиВалют.СформироватьСуммуПрописью(ДанныеПечати.СуммаДокумента, ДанныеПечати.Валюта)); СтруктураДанныхСуммаПрописью = Новый Структура("СуммаПрописью", СуммаПрописью); ОбластьМакета.Параметры.Заполнить(СтруктураДанныхСуммаПрописью); ТабличныйДокумент.Вывести(ОбластьМакета);
Если ДанныеПечати.УчитыватьНДС И НЕ ТолькоЗалогЗаТару Тогда СуффиксОбластиПодвал = "СНДС" + ?(ЕстьСкидки, "СоСкидкой", ""); ОбластьПодвалСНДС = Макет.ПолучитьОбласть("ПодвалТаблицыВсего" + СуффиксОбластиПодвал); КонецЕсли;
Если ЕстьСкидки Тогда СтруктураЗаголовокСкидки = Новый Структура("Скидка, СуммаБезСкидки", ЗаголовокСкидки.Скидка, ЗаголовокСкидки.СуммаСкидки); ОбластьШапкаТаблицы.Параметры.Заполнить(СтруктураЗаголовокСкидки); КонецЕсли; ОбластьШапкаТаблицы.Параметры.Заполнить(СтруктураИмяДопКолонки); ОбластьСуммаПрописью = Макет.ПолучитьОбласть(?(ДанныеПечати.СчетКВозврату, "СуммаПрописьюКВозврату", "СуммаПрописью"));
МассивПроверкиВывода = Новый Массив;
Сумма = 0; СуммаНДС = 0; ВсегоСкидок = 0; ВсегоБезСкидок = 0; НомерСтроки = 0; СоответствиеСтавокНДС = Новый Соответствие; Для Каждого СтрокаТовары Из ТаблицаТовары Цикл
Если НаборыСервер.ИспользоватьОбластьНабор(СтрокаТовары, ИспользоватьНаборы) Тогда ОбластьСтрокаТаблицы = ОбластьСтрокаТаблицыНабор; ИначеЕсли НаборыСервер.ИспользоватьОбластьКомплектующие(СтрокаТовары, ИспользоватьНаборы) Тогда ОбластьСтрокаТаблицы = ОбластьСтрокаТаблицыКомплектующие; Иначе ОбластьСтрокаТаблицы = ОбластьСтрокаТаблицыСтандарт; КонецЕсли;
Если НаборыСервер.ВыводитьТолькоЗаголовок(СтрокаТовары, ИспользоватьНаборы) Тогда НомерСтрокиПечать = ""; Иначе НомерСтроки = НомерСтроки + 1; НомерСтрокиПечать = НомерСтроки; КонецЕсли;
Если НомерСтроки = 0 И ВыводШапки <> 2 Тогда ВыводШапки = 1; КонецЕсли;
Если ЕстьСодержание Тогда Товар = ПрефиксИПостфикс.Префикс + НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати( СтрокаТовары.НаименованиеПолное, СтрокаТовары.Характеристика, // СтрокаТовары.Описание, , , // Серия СтрокаТовары.Содержание, СтрокаТовары.ЭтоВозвратнаяТара) + ПрефиксИПостфикс.Постфикс; Иначе Товар = ПрефиксИПостфикс.Префикс + НоменклатураКлиентСервер.ПредставлениеНоменклатурыДляПечати( СтрокаТовары.НаименованиеПолное, СтрокаТовары.Характеристика, // СтрокаТовары.Описание, , , // Серия , //Содержание СтрокаТовары.ЭтоВозвратнаяТара) + ПрефиксИПостфикс.Постфикс; КонецЕсли; СтруктураДанныхСтроки = Новый Структура; СтруктураДанныхСтроки.Вставить("Товар", Товар); ////////////////////////////////// СтруктураДанныхСтроки.Вставить("ШтрихКод", ШтрихКодСервер(СтрокаТовары.Номенклатура)); ////////////////////////////////// СтруктураДанныхСтроки.Вставить("НомерСтроки", НомерСтрокиПечать); ОбластьСтрокаТаблицы.Параметры.Заполнить(СтрокаТовары); Если ЗаголовокСкидки.ЕстьСкидки Тогда СтруктураДанныхСтроки.Вставить("СуммаСкидки", ?(ЗаголовокСкидки.ТолькоНаценка,- СтрокаТовары.СуммаСкидки,СтрокаТовары.СуммаСкидки)); КонецЕсли;
Если ЗначениеЗаполнено(СтруктураИмяДопКолонки.ИмяКолонкиКодов) Тогда СтруктураДанныхСтроки.Вставить("Артикул", СтрокаТовары[СтруктураИмяДопКолонки.ИмяКолонкиКодов]); КонецЕсли;
Если НаборыСервер.ВыводитьТолькоЗаголовок(СтрокаТовары, ИспользоватьНаборы) Тогда ОбластьСтрокаТаблицы.Параметры.Заполнить(ПустыеДанные); КонецЕсли;
МассивПроверкиВывода.Очистить(); МассивПроверкиВывода.Добавить(ОбластьСтрокаТаблицы); Если НомерСтроки = ТаблицаТовары.Количество() Тогда МассивПроверкиВывода.Добавить(ОбластьПодвалТаблицы); МассивПроверкиВывода.Добавить(ОбластьПодвалНДС); МассивПроверкиВывода.Добавить(ОбластьСуммаПрописью); КонецЕсли;
Если ТабличныйДокумент.ПроверитьВывод(МассивПроверкиВывода) Тогда Если (НомерСтроки = 1 И ВыводШапки = 0) ИЛИ (НомерСтроки = 0 И ВыводШапки = 1) Тогда ВыводШапки = 2; ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы); КонецЕсли; Иначе ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц(); ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы); КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьСтрокаТаблицы);
Если Не НаборыСервер.ИспользоватьОбластьКомплектующие(СтрокаТовары, ИспользоватьНаборы) Тогда
Если ЕстьСкидки Тогда ВсегоСкидок = ВсегоСкидок + СтрокаТовары.СуммаСкидки; ВсегоБезСкидок = ВсегоБезСкидок + СтрокаТовары.СуммаБезСкидки; КонецЕсли;
Если ДанныеПечати.УчитыватьНДС И НЕ ТолькоЗалогЗаТару Тогда СуммаНДСПоСтавке = СоответствиеСтавокНДС[СтрокаТовары.СтавкаНДС]; Если СуммаНДСПоСтавке = Неопределено Тогда СуммаНДСПоСтавке = 0; КонецЕсли; СоответствиеСтавокНДС.Вставить(СтрокаТовары.СтавкаНДС, СуммаНДСПоСтавке + СтрокаТовары.СуммаНДС); КонецЕсли;
КонецЕсли;
КонецЦикла;
СтруктураДанныхВсегоСкидки = Новый Структура;
// Подвал таблицы "Товары" Если ЕстьСкидки Тогда СтруктураДанныхВсегоСкидки.Вставить("ВсегоСкидок", ?(ЗаголовокСкидки.ТолькоНаценка,-ВсегоСкидок, ВсегоСкидок)); СтруктураДанныхВсегоСкидки.Вставить("ВсегоБезСкидок", ВсегоБезСкидок); Если ДанныеПечати.УчитыватьНДС И НЕ ТолькоЗалогЗаТару Тогда СтруктураДанныхВсегоСкидки.Вставить("ВсегоСуммаНДС", СуммаНДС); КонецЕсли; КонецЕсли; СтруктураДанныхВсегоСкидки.Вставить("Всего", ФормированиеПечатныхФорм.ФорматСумм(Сумма)); ОбластьПодвалТаблицы.Параметры.Заполнить(СтруктураДанныхВсегоСкидки); ТабличныйДокумент.Вывести(ОбластьПодвалТаблицы);
// Область "ПодвалТаблицыНДС" Если ДанныеПечати.УчитыватьНДС И НЕ ТолькоЗалогЗаТару Тогда
Для Каждого ТекСтавкаНДС Из СоответствиеСтавокНДС Цикл СтруктураДанныхПодвалНДС = Новый Структура; СтруктураДанныхПодвалНДС.Вставить("НДС", ФормированиеПечатныхФорм.ТекстНДСПоСтавке(ТекСтавкаНДС.Ключ, ДанныеПечати.ЦенаВключаетНДС)); СтруктураДанныхПодвалНДС.Вставить("ВсегоНДС", ФормированиеПечатныхФорм.ФорматСумм(ТекСтавкаНДС.Значение, ,"-")); ОбластьПодвалНДС.Параметры.Заполнить(СтруктураДанныхПодвалНДС); ТабличныйДокумент.Вывести(ОбластьПодвалНДС);
Группа: Пользователи
Сообщений: 10
Спасибо сказали: 0 раз
Рейтинг: 0
Цитата(Petre @ 13.10.14, 14:57)
Про запросы в цикле и вообще обход ТЧ вместо запроса к ТЧ пока промолчу.
Согласен, самому стыдно было выкладывать код. Но отчет нужен был как обычно на "вчера", а у меня только так получилось. В дальнейшем конечно переделаю, ну во всяком случае хочется в это верить.
По совету - ошибку дает.
{ВнешняяОбработка.СчетНаОплатуЕЮ.МодульОбъекта(912)}: Значение не является значением объектного типа (Штрихкод) ШК = ВЗ.Штрихкод;
Группа: Пользователи
Сообщений: 10
Спасибо сказали: 0 раз
Рейтинг: 0
Petre, можно пару вопросов по самому коду ? Тут как бы разобраться хочется . ))
Функция ШтрихКодСервер(ТоварП)
//тут объявляем новый запрос Запрос = Новый Запрос; //сам запрос Запрос.Текст = "ВЫБРАТЬ | ШтрихкодыНоменклатуры.Штрихкод |ИЗ | РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры |ГДЕ | ШтрихкодыНоменклатуры.Номенклатура = &Товар"; //передаем в запрос переменную, которая передается в функцию Запрос.УстановитьПараметр("Товар", ТоварП); //указываем выгрузку данных запроса в переменную "РЗ" РЗ = Запрос.Выполнить(); //объяляем новую переменную "ШК" ШК = ""; // ставим условие "если в результате выгрузки запроса есть данные // тогда продолжаем" Если Не РЗ.Пустой() Тогда //вот здесь не совсем понятно, почему мы объявляем еще одну переменную и //что мы выбираем ? ВЗ = РЗ.Выбрать(); //тут идет перебор выборки ВЗ.Следующий(); //опять слегка не понятно, если мы запросом вытягиваем только значение штрих-кода //зачем тогда в переменной еще и указание на ШК ? ШК = ВЗ.Штрихкод;
Группа: Местный
Сообщений: 2903
Из: Київ, Україна
Спасибо сказали: 1145 раз
Рейтинг: 1225
ВЗ = РЗ.Выбрать();
Здесь мы из результата запроса получаем выборку запроса.
Цитата(EvgenM @ 14.10.14, 8:07)
опять слегка не понятно, если мы запросом вытягиваем только значение штрих-кода зачем тогда в переменной еще и указание на ШК ?
Вопрос не понятен. Запросом мы вытягиваем записи из БД. Записи могут иметь от одного до нескольких полей. В данном случае запросом мы вытягиваем записи с одним полем. Вот к этому полю ("Штрихкод") мы и обращаемся.
Допрацьовую: - "Бухгалтерія для України 2.1"; - "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!