Печать этикеток и ценников / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Функция подготавливает структуру данных, необходимую для печати ценников и этикеток.
// 
// Параметры:
//  СтруктураНастроек - Структура - Структура настроек:
// * ИсходныеДанные - Неопределено -
// * ОбязательныеПоля - Массив из строка-
// * СоответствиеШаблоновИСтруктурыШаблонов - Соответствие -
// * ПараметрыДанных - Структура -
// * КомпоновщикНастроек - Неопределено -
// * ИмяМакетаСхемыКомпоновкиДанных - Неопределено -
// * ИспользуетсяЦенообразование25 - Неопределено -
//  Режим - Строка - Режим
// 
// Возвращаемое значение:
//  Структура -- данные, необходимые для печати этикеток и ценников.
Функция ПодготовитьСтруктуруДанных(СтруктураНастроек, Режим) Экспорт
	
	Если СтруктураНастроек.ИсходныеДанные <> Неопределено Тогда
		ИсходныеДанные = СтруктураНастроек.ИсходныеДанные.Скопировать();
	Иначе
		ИсходныеДанные = Неопределено;
	КонецЕсли;
	
	ИспользуетсяЦенообразование25 = СтруктураНастроек.ИспользуетсяЦенообразование25;
	Если ИспользуетсяЦенообразование25 = Неопределено Тогда
		
		ДатаЦенообразования = Неопределено;
		Если СтруктураНастроек.ПараметрыДанных.Свойство("Дата") 
			И ЗначениеЗаполнено(СтруктураНастроек.ПараметрыДанных.Дата) Тогда
				
			ДатаЦенообразования = СтруктураНастроек.ПараметрыДанных.Дата;
			
		ИначеЕсли СтруктураНастроек.ПараметрыДанных.Свойство("ДатаДополнительно") 
			И ЗначениеЗаполнено(СтруктураНастроек.ПараметрыДанных.ДатаДополнительно) Тогда
				
			ДатаЦенообразования = СтруктураНастроек.ПараметрыДанных.ДатаДополнительно;
			
		КонецЕсли;
		
		ИспользуетсяЦенообразование25 = ЦенообразованиеВызовСервера.ИспользуетсяЦенообразование25(ДатаЦенообразования);
		
	КонецЕсли;
	
	СтруктураРезультата = Новый Структура;
	СтруктураРезультата.Вставить("Таблица",                             Неопределено);
	СтруктураРезультата.Вставить("СоответствиеПолейСКДКолонкамТаблицы", Новый Соответствие);
	
	// Схема компоновки.
	Если Режим = "ОбъектыЭксплуатации" Тогда

	Иначе
		СхемаКомпоновкиДанных = Обработки.ПечатьЭтикетокИЦенников.ПолучитьМакет(СтруктураНастроек.ИмяМакетаСхемыКомпоновкиДанных);
	КонецЕсли; 
	
	НаборДанных25 = СхемаКомпоновкиДанных.НаборыДанных.Найти("НаборДанных2_5");
	Если НаборДанных25 <> Неопределено Тогда
		Если ИспользуетсяЦенообразование25 Тогда
			СхемаКомпоновкиДанных.НаборыДанных.НаборДанных.Запрос = НаборДанных25.Запрос;
		КонецЕсли;
		СхемаКомпоновкиДанных.НаборыДанных.Удалить(НаборДанных25);
	КонецЕсли;
	
	НаборДанныхВСКДЗапрос = ТипЗнч(СхемаКомпоновкиДанных.НаборыДанных.НаборДанных) = Тип("НаборДанныхЗапросСхемыКомпоновкиДанных");
	
	Если НаборДанныхВСКДЗапрос Тогда
	
		ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных.Запрос;
		 
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ТекстЗапросаКоэффициентУпаковки1",
				Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
				"УпаковкиНоменклатуры",
				"ИсходныеДанные.Номенклатура"));

		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ТекстЗапросаКоэффициентУпаковки2",
				Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
				"ЕдиничныеУпаковкиВладельцы.Упаковка",
				"ЕдиничныеУпаковкиВладельцы.Номенклатура"));

		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ТекстЗапросаКоэффициентУпаковки3",
				Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
				"ИсходныеДанные.Упаковка",
				"ИсходныеДанные.Номенклатура"));

		ТекстЗапроса = СтрЗаменить(ТекстЗапроса,
				"&ТекстЗапросаКоэффициентУпаковки4",
				Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаКоэффициентаУпаковки(
				"ЕдиничныеУпаковкиНоменклатур.Упаковка",
				"ЕдиничныеУпаковкиНоменклатур.Номенклатура"));
		
		ПечатьЭтикетокИЦенниковЛокализация.ПриПодготовкеСтруктурыДанныхНабора(Режим, СхемаКомпоновкиДанных, ТекстЗапроса);
		
		Если ИсходныеДанные <> Неопределено И ИспользуетсяЦенообразование25 Тогда
	
			ЗаменяемыйТекст = "&ДанныеПоСериямПереопределяемый";
	
			Если ПолучитьФункциональнуюОпцию("ИспользоватьСерииНоменклатуры") Тогда
				
	 			ТекстЗамены = "ИсходныеДанные.Серия";
				
			Иначе
	
				ТекстЗамены = "ЗНАЧЕНИЕ(Справочник.СерииНоменклатуры.ПустаяСсылка)";
				
			КонецЕсли;
	
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ЗаменяемыйТекст, ТекстЗамены);
			
		КонецЕсли;

		СхемаКомпоновкиДанных.НаборыДанных.НаборДанных.Запрос = ТекстЗапроса;

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

	КонецЕсли;
	
	ПечатьЭтикетокИЦенниковЛокализация.ПриПодготовкеСтруктурыДанныхДляПечати(СтруктураНастроек, Режим, Запрос, ИсходныеДанные);
	
	Если НаборДанныхВСКДЗапрос Тогда
		СтруктураРезультата.Таблица = Запрос.Выполнить().Выгрузить();
	КонецЕсли;
	
	Возврат СтруктураРезультата;
	
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

