Программное обеспечение НДС

С 2008 года действует льгота по НДС при продаже программного обеспечения. С вводом в Налоговый кодек РФ (далее НК РФ) подпункта 26 в пункт 2 статьи 149 к неподлежащим налогообложению (освобождаемым от налогообложения) налогом на добавленную стоимость операциям была добавлена реализации исключительных прав на программы для электронных вычислительных машин (ЭВМ), а также прав на их использование на основании лицензионного договора.

Стоит иметь в виду, что отказаться от такой льготы нельзя, что прямо следует из содержания пункта 5 статьи 149 НК РФ. Иными словами, если вдруг кто-то решит продать программный продукт, выделив в документах НДС и предоставив покупателю счет-фактуру, покупатель можете от этого понести потери, так как взять к вычету такой НДС он не сможет.

Объект налогообложения

Определимся с объектом налогообложения. Программы для ЭВМ признаются объектами интеллектуальной собственности (п. 1 ст. 1225 ГК РФ). В то же время такие программы являются объектами авторских прав, охраняемыми законом как литературное произведение.

Автору программы изначально принадлежит исключительное право на программу.

Организация может выступать правообладатель программы, если такое право по договору отчуждения.

Правообладателем на программу организация будет и в случаях, когда программы для ЭВМ:

– разработаны сотрудниками организации в рамках трудовых договоров;

– разработаны по договорам авторского заказа, если в таких договорах предусмотрено отчуждение исключительных прав на программы;

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

Исключительные права на программы ЭВМ могут быть переданы двумя путями:

  1. Путем отчуждения права.
  2. Путем предоставления лицензии на использование права (Читайте также статью ⇒ Продажа без НДС товаров / услуг).

Что попадает под данное льготное налогообложение

Итак, льготируются с точки зрения НДС:

  1. Программы для ЭВМ.
  2. Права на использования программ для ЭВМ, передаваемые на основании лицензионного договора.

Разберемся в вопросе передачи права по лицензионному договору более подробно.

Согласно гражданскому кодексу по лицензионному договору (статья 1235 ГК РФ) передаются исключительное право использования интеллектуальной собственности.

Если передаются неисключительные права – это уже сублицензионный договор (статья 1238 ГК РФ).

Можно ли применять рассматриваемую льготу и обоим договорам? Однозначного ответа нет.

С одной стороны, в пункте 5 статьи 1238 ГК РФ есть указание на то, что к сублицензионному договору применяются правила о лицензионном договоре.

С другой стороны – в п.п. 26 п. 2 ст. 149 НК РФ назван только лицензионный договор.

Кроме того, в пункте 5 статьи 1286 ГК РФ есть правило, что договор о предоставлении покупателю простой (неисключительной) лицензии на использование программы для ЭВМ может быть заключен в упрощенном порядке.

Упрощенный порядок состоит в оформлении прав пользования программами для ЭВМ путем заключения договора присоединения. Условия такого договора могут быть прописаны непосредственно на экземпляре программы для ЭВМ или ее упаковке, либо в электронном виде.

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

Разъяснения контролирующих органов по п.п. 26 п. 2 ст. 149 НК РФ

Некоторые случаи, когда контролирующие органы допускают применение льготы, приведены в Таблице 1.

Таблица 1.

№ п/п Объект налогообложения Документ
1 Передача права на программу через интернет по лицензионному (сублицензионному договору) Письмо ФНС России от 30.01.2017 № СД-4-3/1580@
2 Передача прав на использование неактивированных данных и команд компьютерной онлайн-игры по лицензионному договору Письмо ФНС России от 23.01.2017 № СД-4-3/988@
3 Передача прав на использование программ для ЭВМ по лицензионному договору Письмо Минфина России от 01.12.2016 № 03-07-11/71133
4 Передача прав на программное обеспечение по сублицензионному договору Письмо Минфина России от 06.10.2016 № 03-07-11/58299

Не попадают под льготное налогообложение по п.п. 26 п. 2 ст. 149 НК РФ

