Убираем разницу в копейках в расчетах НДС

05.11.25

Задачи пользователя - Адаптация типовых решений

Убираем разницу в копейках между расчетной суммой НДС от суммы документа и построчного расчета НДС в документах: Реализация товаров и услуг, Заказ покупателя.

Вводные данные: 1С "Управление торговлей", редакция 10.3 (10.3.8.9), 8 организаций (4 с НДС).

Задача: Убрать разницу в копейках. Сумма НДС от суммы документа не равна сумме всех строк сумма НДС в документе.

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

Был создан общий модуль (серверный) - "ПересчетНДСРавенство" с процедурой "ВыровнятьНДСПоДокументуТоварыУслуги" в качестве параметра будем передавать "ДокОбъект".

 

// Выравнивание НДС по документу с двумя ТЧ: "Товары" и "Услуги".
// Единая ставка НДС (5% или 20%) на документ, расчет от брутто.
// Округляем только СуммаНДС в строках до 2 знаков.
// Распределение разницы методом дробных частей, шаг ±0,01, минимум по строке 0,00.

Процедура ВыровнятьНДСПоДокументуТоварыУслуги(ДокОбъект, ПорогМалойСтроки = 0.01) Экспорт

    // Получаем ставку НДС как число 5 или 20
	НовыйНабор = РегистрыСведений.СтавкаНДСОрганизации.СоздатьНаборЗаписей();
	НовыйНабор.Отбор.Организация.Установить(ДокОбъект.Организация);
	НовыйНабор.Прочитать();
	Ставка = УчетНДС.ПолучитьСтавкуНДС(НовыйНабор[0].СтавкаНДС);    
	Если (Ставка <> 5) И (Ставка <> 20) Тогда
        ВызватьИсключение "Поддерживаются ставки НДС 5% и 20%. Текущая: " + Строка(Ставка);
    КонецЕсли;

    Коэф = Ставка / (100 + Ставка);
    ТочностьКопеек = 2;

    // Сбор строк из двух табличных частей
    Т = Новый ТаблицаЗначений;
    Т.Колонки.Добавить("Источник");       // "Товары" или "Услуги"
    Т.Колонки.Добавить("Индекс");          // порядок ввода
    Т.Колонки.Добавить("Строка");          // объект строки ТЧ
    Т.Колонки.Добавить("СуммаСтроки");     // с НДС
    Т.Колонки.Добавить("НДСНеОкр");
    Т.Колонки.Добавить("НДСОкр");
    Т.Колонки.Добавить("Остаток");         // НДСНеОкр - НДСОкр

    СуммаДок = 0;
    Инд = 0;

    // Товары
    Если ДокОбъект.Метаданные().ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда
        Для Каждого СтрТ Из ДокОбъект.Товары Цикл
            СуммаДок = СуммаДок + СтрТ.Сумма;

            НДСНеОкрЛок = СтрТ.Сумма * Коэф;
            НДСОкрЛок   = Окр(НДСНеОкрЛок, ТочностьКопеек);

            Н = Т.Добавить();
            Н.Источник     = "Товары";
            Н.Индекс       = Инд;
            Н.Строка       = СтрТ;
            Н.СуммаСтроки  = СтрТ.Сумма;
            Н.НДСНеОкр     = НДСНеОкрЛок;
            Н.НДСОкр       = НДСОкрЛок;
            Н.Остаток      = НДСНеОкрЛок - НДСОкрЛок;

            Инд = Инд + 1;
        КонецЦикла;
    КонецЕсли;

    // Услуги
    Если ДокОбъект.Метаданные().ТабличныеЧасти.Найти("Услуги") <> Неопределено Тогда
        Для Каждого СтрУ Из ДокОбъект.Услуги Цикл
            СуммаДок = СуммаДок + СтрУ.Сумма;

            НДСНеОкрЛок = СтрУ.Сумма * Коэф;
            НДСОкрЛок   = Окр(НДСНеОкрЛок, ТочностьКопеек);

            Н = Т.Добавить();
            Н.Источник     = "Услуги";
            Н.Индекс       = Инд;
            Н.Строка       = СтрУ;
            Н.СуммаСтроки  = СтрУ.Сумма;
            Н.НДСНеОкр     = НДСНеОкрЛок;
            Н.НДСОкр       = НДСОкрЛок;
            Н.Остаток      = НДСНеОкрЛок - НДСОкрЛок;

            Инд = Инд + 1;
        КонецЦикла;
    КонецЕсли;

    Если Т.Количество() = 0 Тогда
        Возврат; // нечего выравнивать
    КонецЕсли;

    // НДС по документу
    НДСДокНеОкр = СуммаДок * Коэф;
    НДСДок = Окр(НДСДокНеОкр, ТочностьКопеек);

    // Сумма округленного НДС по строкам
    СумОкрНДС = 0;
    Для Каждого Р Из Т Цикл
        СумОкрНДС = СумОкрНДС + Р.НДСОкр;
    КонецЦикла;

    Разница = НДСДок - СумОкрНДС;

    // Если разницы нет — записываем значения в строки
    Если Макс(Разница, -Разница) < 0.005 Тогда
        Для Каждого Р Из Т Цикл
            Р.Строка.СуммаНДС = Окр(Р.НДСОкр, ТочностьКопеек);
        КонецЦикла;
        Возврат;
    КонецЕсли;

    // Количество копеек для распределения
    Копеек = Цел(Окр(Макс(Разница, -Разница) * 100, 0));

    // Таблица кандидатов
    Кандидаты = Новый ТаблицаЗначений;
    Кандидаты.Колонки.Добавить("Остаток");
    Кандидаты.Колонки.Добавить("СуммаСтроки");
    Кандидаты.Колонки.Добавить("Индекс");
    Кандидаты.Колонки.Добавить("Ссылка"); // ссылка на строку Т

    Если Разница > 0 Тогда
        // Нужно добавить копейки
        Для Каждого Р Из Т Цикл
            Если Р.НДСОкр >= ПорогМалойСтроки Тогда
                НК = Кандидаты.Добавить();
                НК.Остаток = Р.Остаток;
                НК.СуммаСтроки = Р.СуммаСтроки;
                НК.Индекс = Р.Индекс;
                НК.Ссылка = Р;
            КонецЕсли;
        КонецЦикла;

        // Если после фильтра никого — берём все строки
        Если Кандидаты.Количество() = 0 Тогда
            Для Каждого Р Из Т Цикл
                НК = Кандидаты.Добавить();
                НК.Остаток = Р.Остаток;
                НК.СуммаСтроки = Р.СуммаСтроки;
                НК.Индекс = Р.Индекс;
                НК.Ссылка = Р;
            КонецЦикла;
        КонецЕсли;

        Кандидаты.Сортировать("Остаток Убыв, СуммаСтроки Убыв, Индекс Возр");

        Пока Копеек > 0 Цикл
            Изменено = Ложь;
            Для Каждого К Из Кандидаты Цикл
                К.Ссылка.НДСОкр = К.Ссылка.НДСОкр + 0.01;
                Копеек = Копеек - 1;
                Изменено = Истина;
                Если Копеек = 0 Тогда Прервать; КонецЕсли;
            КонецЦикла;
            Если НЕ Изменено Тогда Прервать; КонецЕсли;
        КонецЦикла;

    Иначе // Разница < 0 — нужно отнять копейки
        Для Каждого Р Из Т Цикл
            Если Р.НДСОкр >= 0.01 И Р.НДСОкр >= ПорогМалойСтроки Тогда
                НК = Кандидаты.Добавить();
                НК.Остаток = Р.Остаток;
                НК.СуммаСтроки = Р.СуммаСтроки;
                НК.Индекс = Р.Индекс;
                НК.Ссылка = Р;
            КонецЕсли;
        КонецЦикла;

        // Если никого — ослабим фильтр (все, где НДСОкр >= 0.01)
        Если Кандидаты.Количество() = 0 Тогда
            Для Каждого Р Из Т Цикл
                Если Р.НДСОкр >= 0.01 Тогда
                    НК = Кандидаты.Добавить();
                    НК.Остаток = Р.Остаток;
                    НК.СуммаСтроки = Р.СуммаСтроки;
                    НК.Индекс = Р.Индекс;
                    НК.Ссылка = Р;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;

        Кандидаты.Сортировать("Остаток Возр, СуммаСтроки Убыв, Индекс Возр");

        Пока Копеек > 0 Цикл
            Изменено = Ложь;
            Для Каждого К Из Кандидаты Цикл
                Если К.Ссылка.НДСОкр >= 0.01 Тогда
                    К.Ссылка.НДСОкр = К.Ссылка.НДСОкр - 0.01;
                    Копеек = Копеек - 1;
                    Изменено = Истина;
                    Если Копеек = 0 Тогда Прервать; КонецЕсли;
                КонецЕсли;
            КонецЦикла;
            Если НЕ Изменено Тогда Прервать; КонецЕсли;
        КонецЦикла;

    КонецЕсли;

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

