Добавление новых ставок НДС в УТ 11.4 с ККМ

Клиенту, занимающемуся оптово-розничной торговлей, нужно добавить ставки в УТ 11.4. Можно было бы обновиться до последнего релиза УТ 11.5, но это объемно, потому что сделано много доработок, хотя и в расширениях, но все же. Решено обновлять текущую базу.

1. Доработки в конфигурации

НДС20 встречается 369 раз:

Добавляем значения ставок:

Изменения помечал маркером //Осипов НДС-2026 26.01.03

Модули МенеджерОборудованияВызовСервера, МенеджерОборудованияКлиентСервер — много копипасты, потому что ставки там прописаны напрямую в переменных, проще копировать код, что-то вроде:

//Осипов НДС-2026 26.01.03 +++
Если СуммаПозицийНДС5 > 0 Тогда
	ЗначениеНДС = ?(СуммаНДС5 > 0, СуммаНДС5, СуммаПозицийНДС5 / 105 * 5);
	Текст = Текст + ВыстроитьПоля(НСтр("ru=' СУММА НДС 5%'"), "=" + Формат(ЗначениеНДС, ФорматЧисла), ШиринаСтроки) + Символы.ПС;
КонецЕсли;                    
Если СуммаПозицийНДС7 > 0 Тогда
	ЗначениеНДС = ?(СуммаНДС7 > 0, СуммаНДС7, СуммаПозицийНДС7 / 107 * 7);
	Текст = Текст + ВыстроитьПоля(НСтр("ru=' СУММА НДС 7%'"), "=" + Формат(ЗначениеНДС, ФорматЧисла), ШиринаСтроки) + Символы.ПС;
КонецЕсли;                    
Если СуммаПозицийНДС22 > 0 Тогда
	ЗначениеНДС = ?(СуммаНДС22 > 0, СуммаНДС22, СуммаПозицийНДС22 / 122 * 22);
	Текст = Текст + ВыстроитьПоля(НСтр("ru=' СУММА НДС 22%'"), "=" + Формат(ЗначениеНДС, ФорматЧисла), ШиринаСтроки) + Символы.ПС;
КонецЕсли;                    
Если СуммаПозицийНДС105 > 0 Тогда
	ЗначениеНДС = ?(СуммаНДС105 > 0, СуммаНДС105, СуммаПозицийНДС105 / 105 * 5);
	Текст = Текст + ВыстроитьПоля(НСтр("ru=' СУММА НДС 5/105%'"), "=" + Формат(ЗначениеНДС, ФорматЧисла), ШиринаСтроки) + Символы.ПС;
КонецЕсли;
Если СуммаПозицийНДС107 > 0 Тогда
	ЗначениеНДС = ?(СуммаНДС107 > 0, СуммаНДС107, СуммаПозицийНДС107 / 107 * 5);
	Текст = Текст + ВыстроитьПоля(НСтр("ru=' СУММА НДС 7/107%'"), "=" + Формат(ЗначениеНДС, ФорматЧисла), ШиринаСтроки) + Символы.ПС;
КонецЕсли;
Если СуммаПозицийНДС122 > 0 Тогда
	ЗначениеНДС = ?(СуммаНДС122 > 0, СуммаНДС122, СуммаПозицийНДС122 / 122 * 5);
	Текст = Текст + ВыстроитьПоля(НСтр("ru=' СУММА НДС 22/122%'"), "=" + Формат(ЗначениеНДС, ФорматЧисла), ШиринаСтроки) + Символы.ПС;
КонецЕсли;
//---

Но особо не сильно менял, решил, что остальное поменяю позже, в первую очередь надо сделать доработки по пробитию чеков.

2. Первые тесты 1С и оборудования

Пришлось включить константы «Использовать учет НДС» и «Продажа товаров, облагаемых НДС у покупателя».

Общая политика учета не подходит, т.к. тогда не пробиваются чеки из-за другой СНО.

Раньше УСН была без НДС. Пришлось добавлять галочку дор_УСНСНДС в справочник УчетныеПолитикиОрганизаций.

И учитывать ее в УчетНДСЛокализация.ДополнитьПараметрыУчетаОрганизации:

//Осипов НДС-2026 26.01.03	
Если ПараметрыУчетнойПолитики.дор_УСНСНДС Тогда
	ПараметрыУчета.ОсновноеНалогообложениеНДСПродажи = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
