Изменения модулей форм документов ЧекККМ, ПКО, РКО для конфигураций 1С 7.7 "Торговля и склад, ред. 9.2" и "Комплексная конфигурация, ред. 4.5"
Вставки авторского кода для лучшего ориентирования отмечены комментарием //тщи

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

			Если ОстКолво > 0 Тогда
				коэф = Колво / Список.Количество;
				Сумма = Список.Сумма;
				СуммаНДС = Список.СуммаНДС;
				Список.Количество = Колво;
				Список.Сумма = окр(Сумма*коэф,2,1);
				Список.СуммаНДС = окр(СуммаНДС*коэф,2,1);
				
				Список.Выгрузить(СтрокаСписка,й,й);
				Список.НоваяСтрока(й+1);
				Список.Заполнить(СтрокаСписка,й+1,й+1);
				
				Список.Количество = ОстКолво;
				Список.Сумма = Сумма-окр(Сумма*коэф,2,1);
				Список.СуммаНДС = СуммаНДС-окр(СуммаНДС*коэф,2,1);

				Список.Тег1230 = "";
				Список.Тег1231 = "";
			КонецЕсли;
			
		Иначе	//Заполним номер ГТД и Страну из Номенклатуры, если там есть	
			Если ТипЗначения(ТекТМЦ) <> 11  Тогда //Справочник
			ИначеЕсли ТекТМЦ.Вид() = "Номенклатура" Тогда
				// Заполним номер ГТД и Страну из Номенклатуры, если там есть...
				Если ПустоеЗначение(ТекТМЦ.НомерГТД) = 0 Тогда
					Список.Тег1231 = СокрЛП(ТекТМЦ.НомерГТД);   
				КонецЕсли;
				
				Если ПустоеЗначение(ТекТМЦ.СтранаПроисхождения) = 1 Тогда
				ИначеЕсли Число(ТекТМЦ.СтранаПроисхождения.Код) <> 643 Тогда
					Список.Тег1230 = Число(ТекТМЦ.СтранаПроисхождения.Код);   
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		й = й + 1
		
	КонецЦикла;
	
	Возврат 1
КонецФункции	


1) В модуле формы документа ЧекККМ заменить процедуру ПробитьЧекНаККМ():
//вариант без выбра типа оплаты (НАЛИЧНЫЕ / БЕЗНАЛ) и адреса покупателя на форме документа (выбор производится в отдельном окне при пробитии чека)
//Для добавления возможности выбора типа оплаты на ДИАЛОГЕ документа, используйте файл TIS1003_54FZ.md (также дополнительно взять оттуда изменения модулей формы и проведения документа - они немного отличаются от этого варианта)

//******************************************************************************
Функция ПробитьЧекНаККМ()
	Перем НомерЧека;
	
	СписокТоваров = СоздатьОбъект("ТаблицаЗначений");
	СписокТоваров.НоваяКолонка("ТовНаим"   , "Строка");
	СписокТоваров.НоваяКолонка("Цена"      , "Число",15,2);  //тщи
	СписокТоваров.НоваяКолонка("Количество", "Число");
	СписокТоваров.НоваяКолонка("Сумма"	   , "Число",15,2);  //тщи 54ФЗ ТИС988
	СписокТоваров.НоваяКолонка("СтавкаНДС" , "Число");  	 //тщи 54ФЗ ТИС988
	//СписокТоваров.НоваяКолонка("СуммаНДС"	   	   , "Число",15,2);  //тщи здесь не используется
	СписокТоваров.НоваяКолонка("ПредметРасчета"   , "Число");  //тщи для ФФД 1.05 и выше
	СписокТоваров.НоваяКолонка("СпособРасчета"    , "Число");  //тщи для ФФД 1.05 и выше
	СписокТоваров.НоваяКолонка("ЕдИзм"   	, "Строка");   	   //тщи для ФФД 1.05 и выше
		//Наличие суффикса "_п" в наименовании тега определяет будет ли выведено в чеке значение тега нефискальной строкой для удобства пользователя, или будет значение только передано в ОФД.
		//Рекомендуем управлять печатью тегов настройками драйвера ККТ
	СписокТоваров.НоваяКолонка("Тег1229",	"Число");		//Акциз, заполняется если предмет расчета признается объектом налогообложения акцизами и расчет осуществляется между организациями и (или) индивидуальными предпринимателями с использованием наличных денежных средств и (или) с предъявлением электронных средств платежа.
	СписокТоваров.НоваяКолонка("Тег1230",	"Строка",3);	//код страны происхождения товара (для России и группы стран (например, Евросоюз) не заполняется)
	СписокТоваров.НоваяКолонка("Тег1231",	"Строка");		//Номер таможенной декларации
	СписокТоваров.НоваяКолонка("Номенклатура");			//для подбора ГТД из движений документа
	СписокТоваров.НоваяКолонка("Коэффициент", "Число");    //для подбора ГТД из движений документа

	ВыбратьСтроки();
	Пока ПолучитьСтроку() = 1 Цикл
		СписокТоваров.НоваяСтрока();
		СписокТоваров.ТовНаим    = ?(ПустоеЗначение(Номенклатура.ПолнНаименование)=1, Номенклатура.Наименование, Номенклатура.ПолнНаименование);  //тщи учтено полное наименование
		СписокТоваров.Цена       = Цена;
		СписокТоваров.Количество = Количество;
		СписокТоваров.Сумма		 = Сумма;                                           //тщи 54ФЗ ТИС988
		СписокТоваров.СтавкаНДС  = 100 * глНачисляемыйНДС(Номенклатура.СтавкаНДС);  //тщи 54ФЗ ТИС988
		Если Номенклатура.СтавкаНДС = Перечисление.СтавкиНДС.БезНДС Тогда           //тщи
			СписокТоваров.СтавкаНДС = -1                                            //тщи для разделения ставок 0% и Без НДС
		КонецЕсли;                                                                  //тщи
		
		Если Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Услуга Тогда
			СписокТоваров.ПредметРасчета = 4; //У - УСЛУГА
		ИначеЕсли Номенклатура.ВидНоменклатуры = Перечисление.ВидыНоменклатуры.Работа Тогда
			СписокТоваров.ПредметРасчета = 3; //Р - РАБОТА
		ИначеЕсли Метаданные.Справочник(Номенклатура.Вид()).Реквизит("АлкогольнаяПродукция").Выбран()=1 Тогда
			СписокТоваров.ПредметРасчета = ?(Номенклатура.АлкогольнаяПродукция=1, 2, 1) //Т - Товар, АТ - Подакцизный товар
		Иначе
			СписокТоваров.ПредметРасчета = 1; //Т - ТОВАР
		КонецЕсли;
		СписокТоваров.ЕдИзм = сокрлп(Единица); //?(ПустоеЗначение(Единица.ОКЕИ)=1, "", ?(ПустоеЗначение(Единица.ОКЕИ.ПолнНаименование)=1, Единица.ОКЕИ.Наименование, Единица.ОКЕИ.ПолнНаименование));

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

		Если глЕстьРеквизитШапки("ОплатаКартой", Вид()) = 1 Тогда                       //если диалог документ доработан для указания типа оплаты картой
			ПризнакОплатыКартой = ПолучитьАтрибут("ОплатаКартой");
			Данные.ДобавитьЗначение(ПризнакОплатыКартой,"ТипОплаты"); //чтобы не запрашивать тип оплаты в отдельном диалоге перед печатью чека, (т.к. тип оплаты вводится в чеке), 1 -  запрашивать тип оплаты в отдельном диалоге перед печатью чека. Для работы этого параметра обязательно передавать параметр Контекст!
		Иначе
			ПризнакОплатыКартой = 0
		КонецЕсли;
		
		Если (ПризнакОплатыКартой = 0) и (Получено < Итог("Сумма")) и (Получено <> 0) Тогда
	 		Сообщить("Полученной суммы недостаточно для оплаты!","!!");
			возврат 0
		КонецЕсли;
	 	
		Если глЕстьРеквизитШапки("ФПД", ДокОснование.Вид()) = 1 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
			Данные.ДобавитьЗначение(ДокОснование.ФПД,"Тег1192");
		КонецЕсли;
		
	Иначе
 		Сообщить("Нет позиций для вывода в чек ККМ!","!!");
 		Возврат 0
	КонецЕсли;
	//[-] тщи 54ФЗ

	ПризнВозврата = ?(ВидОперации = Перечисление.ВидыОперацийЧекККМ.Чек, 0, 1);
	ПУП           = 0;	Кассир = "";	КассирИНН = "";
	
	//[+] можно раскомментировать для ТИС релиза 988 или более нового 
	//ВыбКасса = глЗначениеПоУмолчанию("ОсновнаяКасса");
	//ВыбКассир = "";
	//
	//Если ПустоеЗначение(ВыбКасса) = 0 Тогда
	//    ВыбКассир = ВыбКасса.КассирККМ.Получить(ДатаДок);
	//	Если ПустоеЗначение(ВыбКассир) = 1 Тогда
	//        ВыбКассир = Фирма.ЮрЛицо.Кассир.Получить(ДатаДок);
	//    КонецЕсли;
	//КонецЕсли; 
	//
	//Кассир = глФамилияИмяОтчество(ВыбКассир);
	//КассирИНН = ВыбКассир.ИНН;	
	//[-] можно раскомментировать для ТИС релиза 988 или более нового 
    	
	ЧекПробитККМ  = глФРПечататьЧек(СписокТоваров, Итог("Сумма"), ?((Получено=0)и(ПризнакОплатыКартой=0),Итог("Сумма"),Получено), Скидка.Процент, ПризнВозврата, Склад.НомерСекции, НомерЧека, ПУП, Кассир, КассирИНН); //тщи ?(Получено=0,Итог("Сумма"),Получено) -> ?((Получено=0)и(ПризнакОплатыКартой=0),Итог("Сумма"),Получено)   //если Получено < СуммаЧека, то значит оплата идет по банковской карте

	Если ЧекПробитККМ = 1 Тогда
		НомерЧекаККМ = НомерЧека;
		Попытка						//[+] тщи 54ФЗ
			АдресПокупателя = Данные.Получить("АдресПокупателя");
			НомерСменыККМ 	= Данные.Получить("НомерСмены");
			Получено 		= Данные.Получить("Получено");
			ФПД 			= Данные.Получить("ФПД");
			НомерФД 		= Данные.Получить("НомерФД");
			Если Итог("Сумма")>Получено Тогда
				Картой = Итог("Сумма")-Получено;
				ОплатаКартой = 1;
			Иначе
				Картой = 0;
				ОплатаКартой = 0;
			КонецЕсли
		Исключение КонецПопытки;	//[-] тщи 54ФЗ
		ПриЗаписиПерепроводить(0);
		Записать();
		ПриЗаписиПерепроводить(1);
		
		// Откроем денежный ящик, если он подключен
		глДПОткрытьДенежныйЯщик();
	КонецЕсли;
	
	Возврат ЧекПробитККМ;
	