КонецПроцедуры

Вызывать будем из модуля документа из процедуры "ПередЗаписью", проверку на ставку "БезНДС", оформим там же, так как нам нужно обсчитывать только 5% и 20%

	НовыйНабор = РегистрыСведений.СтавкаНДСОрганизации.СоздатьНаборЗаписей();
	НовыйНабор.Отбор.Организация.Установить(Организация);
 	НовыйНабор.Прочитать();
 
 Если НовыйНабор[0].СтавкаНДС <> Перечисления.СтавкиНДС.БезНДС Тогда
  ПересчетНДСРавенство.ВыровнятьНДСПоДокументуТоварыУслуги(ЭтотОбъект);
 КонецЕсли;

Проверено на релизе 10.3.8.9.

PS - может, кому будет полезно.

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Разработка Адаптация типовых решений Производство готовой продукции (работ, услуг) Розничная торговля 1С:Управление торговлей 10 Россия Платные (руб)

Доработка для 1С:Управление торговлей 10.3 (релиз 10.3.88.3) добавляет поддержку маркировки новых категорий товаров согласно постановлениям Правительства РФ 2025–2026 гг. Конфигурация УТ 10.3 снята с поддержки — новые маркируемые категории в типовую поставку больше не попадают. Доработка закрывает этот пробел: новые виды номенклатуры, обмен с ГИС МТ «Честный Знак». Поставляется в виде файла .cf