#Область Печать

Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);

	ПечатьЭтикетокИЦенниковЛокализация.ПриПечати(КоллекцияПечатныхФорм, ПараметрыПечати, ОбъектыПечати);
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЦенникТовары") 
		Или УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЭтикеткаТовары") Тогда
		
		СформироватьПечатныеФормыЭтикетокИЦенниковТоваров(ПараметрыПечати, ОбъектыПечати, КоллекцияПечатныхФорм);
		
	КонецЕсли;
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЭтикеткаСкладскиеЯчейки") Тогда
		
		ТабличныйДокумент = СформироватьПечатнуюФормуЭтикеткиСкладскойЯчейки(ПараметрыПечати, ОбъектыПечати);
		ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭТИКЕТКАСКЛАДСКИЕЯЧЕЙКИ";
		
		СинонимМакета = НСтр("ru = 'Этикетки складских ячеек'");
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм,
			"ЭтикеткаСкладскиеЯчейки",
			СинонимМакета,
			ТабличныйДокумент);
		
	КонецЕсли;
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЭтикеткаСерииНоменклатуры") Тогда
		
		ТабличныйДокумент = СформироватьПечатнуюФормуЭтикеткиСерииНоменклатуры(ПараметрыПечати, ОбъектыПечати);
		ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭТИКЕТКАСЕРИИНОМЕНКЛАТУРЫ";
		
		СинонимМакета = НСтр("ru = 'Этикетки серий номенклатуры'");
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм,
			"ЭтикеткаСерииНоменклатуры",
			СинонимМакета,
			ТабличныйДокумент);
		
	КонецЕсли;
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЭтикеткаДоставки") Тогда
		
		ТабличныйДокумент = СформироватьПечатнуюФормуЭтикеткиДоставки(ПараметрыПечати, ОбъектыПечати, КоллекцияПечатныхФорм);
		ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭТИКЕТКАДОСТАВКИ";
		
		СинонимМакета = НСтр("ru = 'Этикетки доставки'");
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм,
			"ЭтикеткаДоставки",
			СинонимМакета,
			ТабличныйДокумент);
			
	КонецЕсли;

	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЭтикеткаУпаковочныеЛисты") Тогда
		
		ТабличныйДокумент = СформироватьПечатнуюФормуЭтикеткиУпаковочныеЛисты(ПараметрыПечати, ОбъектыПечати);
		ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЭТИКЕТКАУПАКОВОЧНЫЕЛИСТЫ";
		
		СинонимМакета = НСтр("ru = 'Этикетки упаковочных листов'");
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм,
			"ЭтикеткаУпаковочныеЛисты",
			СинонимМакета,
			ТабличныйДокумент);
			
	КонецЕсли;
	
	
	
	Если ТипЗнч(ПараметрыПечати) = Тип("Структура")
		 И ПараметрыПечати.Свойство("СтруктураТипов") Тогда
		ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, ПараметрыПечати.СтруктураТипов, КоллекцияПечатныхФорм);
	КонецЕсли;	
	
	Если ПривилегированныйРежим() Тогда
		УстановитьПривилегированныйРежим(Ложь);
	КонецЕсли;
	
КонецПроцедуры

Процедура СформироватьПечатныеФормыЭтикетокИЦенниковТоваров(ДанныеПечати, ОбъектыПечати, КоллекцияПечатныхФормБСП)
	
	ИсходныеДанные = ПолучитьИзВременногоХранилища(ДанныеПечати.Товары);
	
	НужноПечататьЭтикетки = Ложь;
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФормБСП, "ЭтикеткаТовары") Тогда
		НужноПечататьЭтикетки = Истина;
		КоллекцияПечатныхФормБСП.Удалить(КоллекцияПечатныхФормБСП.Найти(ВРег("ЭтикеткаТовары"), "ИмяВРЕГ"));
	КонецЕсли;
	
	НужноПечататьЦенники = Ложь;
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФормБСП, "ЦенникТовары") Тогда
		НужноПечататьЦенники = Истина;
		КоллекцияПечатныхФормБСП.Удалить(КоллекцияПечатныхФормБСП.Найти(ВРег("ЦенникТовары"), "ИмяВРЕГ"));
	КонецЕсли;
	
	СтруктураНастроек = СтруктураНастроек();
	СтруктураНастроек.ОбязательныеПоля.Добавить("КоличествоЦенниковДляПечати");
	СтруктураНастроек.ОбязательныеПоля.Добавить("КоличествоЭтикетокДляПечати");
	СтруктураНастроек.ОбязательныеПоля.Добавить("ШаблонЦенникаДляПечати");
	СтруктураНастроек.ОбязательныеПоля.Добавить("ШаблонЭтикеткиДляПечати");
	СтруктураНастроек.ОбязательныеПоля.Добавить("Номенклатура");
	Если ПолучитьФункциональнуюОпцию("ИспользоватьХарактеристикиНоменклатуры") Тогда
		СтруктураНастроек.ОбязательныеПоля.Добавить("Характеристика");
	КонецЕсли;
	Если ПолучитьФункциональнуюОпцию("ИспользоватьУпаковкиНоменклатуры") Тогда
		СтруктураНастроек.ОбязательныеПоля.Добавить("Упаковка");
	КонецЕсли;
	
	СтруктураНастроек.ИмяМакетаСхемыКомпоновкиДанных = "ПоляШаблонаПечатьТовары";
	
	// Собираем используемые поля из шаблонов.
	СоответствиеШаблонов = Новый Соответствие;
	Для Каждого СтрокаТЧ Из ИсходныеДанные Цикл
		Если ЗначениеЗаполнено(СтрокаТЧ.ШаблонЭтикетки) И СтрокаТЧ.КоличествоЭтикеток > 0 И НужноПечататьЭтикетки Тогда
			СоответствиеШаблонов.Вставить(СтрокаТЧ.ШаблонЭтикетки);
		КонецЕсли;
		Если ЗначениеЗаполнено(СтрокаТЧ.ШаблонЦенника) И СтрокаТЧ.КоличествоЦенников > 0 И НужноПечататьЦенники Тогда
			СоответствиеШаблонов.Вставить(СтрокаТЧ.ШаблонЦенника);
		КонецЕсли;
	КонецЦикла;
	Если ДанныеПечати.Свойство("СтруктураМакетаШаблона") И ЗначениеЗаполнено(ДанныеПечати.СтруктураМакетаШаблона) Тогда
		СоответствиеШаблонов.Вставить(Справочники.ШаблоныЭтикетокИЦенников.ПустаяСсылка());
	КонецЕсли;
	
	// Заполняем коллекцию обязательных полей и формируем соответствие шаблонов.
	Для Каждого КлючИЗначение ИЗ СоответствиеШаблонов Цикл
		
		ШаблонЭтикетокИЦенников = КлючИЗначение.Ключ;
		
		Если ЗначениеЗаполнено(ШаблонЭтикетокИЦенников) Тогда
			КлючШаблон = КлючИЗначение.Ключ.Шаблон; // ХранилищеЗначения
			СтруктураШаблона = КлючШаблон.Получить();
		Иначе
			СтруктураШаблона = ДанныеПечати.СтруктураМакетаШаблона;
		КонецЕсли;
		
		// Структура шаблонов.
		СтруктураНастроек.СоответствиеШаблоновИСтруктурыШаблонов.Вставить(ШаблонЭтикетокИЦенников, СтруктураШаблона);
		
		// Добавляем в массив обязательных полей поля, присутствующие в печатной форме ценника.
		Для Каждого Элемент Из СтруктураШаблона.ПараметрыШаблона Цикл
			СтруктураНастроек.ОбязательныеПоля.Добавить(Элемент.Ключ);
		КонецЦикла;
		
	КонецЦикла;
	
	СтруктураНастроек.ПараметрыДанных.Вставить("Организация", ДанныеПечати.Организация);
	
	СтруктураНастроек.ПараметрыДанных.Вставить("ПравилоОбмена",                 ДанныеПечати.ПравилоОбмена);
	СтруктураНастроек.ПараметрыДанных.Вставить("МаксимальныйКодВесовогоТовара", ДанныеПечати.МаксимальныйКодВесовогоТовара);
	СтруктураНастроек.ПараметрыДанных.Вставить("ПравилоВыгрузкиВВесы",          ДанныеПечати.ПравилоВыгрузкиВВесы);
	
	СтруктураНастроек.ПараметрыДанных.Вставить("ВидЦены",       ДанныеПечати.ВидЦены);
	СтруктураНастроек.ПараметрыДанных.Вставить("Дата",          ДанныеПечати.Дата);
	
	СтруктураНастроек.ПараметрыДанных.Вставить("ВидЦеныДополнительно", ДанныеПечати.ВидЦеныДополнительно);
	СтруктураНастроек.ПараметрыДанных.Вставить("ДатаДополнительно",    ДанныеПечати.ДатаДополнительно);
	
	СтруктураНастроек.ИсходныеДанные = ИсходныеДанные;