КонецФункции // ПробитьЧекНаККМ()


2) В модуле формы документа ПКО (Приходный кассовый ордер) заменить процедуры  ПечатьЧека() и ПризнакПробитияЧека():
//Для отключения передачи данных о покупателе в ОФД можно добавить в шапку документа реквизит "НеПередаватьКлиентаВОФД" и вывести его на форме документа в виде флажка (подробнее см. в файле TIS1003_54FZ.md)

//******************************************************************************
Функция ПризнакПробитияЧека()
    
	Если НомерЧекаККМ <> 0 Тогда
  		Если НомерЧекаККМ > 0  Тогда
 			ПечФПД = "";
			Если Метаданные.Документ(Вид()).РеквизитШапки("ФПД").Выбран() = 0 Тогда  //[+] тщи
			ИначеЕсли ПустоеЗначение(ПолучитьАтрибут("ФПД"))= 0 Тогда
  				ПечФПД = ", ФПД: "+ Сокрлп(ПолучитьАтрибут("ФПД"))
  			КонецЕсли;                                        //[-] тщи
			Возврат "№ чека: "+СокрЛП(НомерЧекаККМ) + ПечФПД; //тщи  + ПечФПД
		Иначе
			Возврат "Чек пробит";
		КонецЕсли;
	Иначе
		Возврат "";
    КонецЕсли;
	
КонецФункции

