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