#Область ПодготовкаСтруктурыДанныхШаблона
	
	СтруктураРезультата = ПодготовитьСтруктуруДанных(СтруктураНастроек, "Товары");

#КонецОбласти

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

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

Функция СформироватьПечатнуюФормуЭтикеткиДоставки(ДанныеПечати, ОбъектыПечати, КоллекцияПечатныхФормБСП)
	
	СтруктураНастроек = СтруктураНастроек();
	СтруктураНастроек.ОбязательныеПоля.Добавить("Распоряжение");
	СтруктураНастроек.ОбязательныеПоля.Добавить("ШаблонЭтикетки");
	
	СтруктураНастроек.ИмяМакетаСхемыКомпоновкиДанных = "ПоляШаблонаДоставка";
	
	// Собираем используемые поля из шаблонов.
	ТаблицаДоставки = ПолучитьИзВременногоХранилища(ДанныеПечати.АдресВХранилище);
	ПоместитьВоВременноеХранилище(Неопределено, ДанныеПечати.АдресВХранилище); 

	СоответствиеШаблонов = Новый Соответствие;
	Для Каждого СтрокаТЧ Из ТаблицаДоставки Цикл
		Если ЗначениеЗаполнено(СтрокаТЧ.ШаблонЭтикетки) Тогда
			СоответствиеШаблонов.Вставить(СтрокаТЧ.ШаблонЭтикетки);
		КонецЕсли;
	КонецЦикла;
	Если ДанныеПечати.Свойство("СтруктураМакетаШаблона") И ЗначениеЗаполнено(ДанныеПечати.СтруктураМакетаШаблона) Тогда
		СоответствиеШаблонов.Вставить(Справочники.ШаблоныЭтикетокИЦенников.ПустаяСсылка());
	КонецЕсли;
	
	// Заполняем коллекцию обязательных полей и формируем соответствие шаблонов.
	Для Каждого КлючИЗначение Из СоответствиеШаблонов Цикл
		
		ШаблонЭтикетокИЦенников = КлючИЗначение.Ключ;
		
		Если ЗначениеЗаполнено(ШаблонЭтикетокИЦенников) Тогда
			ШаблонЭтикетокИЦенниковШаблон = ШаблонЭтикетокИЦенников.Шаблон; // ХранилищеЗначения
			СтруктураШаблона = ШаблонЭтикетокИЦенниковШаблон.Получить();
		Иначе
			СтруктураШаблона = ДанныеПечати.СтруктураМакетаШаблона;
		КонецЕсли;
		
		// Структура шаблонов.
		СтруктураНастроек.СоответствиеШаблоновИСтруктурыШаблонов.Вставить(КлючИЗначение.Ключ, СтруктураШаблона);
		
		// Добавляем в массив обязательных полей поля, присутствующие в печатной форме ценника.
		Для Каждого Элемент Из СтруктураШаблона.ПараметрыШаблона Цикл
			СтруктураНастроек.ОбязательныеПоля.Добавить(Элемент.Ключ);	
		КонецЦикла;
		
	КонецЦикла;
	
	СтруктураНастроек.ИсходныеДанные = ТаблицаДоставки;

#Область ПодготовкаСтруктурыДанныхШаблона
	
	СтруктураРезультата = ПодготовитьСтруктуруДанных(СтруктураНастроек, "Доставка");
	
	// Подготовка коллекции печатных форм.
	КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
	КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета");
	КоллекцияПечатныхФорм.Колонки.Добавить("СинонимМакета");
	КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент");
	КоллекцияПечатныхФорм.Колонки.Добавить("ИмяКолонкиШаблон");
	КоллекцияПечатныхФорм.Колонки.Добавить("Шаблон");
	
	Для Каждого КлючИЗначение Из СтруктураНастроек.СоответствиеШаблоновИСтруктурыШаблонов Цикл
	
		ПечатнаяФорма = КоллекцияПечатныхФорм.Добавить();
		ПечатнаяФорма.ИмяМакета            = "Этикетка: "+КлючИЗначение.Ключ;
		ПечатнаяФорма.СинонимМакета        =  СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Этикетка: %1'"), КлючИЗначение.Ключ);
		ПечатнаяФорма.ИмяКолонкиШаблон     = "ШаблонЭтикетки";
		ПечатнаяФорма.Шаблон = КлючИЗначение.Ключ;
		
	КонецЦикла;
	