Исходя из формулировок п.п. 26 п.2 ст. 149 НК РФ не льготируются, подлежат налогообложению НДС:

  • реализации работ/услуг по созданию программ для ЭВМ, выполняемых на основании договоров подряда (письмо УФНС России по г. Москве от 30.03.2012 № 16-15/27670);
  • оказания услуг по разработке, доработке, модификации программного обеспечения, передачи права на них на основании смешанного договора (Письмо УФНС России по г. Москве от 10.03.2009 № 16-15/020629);
  • услуги технической поддержки программного обеспечения для ЭВМ, переданного по лицензионному договору (Письмо Минфина России от 06.03.2015 № 03-07-07/12158);
  • реализации экземпляров программ для ЭВМ на основании договора купли-продажи, в том числе и в случае продажи в розницу (Письмо Минфина России от 21.10.2014 № 03-07-03/52967);
  • реализация прав пользования дополнительного функционала игры в целях облегчения игрового процесса и более быстрого развития игрового персонажа (Письмо Минфина России от 21.10.2014 № 03-07-03/52967).

Ответы на распространенные вопросы

Вопрос № 1:

Можно ли воспользоваться льготой по НДС по п.п.26 п.2 ст. 149 НК РФ, если при продаже программных продуктов заключаются не лицензионные договора, а договора поставки?

Ответ:

Скорее всего, нет, хотя надо исходить не только из названия договора, а и из его содержания. Для того, чтобы воспользоваться льготой, нужно выяснить, есть ли в таких договорах положения, содержащие данные о передаче исключительных прав на программы, либо правила использования программных продуктов (Читайте также статью ⇒ Налоговые льготы по НДС 2020).

Вопрос № 2:

Исполнитель производит работы по сборке ЭВМ, включая установку и настройку программного обеспечения. У исполнителя есть письмо от производителя программы, содержащее утверждение о том, что лицензия на программу является ее неотъемлемой частью, оформление лицензионного договора не требуется. Можно ли в этом случае воспользоваться льготой по п.п.26 п.2 ст. 149 НК РФ?

Ответ:

На наш взгляд, данного письма производителя недостаточно. Для применения рассматриваемой льготы по НДС необходимо заключить лицензионный договор с производителем программного обеспечения.

Вопрос № 3:

Мы является торговой организацией и перепродаем программное обеспечение. Можем ли мы воспользоваться льготой по п.п.26 п.2 ст. 149 НК РФ?

Ответ:

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

Проектирование и реализация программного обеспечения

Реализация программного обеспечения – это процесс перевода системной спецификации в работоспособную систему. Этап реализации всегда включает процессы проектирования и программирования, но если для разработки ПО применяется эволюционный подход, этап реализации также может включать процесс внесения изменений в системную спецификацию.

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

Процесс проектирования может включать разработку нескольких моделей системы различных уровней обобщения. Поскольку проектирование – это процесс декомпозиции, такие модели помогают выявить ошибки, допущенные на ранних стадиях проектирования, а следовательно, позволяют внести изменения в ранее созданные модели. На рис. 3.9 показана схема процесса проектирования ПО с указанием результата каждого этапа проектирования. Эта схема построена в предположении, что все этапы процесса проектирования выполняются последовательно. На практике эти этапы перекрываются вследствие неизбежных обратных связей от одного этапа к предыдущему и повторного выполнения некоторых проектных работ.

Результатом каждого этапа проектирования является спецификация, необходимая для выполнения следующего этапа. Эта спецификация может быть абстрактной и формальной, т.е. такой, какая необходима для детализации системных требований; но она может быть и частью разрабатываемой системы. Так как процесс проектирования непрерывен, спецификации постепенно становятся все более детализированными. Конечными результатами процесса проектирования являются точные спецификации на алгоритмы и структуры данных, которые будут реализованы на следующем этапе создания ПО.

Ниже перечислены отдельные этапы процесса проектирования.

1. Архитектурное проектирование. Определяются и документируются подсистемы и взаимосвязи между ними.

2. Обобщенная спецификация. Для каждой подсистемы разрабатывается обобщенная спецификация на ее сервисы и ограничения.

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

4. Компонентное проектирование. Проводится распределение системных функций (сервисов) по различным компонентам и их интерфейсам.

5. Проектирование структур данных. Детально разрабатываются структуры данных, необходимые для реализации программной системы.