КонецЕсли;

Драйвет торгового оборудования был старый 10.8.1.0, обновил на 10.10.8.0:

В чеке появилась ставка НДС, но почему-то не рассчитывалась сумма НДС, решил оставить пока так и разобраться позже.

3. Исправление ошибки СНО

Однако при печати чека возникла ошибка:

При печати чека произошла ошибка.
Чек не напечатан на фискальном устройстве.
Дополнительное описание:
ККТ не зарегистрирована с указанной системой налогообложения.

Пришлось запускать конфигуратор с отладкой на компьютере с кассой, чтобы разобраться с проблемой.

Ошибка возникает в ФорматноЛогическийКонтрольВызовСервера.ВыполненаПроверкаОбязательностиИПравильностиЗаполненияТэгов:

В параметрах чека код системы налогообложения неправильно 5 (Патент), а в кассе правильно 1 (УСН доход):

Оказалось, там застряли старые параметры регистрации устройства (старая СНО — патент).

Чтобы их обновить, нужно выбрать пункт «Изменение параметров регистрации», при этом дальше изменять не надо, при нажатии на кнопку параметры считаются и обновятся.

Чек пробился но со ставкой 0%:

  <Positions>
    <FiscalString Name="Резка"
        Quantity="1"
        PriceWithDiscount="10"
        AmountWithDiscount="10"
        DiscountAmount="0"
        Department="1"
        VATRate="0"
        VATAmount=""
        PaymentMethod="4"
        CalculationSubject="4">
      <AgentData/>
      <VendorData/>
    </FiscalString>
  </Positions>

РешиVATRate

Чтобы не допускать 0% ставки НДС, делал чек на возврат.

Обратил внимание что ставка НДС равна нулю:

Сделал точку останова в МенеджерОборудованияКлиент.НачатьВыполнениеКоманды_ВыбратьУстройствоЗавершение:

Чтобы не делать постоянно возвраты. Просто очищать в табло Параметры и фискализация чека возвращает ошибку.

Пропустил функцию УчетНДСУПКлиентСервер.ПолучитьСтавкуНДС, а она вызывалась как раз для расчета ставки НДС при фискализации и в прочих случаях:

Функция ПолучитьСтавкуНДС(СтавкаНДС) Экспорт
	
	Если СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10")
		Или СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС10_110") Тогда
		Возврат 10;
	ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18")
		Или СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС18_118") Тогда
		Возврат 18;
	ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20")
		Или СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС20_120") Тогда
		Возврат 20;
		//Осипов НДС-2026 26.01.03 +++
	ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС5") ИЛИ
		СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС5_105") 
		Тогда
		Возврат 5;    
	ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС7") ИЛИ
		СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС7_107") 
		Тогда
		Возврат 7;    
	ИначеЕсли СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС22") ИЛИ
		СтавкаНДС = ПредопределенноеЗначение("Перечисление.СтавкиНДС.НДС22_122") 
		Тогда
		Возврат 22;    //---
	Иначе
		Возврат 0;
	КонецЕсли;
	
КонецФункции

При этом пришлось обновлять конфгирацию на сервере, с локального компьютера это делалось очень медленно.

4. Обновление драйвера ККМ в 1С

Далее при пробитии чека возникла уже знакомая мне ошибка:

При печати чека произошла ошибка.
Чек не напечатан на фискальном устройстве.
Дополнительное описание:
При выполнении операции произошла ошибка: Некорректное значение поля "items[0].tax.type" ()

Она связана с тем, что драйвер не знает ставку НДС 5%.

Проверил в отладчике в МенеджерОборудованияВызовСервера.СформироватьXMLПакетДляФискализацияЧека, что сюда действительно приходит ставка НДС 5%:

Значит, проблема в драйвере ККМ, который не знает ничего про ставку 5%.

Заходим в справочник Драйверы оборудования e1cib/list/Справочник.ДрайверыОборудования. Нажимаем «Добавить новый драйвер из файла». Я выгрузил рабочий драйвер из УТ 11.5 в файл ДрайверАТОЛККТ54ФЗ107X_ru.zip, его и выбираю:

Дал ему говорящее наименование «АТОЛ:ККТ с передачей данных в ОФД 10.x НДС 5% 2026»:

Правда, новый драйвер писал, что его версия отличается, но я это игнорирую:

Чек пробился, но у него по-прежнему нулевая сумма НДС, ну это идет из чека, там сумма НДС не вычисляется почему-то:

  <Positions>
    <FiscalString Name="Резка"
        Quantity="1"
        PriceWithDiscount="10"
        AmountWithDiscount="10"
        DiscountAmount="0"
        Department="1"
        VATRate="5"
        VATAmount=""
        PaymentMethod="4"
        CalculationSubject="4">
      <AgentData/>
      <VendorData/>
    </FiscalString>

5. Пересчет суммы НДС в РМК

Осталось добиться, чтобы пересчитывалась сумма НДС в РМК.

Оказалось, что после поправки расчета суммы НДС по ставке при смене количества сумма НДС рассчитывается, а при смене цены нет. Оказалось, что в типовой УТ нет смены цены и там были сделаны доработки, вот я прямо туда и прописал вызов перерасчета ставки НДС:

&НаКлиенте
Процедура Расш70_ТоварыЦенаПриИзмененииПеред(Элемент)
		ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;	
	СтруктураДействий = Новый Структура;
	ДобавитьВСтруктуруДействияПриИзмененииЦены(СтруктураДействий,Объект);
	
	//Осипов НДС-2026 26.01.03 Нужно пересчитываь сумму НДС при изменении цены
	СтруктураДействий.Вставить("ПересчитатьСуммуНДС", ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(Объект));
	ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
	
	ПересчитатьДокументНаКлиенте();
КонецПроцедур

При смене цены сумма НДС стала перерасчитываться:

Правильность суммы было считать лень, попросил ИИ:

Пробил чек, но там по-прежнему была нулевая сумма НДС. Хотя сумма НДС в табличной части чека не нулевая:

Конфигуратор отлаживал только на сервере, а массив позиций чеков формировался где-то на клиенте. Но я сформировал ошибку и увидел примерный путь:

Значение не является значением объектного типа (ЗаписатьАтрибут)
{ОбщийМодуль.МенеджерОборудованияВызовСервера.Модуль(3134)}:ЗаписьXML.ЗаписатьАтрибут("VATRate", XMLСтрока(ЗначениеСтавкаНДС)); // Ставка НДС
{ОбщийМодуль.МенеджерОборудованияВызовСервера.Модуль(4003)}:МенеджерОборудованияВызовСервера.СформироватьXMLПакетДляФискализацияЧека(ОбщиеПараметры, ПараметрыФискализации);
{ОбщийМодуль.ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.Модуль(1208)}:ПараметрыФискализации = МенеджерОборудованияВызовСервера.ПодготовитьДанныеФискализацииЧека(ВходныеПараметры, ПараметрыПодключения);
{ОбщийМодуль.ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.Модуль(256)}:Результат = ФискализацияЧека(ОбъектДрайвера, Параметры, ПараметрыПодключения, ВходныеПараметры, ВыходныеПараметры);
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(2909)}:Результат = ОбработчикДрайвераМодуль.ВыполнитьКоманду(ПараметрыВыполнения.Команда, ПараметрыВыполнения.ВходныеПараметры,
{Документ.ЧекККМ.Форма.ФормаДокументаРМК.Форма(1855)}:ВыполнитьОбработкуОповещения(ПараметрыВыполнения.ОповещениеПродолжения, ПараметрыВыполнения);
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(2798)}:ВыполнитьОбработкуОповещения(Параметры.ОповещениеПослеОткрытииЧека, ПараметрыВыполнения);
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(1948)}:НачатьВыполнениеКомандыПечатиЧека(ОписаниеОповещения, Параметры.ИдентификаторУстройства, ВыполняемаяКоманда, Параметры, Параметры.ВходныеПараметры);
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(601)}:ВыполнитьОбработкуОповещения(ОповещениеПриПодключении, РезультатВыполнения);
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(467)}:НачатьПодключениеОборудования(ОповещениеПриПодключении, ИдентификаторКлиента, , ИдентификаторУстройства);
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(1888)}:НачатьПодключениеОборудованиеПоИдентификатору(ОписаниеОповещения, Параметры.УникальныйИдентификатор, ИдентификаторУстройства);
{ОбщийМодуль.МенеджерОборудованияКлиент.Модуль(2339)}:НачатьВыполнениеКомандыВыбратьУстройствоЗавершение(ИдентификаторУстройства, Контекст); {Документ.ЧекККМ.Форма.ФормаДокументаРМК.Форма(1810)}:МенеджерОборудованияКлиент.НачатьФискализациюЧекаНаФискальномУстройстве( {Документ.ЧекККМ.Форма.ФормаДокументаРМК.Форма(4614)}:ВыполнитьОбработкуОповещения(ОповещениеПриЗавершении, Истина); {РасширениеДляККМv2 Документ.ЧекККМ.Форма.ФормаДокументаРМК.Форма(135)}:НСтр("ru = 'Перед выполнением операции пробития чека не удалось провести документ.'")); {Доработки Документ.ЧекККМ.Форма.ФормаДокументаРМК.Форма(804)}:ПробитьЧек();
{Документ.ЧекККМ.Форма.ФормаДокументаРМК.Форма(4179)}:ОбработатьДобавлениеОплаты(ДополнительныеПараметры);
{Документ.ЧекККМ.Форма.ФормаСмешаннойОплаты.Форма(325)}:Закрыть(РезультатОплаты);

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

