Добрый день, уважаемые читатели, хочу показать вам реализацию простенькой обработки по печатной форме товаров из расходного ордера.
Одно "НО", специально под эту обработку был создан специальный реквизит в справочнике "СерииНоменклатуры", это штрихкод, который обязан быть для того, чтобы программа получала данные штрихкодов по сериям, так как сами штрихкоды могут меняться от партии к партии, для этого он и был разработан.
Сама обработка была создана для кладовщиков, поэтому функционал изначально выключен, а вы сможете включить его для себя, включив доступ на форме (также и опробовать сам расходный ордер сможете, перенастроив надпись на поле ввода)
Прилагаю код модуля формы:
#Область ОбработчикиСобытийФормы
// Процедура выполняет действия при создании объекта на сервере, проверяя наличие и тип объекта назначения, и вызывает обработку изменения расходного ордера на товары, если он присутствует.
//
// Параметры:
// Отказ - Булево - Флаг, указывающий на необходимость отказа от выполнения стандартной обработки
// СтандартнаяОбработка - Булево - Флаг, указывающий на необходимость выполнения стандартной обработки
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если (Параметры.Свойство("ОбъектыНазначения") И ЗначениеЗаполнено(Параметры.ОбъектыНазначения))тогда
Для каждого ОбъектНазначения Из Параметры.ОбъектыНазначения Цикл
Если ТипЗнч(ОбъектНазначения) = Тип("ДокументСсылка.РасходныйОрдерНаТовары") Тогда
РасходныйОрдер = ОбъектНазначения;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(РасходныйОрдер) Тогда
РасходныйОрдерПриИзмененииНаСервере();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
// Вызывает процедуру обработки изменения расходного ордера на сервере при изменении элемента на клиенте
//
// Параметры:
// Элемент - Объект - Элемент интерфейса, который был изменён
&НаКлиенте
Процедура РасходныйОрдерПриИзменении(Элемент)
РасходныйОрдерПриИзмененииНаСервере();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
// Обрабатывает выделенные строки в таблице товаров, устанавливая флаг 'Выбран' в значение 'Истина' для каждой выделенной строки.
//
// Параметры:
// Команда - Неизвестно - Команда, инициирующая выполнение процедуры
&НаКлиенте
Процедура ВыбратьВыделенныеСтроки(Команда)
МассивСтрок = Элементы.Товары.ВыделенныеСтроки;
Если МассивСтрок.Количество() = 0 Тогда
ПоказатьПредупреждение(Неопределено, НСтр("ru = 'В списке отсутствуют выделенные строки';
|en = 'No selected lines in the list'"));
Возврат;
КонецЕсли;
Для Каждого НомерСтроки Из МассивСтрок Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(НомерСтроки);
СтрокаТЧ.Выбран = Истина;
КонецЦикла;
КонецПроцедуры
// Процедура исключает выделенные строки из табличной части 'Товары', снимая флаг 'Выбран' у каждой выделенной строки.
//
// Параметры:
// Команда - Неопределено - Параметр команды, который может быть использован для вызова процедуры.
&НаКлиенте
Процедура ИсключитьВыделенныеСтроки(Команда)
МассивСтрок = Элементы.Товары.ВыделенныеСтроки;
Если МассивСтрок.Количество() = 0 Тогда
ПоказатьПредупреждение(Неопределено, НСтр("ru = 'В списке отсутствуют выделенные строки';
|en = 'No selected lines in the list'"));
Возврат;
КонецЕсли;
Для Каждого НомерСтроки Из МассивСтрок Цикл
СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(НомерСтроки);
СтрокаТЧ.Выбран = Ложь;
КонецЦикла;
КонецПроцедуры
// Процедура выполняет печать этикеток на основе проверки наличия выбранных товаров и наличия необходимых подсистем для печати. Если проверка пройдена успешно, формируется табличный документ и запускается процесс печати.
//
// Параметры:
// Команда - Неопределено - Команда, инициирующая процесс печати. Тип и содержимое не указаны в коде.
&НаКлиенте
Процедура Печать(Команда)
ОчиститьСообщения();
РезультатПроверки = ВыполнитьПроверку(ЭтаФорма);
Если Не РезультатПроверки.ТоварыВыбраны Тогда
ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Не выбрано ни одного товара';
|en = 'No goods selected'"));
Возврат;
КонецЕсли;
Если РезультатПроверки.ПроверкаВыполнена Тогда
ТабДок = ПолучитьТабличныйДокументПечатьЭтикеток();
ИдентификаторПечатнойФормы = "ПечатьЭтикетокGX420d";
НазваниеПечатнойФормы = НСтр("ru = 'Печать этикетки на номенклатуру расходного ордера'");
Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Печать") Тогда
ТабДок.Показать(НазваниеПечатнойФормы);
ДокументыПечатались = Истина;
Возврат;
КонецЕсли;
МодульУправлениеПечатьюКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюКлиент");
КоллекцияПечатныхФорм = МодульУправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(ИдентификаторПечатнойФормы);
ПечатнаяФорма = МодульУправлениеПечатьюКлиент.ОписаниеПечатнойФормы(КоллекцияПечатныхФорм, ИдентификаторПечатнойФормы);
ПечатнаяФорма.СинонимМакета = НазваниеПечатнойФормы;
ПечатнаяФорма.ТабличныйДокумент = ТабДок;
ПечатнаяФорма.ИмяФайлаПечатнойФормы = НазваниеПечатнойФормы;
ОбластиОбъектов = Новый СписокЗначений;
МодульУправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбластиОбъектов);
ДокументыПечатались = Истина;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Функция создает и возвращает табличный документ для печати этикеток товаров на основе выбранных товаров в объекте. Для каждого выбранного товара генерируется указанное количество этикеток с штрихкодами и названием товара.
//
// Возвращаемое значение:
// ТабличныйДокумент - Документ с подготовленными этикетками для печати
&НаСервере
Функция ПолучитьТабличныйДокументПечатьЭтикеток()
ТабДок = Новый ТабличныйДокумент;
Обработка = РеквизитФормыВЗначение("Объект");
Макет = Обработка.ПолучитьМакет("ПечатьЭтикетокGX420d");
Для каждого Строка из Объект.Товары Цикл
Если Строка.Выбран Тогда
Повтор = 1;
Пока Повтор <= Строка.КоличествоЭтикеток Цикл
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("Ширина", 400);
ПараметрыШтрихкода.Вставить("Высота", 130);
ПараметрыШтрихкода.Вставить("ТипКода", 4);
ПараметрыШтрихкода.Вставить("ОтображатьТекст", Истина);
ПараметрыШтрихкода.Вставить("Штрихкод", Строка.Штрихкод);
ПараметрыШтрихкода.Вставить("Масштабировать", Истина);
ПараметрыШтрихкода.Вставить("РазмерШрифта", 14);
Область = Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Номенклатура = Строка.Номенклатура.Наименование;
Штрихкод = Область.Рисунки.Штрихкод;
Штрихкод.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);
ТабДок.Вывести(Область);
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
Повтор = Повтор + 1;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТабДок.ПолеСверху = 1;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСнизу = 10;
ТабДок.ПолеСправа = 10;
Возврат ТабДок;
КонецФункции
// Выполняет проверку заполнения данных в табличной части 'Товары' и возвращает результат проверки.
//
// Параметры:
// Форма - Структура - Объект формы, содержащий табличную часть 'Товары' для проверки
//
// Возвращаемое значение:
// Структура - Состоит из двух полей: ТоварыВыбраны (Булево) и ПроверкаВыполнена (Булево)
&НаКлиентеНаСервереБезКонтекста
Функция ВыполнитьПроверку(Форма)
ЕстьОшибки = Ложь;
Для Каждого СтрокаТЧ Из Форма.Объект.Товары Цикл
Если Не СтрокаТЧ.Выбран Тогда
Продолжить;
КонецЕсли;
НомерСтроки = СтрокаТЧ.НомерСтроки - 1;
Если СтрокаТЧ.КоличествоЭтикеток = 0 Тогда
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не заполнено количество этикеток в строке: %1';
|en = 'Number of labels is required in line: %1'"),
НомерСтроки + 1);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстСообщения,,
"Объект.Товары["+НомерСтроки+"].КоличествоЭтикеток",,
ЕстьОшибки);
КонецЕсли;
Если НЕ ЗначениеЗаполнено(СтрокаТЧ.Штрихкод) Тогда
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не заполнен штрихкод этикетки в строке: %1';
|en = 'The label barcode in the line is not filled in: %1'"),
НомерСтроки + 1);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
ТекстСообщения,,
"Объект.Товары["+НомерСтроки+"].Штрихкод",,
ЕстьОшибки);
КонецЕсли;
КонецЦикла;
Отбор = Новый Структура("Выбран", Истина);
ТоварыВыбраны = Форма.Объект.Товары.НайтиСтроки(Отбор).Количество() > 0;
Возврат Новый Структура("ТоварыВыбраны, ПроверкаВыполнена", ТоварыВыбраны, Не ЕстьОшибки);
КонецФункции
// Процедура обновляет товары в расходном ордере при изменении, заполняя данными из указанных строк документа
&НаСервере
Процедура РасходныйОрдерПриИзмененииНаСервере()
Объект.Товары.Очистить();
ТЧРасхОрдера = ЭтотОбъект.РасходныйОрдер.ОтгружаемыеТовары;
Для каждого Строка из ТЧРасхОрдера Цикл
НовСтр = Объект.Товары.Добавить();
НовСтр.Номенклатура = Строка.Номенклатура;
НовСтр.КоличествоВДокументе = Строка.Количество;
НовСтр.Серия = Строка.Серия;
НовСтр.КоличествоЭтикеток = 1;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СерииНоменклатуры.Штрихкод КАК Штрихкод
|ИЗ
| Справочник.СерииНоменклатуры КАК СерииНоменклатуры
|ГДЕ
| СерииНоменклатуры.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Строка.Серия);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтр.Штрихкод = ВыборкаДетальныеЗаписи.Штрихкод;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
Код модуля объекта:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73");
ПараметрыРегистрации.Информация = НСтр("ru = 'Печать Этикеток (НС)'");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
ПараметрыРегистрации.Версия = "2.4.4.0";
ПараметрыРегистрации.Назначение.Добавить("Документ.РасходныйОрдерНаТовары");
ПараметрыРегистрации.БезопасныйРежим = Ложь;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = НСтр("ru = 'Печать Этикеток (НС)'");
Команда.Идентификатор = "ПечатьЭтикеток(НС)";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Команда.ПоказыватьОповещение = Истина;
Команда.Модификатор = "ПечатьЭтикеток(НС)";
Возврат ПараметрыРегистрации;
КонецФункции
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.4.12.71