6. Проектирование алгоритмов. Детально разрабатываются алгоритмы, предназначенные для реализации системных сервисов.

Рис. 3.9. Обобщенная схема процесса проектирования

Описанная схема процесса проектирования является достаточно общей и на практике может (и должна) адаптироваться применительно к разработке конкретного программного продукта. Например, два последних этапа, проектирование структур данных и алгоритмов, могут быть как составными частями процесса проектирования, так и входить в процесс реализации ПО. Если для создания программной системы используются некоторые уже готовые компоненты, это может наложить ограничения на архитектуру системы и интерфейсы системных модулей. Это означает, что количество компонентов, требующих проектирования, значительно уменьшится. Если в процессе проектирования используется метод проб и ошибок, то системные интерфейсы могут разрабатываться после определения структур данных.

Дата добавления: 2015-08-14; просмотров: 2581; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Структурированное программирование

В процессе кодирования строки кода продолжают умножаться, поэтому размер программного обеспечения увеличивается. Постепенно становится практически невозможно запомнить ход программы. Если забыть, как сконструированы программное обеспечение и лежащие в его основе программы, файлы, процедуры, тогда становится очень трудно делиться, отлаживать и модифицировать программу. Решением этого является структурированное программирование. Он поощряет разработчика использовать подпрограммы и циклы вместо простых переходов в коде, тем самым внося ясность в код и повышая его эффективность. Структурированное программирование также помогает программисту сократить время кодирования и правильно организовать код.

Структурированное программирование устанавливает, как программа должна быть закодирована. Структурированное программирование использует три основных понятия:

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

  • Модульное программирование — при программировании код разбивается на меньшую группу инструкций. Эти группы известны как модули, подпрограммы или подпрограммы. Модульное программирование, основанное на понимании нисходящего анализа. Он препятствует переходам, используя в программе операторы ‘goto’, что часто делает поток программы не отслеживаемым. Переходы запрещены и модульный формат приветствуется в структурированном программировании.

  • Структурное кодирование. В соответствии с анализом сверху вниз, структурированное кодирование подразделяет модули на более мелкие блоки кода в порядке их выполнения. Структурированное программирование использует управляющую структуру, которая управляет потоком программы, в то время как структурированное кодирование использует управляющую структуру для организации своих инструкций в определенных шаблонах.

Нисходящий анализ — всегда выполняется программное обеспечение для выполнения рациональной работы. Эта рациональная работа известна как проблема на языке программного обеспечения. Поэтому очень важно, чтобы мы понимали, как решить проблему. При нисходящем анализе проблема разбивается на маленькие части, каждая из которых имеет какое-то значение. Каждая проблема решается индивидуально, и четко обозначены шаги по ее решению.

Модульное программирование — при программировании код разбивается на меньшую группу инструкций. Эти группы известны как модули, подпрограммы или подпрограммы. Модульное программирование, основанное на понимании нисходящего анализа. Он препятствует переходам, используя в программе операторы ‘goto’, что часто делает поток программы не отслеживаемым. Переходы запрещены и модульный формат приветствуется в структурированном программировании.

Структурное кодирование. В соответствии с анализом сверху вниз, структурированное кодирование подразделяет модули на более мелкие блоки кода в порядке их выполнения. Структурированное программирование использует управляющую структуру, которая управляет потоком программы, в то время как структурированное кодирование использует управляющую структуру для организации своих инструкций в определенных шаблонах.

Функциональное программирование

Функциональное программирование — это стиль языка программирования, в котором используются понятия математических функций. Функция в математике всегда должна давать один и тот же результат при получении одного и того же аргумента. На процедурных языках поток программы проходит через процедуры, т. Е. Управление программой передается вызываемой процедуре. Пока поток управления переходит от одной процедуры к другой, программа меняет свое состояние.

В процедурном программировании процедура может давать разные результаты, когда она вызывается с одним и тем же аргументом, поскольку сама программа может находиться в другом состоянии при вызове. Это свойство, а также недостаток процедурного программирования, в котором важна последовательность или время выполнения процедуры.

Функциональное программирование предоставляет средства вычисления в виде математических функций, которые дают результаты независимо от состояния программы. Это позволяет прогнозировать поведение программы.