//******************************************************************************
Процедура ПечатьЧека()       
	
	Если КодОперации <> Перечисление.КодыОпераций.ОплатаОтПокупателя Тогда
	    Сообщить("Чек может быть напечатан только при получении оплаты от покупателя!");
		Возврат;
	КонецЕсли;
	
	//Если глФРДляПриемаНаличныхОтЮрЛиц <> 1 Тогда    //тщи отключаем эту проверку
	//	Сообщить("Фискальный регистратор не предназначен для отражения наличных денежных расчетов.");
	//	Возврат;
	//КонецЕсли;
	
	Если НомерЧекаККМ <> 0 Тогда
	    Предупреждение("Чек уже пробит на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли глФРВкл=0 Тогда
	    Предупреждение("Фискальный регистратор не подключен!",60);
		Возврат;
	ИначеЕсли (ОблагаетсяНП=1) и (СтавкаНП.Ставка<>0) Тогда
	    Предупреждение("Чтобы распечатать чек на фискальном регистраторе" + РазделительСтрок +
		               "необходимо, чтобы ставка НП была равна 0!",60);
		Возврат;
	ИначеЕсли ПометкаУдаления()=1 Тогда
	    Предупреждение("Документ помечен на удаление, поэтому" + РазделительСтрок +
		               "нельзя пробить чек на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли Проведен()=0 Тогда
		Если Вопрос("Провести документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
			Если Провести()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	ИначеЕсли Модифицированность()=1 Тогда
		Если Вопрос("Сохранить документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	КонецЕсли;
	
	Список = СоздатьОбъект("ТаблицаЗначений");
	Список.НоваяКолонка("ТовНаим"   , "Строка");
	Список.НоваяКолонка("Цена"      , "Число",15,2);	//тщи
	Список.НоваяКолонка("Количество", "Число");
	Список.НоваяКолонка("НДС"       , "Число");
	Список.НоваяКолонка("Сумма"	    , "Число",15,2);	//[+] тщи 54ФЗ ТИС988
	Список.НоваяКолонка("СуммаНДС"	, "Число",15,2);	//тщи
	Список.НоваяКолонка("ПредметРасчета"   , "Число");	//тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("СпособРасчета"    , "Число");	//тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("ЕдИзм"   	, "Строка");		//тщи для ФФД 1.05 и выше
		//Наличие суффикса "_п" в наименовании тега определяет будет ли выведено в чеке значение тега нефискальной строкой для удобства пользователя, или будет значение только передано в ОФД.
		//Рекомендуем управлять печатью тегов настройками драйвера ККТ
	Список.НоваяКолонка("Тег1229",	"Число");		//Акциз, заполняется если предмет расчета признается объектом налогообложения акцизами и расчет осуществляется между организациями и (или) индивидуальными предпринимателями с использованием наличных денежных средств и (или) с предъявлением электронных средств платежа.
	Список.НоваяКолонка("Тег1230",	"Строка",3);	//код страны происхождения товара (для России и группы стран (например, Евросоюз) не заполняется)
	Список.НоваяКолонка("Тег1231",	"Строка");		//Номер таможенной декларации
	Список.НоваяКолонка("Номенклатура");			//для подбора ГТД из движений документа
	Список.НоваяКолонка("Коэффициент", "Число");    //для подбора ГТД из движений документа

	ДокумОснование = "";
	Скидка            = 0; //тщи 54ФЗ перенес выше
	
	Если ПустоеЗначение(ДокОснование) = 0 Тогда
		Если (ДокОснование.Вид() = "ВозвратПоставщику")
			или (ДокОснование.Вид() = "ЗаявкаПокупателя") 
			или (ДокОснование.Вид() = "ОтчетКомиссионера")
			или (ДокОснование.Вид() = "Реализация")
			или (ДокОснование.Вид() = "РеализацияПрочее")
			или (ДокОснование.Вид() = "РеализацияРозница") Тогда
	        //Если ДокОснование.Итог("Сумма") = Сумма Тогда  //тщи 54ФЗ
			    ДокумОснование = ДокОснование;
			//КонецЕсли;	                                 //тщи 54ФЗ
		КонецЕсли;
	КонецЕсли;	
	
	Если СтавкаНДС.Выбран() = 0 Тогда 				//[+] тщи 54ФЗ
		СтавкаНДСПоДокОснованию = "<авто>"
	ИначеЕсли СтавкаНДС = Перечисление.СтавкиНДС.БезНДС Тогда
		СтавкаНДСПоДокОснованию = -1                              	//для разделения ставок 0% и Без НДС
	Иначе
		СтавкаНДСПоДокОснованию = глНачисляемыйНДС(СтавкаНДС)*100;   
	КонецЕсли;
	ПринятоОтОснование = ?(ПустаяСтрока(ПринятоОт)=0,"Принято от ","")+СокрЛП(СокрЛП(ПринятоОт)+" "+СокрЛП(Основание)); 		//[-] тщи 54ФЗ
	
	Если ПустоеЗначение(ДокумОснование) = 1 Тогда	//[-] тщи 54ФЗ ТИС988
		Список.НоваяСтрока();
		Список.ТовНаим    = ПринятоОтОснование;		//тщи 54ФЗ
		Список.Цена       = Сумма;
		Список.Количество = 1;
		Список.НДС        = СтавкаНДСПоДокОснованию;//тщи 54ФЗ
		Список.Сумма      = 0; //Сумма;            		//[+] тщи 54ФЗ ТИС988

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

		Если глЕстьРеквизитШапки("ОплатаКартой", Вид()) = 1 Тогда                       //если диалог документ доработан для указания типа оплаты картой
			ПризнакОплатыКартой = ПолучитьАтрибут("ОплатаКартой");
			Данные.ДобавитьЗначение(ПризнакОплатыКартой,"ТипОплаты");	 	//чтобы не запрашивать тип оплаты в отдельном диалоге перед печатью чека, (т.к. тип оплаты вводится в чеке), 1 -  запрашивать тип оплаты в отдельном диалоге перед печатью чека. Для работы этого параметра обязательно передавать параметр Контекст!
		Иначе
			ПризнакОплатыКартой = 0
		КонецЕсли;
		
		Если глЕстьРеквизитШапки("Получено", Вид()) = 1 Тогда                       //если диалог документа доработан для указания типа оплаты картой
			Получено = ПолучитьАтрибут("Получено");     //получено НАЛИЧНЫМИ (остальное - КАРТА)
			Если (Получено=0) и (ПризнакОплатыКартой=0) Тогда
				Получено = СуммаЧека
			КонецЕсли;
		Иначе
			Получено = ?(ПризнакОплатыКартой = 1, 0, СуммаЧека)
		КонецЕсли;
	
		Если (Получено < СуммаЧека) и (ПризнакОплатыКартой = 0) Тогда  		//тщи если Получено < СуммаЧека, то значит оплата идет по банковской карте
	 		Предупреждение("Полученной суммы недостаточно для оплаты!",60);
	 		Возврат
	 	КонецЕсли;
	 	
		Данные.ДобавитьЗначение(ПринятоОтОснование, "Основание");
		Данные.ДобавитьЗначение(СтавкаНДСПоДокОснованию, "НДСпоУмолч");
	 	Если ПустоеЗначение(ДокумОснование) = 0 Тогда
			Данные.ДобавитьЗначение(ДокумОснование,"Документ");	//ссылка на документ-основание
		КонецЕсли;
	 	Если ПустоеЗначение(Договор) = 0 Тогда
			Данные.ДобавитьЗначение(Договор.Наименование,"Договор");	//договор контрагента
		КонецЕсли;
		
		Если ПустоеЗначение(ДокОснование) = 1 Тогда //если был частичный возврат по пред.чеку
		ИначеЕсли глЕстьРеквизитШапки("ФПД", ДокОснование.Вид()) = 1 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
			Данные.ДобавитьЗначение(ДокОснование.ФПД,"Тег1192");
		ИначеЕсли глЕстьРеквизитШапки("ДокОснование", ДокОснование.Вид()) = 0 Тогда
		ИначеЕсли ПустоеЗначение(ДокОснование.ДокОснование) = 0 Тогда
			Док = СоздатьОбъект("Документ");
			Док.ВыбратьПодчиненныеДокументы(,,ДокОснование.ДокОснование);
			Пока Док.ПолучитьДокумент() = 1 Цикл
				Если Док.ТекущийДокумент() = ТекущийДокумент() Тогда
				ИначеЕсли глЕстьРеквизитШапки("ФПД", Док.Вид()) = 0 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
				ИначеЕсли ПустоеЗначение(Док.ФПД) = 0 Тогда   //??? алгоритм может запутаться, если пробиты множественные возвраты
					Данные.ДобавитьЗначение(Док.ФПД,"Тег1192");
					прервать
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
		Если ?(глЕстьРеквизитШапки("НеПередаватьКлиентаВОФД", Вид())=0,0,ПолучитьАтрибут("НеПередаватьКлиентаВОФД")) = 1 Тогда //теги 1227 и 1228 не нужно передавать в ОФД
		ИначеЕсли (КодОперации = глКО.ОплатаОтПокупателя) ИЛИ
		     (КодОперации = глКО.ВозвратОплатыОтПоставщика)ИЛИ
			 (КодОперации = глКО.РозничнаяВыручка) ИЛИ
			 (КодОперации = глКО.РозничнаяВыручкаЕНВД) ИЛИ 
			 (КодОперации = глКО.РозничнаяВыручкаЗаПринятые) ИЛИ
			 (КодОперации = глКО.РозничнаяВыручкаЗаПринятыеЕНВД) Тогда
			 	КлиентИНН = "";
			 	Если ПустоеЗначение(Контрагент) = 1 Тогда
			 		Предупреждение("Не указан контрагент!",60);
			 		Возврат
				ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо) = 1 Тогда
			 		Предупреждение("Не указано юр/физлицо контрагента!",60);
			 		Возврат
				//ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо.ИНН) = 1 Тогда //для ФФД 1.1
			 	//	Предупреждение("Не указан ИНН контрагента!",60);   
			 	//	Возврат
			 	Иначе
			 		КлиентИНН = сокрлп(Контрагент.ЮрФизЛицо.ИНН); 
			 	КонецЕсли;
				поз = Найти(КлиентИНН, "/");
				Если поз > 0 Тогда
					КлиентИНН = лев(КлиентИНН, поз-1)
				Иначе
					поз = Найти(КлиентИНН, "\");
					Если поз > 0 Тогда
						КлиентИНН = лев(КлиентИНН, поз-1)
					КонецЕсли;
				КонецЕсли;

			 	//??? добавить проверку КЧ ИНН
			Если ПустоеЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование) = 0 Тогда
				Данные.ДобавитьЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование,	"Клиент");    //"Тег1227"
			КонецЕсли;
			Если Число(КлиентИНН) <> 0 Тогда
				Данные.ДобавитьЗначение(КлиентИНН, "КлиентИНН"); //"Тег1228"
			КонецЕсли;
		КонецЕсли;
		
	Иначе
 		Предупреждение("Нет позиций для вывода в чек ККМ!",60);
 		Возврат
	КонецЕсли;
	//[-] тщи 54ФЗ

	ПУП           = 0;	Кассир = "";	КассирИНН = "";
	
	//[+] можно раскомментировать для ТИС релиза 988 или более нового 
	//ВыбКасса = глЗначениеПоУмолчанию("ОсновнаяКасса");
	//ВыбКассир = "";
	//
	//Если ПустоеЗначение(ВыбКасса) = 0 Тогда
	//    ВыбКассир = ВыбКасса.КассирККМ.Получить(ДатаДок);
	//	Если ПустоеЗначение(ВыбКассир) = 1 Тогда
	//        ВыбКассир = Фирма.ЮрЛицо.Кассир.Получить(ДатаДок);
	//    КонецЕсли;
	//КонецЕсли; 
	//
	//Кассир = глФамилияИмяОтчество(ВыбКассир);
	//КассирИНН = ВыбКассир.ИНН;	
	//[-] можно раскомментировать для ТИС релиза 988 или более нового 

	Если глФРПечататьЧек(Список, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ПУП, Кассир, КассирИНН) = 1 Тогда
		НомерЧекаККМ = ?(НомерЧека = 0, -1, НомерЧека);
		Попытка						//[+] тщи 54ФЗ
			АдресПокупателя = Данные.Получить("АдресПокупателя");
			НомерСменыККМ 	= Данные.Получить("НомерСмены");
			Получено 		= Данные.Получить("Получено");
			ФПД 			= Данные.Получить("ФПД");
			НомерФД 		= Данные.Получить("НомерФД");
			Если СуммаЧека>Получено Тогда
				Картой = СуммаЧека-Получено;
				ОплатаКартой = 1;
			Иначе
				Картой = 0;
				ОплатаКартой = 0;
			КонецЕсли
		Исключение КонецПопытки;	//[-] тщи 54ФЗ
		ПриЗаписиПерепроводить(0);
		Записать();
		ПриЗаписиПерепроводить(1);
	КонецЕсли;
	
КонецПроцедуры       

3) В модуле формы документа РКО (Расходный кассовый ордер) заменить процедуры  ПечатьЧека() и ПризнакПробитияЧека():
//Для  отключения передачи данных о покупателе в ОФД можно добавить в шапку документа реквизит "НеПередаватьКлиентаВОФД" и вывести его на форме документа в виде флажка (подробнее см. в файле TIS1003_54FZ.md)

//******************************************************************************
Функция ПризнакПробитияЧека()
    
	Если НомерЧекаККМ <> 0 Тогда
  		Если НомерЧекаККМ > 0  Тогда
 			ПечФПД = "";
			Если Метаданные.Документ(Вид()).РеквизитШапки("ФПД").Выбран() = 0 Тогда  //[+] тщи
			ИначеЕсли ПустоеЗначение(ПолучитьАтрибут("ФПД"))= 0 Тогда
  				ПечФПД = ", ФПД: "+ Сокрлп(ПолучитьАтрибут("ФПД"))
  			КонецЕсли;                                        //[-] тщи
			Возврат "№ чека: "+СокрЛП(НомерЧекаККМ) + ПечФПД; //тщи  + ПечФПД
		Иначе
			Возврат "Чек пробит";
		КонецЕсли;
	Иначе
		Возврат "";
    КонецЕсли;
	
КонецФункции

//******************************************************************************
Процедура ПечатьЧека()
	
	Если КодОперации <> Перечисление.КодыОпераций.ВозвратОплатыПокупателю Тогда
	    Сообщить("Чек на возврат может быть напечатан только при возврате оплаты покупателю!");
		Возврат;
	КонецЕсли;
	
	//Если глФРДляПриемаНаличныхОтЮрЛиц <> 1 Тогда		//тщи отключаем эту проверку
	//	Сообщить("Фискальный регистратор не предназначен для отражения наличных денежных расчетов.");
	//	Возврат;
	//КонецЕсли;
	
	Если НомерЧекаККМ <> 0 Тогда
	    Предупреждение("Чек уже пробит на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли глФРВкл=0 Тогда
	    Предупреждение("Фискальный регистратор не подключен!",60);
		Возврат;
	ИначеЕсли ПометкаУдаления()=1 Тогда
	    Предупреждение("Документ помечен на удаление, поэтому" + РазделительСтрок +
		               "нельзя пробить чек на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли Проведен()=0 Тогда
		Если Вопрос("Провести документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
			Если Провести()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	ИначеЕсли Модифицированность()=1 Тогда
		Если Вопрос("Сохранить документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	КонецЕсли;
	
	Список = СоздатьОбъект("ТаблицаЗначений");
	Список.НоваяКолонка("ТовНаим"   , "Строка");
	Список.НоваяКолонка("Цена"      , "Число",15,2);	//тщи
	Список.НоваяКолонка("Количество", "Число");
	Список.НоваяКолонка("НДС"       , "Число");  
	Список.НоваяКолонка("Сумма"	    , "Число",15,2);	//[+] тщи 54ФЗ ТИС988
	Список.НоваяКолонка("СуммаНДС"	, "Число",15,2);	//тщи
	Список.НоваяКолонка("ПредметРасчета"   , "Число");  //тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("СпособРасчета"    , "Число");  //тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("ЕдИзм"   	, "Строка");   	   //тщи для ФФД 1.05 и выше
		//Наличие суффикса "_п" в наименовании тега определяет будет ли выведено в чеке значение тега нефискальной строкой для удобства пользователя, или будет значение только передано в ОФД.
		//Рекомендуем управлять печатью тегов настройками драйвера ККТ
	Список.НоваяКолонка("Тег1229",	"Число");		//Акциз, заполняется если предмет расчета признается объектом налогообложения акцизами и расчет осуществляется между организациями и (или) индивидуальными предпринимателями с использованием наличных денежных средств и (или) с предъявлением электронных средств платежа.
	Список.НоваяКолонка("Тег1230",	"Строка",3);	//код страны происхождения товара (для России и группы стран (например, Евросоюз) не заполняется)
	Список.НоваяКолонка("Тег1231",	"Строка");		//Номер таможенной декларации
	Список.НоваяКолонка("Номенклатура");			//для подбора ГТД из движений документа
	Список.НоваяКолонка("Коэффициент", "Число");    //для подбора ГТД из движений документа
	
	ДокумОснование = "";
	Скидка            = 0; //тщи 54ФЗ перенес выше
	
	Если ПустоеЗначение(ДокОснование) = 0 Тогда
		Если (ДокОснование.Вид() = "ВозвратОтПокупателя")
		или (ДокОснование.Вид() = "ЗаказПоставщику") 
		или (ДокОснование.Вид() = "ОтчетКомитенту")
		или (ДокОснование.Вид() = "ПоступлениеДопРасходы")
		или (ДокОснование.Вид() = "ПоступлениеПрочее")
		или (ДокОснование.Вид() = "ПоступлениеТМЦ")	
		или (ДокОснование.Вид() = "ПоступлениеТМЦИмпорт")
		или (ДокОснование.Вид() = "ПоступлениеТМЦРозница") Тогда
			//Если ДокОснование.Итог("Сумма") = Сумма Тогда  //тщи 54ФЗ
				ДокумОснование = ДокОснование;
			//КонецЕсли;                                     //тщи 54ФЗ
		ИначеЕсли (ДокОснование.Вид() = "ПКО") или (ДокОснование.Вид() = "СтрокаВыпискиПриход") Тогда  //тщи 54ФЗ СтрокаВыпискиПриход
			Если ПустоеЗначение(ДокОснование.ДокОснование) = 0 Тогда
				Если (ДокОснование.ДокОснование.Вид() = "ВозвратПоставщику")
				или (ДокОснование.ДокОснование.Вид() = "ЗаявкаПокупателя") 
				или (ДокОснование.ДокОснование.Вид() = "ОтчетКомиссионера")
				или (ДокОснование.ДокОснование.Вид() = "Реализация")
				или (ДокОснование.ДокОснование.Вид() = "РеализацияПрочее")
				или (ДокОснование.ДокОснование.Вид() = "РеализацияРозница") Тогда
					//Если ДокОснование.ДокОснование.Итог("Сумма") = Сумма Тогда  //тщи 54ФЗ
						ДокумОснование = ДокОснование.ДокОснование;
					//КонецЕсли;	                                              //тщи 54ФЗ
				КонецЕсли;
			КонецЕсли;			
		КонецЕсли;
	КонецЕсли;
	
		СтавкаНДСПоДокОснованию = "";   //тщи вынес блок из условия
		Если ДокОснование.Вид() = "ПКО" Тогда //[+] тщи 54ФЗ
			СтавкаНДСПоДокОснованию = ДокОснование.СтавкаНДС                    	
		КонецЕсли;
		Если ПустоеЗначение(СтавкаНДСПоДокОснованию) = 1 Тогда                  
			СтавкаНДСПоДокОснованию = "<авто>"
		ИначеЕсли СтавкаНДСПоДокОснованию = Перечисление.СтавкиНДС.БезНДС Тогда
			СтавкаНДСПоДокОснованию = -1                              	//для разделения ставок 0% и Без НДС
		Иначе
			СтавкаНДСПоДокОснованию = глНачисляемыйНДС(СтавкаНДСПоДокОснованию)*100;   //[+] тщи 54ФЗ
		КонецЕсли;
	ПринятоОтОснование = СокрЛП(Основание); 		//тщи 54ФЗ
		
	Если ПустоеЗначение(ДокумОснование) = 1 Тогда  	//[-] тщи 54ФЗ ТИС988
	
		Список.НоваяСтрока();
		Список.ТовНаим    = ПринятоОтОснование; 	//тщи 54ФЗ СокрЛП(Основание);
		Список.Цена       = Сумма;
		Список.Количество = 1;
		Список.Сумма      = 0; //Сумма;                 	//[+] тщи 54ФЗ ТИС988
		
		Список.НДС		  = СтавкаНДСПоДокОснованию; 		//тщи ?(ПустоеЗначение(СтавкаНДСПоДокОснованию) = 0, СтавкаНДСПоДокОснованию, глЗначениеПоУмолчанию("ОсновнаяСтавкаНДС"))

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

			Если глЕстьРеквизитМнЧ("Партия",ДокумОснование.Вид()) = 0 Тогда //учета по ГТД (на партиях) в документе нет
			ИначеЕсли ПустоеЗначение(ДокумОснование.Партия) = 1 Тогда //в документе включен "автоподбор" партий - в этом случае не будем определять ГТД, для работы с "автоподбором" требуется доработка
			ИначеЕсли ПустоеЗначение(ДокумОснование.Партия.СтранаПроисхождения) = 1 Тогда
			ИначеЕсли (Число(ДокумОснование.Партия.СтранаПроисхождения.Код) <> 0) и (Число(ДокумОснование.Партия.СтранаПроисхождения.Код) <> 643) Тогда
				Список.Тег1230 = Число(ДокумОснование.Партия.СтранаПроисхождения.Код); //Если код страны происхождения имеет длину меньше 3 цифр, то он дополняется справа пробелами
				Список.Тег1231 = ДокумОснование.Партия.ГТД.Наименование;
			КонецЕсли;

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

		Если глЕстьРеквизитШапки("ОплатаКартой", Вид()) = 1 Тогда                       //если диалог документ доработан для указания типа оплаты картой
			ПризнакОплатыКартой = ПолучитьАтрибут("ОплатаКартой");
			Данные.ДобавитьЗначение(ПризнакОплатыКартой,"ТипОплаты");	 	//чтобы не запрашивать тип оплаты в отдельном диалоге перед печатью чека, (т.к. тип оплаты вводится в чеке), 1 -  запрашивать тип оплаты в отдельном диалоге перед печатью чека. Для работы этого параметра обязательно передавать параметр Контекст!
		Иначе
			ПризнакОплатыКартой = 0
		КонецЕсли;
		
		Если глЕстьРеквизитШапки("Получено", Вид()) = 1 Тогда                       //если диалог документ доработан для указания типа оплаты картой
			Получено = ПолучитьАтрибут("Получено");     //получено НАЛИЧНЫМИ (остальное - КАРТА)
			Если (Получено=0) и (ПризнакОплатыКартой=0) Тогда
				Получено = СуммаЧека
			КонецЕсли;
		Иначе
			Получено = ?(ПризнакОплатыКартой = 1, 0, СуммаЧека)
		КонецЕсли;
	
		Если (Получено < СуммаЧека) и (ПризнакОплатыКартой = 0) Тогда  		//тщи если Получено < СуммаЧека, то значит оплата идет по банковской карте
	 		Предупреждение("Полученной суммы недостаточно для оплаты!",60);
	 		Возврат
	 	КонецЕсли;
	 	
		Данные.ДобавитьЗначение(ПринятоОтОснование, "Основание");
		Данные.ДобавитьЗначение(СтавкаНДСПоДокОснованию, "НДСпоУмолч");
	 	Если ПустоеЗначение(ДокумОснование) = 0 Тогда
			Данные.ДобавитьЗначение(ДокумОснование,"Документ");	//ссылка на документ-основание
		КонецЕсли;
	 	Если ПустоеЗначение(Договор) = 0 Тогда
			Данные.ДобавитьЗначение(Договор.Наименование,"Договор");	//договор контрагента
		КонецЕсли;

		Если ПустоеЗначение(ДокОснование) = 1 Тогда //если был частичный возврат по пред.чеку
		ИначеЕсли глЕстьРеквизитШапки("ФПД", ДокОснование.Вид()) = 1 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
			Данные.ДобавитьЗначение(ДокОснование.ФПД,"Тег1192");
		ИначеЕсли глЕстьРеквизитШапки("ДокОснование", ДокОснование.Вид()) = 0 Тогда
		ИначеЕсли ПустоеЗначение(ДокОснование.ДокОснование) = 0 Тогда
			Док = СоздатьОбъект("Документ");
			Док.ВыбратьПодчиненныеДокументы(,,ДокОснование.ДокОснование);
			Пока Док.ПолучитьДокумент() = 1 Цикл
				Если Док.ТекущийДокумент() = ТекущийДокумент() Тогда
				ИначеЕсли глЕстьРеквизитШапки("ФПД", Док.Вид()) = 0 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
				ИначеЕсли ПустоеЗначение(Док.ФПД) = 0 Тогда   //??? алгоритм может запутаться, если пробиты множественные возвраты
					Данные.ДобавитьЗначение(Док.ФПД,"Тег1192");
					прервать
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
		Если ?(глЕстьРеквизитШапки("НеПередаватьКлиентаВОФД", Вид())=0,0,ПолучитьАтрибут("НеПередаватьКлиентаВОФД")) = 1 Тогда //теги 1227 и 1228 не нужно передавать в ОФД
		ИначеЕсли (КодОперации = глКО.ОплатаПоставщику) ИЛИ
		     (КодОперации = глКО.ВозвратОплатыПокупателю) Тогда
			 	КлиентИНН = "";
			 	Если ПустоеЗначение(Контрагент) = 1 Тогда
			 		Предупреждение("Не указан контрагент!",60);
			 		Возврат
				ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо) = 1 Тогда
			 		Предупреждение("Не указано юр/физлицо контрагента!",60);
			 		Возврат
				//ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо.ИНН) = 1 Тогда //для ФФД 1.1
			 	//	Предупреждение("Не указан ИНН контрагента!",60);   
			 	//	Возврат
			 	Иначе
			 		КлиентИНН = сокрлп(Контрагент.ЮрФизЛицо.ИНН); 
			 	КонецЕсли;
				поз = Найти(КлиентИНН, "/");
				Если поз > 0 Тогда
					КлиентИНН = лев(КлиентИНН, поз-1)
				Иначе
					поз = Найти(КлиентИНН, "\");
					Если поз > 0 Тогда
						КлиентИНН = лев(КлиентИНН, поз-1)
					КонецЕсли;
				КонецЕсли;

			 	//??? добавить проверку КЧ ИНН
			Если ПустоеЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование) = 0 Тогда
				Данные.ДобавитьЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование,	"Клиент");    //"Тег1227"
			КонецЕсли;
			Если Число(КлиентИНН) <> 0 Тогда
				Данные.ДобавитьЗначение(КлиентИНН, "КлиентИНН"); //"Тег1228"
			КонецЕсли;
		КонецЕсли;
		
	Иначе
 		Предупреждение("Нет позиций для вывода в чек ККМ!",60);
 		Возврат
	КонецЕсли;
	//[-] тщи 54ФЗ

	ПУП           = 0;	Кассир = "";	КассирИНН = "";
	
	//[+] можно раскомментировать для ТИС релиза 988 или более нового 
	//ВыбКасса = глЗначениеПоУмолчанию("ОсновнаяКасса");
	//ВыбКассир = "";
	//
	//Если ПустоеЗначение(ВыбКасса) = 0 Тогда
	//    ВыбКассир = ВыбКасса.КассирККМ.Получить(ДатаДок);
	//	Если ПустоеЗначение(ВыбКассир) = 1 Тогда
	//        ВыбКассир = Фирма.ЮрЛицо.Кассир.Получить(ДатаДок);
	//    КонецЕсли;
	//КонецЕсли; 
	//
	//Кассир = глФамилияИмяОтчество(ВыбКассир);
	//КассирИНН = ВыбКассир.ИНН;	
	//[-] можно раскомментировать для ТИС релиза 988 или более нового 

	Если глФРПечататьЧек(Список, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ПУП, Кассир, КассирИНН) = 1 Тогда
		НомерЧекаККМ = ?(НомерЧека = 0, -1, НомерЧека);
		Попытка						//[+] тщи 54ФЗ
			АдресПокупателя = Данные.Получить("АдресПокупателя");
			НомерСменыККМ 	= Данные.Получить("НомерСмены");
			Получено 		= Данные.Получить("Получено");
			ФПД 			= Данные.Получить("ФПД");
			НомерФД 		= Данные.Получить("НомерФД");
			Если СуммаЧека>Получено Тогда
				Картой = СуммаЧека-Получено;
				ОплатаКартой = 1;
			Иначе
				Картой = 0;
				ОплатаКартой = 0;
			КонецЕсли
		Исключение КонецПопытки;	//[-] тщи 54ФЗ
		ПриЗаписиПерепроводить(0);
		Записать();
		ПриЗаписиПерепроводить(1);
	КонецЕсли;
	
КонецПроцедуры

4) в документ РКО добавлен  ввод на основании документа СтрокаВыпискиПриход, внесены изменения в функцию ЗаполнениеПоДокументуОснованию(), в настройку "Ввод на основании" добавлен документ СтрокаВыпискиПриход в списке "Вводить на основании" (подробнее см. в файле TIS1003_54FZ.md)

5) В модуле формы документа СтрокаВыпискиПриход ДОБАВИТЬ (т.к. их там нет) процедуры ПризнакПробитияЧека() и ПечатьЧека():
//Для отключения передачи данных о покупателе в ОФД можно добавить в шапку документа реквизит "НеПередаватьКлиентаВОФД" и вывести его на форме документа в виде флажка (подробнее см. в файле TIS1003_54FZ.md)

//******************************************************************************
Функция ПризнакПробитияЧека()	//тщи
    
	Если НомерЧекаККМ <> 0 Тогда
  		Если НомерЧекаККМ > 0  Тогда
 			ПечФПД = "";
			Если Метаданные.Документ(Вид()).РеквизитШапки("ФПД").Выбран() = 0 Тогда  //[+] тщи
			ИначеЕсли ПустоеЗначение(ПолучитьАтрибут("ФПД"))= 0 Тогда
  				ПечФПД = ", ФПД: "+ Сокрлп(ПолучитьАтрибут("ФПД"))
  			КонецЕсли;                                        //[-] тщи
			Возврат "№ чека: "+СокрЛП(НомерЧекаККМ) + ПечФПД; //тщи  + ПечФПД
		Иначе
			Возврат "Чек пробит";
		КонецЕсли;
	Иначе
		Возврат "";
    КонецЕсли;
	
КонецФункции

//******************************************************************************
Процедура ПечатьЧека() //тщи      
	
	Если КодОперации <> Перечисление.КодыОпераций.ОплатаОтПокупателя Тогда
	    Сообщить("Чек может быть напечатан только при получении оплаты от покупателя!");
		Возврат;
	КонецЕсли;
	
	//Если глФРДляПриемаНаличныхОтЮрЛиц <> 1 Тогда    //тщи отключаем эту проверку
	//	Сообщить("Фискальный регистратор не предназначен для отражения наличных денежных расчетов.");
	//	Возврат;
	//КонецЕсли;
	
	Если НомерЧекаККМ <> 0 Тогда
	    Предупреждение("Чек уже пробит на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли глФРВкл=0 Тогда
	    Предупреждение("Фискальный регистратор не подключен!",60);
		Возврат;
	//ИначеЕсли (ОблагаетсяНП=1) и (СтавкаНП.Ставка<>0) Тогда
	//    Предупреждение("Чтобы распечатать чек на фискальном регистраторе" + РазделительСтрок +
	//	               "необходимо, чтобы ставка НП была равна 0!",60);
	//	Возврат;
	ИначеЕсли ПометкаУдаления()=1 Тогда
	    Предупреждение("Документ помечен на удаление, поэтому" + РазделительСтрок +
		               "нельзя пробить чек на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли Проведен()=0 Тогда
		Если Вопрос("Провести документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
			Если Провести()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	ИначеЕсли Модифицированность()=1 Тогда
		Если Вопрос("Сохранить документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	КонецЕсли;
	
	Список = СоздатьОбъект("ТаблицаЗначений");
	Список.НоваяКолонка("ТовНаим"   , "Строка");
	Список.НоваяКолонка("Цена"      , "Число",15,2);	//тщи
	Список.НоваяКолонка("Количество", "Число");
	Список.НоваяКолонка("НДС"       , "Число");
	Список.НоваяКолонка("Сумма"	    , "Число",15,2);	//[+] тщи 54ФЗ ТИС988
	Список.НоваяКолонка("СуммаНДС"	, "Число",15,2);	//тщи
	Список.НоваяКолонка("ПредметРасчета"   , "Число");  //тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("СпособРасчета"    , "Число");  //тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("ЕдИзм"   	, "Строка");		//тщи для ФФД 1.05 и выше
		//Наличие суффикса "_п" в наименовании тега определяет будет ли выведено в чеке значение тега нефискальной строкой для удобства пользователя, или будет значение только передано в ОФД.
		//Рекомендуем управлять печатью тегов настройками драйвера ККТ
	Список.НоваяКолонка("Тег1229",	"Число");		//Акциз, заполняется если предмет расчета признается объектом налогообложения акцизами и расчет осуществляется между организациями и (или) индивидуальными предпринимателями с использованием наличных денежных средств и (или) с предъявлением электронных средств платежа.
	Список.НоваяКолонка("Тег1230",	"Строка",3);	//код страны происхождения товара (для России и группы стран (например, Евросоюз) не заполняется)
	Список.НоваяКолонка("Тег1231",	"Строка");		//Номер таможенной декларации
	Список.НоваяКолонка("Номенклатура");			//для подбора ГТД из движений документа
	Список.НоваяКолонка("Коэффициент", "Число");    //для подбора ГТД из движений документа

	ДокумОснование = "";
	Скидка            = 0; //тщи 54ФЗ перенес выше
	
	Если ПустоеЗначение(ДокОснование) = 0 Тогда
		Если (ДокОснование.Вид() = "ВозвратПоставщику")
			или (ДокОснование.Вид() = "ЗаявкаПокупателя") 
			или (ДокОснование.Вид() = "ОтчетКомиссионера")
			или (ДокОснование.Вид() = "Реализация")
			или (ДокОснование.Вид() = "РеализацияПрочее")
			или (ДокОснование.Вид() = "РеализацияРозница") Тогда
	        //Если ДокОснование.Итог("Сумма") = Сумма Тогда  //тщи 54ФЗ
			    ДокумОснование = ДокОснование;
			//КонецЕсли;	                                 //тщи 54ФЗ
		КонецЕсли;
	КонецЕсли;	
	
	//Если СтавкаНДС.Выбран() = 0 Тогда 				//[+] тщи 54ФЗ
		СтавкаНДСПоДокОснованию = "<авто>";
	//ИначеЕсли СтавкаНДС = Перечисление.СтавкиНДС.БезНДС Тогда
	//	СтавкаНДСПоДокОснованию = -1                              	//для разделения ставок 0% и Без НДС
	//Иначе
	//	СтавкаНДСПоДокОснованию = глНачисляемыйНДС(СтавкаНДС)*100;   
	//КонецЕсли;
	ПринятоОтОснование = "Принято от " + Контрагент; 		//[-] тщи 54ФЗ
	
	Если ПустоеЗначение(ДокумОснование) = 1 Тогда	//[-] тщи 54ФЗ ТИС988
		Список.НоваяСтрока();
		Список.ТовНаим    = ПринятоОтОснование;		//тщи 54ФЗ
		Список.Цена       = Сумма;
		Список.Количество = 1;
		Список.НДС        = СтавкаНДСПоДокОснованию;//тщи 54ФЗ
		Список.Сумма      = 0; //Сумма;            		//[+] тщи 54ФЗ ТИС988

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

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

		Данные.ДобавитьЗначение(1,"ТипОплаты");	 	//чтобы не запрашивать тип оплаты в отдельном диалоге перед печатью чека, (т.к. тип оплаты вводится в чеке), 1 -  запрашивать тип оплаты в отдельном диалоге перед печатью чека. Для работы этого параметра обязательно передавать параметр Контекст!
		
		Получено = 0;
	
		Данные.ДобавитьЗначение(ПринятоОтОснование, "Основание");
		Данные.ДобавитьЗначение(СтавкаНДСПоДокОснованию, "НДСпоУмолч");
	 	Если ПустоеЗначение(ДокумОснование) = 0 Тогда
			Данные.ДобавитьЗначение(ДокумОснование,"Документ");	//ссылка на документ-основание
		КонецЕсли;
	 	Если ПустоеЗначение(Договор) = 0 Тогда
			Данные.ДобавитьЗначение(Договор.Наименование,"Договор");	//договор контрагента
		КонецЕсли;
		
		Если ПустоеЗначение(ДокОснование) = 1 Тогда //если был частичный возврат по пред.чеку
		ИначеЕсли глЕстьРеквизитШапки("ФПД", ДокОснование.Вид()) = 1 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
			Данные.ДобавитьЗначение(ДокОснование.ФПД,"Тег1192");
		ИначеЕсли глЕстьРеквизитШапки("ДокОснование", ДокОснование.Вид()) = 0 Тогда
		ИначеЕсли ПустоеЗначение(ДокОснование.ДокОснование) = 0 Тогда
			Док = СоздатьОбъект("Документ");
			Док.ВыбратьПодчиненныеДокументы(,,ДокОснование.ДокОснование);
			Пока Док.ПолучитьДокумент() = 1 Цикл
				Если Док.ТекущийДокумент() = ТекущийДокумент() Тогда
				ИначеЕсли глЕстьРеквизитШапки("ФПД", Док.Вид()) = 0 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
				ИначеЕсли ПустоеЗначение(Док.ФПД) = 0 Тогда   //??? алгоритм может запутаться, если пробиты множественные возвраты
					Данные.ДобавитьЗначение(Док.ФПД,"Тег1192");
					прервать
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
		Если ?(глЕстьРеквизитШапки("НеПередаватьКлиентаВОФД", Вид())=0,0,ПолучитьАтрибут("НеПередаватьКлиентаВОФД")) = 1 Тогда //теги 1227 и 1228 не нужно передавать в ОФД
		ИначеЕсли КодОперации <> Перечисление.КодыОпераций.Прочее Тогда
			 	КлиентИНН = "";
			 	Если ПустоеЗначение(Контрагент) = 1 Тогда
			 		Предупреждение("Не указан контрагент!",60);
			 		Возврат
				ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо) = 1 Тогда
			 		Предупреждение("Не указано юр/физлицо контрагента!",60);
			 		Возврат
				//ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо.ИНН) = 1 Тогда //для ФФД 1.1
			 	//	Предупреждение("Не указан ИНН контрагента!",60);   
			 	//	Возврат
			 	Иначе
			 		КлиентИНН = сокрлп(Контрагент.ЮрФизЛицо.ИНН); 
			 	КонецЕсли;
				поз = Найти(КлиентИНН, "/");
				Если поз > 0 Тогда
					КлиентИНН = лев(КлиентИНН, поз-1)
				Иначе
					поз = Найти(КлиентИНН, "\");
					Если поз > 0 Тогда
						КлиентИНН = лев(КлиентИНН, поз-1)
					КонецЕсли;
				КонецЕсли;

			 	//??? добавить проверку КЧ ИНН
			Если ПустоеЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование) = 0 Тогда
				Данные.ДобавитьЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование,	"Клиент");    //"Тег1227"
			КонецЕсли;
			Если Число(КлиентИНН) <> 0 Тогда
				Данные.ДобавитьЗначение(КлиентИНН, "КлиентИНН"); //"Тег1228"
			КонецЕсли;
		КонецЕсли;
		
	Иначе
 		Предупреждение("Нет позиций для вывода в чек ККМ!",60);
 		Возврат
	КонецЕсли;
	//[-] тщи 54ФЗ

	ПУП           = 0;	Кассир = "";	КассирИНН = "";
	
	//[+] можно раскомментировать для ТИС релиза 988 или более нового 
	//ВыбКасса = глЗначениеПоУмолчанию("ОсновнаяКасса");
	//ВыбКассир = "";
	//
	//Если ПустоеЗначение(ВыбКасса) = 0 Тогда
	//    ВыбКассир = ВыбКасса.КассирККМ.Получить(ДатаДок);
	//	Если ПустоеЗначение(ВыбКассир) = 1 Тогда
	//        ВыбКассир = Фирма.ЮрЛицо.Кассир.Получить(ДатаДок);
	//    КонецЕсли;
	//КонецЕсли; 
	//
	//Кассир = глФамилияИмяОтчество(ВыбКассир);
	//КассирИНН = ВыбКассир.ИНН;	
	//[-] можно раскомментировать для ТИС релиза 988 или более нового 

	Если глФРПечататьЧек(Список, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ПУП, Кассир, КассирИНН) = 1 Тогда
		НомерЧекаККМ = ?(НомерЧека = 0, -1, НомерЧека);
		Попытка						//[+] тщи 54ФЗ
			АдресПокупателя = Данные.Получить("АдресПокупателя");
			НомерСменыККМ 	= Данные.Получить("НомерСмены");
			ФПД 			= Данные.Получить("ФПД");
			НомерФД 		= Данные.Получить("НомерФД");
		Исключение КонецПопытки;	//[-] тщи 54ФЗ
		ПриЗаписиПерепроводить(0);
		Записать();
		ПриЗаписиПерепроводить(1);
	КонецЕсли;
	
КонецПроцедуры       


6) В модуле формы документа СтрокаВыпискиПриход в начале процедуры ВводНового() добавить строчку:
	НомерЧекаККМ  = 0;

Процедура ВводНового(Скопирован) 
	НомерЧекаККМ  = 0;	//тщи

7) На диалог формы документа СтрокаВыпискиПриход ДОБАВИТЬ (т.к. их там нет) реквизиты ТекстНомерЧекаККМ и кнЧек (по аналогии см. документ ПриходныйОрдер)

8) В модуле формы документа СтрокаВыпискиРасход ДОБАВИТЬ (т.к. их там нет) процедуры ПризнакПробитияЧека() и ПечатьЧека():
//Для отключения передачи данных о покупателе в ОФД можно добавить в шапку документа реквизит "НеПередаватьКлиентаВОФД" и вывести его на форме документа в виде флажка (подробнее см. в файле TIS1003_54FZ.md)