#КонецОбласти
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	КоличествоПоВертикали =0;
	
	Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
		
		НомерРяда    = 0;
		НомерКолонки = 0;
		КоличествоПоВертикали = КоличествоПоВертикали + 1/СтруктураШаблона.КоличествоПоВертикали; 
		Если КоличествоПоВертикали > 1  Тогда
			КоличествоПоВертикали =0;
			
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
				
		Для Каждого СтрокаТовары Из СтруктураРезультата.Таблица Цикл
			
			Если СтрокаТовары[ПечатнаяФорма.ИмяКолонкиШаблон] = ПечатнаяФорма.Шаблон Тогда
				
				СтруктураШаблона = СтруктураНастроек.СоответствиеШаблоновИСтруктурыШаблонов.Получить(СтрокаТовары[ПечатнаяФорма.ИмяКолонкиШаблон]);
				
				Область = СтруктураШаблона.МакетЭтикетки.ПолучитьОбласть(СтруктураШаблона.ИмяОбластиПечати); // ТабличныйДокумент
				
				// Применение настроек табличного документа.
				ЗаполнитьЗначенияСвойств(ТабличныйДокумент, СтруктураШаблона.МакетЭтикетки, , "ОбластьПечати");
				
				Для каждого ПараметрШаблона Из СтруктураШаблона.ПараметрыШаблона Цикл
					Если ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(Область.Параметры, ПараметрШаблона.Значение) Тогда
						НаименованиеКолонки = СтруктураРезультата.СоответствиеПолейСКДКолонкамТаблицы.Получить(Справочники.ШаблоныЭтикетокИЦенников.ИмяПоляВШаблоне(ПараметрШаблона.Ключ));
						Если НаименованиеКолонки <> Неопределено Тогда
							Область.Параметры[ПараметрШаблона.Значение] = СтрокаТовары[НаименованиеКолонки];
						КонецЕсли;
					КонецЕсли;
				КонецЦикла;
				
				НомерКолонки = НомерКолонки + 1;
				
				Если НомерКолонки = 1 Тогда
					
					НомерРяда = НомерРяда + 1;
					
					ТабличныйДокумент.Вывести(Область);
					
				Иначе
					
					ТабличныйДокумент.Присоединить(Область);
					
				КонецЕсли;
				
				Если НомерРяда = СтруктураШаблона.КоличествоПоВертикали И НомерКолонки = СтруктураШаблона.КоличествоПоГоризонтали Тогда
					
					НомерРяда    = 0;
					НомерКолонки = 0;
					КоличествоПоВертикали =0;
					
					ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
					
				ИначеЕсли НомерКолонки = СтруктураШаблона.КоличествоПоГоризонтали Тогда
					
					НомерКолонки = 0;
					КоличествоПоВертикали = КоличествоПоВертикали + 1/СтруктураШаблона.КоличествоПоВертикали;
					
				КонецЕсли;
				
			КонецЕсли;
			
		КонецЦикла; // Цикл по строкам таблицы товаров
		
	КонецЦикла;
	
	СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(ТаблицаДоставки.ВыгрузитьКолонку("Распоряжение"));
	ДанныеПечати.Вставить( "СтруктураТипов", СтруктураТипов );
	
	Возврат ТабличныйДокумент;
	
КонецФункции

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

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

#КонецОбласти

#Область Прочее

Функция УстановитьЗначениеПараметраСКД(КомпоновщикНастроек, ИмяПараметра, ЗначениеПараметра, ИспользоватьНеЗаполненный = Истина)
	
	ПараметрУстановлен = Ложь;
	
	ПараметрКомпоновкиДанных = Новый ПараметрКомпоновкиДанных(ИмяПараметра);
	ЗначениеПараметраКомпоновкиДанных = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ПараметрКомпоновкиДанных);
	Если ЗначениеПараметраКомпоновкиДанных <> Неопределено Тогда
		
		ЗначениеПараметраКомпоновкиДанных.Значение = ЗначениеПараметра;
		ЗначениеПараметраКомпоновкиДанных.Использование = ?(ИспользоватьНеЗаполненный, Истина, ЗначениеЗаполнено(ЗначениеПараметраКомпоновкиДанных.Значение));
		
		ПараметрУстановлен = Истина;
		
	КонецЕсли;
	
	Возврат ПараметрУстановлен;
	
КонецФункции

// Структура настроек.
// 
// Возвращаемое значение:
//  Структура - Структура настроек:
// * ИсходныеДанные - Неопределено -
// * ОбязательныеПоля - Массив из Строка -
// * СоответствиеШаблоновИСтруктурыШаблонов - Соответствие -
// * ПараметрыДанных - Структура -
// * КомпоновщикНастроек - Неопределено -
// * ИмяМакетаСхемыКомпоновкиДанных - Неопределено -
// * ИспользуетсяЦенообразование25 - Неопределено -
Функция СтруктураНастроек() Экспорт
	
	СтруктураНастроек = Новый Структура;
	СтруктураНастроек.Вставить("ИсходныеДанные",                         Неопределено);
	СтруктураНастроек.Вставить("ОбязательныеПоля",                       Новый Массив);
	СтруктураНастроек.Вставить("СоответствиеШаблоновИСтруктурыШаблонов", Новый Соответствие);
	СтруктураНастроек.Вставить("ПараметрыДанных"    ,                    Новый Структура);
	СтруктураНастроек.Вставить("КомпоновщикНастроек",                    Неопределено);
	СтруктураНастроек.Вставить("ИмяМакетаСхемыКомпоновкиДанных",         Неопределено);
	СтруктураНастроек.Вставить("ИспользуетсяЦенообразование25",          Неопределено);
	
	Возврат СтруктураНастроек;
	
КонецФункции

Функция ДанныеДляПечатиЭтикетокДоставки(МассивОбъектов) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	
	МассивТекстовЗапроса = Новый Массив;
	ТекущийОбъект = МассивОбъектов[0];
	
	Если ТипЗнч(ТекущийОбъект) = Тип("ДокументСсылка.ЗаданиеНаПеревозку") Тогда
		
		ТекстЗапросаСозданияВТРаспоряженияПоЗаданию =
		"ВЫБРАТЬ
		|	ЗаданиеНаПеревозкуРаспоряжения.Ссылка КАК ЗаданиеНаПеревозку,
		|	ВЫБОР
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.ЗаданиеВыполняет = ЗНАЧЕНИЕ(Перечисление.ТипыИсполнителейЗаданийНаПеревозку.Перевозчик)
		|			ТОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Перевозчик
		|		ИНАЧЕ ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.ПеревозчикПартнер
		|	КОНЕЦ КАК Перевозчик,
		|	ЗаданиеНаПеревозкуРаспоряжения.Распоряжение КАК Распоряжение,
		|	ЗаданиеНаПеревозкуРаспоряжения.Вес КАК Вес,
		|	ЗаданиеНаПеревозкуРаспоряжения.Объем КАК Объем,
		|	ВЫБОР
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
		|				И ЗаданиеНаПеревозкуРаспоряжения.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= ЗаданиеНаПеревозкуРаспоряжения.Ссылка.ДатаВремяРейсаПланС
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ КАК ОрдерныйСклад,
		|	ЗаданиеНаПеревозкуРаспоряжения.Склад КАК Склад,
		|	ВЫБОР
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.ЗаданиеВыполняет = ЗНАЧЕНИЕ(Перечисление.ТипыИсполнителейЗаданийНаПеревозку.Перевозчик)
		|			И ЕСТЬNULL(ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Перевозчик.ШаблонЭтикетки, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Перевозчик.ШаблонЭтикетки
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.ПолучательОтправитель ССЫЛКА Справочник.Партнеры
		|			И ЕСТЬNULL(ВЫРАЗИТЬ(ЗаданиеНаПеревозкуРаспоряжения.ПолучательОтправитель КАК Справочник.Партнеры).ШаблонЭтикетки, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА ВЫРАЗИТЬ(ЗаданиеНаПеревозкуРаспоряжения.ПолучательОтправитель КАК Справочник.Партнеры).ШаблонЭтикетки
		|		ИНАЧЕ &ШаблонЭтикеткиДоставки
		|	КОНЕЦ КАК ШаблонЭтикетки,
		|	СУММА(ЕСТЬNULL(РасходныйОрдерНаТовары.ВсегоМест, 0)) КАК ВсегоМест
		|ПОМЕСТИТЬ РаспоряженияПоЗаданию
		|ИЗ
		|	Документ.ЗаданиеНаПеревозку.Распоряжения КАК ЗаданиеНаПеревозкуРаспоряжения
		|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходныйОрдерНаТовары КАК РасходныйОрдерНаТовары
		|		ПО ЗаданиеНаПеревозкуРаспоряжения.Ссылка = РасходныйОрдерНаТовары.ЗаданиеНаПеревозку
		|ГДЕ
		|	ЗаданиеНаПеревозкуРаспоряжения.Ссылка В(&ПараметрКоманды)
		|	И НЕ ЗаданиеНаПеревозкуРаспоряжения.Распоряжение ССЫЛКА Документ.ПоручениеЭкспедитору
		|
		|СГРУППИРОВАТЬ ПО
		|	ЗаданиеНаПеревозкуРаспоряжения.Распоряжение,
		|	ЗаданиеНаПеревозкуРаспоряжения.Ссылка,
		|	ВЫБОР
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.Склад.ИспользоватьОрдернуюСхемуПриОтгрузке
		|				И ЗаданиеНаПеревозкуРаспоряжения.Склад.ДатаНачалаОрдернойСхемыПриОтгрузке <= ЗаданиеНаПеревозкуРаспоряжения.Ссылка.ДатаВремяРейсаПланС
		|			ТОГДА ИСТИНА
		|		ИНАЧЕ ЛОЖЬ
		|	КОНЕЦ,
		|	ВЫБОР
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.ЗаданиеВыполняет = ЗНАЧЕНИЕ(Перечисление.ТипыИсполнителейЗаданийНаПеревозку.Перевозчик)
		|			И ЕСТЬNULL(ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Перевозчик.ШаблонЭтикетки, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Перевозчик.ШаблонЭтикетки
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.ПолучательОтправитель ССЫЛКА Справочник.Партнеры
		|			И ЕСТЬNULL(ВЫРАЗИТЬ(ЗаданиеНаПеревозкуРаспоряжения.ПолучательОтправитель КАК Справочник.Партнеры).ШаблонЭтикетки, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА ВЫРАЗИТЬ(ЗаданиеНаПеревозкуРаспоряжения.ПолучательОтправитель КАК Справочник.Партнеры).ШаблонЭтикетки
		|		ИНАЧЕ &ШаблонЭтикеткиДоставки
		|	КОНЕЦ,
		|	ВЫБОР
		|		КОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.ЗаданиеВыполняет = ЗНАЧЕНИЕ(Перечисление.ТипыИсполнителейЗаданийНаПеревозку.Перевозчик)
		|			ТОГДА ЗаданиеНаПеревозкуРаспоряжения.Ссылка.Перевозчик
		|		ИНАЧЕ ЗаданиеНаПеревозкуРаспоряжения.Распоряжение.ПеревозчикПартнер
		|	КОНЕЦ,
		|	ЗаданиеНаПеревозкуРаспоряжения.Склад,
		|	ЗаданиеНаПеревозкуРаспоряжения.Объем,
		|	ЗаданиеНаПеревозкуРаспоряжения.Вес";
		
		ТекстЗапросаПоРаспоряжению =
		"ВЫБРАТЬ
		|	РаспоряженияПоЗаданию.Распоряжение КАК Распоряжение,
		|	РаспоряженияПоЗаданию.Перевозчик КАК Перевозчик,
		|	РаспоряженияПоЗаданию.Вес КАК ВесНакладной,
		|	РаспоряженияПоЗаданию.Объем КАК ОбъемНакладной,
		|	РаспоряженияПоЗаданию.ШаблонЭтикетки КАК ШаблонЭтикетки,
		|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДокументРаспоряжениеТовары.НомерСтроки) КАК КоличествоПозиций
		|,&ТекстЗапросаИмяТЧ
		|ИЗ
		|	РаспоряженияПоЗаданию КАК РаспоряженияПоЗаданию
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекстИмяТЧТовары КАК ДокументРаспоряжениеТовары
		|		ПО (&ТекстУсловияСоединенияШапкиИТЧ)
		|			И (&ТекстСоединенияСРаспоряжениемПоСкладу)
		|ГДЕ
		|	НЕ РаспоряженияПоЗаданию.ОрдерныйСклад
		|
		|СГРУППИРОВАТЬ ПО
		|	РаспоряженияПоЗаданию.Распоряжение,
		|	РаспоряженияПоЗаданию.Перевозчик,
		|	РаспоряженияПоЗаданию.Вес,
		|	РаспоряженияПоЗаданию.Объем,
		|	РаспоряженияПоЗаданию.ШаблонЭтикетки,
		|	РаспоряженияПоЗаданию.ВсегоМест";
		
		МассивТекстовПоРаспоряжениям = Новый Массив;
		
		ТипыРаспоряжений = Метаданные.ОпределяемыеТипы.РаспоряжениеНаДоставку.Тип.Типы();
		ЭтоПервыйТип = Истина;
		
		Для Каждого ТипРаспоряжения из ТипыРаспоряжений Цикл
			
			МетаданныеРаспоряжения = Метаданные.НайтиПоТипу(ТипРаспоряжения);
						
			Если Не ОбщегоНазначения.ЭтоДокумент(МетаданныеРаспоряжения)
				Или МетаданныеРаспоряжения = Метаданные.Документы.ПоручениеЭкспедитору Тогда
				Продолжить;
			Иначе
				
				ТекстЗапроса = ДанныеДляПечатиЭтикетокДоставкиАдаптироватьКРаспоряжению(МетаданныеРаспоряжения, ТекстЗапросаПоРаспоряжению);
				ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстУсловияСоединенияШапкиИТЧ", "РаспоряженияПоЗаданию.Распоряжение = ДокументРаспоряжениеТовары.Ссылка");
				Если ЭтоПервыйТип Тогда
					ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ",&ТекстЗапросаИмяТЧ", "ПОМЕСТИТЬ ВТРаспоряженияИШаблоны");
					ЭтоПервыйТип = Ложь;
				Иначе
					ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ",&ТекстЗапросаИмяТЧ", "");
				КонецЕсли;
				
				МассивТекстовПоРаспоряжениям.Добавить(ТекстЗапроса);
				
			КонецЕсли;
			
				
		КонецЦикла;
		
		Если ПолучитьФункциональнуюОпцию("ИспользоватьОрдерныеСклады") Тогда
			ТекстЗапроса =
			"ВЫБРАТЬ
			|	РаспоряженияПоЗаданию.Распоряжение КАК Распоряжение,
			|	РаспоряженияПоЗаданию.Перевозчик КАК Перевозчик,
			|	РаспоряженияПоЗаданию.Вес КАК ВесНакладной,
			|	РаспоряженияПоЗаданию.Объем КАК ОбъемНакладной,
			|	РаспоряженияПоЗаданию.ШаблонЭтикетки КАК ШаблонЭтикетки,
			|	РаспоряженияПоЗаданию.ВсегоМест КАК КоличествоПозиций
			|ИЗ
			|	РаспоряженияПоЗаданию КАК РаспоряженияПоЗаданию
			|ГДЕ
			|	РаспоряженияПоЗаданию.ОрдерныйСклад
			|
			|СГРУППИРОВАТЬ ПО
			|	РаспоряженияПоЗаданию.Распоряжение,
			|	РаспоряженияПоЗаданию.Перевозчик,
			|	РаспоряженияПоЗаданию.Вес,
			|	РаспоряженияПоЗаданию.Объем,
			|	РаспоряженияПоЗаданию.ШаблонЭтикетки,
			|	РаспоряженияПоЗаданию.ВсегоМест";
			
			МассивТекстовПоРаспоряжениям.Добавить(ТекстЗапроса);
		КонецЕсли;
		
		ТекстЗапросаВТРаспоряженияИШаблоны = СтрСоединить(МассивТекстовПоРаспоряжениям, ОбщегоНазначенияУТ.РазделительЗапросовВОбъединении());
		
		ТекстВыборкиЗаданияБезРаспоряжений =
		"ВЫБРАТЬ
		|	ВложенныйЗапрос.Ссылка КАК Ссылка
		|ИЗ
		|	(ВЫБРАТЬ РАЗЛИЧНЫЕ
		|		ЗаданиеНаПеревозкуРаспоряжения.Ссылка КАК Ссылка
		|	ИЗ
		|		Документ.ЗаданиеНаПеревозку.Распоряжения КАК ЗаданиеНаПеревозкуРаспоряжения
		|			ЛЕВОЕ СОЕДИНЕНИЕ РаспоряженияПоЗаданию КАК РаспоряженияПоЗаданию
		|			ПО ЗаданиеНаПеревозкуРаспоряжения.Ссылка = РаспоряженияПоЗаданию.ЗаданиеНаПеревозку
		|	ГДЕ
		|		ЗаданиеНаПеревозкуРаспоряжения.Ссылка В(&ПараметрКоманды)
		|		И РаспоряженияПоЗаданию.ЗаданиеНаПеревозку ЕСТЬ NULL
		|	
		|	ОБЪЕДИНИТЬ ВСЕ
		|	
		|	ВЫБРАТЬ
		|		ЗаданияНаПеревозку.Ссылка
		|	ИЗ
		|		Документ.ЗаданиеНаПеревозку КАК ЗаданияНаПеревозку
		|			ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаПеревозку.Распоряжения КАК ЗаданиеНаПеревозкуРаспоряжения
		|			ПО ЗаданияНаПеревозку.Ссылка = ЗаданиеНаПеревозкуРаспоряжения.Ссылка
		|	ГДЕ
		|		ЗаданияНаПеревозку.Ссылка В(&ПараметрКоманды)
		|		И ЗаданиеНаПеревозкуРаспоряжения.Ссылка ЕСТЬ NULL) КАК ВложенныйЗапрос
		|ГДЕ
		|	НЕ ВложенныйЗапрос.Ссылка ЕСТЬ NULL";
		
		МассивТекстовЗапроса.Добавить(ТекстЗапросаСозданияВТРаспоряженияПоЗаданию);
		МассивТекстовЗапроса.Добавить(ТекстЗапросаВТРаспоряженияИШаблоны);
		МассивТекстовЗапроса.Добавить(ТекстВыборкиЗаданияБезРаспоряжений);
		
	Иначе
		
		ТекстЗапросаПоРаспоряжению =
		"ВЫБРАТЬ
		|	ДокументРаспоряжение.Ссылка КАК Распоряжение,
		|	ДокументРаспоряжение.ПеревозчикПартнер КАК Перевозчик,
		|	СУММА(ВЫБОР
		|			КОГДА ДокументРаспоряжениеТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
		|					ИЛИ &ТекстЗапросаВесУпаковки = 0
		|				ТОГДА &ТекстЗапросаВесНоменклатуры * ДокументРаспоряжениеТовары.Количество
		|			ИНАЧЕ &ТекстЗапросаВесУпаковки * ДокументРаспоряжениеТовары.КоличествоУпаковок
		|		КОНЕЦ) КАК ВесНакладной,
		|	СУММА(ВЫБОР
		|			КОГДА ДокументРаспоряжениеТовары.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
		|					ИЛИ &ТекстЗапросаОбъемУпаковки = 0
		|				ТОГДА &ТекстЗапросаОбъемНоменклатуры * ДокументРаспоряжениеТовары.Количество
		|			ИНАЧЕ &ТекстЗапросаОбъемУпаковки * ДокументРаспоряжениеТовары.КоличествоУпаковок
		|		КОНЕЦ) КАК ОбъемНакладной,
		|	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДокументРаспоряжениеТовары.НомерСтроки) КАК КоличествоПозиций,
		|	ВЫБОР
		|		КОГДА (ДокументРаспоряжение.СпособДоставки = ЗНАЧЕНИЕ(Перечисление.СпособыДоставки.Самовывоз)
		|				ИЛИ ДокументРаспоряжение.СпособДоставки = ЗНАЧЕНИЕ(Перечисление.СпособыДоставки.ДоКлиента))
		|				И ЕСТЬNULL(&ТекстЗапросаШаблонИзКарточкиПартнера, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА &ТекстЗапросаШаблонИзКарточкиПартнера
		|		КОГДА ЕСТЬNULL(ДокументРаспоряжение.ПеревозчикПартнер.ШаблонЭтикетки, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА ДокументРаспоряжение.ПеревозчикПартнер.ШаблонЭтикетки
		|		ИНАЧЕ &ШаблонЭтикеткиДоставки
		|	КОНЕЦ КАК ШаблонЭтикетки
		|,&ТекстЗапросаИмяТЧ
		|ИЗ
		|	ТекстИмяШапкаДокумента КАК ДокументРаспоряжение
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТекстИмяТЧТовары КАК ДокументРаспоряжениеТовары
		|		ПО &ТекстУсловияСоединенияШапкиИТЧ
		|ГДЕ
		|	ДокументРаспоряжение.Ссылка В(&ПараметрКоманды)
		|
		|СГРУППИРОВАТЬ ПО
		|	ДокументРаспоряжение.Ссылка,
		|	ДокументРаспоряжение.ПеревозчикПартнер,
		|	ВЫБОР
		|		КОГДА (ДокументРаспоряжение.СпособДоставки = ЗНАЧЕНИЕ(Перечисление.СпособыДоставки.Самовывоз)
		|				ИЛИ ДокументРаспоряжение.СпособДоставки = ЗНАЧЕНИЕ(Перечисление.СпособыДоставки.ДоКлиента))
		|				И ЕСТЬNULL(&ТекстЗапросаШаблонИзКарточкиПартнера, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА &ТекстЗапросаШаблонИзКарточкиПартнера
		|		КОГДА ЕСТЬNULL(ДокументРаспоряжение.ПеревозчикПартнер.ШаблонЭтикетки, ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)) <> ЗНАЧЕНИЕ(Справочник.ШаблоныЭтикетокИЦенников.ПустаяСсылка)
		|			ТОГДА ДокументРаспоряжение.ПеревозчикПартнер.ШаблонЭтикетки
		|		ИНАЧЕ &ШаблонЭтикеткиДоставки
		|	КОНЕЦ";
		
		СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);

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

Функция ДанныеДляПечатиЭтикетокДоставкиАдаптироватьКРаспоряжению(МетаданныеРаспоряжения, ТекстЗапросаПоРаспоряжению)
	
	ИменаТЧТовары = Новый Соответствие;
	ИменаТЧТовары.Вставить(Метаданные.Документы.ЗаявкаНаВозвратТоваровОтКлиента,"ЗаменяющиеТовары");

	
	Если МетаданныеРаспоряжения.ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда
		ИмяТЧТовары = "Товары";
	Иначе
		ИмяТЧТовары = ИменаТЧТовары.Получить(МетаданныеРаспоряжения);
		
		Если ИмяТЧТовары = Неопределено Тогда
			ТекстИсключения = НСтр("ru = 'Для типа %ТипРаспоряжения% распоряжения на доставку не определен запрос выборки данных доставки.'");
			ТекстИсключения = СтрЗаменить(ТекстИсключения, "%ТипРаспоряжения%", МетаданныеРаспоряжения.ПолноеИмя());
			ВызватьИсключение ТекстИсключения;
		КонецЕсли;
		
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапросаПоРаспоряжению, "ТекстИмяТЧТовары", МетаданныеРаспоряжения.ПолноеИмя() + "." + ИмяТЧТовары);
	
	Если МетаданныеРаспоряжения.ТабличныеЧасти[ИмяТЧТовары].Реквизиты.Найти("Склад") <> Неопределено Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстСоединенияСРаспоряжениемПоСкладу",
		"РаспоряженияПоЗаданию.Склад = ДокументРаспоряжениеТовары.Склад");
	Иначе
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстСоединенияСРаспоряжениемПоСкладу",
		"ИСТИНА");
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ТекстИмяШапкаДокумента", МетаданныеРаспоряжения.ПолноеИмя());
	
	Если МетаданныеРаспоряжения.Реквизиты.Найти("Партнер") <> Неопределено Тогда
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстЗапросаШаблонИзКарточкиПартнера",
		"ДокументРаспоряжение.Партнер.ШаблонЭтикетки");
	Иначе
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ТекстЗапросаШаблонИзКарточкиПартнера",
		"NULL");
	КонецЕсли;
	
	ТекстЗапроса = СтрЗаменить(
		ТекстЗапроса, 
		"&ТекстЗапросаВесНоменклатуры", 
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки("ДокументРаспоряжениеТовары.Номенклатура.ЕдиницаИзмерения", "ДокументРаспоряжениеТовары.Номенклатура"));

	ТекстЗапроса = СтрЗаменить(
		ТекстЗапроса, 
		"&ТекстЗапросаОбъемНоменклатуры", 
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаОбъемУпаковки("ДокументРаспоряжениеТовары.Номенклатура.ЕдиницаИзмерения", "ДокументРаспоряжениеТовары.Номенклатура"));

	ТекстЗапроса = СтрЗаменить(
		ТекстЗапроса, 
		"&ТекстЗапросаВесУпаковки", 
		Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаВесУпаковки("ДокументРаспоряжениеТовары.Упаковка", "ДокументРаспоряжениеТовары.Номенклатура"));

	ТекстЗапроса = СтрЗаменить(
		ТекстЗапроса, 
		"&ТекстЗапросаОбъемУпаковки", 
					Справочники.УпаковкиЕдиницыИзмерения.ТекстЗапросаОбъемУпаковки("ДокументРаспоряжениеТовары.Упаковка", "ДокументРаспоряжениеТовары.Номенклатура"));
	
	Возврат ТекстЗапроса;

КонецФункции

Функция ДанныеДляПечатиЭтикетокУпаковочныеЛисты(ОбъектыПечати) Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Запрос = Новый Запрос;
	
	Если ТипЗнч(ОбъектыПечати[0]) = Тип("ДокументСсылка.РасходныйОрдерНаТовары") Тогда
		Запрос.Текст =
		"ВЫБРАТЬ
		|	РасходныйОрдерНаТоварыОтгружаемыеТовары.УпаковочныйЛист КАК Ссылка,
		|	РасходныйОрдерНаТоварыОтгружаемыеТовары.УпаковочныйЛист.Код КАК Штрихкод
		|ИЗ
		|	Документ.РасходныйОрдерНаТовары.ОтгружаемыеТовары КАК РасходныйОрдерНаТоварыОтгружаемыеТовары
		|ГДЕ
		|	РасходныйОрдерНаТоварыОтгружаемыеТовары.ЭтоУпаковочныйЛист
		|	И РасходныйОрдерНаТоварыОтгружаемыеТовары.Ссылка В(&ОбъектыПечати)";
	ИначеЕсли ТипЗнч(ОбъектыПечати[0]) = Тип("ДокументСсылка.УпаковочныйЛист") Тогда
		Запрос.Текст =
		"ВЫБРАТЬ
		|	УпаковочныйЛист.Ссылка,
		|	УпаковочныйЛист.Код КАК Штрихкод
		|ИЗ
		|	Документ.УпаковочныйЛист КАК УпаковочныйЛист
		|ГДЕ
		|	УпаковочныйЛист.Ссылка В(&ОбъектыПечати)";
	Иначе 
		Возврат Новый Структура ("ЕстьШаблонЭтикетки",Ложь);
	КонецЕсли; 
	
	Запрос.УстановитьПараметр("ОбъектыПечати",ОбъектыПечати);
	ТаблицаУпаковочныхЛистов = Запрос.Выполнить().Выгрузить();
	ЕстьЭтикеткиДляПечати = ТаблицаУпаковочныхЛистов.Количество() > 0;
	ШаблонЭтикетки = Константы.ШаблонЭтикеткиУпаковочногоЛиста.Получить();
	ЕстьШаблонЭтикетки = ЗначениеЗаполнено(ШаблонЭтикетки);
		
	СтруктураВозврата = Новый Структура;
	СтруктураВозврата.Вставить("ЕстьШаблонЭтикетки",    ЕстьШаблонЭтикетки);
	СтруктураВозврата.Вставить("ШаблонЭтикетки",        ШаблонЭтикетки);
	СтруктураВозврата.Вставить("ЕстьЭтикеткиДляПечати", ЕстьЭтикеткиДляПечати);
	Если ЕстьЭтикеткиДляПечати Тогда
		СтруктураВозврата.Вставить("АдресВХранилище",   ПоместитьВоВременноеХранилище(ТаблицаУпаковочныхЛистов, Новый УникальныйИдентификатор));
	КонецЕсли;
	
	Возврат СтруктураВозврата;
	