Функциональное программирование использует следующие понятия:

  • Функции первого класса и высшего порядка. Эти функции могут принимать другую функцию в качестве аргумента или возвращать другие функции в качестве результата.

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

  • Рекурсия — рекурсия — это метод программирования, при котором функция вызывает себя и повторяет в ней программный код, если не совпадает какое-то предварительно определенное условие. Рекурсия — это способ создания циклов в функциональном программировании.

  • Строгая оценка — это метод оценки выражения, переданного функции в качестве аргумента. Функциональное программирование имеет два типа методов оценки: строгий (нетерпеливый) или нестрогий (ленивый). Строгая оценка всегда вычисляет выражение перед вызовом функции. Нестрогая оценка не оценивает выражение, если оно не требуется.

  • λ-исчисление — большинство функциональных языков программирования используют λ-исчисление в качестве систем типов. λ-выражения выполняются путем их оценки по мере их появления.

Функции первого класса и высшего порядка. Эти функции могут принимать другую функцию в качестве аргумента или возвращать другие функции в качестве результата.

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

Рекурсия — рекурсия — это метод программирования, при котором функция вызывает себя и повторяет в ней программный код, если не совпадает какое-то предварительно определенное условие. Рекурсия — это способ создания циклов в функциональном программировании.

Строгая оценка — это метод оценки выражения, переданного функции в качестве аргумента. Функциональное программирование имеет два типа методов оценки: строгий (нетерпеливый) или нестрогий (ленивый). Строгая оценка всегда вычисляет выражение перед вызовом функции. Нестрогая оценка не оценивает выражение, если оно не требуется.

λ-исчисление — большинство функциональных языков программирования используют λ-исчисление в качестве систем типов. λ-выражения выполняются путем их оценки по мере их появления.

Common Lisp, Scala, Haskell, Erlang и F # являются примерами функциональных языков программирования.

Стиль программирования

Стиль программирования — это набор правил кодирования, которым следуют все программисты для написания кода. Когда несколько программистов работают над одним программным проектом, им часто приходится работать с программным кодом, написанным другим разработчиком. Это становится утомительным или порой невозможным, если все разработчики не следуют некоторому стандартному стилю программирования для кодирования программы.

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

Руководство по кодированию

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

Следующие элементы кодирования могут быть определены в соответствии с руководящими принципами кодирования организации:

  • Соглашения об именах — этот раздел определяет, как называть функции, переменные, константы и глобальные переменные.

  • Отступ — это пробел, оставленный в начале строки, обычно 2-8 пробелов или одна вкладка.

  • Пробелы — обычно не указываются в конце строки.

  • Операторы — Определяет правила написания математических, присваивающих и логических операторов. Например, оператор присваивания ‘=’ должен иметь пробел до и после него, как в «x = 2».

  • Управляющие структуры — правила написания if-then-else, case-switch, while-before и для операторов потока управления исключительно и во вложенном виде.

  • Длина строки и перенос — определяет, сколько символов должно быть в одной строке, в основном длина строки составляет 80 символов. Обтекание определяет способ переноса строки, если она слишком длинная.

  • Функции — это определяет, как функции должны быть объявлены и вызваны, с параметрами и без параметров.

  • Переменные. Здесь указывается, как переменные различных типов данных объявляются и определяются.

  • Комментарии — это один из важных компонентов кодирования, так как комментарии, включенные в код, описывают, что на самом деле делает код, и все другие связанные описания. Этот раздел также помогает создавать справочную документацию для других разработчиков.

Соглашения об именах — этот раздел определяет, как называть функции, переменные, константы и глобальные переменные.

Отступ — это пробел, оставленный в начале строки, обычно 2-8 пробелов или одна вкладка.

Пробелы — обычно не указываются в конце строки.

Операторы — Определяет правила написания математических, присваивающих и логических операторов. Например, оператор присваивания ‘=’ должен иметь пробел до и после него, как в «x = 2».

Управляющие структуры — правила написания if-then-else, case-switch, while-before и для операторов потока управления исключительно и во вложенном виде.

Длина строки и перенос — определяет, сколько символов должно быть в одной строке, в основном длина строки составляет 80 символов. Обтекание определяет способ переноса строки, если она слишком длинная.