//******************************************************************************
Функция ПризнакПробитияЧека()	//тщи
    
	Если НомерЧекаККМ <> 0 Тогда
  		Если НомерЧекаККМ > 0  Тогда
 			ПечФПД = "";
			Если Метаданные.Документ(Вид()).РеквизитШапки("ФПД").Выбран() = 0 Тогда  //[+] тщи
			ИначеЕсли ПустоеЗначение(ПолучитьАтрибут("ФПД"))= 0 Тогда
  				ПечФПД = ", ФПД: "+ Сокрлп(ПолучитьАтрибут("ФПД"))
  			КонецЕсли;                                        //[-] тщи
			Возврат "№ чека: "+СокрЛП(НомерЧекаККМ) + ПечФПД; //тщи  + ПечФПД
		Иначе
			Возврат "Чек пробит";
		КонецЕсли;
	Иначе
		Возврат "";
    КонецЕсли;
	
КонецФункции

//******************************************************************************
Процедура ПечатьЧека()	//тщи
	
	Если КодОперации <> Перечисление.КодыОпераций.ВозвратОплатыПокупателю Тогда
	    Сообщить("Чек на возврат может быть напечатан только при возврате оплаты покупателю!");
		Возврат;
	КонецЕсли;
	
	//Если глФРДляПриемаНаличныхОтЮрЛиц <> 1 Тогда		//тщи отключаем эту проверку
	//	Сообщить("Фискальный регистратор не предназначен для отражения наличных денежных расчетов.");
	//	Возврат;
	//КонецЕсли;
	
	Если НомерЧекаККМ <> 0 Тогда
	    Предупреждение("Чек уже пробит на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли глФРВкл=0 Тогда
	    Предупреждение("Фискальный регистратор не подключен!",60);
		Возврат;
	ИначеЕсли ПометкаУдаления()=1 Тогда
	    Предупреждение("Документ помечен на удаление, поэтому" + РазделительСтрок +
		               "нельзя пробить чек на фискальном регистраторе!",60);
		Возврат;
	ИначеЕсли Проведен()=0 Тогда
		Если Вопрос("Провести документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
			Если Провести()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	ИначеЕсли Модифицированность()=1 Тогда
		Если Вопрос("Сохранить документ и пробить чек на фискальном регистраторе?","Да+Нет")="Нет" Тогда
		    Возврат;
		КонецЕсли;
		Попытка
			Если Записать()=0 Тогда Возврат КонецЕсли; //тщи
		Исключение
			Возврат;
		КонецПопытки;
	КонецЕсли;
	
	Список = СоздатьОбъект("ТаблицаЗначений");
	Список.НоваяКолонка("ТовНаим"   , "Строка");
	Список.НоваяКолонка("Цена"      , "Число",15,2);	//тщи
	Список.НоваяКолонка("Количество", "Число");
	Список.НоваяКолонка("НДС"       , "Число");  
	Список.НоваяКолонка("Сумма"	    , "Число",15,2);	//[+] тщи 54ФЗ ТИС988
	Список.НоваяКолонка("СуммаНДС"	, "Число",15,2);	//тщи
	Список.НоваяКолонка("ПредметРасчета"   , "Число");  //тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("СпособРасчета"    , "Число");  //тщи для ФФД 1.05 и выше
	Список.НоваяКолонка("ЕдИзм"   	, "Строка");		//тщи для ФФД 1.05 и выше
		//Наличие суффикса "_п" в наименовании тега определяет будет ли выведено в чеке значение тега нефискальной строкой для удобства пользователя, или будет значение только передано в ОФД.
		//Рекомендуем управлять печатью тегов настройками драйвера ККТ
	Список.НоваяКолонка("Тег1229",	"Число");		//Акциз, заполняется если предмет расчета признается объектом налогообложения акцизами и расчет осуществляется между организациями и (или) индивидуальными предпринимателями с использованием наличных денежных средств и (или) с предъявлением электронных средств платежа.
	Список.НоваяКолонка("Тег1230",	"Строка",3);	//код страны происхождения товара (для России и группы стран (например, Евросоюз) не заполняется)
	Список.НоваяКолонка("Тег1231",	"Строка");		//Номер таможенной декларации
	Список.НоваяКолонка("Номенклатура");			//для подбора ГТД из движений документа
	Список.НоваяКолонка("Коэффициент", "Число");    //для подбора ГТД из движений документа
	
	ДокумОснование = "";
	Скидка            = 0; //тщи 54ФЗ перенес выше
	
	Если ПустоеЗначение(ДокОснование) = 0 Тогда
		Если (ДокОснование.Вид() = "ВозвратОтПокупателя")
		или (ДокОснование.Вид() = "ЗаказПоставщику") 
		или (ДокОснование.Вид() = "ОтчетКомитенту")
		или (ДокОснование.Вид() = "ПоступлениеДопРасходы")
		или (ДокОснование.Вид() = "ПоступлениеПрочее")
		или (ДокОснование.Вид() = "ПоступлениеТМЦ")	
		или (ДокОснование.Вид() = "ПоступлениеТМЦИмпорт")
		или (ДокОснование.Вид() = "ПоступлениеТМЦРозница") Тогда
			//Если ДокОснование.Итог("Сумма") = Сумма Тогда  //тщи 54ФЗ
				ДокумОснование = ДокОснование;
			//КонецЕсли;                                     //тщи 54ФЗ
		ИначеЕсли (ДокОснование.Вид() = "СтрокаВыпискиПриход") или (ДокОснование.Вид() = "ПКО") Тогда
			Если ПустоеЗначение(ДокОснование.ДокОснование) = 0 Тогда
				Если (ДокОснование.ДокОснование.Вид() = "ВозвратПоставщику")
				или (ДокОснование.ДокОснование.Вид() = "ЗаявкаПокупателя") 
				или (ДокОснование.ДокОснование.Вид() = "ОтчетКомиссионера")
				или (ДокОснование.ДокОснование.Вид() = "Реализация")
				или (ДокОснование.ДокОснование.Вид() = "РеализацияПрочее")
				или (ДокОснование.ДокОснование.Вид() = "РеализацияРозница") Тогда
					//Если ДокОснование.ДокОснование.Итог("Сумма") = Сумма Тогда  //тщи 54ФЗ
						ДокумОснование = ДокОснование.ДокОснование;
					//КонецЕсли;	                                              //тщи 54ФЗ
				КонецЕсли;
			КонецЕсли;			
		КонецЕсли;
	КонецЕсли;
	
		СтавкаНДСПоДокОснованию = "";   //тщи выенс блок из условия
		Если (ДокОснование.Выбран() = 1) и (ДокОснование.Вид() = "ПКО") Тогда //[+] тщи 54ФЗ
			СтавкаНДСПоДокОснованию = ДокОснование.СтавкаНДС                    	
		КонецЕсли;
		Если ПустоеЗначение(СтавкаНДСПоДокОснованию) = 1 Тогда                  
			СтавкаНДСПоДокОснованию = "<авто>"
		ИначеЕсли СтавкаНДСПоДокОснованию = Перечисление.СтавкиНДС.БезНДС Тогда
			СтавкаНДСПоДокОснованию = -1                              	//для разделения ставок 0% и Без НДС
		Иначе
			СтавкаНДСПоДокОснованию = глНачисляемыйНДС(СтавкаНДСПоДокОснованию)*100;   //[+] тщи 54ФЗ
		КонецЕсли;
	ПринятоОтОснование = "Принято от " + Контрагент; 		//[-] тщи 54ФЗ
		
	Если ПустоеЗначение(ДокумОснование) = 1 Тогда  	//[-] тщи 54ФЗ ТИС988
	
		Список.НоваяСтрока();
		Список.ТовНаим    = ПринятоОтОснование; 	//тщи 54ФЗ СокрЛП(Основание);
		Список.Цена       = Сумма;
		Список.Количество = 1;
		Список.Сумма      = 0; //Сумма;                 	//[+] тщи 54ФЗ ТИС988
		
		Список.НДС		  = СтавкаНДСПоДокОснованию; 		//тщи ?(ПустоеЗначение(СтавкаНДСПоДокОснованию) = 0, СтавкаНДСПоДокОснованию, глЗначениеПоУмолчанию("ОсновнаяСтавкаНДС"))

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

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

		Данные.ДобавитьЗначение(1,"ТипОплаты");	 	//чтобы не запрашивать тип оплаты в отдельном диалоге перед печатью чека, (т.к. тип оплаты вводится в чеке), 1 -  запрашивать тип оплаты в отдельном диалоге перед печатью чека. Для работы этого параметра обязательно передавать параметр Контекст!
		
		Получено = 0;
	 	
		Данные.ДобавитьЗначение(ПринятоОтОснование, "Основание");
		Данные.ДобавитьЗначение(СтавкаНДСПоДокОснованию, "НДСпоУмолч");
	 	Если ПустоеЗначение(ДокумОснование) = 0 Тогда
			Данные.ДобавитьЗначение(ДокумОснование,"Документ");	//ссылка на документ-основание
		КонецЕсли;
	 	Если ПустоеЗначение(Договор) = 0 Тогда
			Данные.ДобавитьЗначение(Договор.Наименование,"Договор");	//договор контрагента
		КонецЕсли;

		Если ПустоеЗначение(ДокОснование) = 1 Тогда //если был частичный возврат по пред.чеку
		ИначеЕсли глЕстьРеквизитШапки("ФПД", ДокОснование.Вид()) = 1 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
			Данные.ДобавитьЗначение(ДокОснование.ФПД,"Тег1192");
		ИначеЕсли глЕстьРеквизитШапки("ДокОснование", ДокОснование.Вид()) = 0 Тогда
		ИначеЕсли ПустоеЗначение(ДокОснование.ДокОснование) = 0 Тогда
			Док = СоздатьОбъект("Документ");
			Док.ВыбратьПодчиненныеДокументы(,,ДокОснование.ДокОснование);
			Пока Док.ПолучитьДокумент() = 1 Цикл
				Если Док.ТекущийДокумент() = ТекущийДокумент() Тогда
				ИначеЕсли глЕстьРеквизитШапки("ФПД", Док.Вид()) = 0 Тогда  //если вводим чек для омены предыдущего (РКО), то желательно передавать ФПД отменяемого чека
				ИначеЕсли ПустоеЗначение(Док.ФПД) = 0 Тогда   //??? алгоритм может запутаться, если пробиты множественные возвраты
					Данные.ДобавитьЗначение(Док.ФПД,"Тег1192");
					прервать
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		
		Если ?(глЕстьРеквизитШапки("НеПередаватьКлиентаВОФД", Вид())=0,0,ПолучитьАтрибут("НеПередаватьКлиентаВОФД")) = 1 Тогда //теги 1227 и 1228 не нужно передавать в ОФД
		ИначеЕсли КодОперации <> Перечисление.КодыОпераций.Прочее Тогда
			 	КлиентИНН = "";
			 	Если ПустоеЗначение(Контрагент) = 1 Тогда
			 		Предупреждение("Не указан контрагент!",60);
			 		Возврат
				ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо) = 1 Тогда
			 		Предупреждение("Не указано юр/физлицо контрагента!",60);
			 		Возврат
				//ИначеЕсли ПустоеЗначение(Контрагент.ЮрФизЛицо.ИНН) = 1 Тогда //для ФФД 1.1
			 	//	Предупреждение("Не указан ИНН контрагента!",60);   
			 	//	Возврат
			 	Иначе
			 		КлиентИНН = сокрлп(Контрагент.ЮрФизЛицо.ИНН); 
			 	КонецЕсли;
				поз = Найти(КлиентИНН, "/");
				Если поз > 0 Тогда
					КлиентИНН = лев(КлиентИНН, поз-1)
				Иначе
					поз = Найти(КлиентИНН, "\");
					Если поз > 0 Тогда
						КлиентИНН = лев(КлиентИНН, поз-1)
					КонецЕсли;
				КонецЕсли;

			 	//??? добавить проверку КЧ ИНН
			Если ПустоеЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование) = 0 Тогда
				Данные.ДобавитьЗначение(Контрагент.ЮрФизЛицо.ПолнНаименование,	"Клиент");    //"Тег1227"
			КонецЕсли;
			Если Число(КлиентИНН) <> 0 Тогда
				Данные.ДобавитьЗначение(КлиентИНН, "КлиентИНН"); //"Тег1228"
			КонецЕсли;
		КонецЕсли;
		
	Иначе
 		Предупреждение("Нет позиций для вывода в чек ККМ!",60);
 		Возврат
	КонецЕсли;
	//[-] тщи 54ФЗ

	ПУП           = 0;	Кассир = "";	КассирИНН = "";
	
	//[+] можно раскомментировать для ТИС релиза 988 или более нового 
	//ВыбКасса = глЗначениеПоУмолчанию("ОсновнаяКасса");
	//ВыбКассир = "";
	//
	//Если ПустоеЗначение(ВыбКасса) = 0 Тогда
	//    ВыбКассир = ВыбКасса.КассирККМ.Получить(ДатаДок);
	//	Если ПустоеЗначение(ВыбКассир) = 1 Тогда
	//        ВыбКассир = Фирма.ЮрЛицо.Кассир.Получить(ДатаДок);
	//    КонецЕсли;
	//КонецЕсли; 
	//
	//Кассир = глФамилияИмяОтчество(ВыбКассир);
	//КассирИНН = ВыбКассир.ИНН;	
	//[-] можно раскомментировать для ТИС релиза 988 или более нового 

	Если глФРПечататьЧек(Список, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека, ПУП, Кассир, КассирИНН) = 1 Тогда
		НомерЧекаККМ = ?(НомерЧека = 0, -1, НомерЧека);
		Попытка						//[+] тщи 54ФЗ
			АдресПокупателя = Данные.Получить("АдресПокупателя");
			НомерСменыККМ 	= Данные.Получить("НомерСмены");
			ФПД 			= Данные.Получить("ФПД");
			НомерФД 		= Данные.Получить("НомерФД");
		Исключение КонецПопытки;	//[-] тщи 54ФЗ
		ПриЗаписиПерепроводить(0);
		Записать();
		ПриЗаписиПерепроводить(1);
	КонецЕсли;
	
КонецПроцедуры


9) В модуле формы документа СтрокаВыпискиРасход в начале процедуры ВводНового() добавить строчку:
	НомерЧекаККМ  = 0;