14640 руб.

23.04.2026    1835    15    13    

16

Адаптация типовых решений БСП (Библиотека стандартных подсистем) Кадровый учет ЭДО и ОФД 1C:Бухгалтерия 1С:Зарплата и кадры 7.7 1C:ERP 1С:ЗУП 1С:УТ 1С:ДО Платные (руб)

Наше расширение 1С Госключ обеспечивает интеграцию любой конфигурации 1С на базе БСП с мобильным приложением «Госключ», позволяя сотрудникам подписывать кадровые документы (КЭДО) и документы материальной ответственности (МОЛ, ПБ) усиленной электронной подписью прямо со смартфона. Решение автоматизирует формирование и отправку документов на подпись, отслеживает статусы подписания и хранит подписанные файлы непосредственно в базе 1С

25000 руб.

06.03.2026    1615    4    0    

3

Печатные формы Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с соответствующими именами, при выводе на печать в размещённые картинки будут выводиться факсимиле из прикреплённых рисунков. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

6000 руб.

07.02.2023    13780    120    25    

76

Банковские операции Адаптация типовых решений Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

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

9760 руб.

17.06.2025    4182    10    0    

9

Адаптация типовых решений 1С 8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Расширение, которое в форму списка и форму выбора справочника «Номенклатура» добавляет табличную часть в виде дерева, в которую выводится информация об остатках и доступности выбранной номенклатурной позиции.

6710 руб.

20.04.2026    558    1    0    

3

Логистика, склад и ТМЦ Адаптация типовых решений Пользователь 1С:Предприятие 8 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Расширение для УНФ, чтобы автоматически отменять старые резервы и не мешалть эффективно продавать.

9150 руб.

02.08.2023    8511    26    5    

41

Адаптация типовых решений 1С 8.3 1С:Бухгалтерия 3.0 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Беларусь Россия Платные (руб)