Функции — это определяет, как функции должны быть объявлены и вызваны, с параметрами и без параметров.

Переменные. Здесь указывается, как переменные различных типов данных объявляются и определяются.

Комментарии — это один из важных компонентов кодирования, так как комментарии, включенные в код, описывают, что на самом деле делает код, и все другие связанные описания. Этот раздел также помогает создавать справочную документацию для других разработчиков.

Документация по программному обеспечению

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

Ухоженная документация должна включать следующие документы:

  • Документация по требованиям — эта документация является ключевым инструментом для разработчика программного обеспечения, разработчика и группы тестирования для выполнения соответствующих задач. Этот документ содержит все функциональное, нефункциональное и поведенческое описание предполагаемого программного обеспечения.

    Источником этого документа могут быть ранее сохраненные данные о программном обеспечении, уже запущенном программном обеспечении на стороне клиента, интервью клиента, анкетирование и исследование. Как правило, он хранится в форме электронной таблицы или документа для обработки текстов с командой высококлассного управления программным обеспечением.

    Эта документация служит основой для разработки программного обеспечения и в основном используется на этапах верификации и валидации. Большинство тестовых случаев построены непосредственно из документации требований.

  • Документация по разработке программного обеспечения — эта документация содержит всю необходимую информацию, необходимую для создания программного обеспечения. Он содержит: (a) архитектуру программного обеспечения высокого уровня, (b) детали разработки программного обеспечения, (c) диаграммы потоков данных, (d) проектирование базы данных

    Эти документы работают в качестве хранилища для разработчиков для реализации программного обеспечения. Хотя в этих документах не содержится каких-либо подробностей о том, как кодировать программу, они предоставляют всю необходимую информацию, необходимую для кодирования и реализации.

  • Техническая документация. Эти документы поддерживаются разработчиками и действующими программистами. Эти документы, в целом, представляют информацию о коде. При написании кода программисты также упоминают цель кода, кто его написал, где он потребуется, что он делает и как он делает, какие другие ресурсы использует код и т. Д.

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

    Доступны различные автоматизированные инструменты, а некоторые поставляются с самим языком программирования. Например, Java поставляется с инструментом JavaDoc для создания технической документации кода.

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

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

Документация по требованиям — эта документация является ключевым инструментом для разработчика программного обеспечения, разработчика и группы тестирования для выполнения соответствующих задач. Этот документ содержит все функциональное, нефункциональное и поведенческое описание предполагаемого программного обеспечения.

Источником этого документа могут быть ранее сохраненные данные о программном обеспечении, уже запущенном программном обеспечении на стороне клиента, интервью клиента, анкетирование и исследование. Как правило, он хранится в форме электронной таблицы или документа для обработки текстов с командой высококлассного управления программным обеспечением.

Эта документация служит основой для разработки программного обеспечения и в основном используется на этапах верификации и валидации. Большинство тестовых случаев построены непосредственно из документации требований.

Документация по разработке программного обеспечения — эта документация содержит всю необходимую информацию, необходимую для создания программного обеспечения. Он содержит: (a) архитектуру программного обеспечения высокого уровня, (b) детали разработки программного обеспечения, (c) диаграммы потоков данных, (d) проектирование базы данных

Эти документы работают в качестве хранилища для разработчиков для реализации программного обеспечения. Хотя в этих документах не содержится каких-либо подробностей о том, как кодировать программу, они предоставляют всю необходимую информацию, необходимую для кодирования и реализации.

Техническая документация. Эти документы поддерживаются разработчиками и действующими программистами. Эти документы, в целом, представляют информацию о коде. При написании кода программисты также упоминают цель кода, кто его написал, где он потребуется, что он делает и как он делает, какие другие ресурсы использует код и т. Д.

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

Доступны различные автоматизированные инструменты, а некоторые поставляются с самим языком программирования. Например, Java поставляется с инструментом JavaDoc для создания технической документации кода.

Пользовательская документация — эта документация отличается от всего вышеописанного. Все предыдущие документы поддерживаются для предоставления информации о программном обеспечении и процессе его разработки. Но пользовательская документация объясняет, как должен работать программный продукт и как его использовать для получения желаемых результатов.

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