Пришлось прописывать код по установке суммы НДС в ФормаДокументаРМК.ДанныеДляПробитияЧека:

В отладчике увидел, что это сработало:

Странно, получается в типовой УТ НДС в чек не подставляется, раз пришлось исправлять эту ошибку?

В XML увидел ставку НДС, в представлении нет:

  <Positions>
    <FiscalString Name="Резка"
        Quantity="1"
        PriceWithDiscount="10"
        AmountWithDiscount="10"
        DiscountAmount="0"
        Department="1"
        VATRate="5"
        VATAmount="0.48"
        PaymentMethod="4"
        CalculationSubject="4">
      <AgentData/>
      <VendorData/>
    </FiscalString>
  </Positions>

Но решил попросить печатную форму чека или ОФД, может 1С просто так отрисовывает представление чеков с НДС. В ОФД выглядит прилично:

6. Установка ставок НДС 5%

К счастью, клиент торгует товаром только по обычной ставке НДС (20%), не пониженной (10%). Поэтому везде проставляю у товаров ставку 5% с помощью групповой обработки Андрея Волина:

В настройках указываю важное, чтобы не было проблем с обработкой:

Предупредил клиента, чтобы у новых товаров ставили 5%. Поэтому проставляю ставку НДС 5% у видов номенклатуры:

7. Проблема с кодом товара

При пробитии некоторых товаров (без штрих-кода) возникала ошибка:

При печати чека произошла ошибка.
Чек не напечатан на фискальном устройстве.
Дополнительное описание:
При выполнении операции произошла ошибка:
Неподдерживаемый тип кода товара

Нашел решение на инфостарте, проверил в модуле МенеджерОборудованияВызовСервера.ЗаписатьДанныеКодаТоварнойНоменклатуры что записывается в тег GoodCodeData:

		Если НЕ ПустаяСтрока(Позиция.КодВидаНоменклатурнойКлассификации) Тогда
			ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.КодВидаНоменклатурнойКлассификации);
			РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
		Иначе
			РеквизитКодаТовара = ДанныеКодаТоварнойНоменклатуры.РеквизитКодаТовара;
			// Если реквизит кода товара (1162) не передается в готовом виде сформируем его из штрихкода
			Если ПустаяСтрока(РеквизитКодаТовара) Тогда
				ДанныеКодаТовара = МенеджерОборудованияМаркировкаКлиентСервер.РазобратьШтриховойКодТовара(Позиция.Штрихкод);
				РеквизитКодаТовара = ДанныеКодаТовара.РеквизитКодаТовара;
			КонецЕсли;
		КонецЕсли;
		
		// Если первые 2 байта значения кода товара имеют значения "00h00h" в автономном режиме реквизит не включается.
		Если ПараметрыФискализации.АвтономныйРежим И Лев(РеквизитКодаТовара, 2) = "AA" Тогда
			Возврат;
		КонецЕсли;
		// Реквизит кода товара (1162) для стандарта 3.2 и выше в ККТ передается в готовом виде.
		Если НЕ ПустаяСтрока(РеквизитКодаТовара) Тогда
			ЗаписьXML.ЗаписатьНачалоЭлемента("GoodCodeData");
			ЗаписьXML.ЗаписатьАтрибут("MarkingCode", XMLСтрока(РеквизитКодаТовара));
			ЗаписьXML.ЗаписатьКонецЭлемента();
		КонецЕсли;