Процедура ВводНового(Скопирован) 
	НомерЧекаККМ  = 0;	//тщи

10) На диалог формы документа СтрокаВыпискиРасход ДОБАВИТЬ (т.к. их там нет) реквизиты ТекстНомерЧекаККМ и кнЧек (по аналогии см. документ ПриходныйОрдер)


11) Новый реквизит НомерЧекаККМ  в документах СтрокаВыпискиПриход и СтрокаВыпискиРасход


12) ВНИМАНИЕ!!! Для корректной работы для документа Реализация типовой ТИС, ред. 9.2 нужно в модуле формы документа в процедуре ПоКнопкеПечать() заменить строчку:
		Параметры.ДобавитьЗначение(?((Модифицированность()=0) и (ПустоеЗначение(ТекущийДокумент())=0), ТекущийДокумент(), глВзятьКонтекст(Контекст)), "Контекст");
на
		Параметры.ДобавитьЗначение(глВзятьКонтекст(Контекст), "Контекст");


13) ВНИМАНИЕ!!! Для релиза ТиС 987 или более старого нужно убрать при вызове функции глФРПечататьЧек() три аргумента в конце (, ПУП, Кассир, КассирИНН):
глФРПечататьЧек(Список, СуммаЧека, Получено, Скидка, ПризнВозврата, НомерСекции, НомерЧека)

14)  в процедуру глобального модуля глФРЗакрытьСмену() добавить два дополнительных аргумента Фирма="", Касса="", а также их обработку:
Функция глФРЗакрытьСмену(НомерЛенты, ОписаниеРезультата, Фирма="", Касса="") Экспорт //тщи 54ФЗ , Фирма="", Касса=""
	Рез = 0;
	
	Если глФРВкл = 1 Тогда
		Параметры = СоздатьОбъект("СписокЗначений");
		Параметры.Установить("Процесс"      , "закрыть_смену");
		Параметры.Установить("Объект"       , глФР);
		Параметры.Установить("ПарольАдминистратора", глФРПарольАдминистратора);
		//[+] тщи 54ФЗ
		Параметры.Установить("Данные54ФЗ", СоздатьОбъект("СписокЗначений"));
		ПараметрыФР = Параметры.Получить("Данные54ФЗ");
		ПараметрыФР.Установить("Фирма", Фирма);
		ПараметрыФР.Установить("Касса", Касса);
		//[-] тщи 54ФЗ

15) в обработке ЗакрытиеКассовойСмены строку 
		Если глФРЗакрытьСмену(НомерЛенты, ОписаниеРезультата) = 0 Тогда
заменить на:
		Если глФРЗакрытьСмену(НомерЛенты, ОписаниеРезультата, ВыбФирма, ВыбКасса) = 0 Тогда  //тщи 54ФЗ  , ВыбФирма, ВыбКасса

16) В шапку документов ПКО, РКО, СтрокаВыпискиПриход и СтрокаВыпискиРасход добавить новые реквизиты: ФПД и НеПередаватьКлиентаВОФД.
Реквизит НеПередаватьКлиентаВОФД вывести на диалог формы документов в виде флажка.
Реквизит ФПД отображается в текством реквизите ТекстНомерЧекаККМ, для этого нужно увеличить его на диалоге формы документа по шиирине, чтобы вместить номер чека и номер ФПД.

17) В шапку документа ЧекККМ добавить новый реквизит: ФПД. На диалог формы документа добавить текстовый реквизит для отоборажения ФПД.

18) В табличную часть документа ЧекККМ можно добавить реквизит Партия с типом Справочник.Партии. Он служит для выбора ГТД кассиром, если необходимо продавать в розницу импортный товар и передавать в ОФД теги 1230 и 1231.