КонецФункции

Функция ЗаменитьСпецСимволы(Знач ВходящаяСтрока)
	
	Перем Результат;
	
	Результат = СтрЗаменить(ВходящаяСтрока, ".", "");
	Результат = СтрЗаменить(Результат, " ", "");
	Результат = СтрЗаменить(Результат, "[", "_");
	Результат = СтрЗаменить(Результат, "]", "_");
	Результат = СтрЗаменить(Результат, "(", "_");
	Результат = СтрЗаменить(Результат, ")", "_");
	Результат = СтрЗаменить(Результат, "*", "_");
	Результат = СтрЗаменить(Результат, "-", "_");
	Результат = СтрЗаменить(Результат, "+", "_");
	Результат = СтрЗаменить(Результат, "/", "_");
	Результат = СтрЗаменить(Результат, "@", "_");
	Результат = СтрЗаменить(Результат, "#", "_");
	Результат = СтрЗаменить(Результат, "$", "_");
	Результат = СтрЗаменить(Результат, "%", "_");
	Результат = СтрЗаменить(Результат, "^", "_");
	Результат = СтрЗаменить(Результат, "&", "_");
	Результат = СтрЗаменить(Результат, "*", "_");
	Результат = СтрЗаменить(Результат, ">", "_");
	Результат = СтрЗаменить(Результат, "<", "_");
	Результат = СтрЗаменить(Результат, "?", "_");
	Результат = СтрЗаменить(Результат, ",", "_");
	
	Возврат Результат;

КонецФункции

#КонецОбласти

#КонецОбласти

#КонецЕсли

Связанные материалы