Расширение "Дополнительные документы" предназначено для создания дополнительных документов различного назначения, как форм для внесения данных так и печатных форм в расширяемой конфигурации пользовательскими средствами, без работы в конфигураторе и внесения изменений в структуру данных. Тестировалось для "1С:БП", "1С:УНФ","1С:КА"

21859 руб.

29.12.2025    1674    1    8    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. V.Nikonov 130 05.11.25 12:20 Сейчас в теме
А разве штатно Сумма НДС Документа не равна Сумме НДС в строках?
2. weart 2 05.11.25 12:22 Сейчас в теме
В УТ сумма строк по столбцу СуммаНДС там из за округления разница в копейках. По факту нет.
3. suepifanov 1307 05.11.25 12:24 Сейчас в теме
После вот таких видимо доработок потом получаешь претензии от бухов - у вас тут все неправильно, переделывайте нам документы...
4. weart 2 05.11.25 12:28 Сейчас в теме
Как не странно, это именно бухи и просили сделать
5. suepifanov 1307 05.11.25 12:28 Сейчас в теме
(4) вот их надо отправить гуглить как это работает
VKuser15607932; +1 Ответить
6. elite128 12.11.25 11:15 Сейчас в теме
(5) В УТ11 и Бух 3 суммы считаются по разному, 1С ответили, что так и должно быть, потому что логику в коде писали разные разработчики ) И прилетает документ синхронизацией из УТ в Бух - а суммы на копейку разные. Часто доки выставляются в документообороте из УТ, вот потом возникают вопросы, почему суммы не бьются
7. IlyaReznikov 03.12.25 07:31 Сейчас в теме
Супер ! Спасибо ! Работает ! То что надо было. УТ 10.3.73.2
8. IlyaReznikov 03.12.25 10:23 Сейчас в теме
поправьте пожалуйста чтобы ставка ндс 10, которая есть вперемешку с 20 в табличной части считалась как раньше, сейчас все пересчитывается с 20%
9. weart 2 03.12.25 10:34 Сейчас в теме
Добрый день:
вот тут мы получаем ставку из регистра по отбору по организации (в регистре 2-а поля, организация и ставка(перечисление))
        НовыйНабор = РегистрыСведений.СтавкаНДСОрганизации.СоздатьНаборЗаписей();
	НовыйНабор.Отбор.Организация.Установить(ДокОбъект.Организация);
	НовыйНабор.Прочитать();


Вот это, стандартная:
	Ставка = УчетНДС.ПолучитьСтавкуНДС(НовыйНабор[0].СтавкаНДС);    


вот этот код можно и не использовать, т.к. вызывается процедура из документа и там проверяется ставка
	Если (Ставка <> 5) И (Ставка <> 20) Тогда
        ВызватьИсключение "Поддерживаются ставки НДС 5% и 20%. Текущая: " + Строка(Ставка);
    КонецЕсли;



вот вызов из документа:
Если НовыйНабор[0].СтавкаНДС <> Перечисления.СтавкиНДС.БезНДС Тогда
  ПересчетНДСРавенство.ВыровнятьНДСПоДокументуТоварыУслуги(ЭтотОбъект);
 КонецЕсли;
10. IlyaReznikov 03.12.25 14:30 Сейчас в теме
у меня странная контора, ставки ндс 5,10,20,22 %
что мне надо поменять в вашем чудесном решении расчета ндс ?
11. weart 2 03.12.25 14:45 Сейчас в теме
вам нужно получить "ставку" НДС (число 5, 10, 20, 22) зависимости от организации, можно получить из:
1. Учетная политика (зависимости от конфигурации)
2. Сделать регистр сведений (как у меня) где будет : Организация, СтавкаНДС
3. Получить ставку из табличной части самого документа.

Проще создать свой регистр (ну мне так кажется):
Регистр сведений: СтавкаНДСОрганизации
Измерения: Организация (Тип, СправочникСсылка.Организации)
СтавкаНДС (Тип, ПеречислениеСсылка.СтавкиНДС)

или у Вас в табл. части номенклатура с разными ставками, тип мед. перчатки и т.п.
12. IlyaReznikov 06.12.25 12:31 Сейчас в теме
разобрался, все нормально
Для отправки сообщения требуется регистрация/авторизация