Если я добавлял внутренний штрих-код с префиксом 22, записывало что-то вроде двоичного значения штрих-кода: RQ0B1lFiKGk=.

У клиента пока что нет маркировки, так что я временно отключил запись этого реквизита.

Дальнейшие доработки

Далее нужно вернуть суммы НДС в реализации, решать вопрос со счет-фактурами и т.п., т.е. обработать уже контур оптовой торговли.

Выводы

Думаю, это обновление не надолго спасет клиента, может еще на год. Потом все же придется переходить на новую УТ. Слишком много слабых мест — от логики 1С, до библиотеки подключаемого оборудования и драйверов. Но годик простоит, если не будет существенных изменений в законах.

Среда: УТ 11.4.13.46 Объем: 6 час.

image_pdfimage_print

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Вам может также понравиться...

комментариев 16

  1. rzd:

    Вместо типового обновления сомнительные доработки — путь в никуда

    • это тактика. Можно было обновляться до нового года. А вот обновляться на новый год такое себе. Переживут новый год, адаптируются и в середине года, когда захотят работать с маркированным товаром, обновятся уже спокойно.
      потому что сделано слишком много доработок. Процесс встанет, имхо.

      • rzd:

        Спокойно уже не обновятся. А скорее всего никак не обновятся

        • а что ему помешает спокойно обновиться?
          делается копия базы, делаются обновления, в копию переносится не спеша нужный функционал.
          далее уже переводится рабочая база.
          лучше эти этапы разделить. если переход на новые ставки и СНО совместить с переходом на новый функционал, это неделя простоя предприятия.

  2. Виктор 1с:

    Судя по вашим решениям вы недавно в 1с? Только учитесь программированию?

  3. Сергей:

    Спасибо, бро! Я уже потерял надежду, что справлюсь с этой ставкой НДС, но потом наткнулся на твою статью, вдохновился тем, что я уже близок к разгадке и допилил её!!! Прям респект!

  4. Вячеслав:

    Добрый день!.
    Один момент хотел уточнить. Как только залили в справочник новый драйвер «АТОЛ:ККТ с передачей данных в ОФД 10.x НДС 5% 2026»,
    его же нужно подцепить в саму кассу. Но в сущ. карточке оборудования это поле уже не доступно. Т.е. нужно создавать/заводить новое рабочей место-кассу ?

    • Ну можете да, создать новый экземпляр оборудования, где выберете этот драйвер. А старый экземпляр убрать. Только новый экземпляр нужно прописать или в настройках рабочего места или в кассах ККМ

  5. Вячеслав:

    Я также с последней УТ 11.5.22.145 скачал и установил Драйвер.
    Но у нас старая УТ 11.4.6.174 во всех функциях где идет обращение к ОбъектДрайвера.ПолучитьОписание…. и в других функциях выдается конечно ошибка о нехватке параметров и т.д. Понятное дело, драйвер под 11.5 написан, а наша база старая. И почему 1с ники как для платформы 8.2 на сайте обновлений выкладывают внешнии обработки постоянно, изменилась прошивка, залил новую обработку 8.2 и старая УТ 10 печает и 22% и т.д. А под УТ 11х версий таких обработок-драйверов внешних нету почему-то. Вот скрин ошибки для примера и таких подобных мест много, можно было бы доработать если бы был открытый код обработки-драйвера 11.5 как для 8.2 платформы делают.

    • я в старой конфигурации прикрутил Торговое Оборудование Легкое, заняло 4 часа.
      Сам формирую и пробиваю чеки на Атолл.
      Это проще, чем ковырять типовое легаси.

      • Денис:

        А что такое Торговое Оборудование Легкое и можно ли его прикрутить к переписанной КА 2.4? Может есть где то пример интеграции? Буду очень признателен. А то у меня такая же проблема как у Вячеслава и не знаю как решить.

        • Сам ТОЛ я недавно включил в F³, скачать можно тут:
          https://github.com/fixinchik/F3/releases

          Как это интегрировать, опишу в течении недели.
          если нужно срочно, могу платно за 2000 выслать образцы кода.
          Просто сейчас нет времени этим заниматься. если не горит, подождите.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *