Как нумеровать счета-фактуры и что будет за ошибки в нумерации
Надо признать, что ошибки в счетах-фактурах приводят к разногласиям с проверяющими. Налоговики используют любую возможность, чтобы отказать в вычете. Состав показателей и порядок заполнения счета-фактуры утверждены в приложении №1 к постановлению Правительства от 26 декабря 2011 № 1137. А затруднения при заполнении бывают даже по строке 1 счета-фактуры.
Правила нумерации счетов-фактур
Порядковый номер и дата выписки счета-фактуры проставляют по строке 1. Запомните несколько простых правил.
Счета-фактуры нумеруют в порядке возрастания номеров в целом по организации в пределах одного года либо одного налогового периода. Здесь «зашифрованы» 3 главных момента:
- счета-фактуры должны выставляться в хронологическом порядке;
- нумерация ведется в целом по фирме, включая все ее обособки;
- нумеровать счета-фактуры можно как в пределах года, так и налогового периода. Нумерация счетов-фактур может начинаться заново как с 1 января, так и с 1 числа каждого квартала или даже месяца.
Выписать счет-фактуру нужно не позднее 5 календарных дней , считая:
- со дня отгрузки товара (выполнения работ, оказания услуг) или передачи имущественных прав;
- со дня получения сумм оплаты, частичной оплаты в счет предстоящих поставок товаров (выполнения работ, оказания услуг), передачи имущественных прав (п. 3 ст. 168 НК РФ). День отгрузки товара включается в этот пятидневный срок.
Но есть и нюансы.
Можно ли менять порядок нумерации счетов-фактур в середине года
Из нашей группы Вконтакте мы узнали, что бухгалтеры иногда испытывают сложности с нумерацией счетов-фактур.
Вот что написал один из наших подписчиков:
Подскажите, если в первом квартале велась нумерация авансовых счетов-фактур единая с остальными реализациями, а со второго квартала для авансовых счетов-фактур нумерация стала вестись с префиксом, это допускается?
Что можно посоветовать коллеге?
Из вопроса ясно, что нумерацию счетов-фактур фирма ведет поквартально. Об этом должно быть прописано в ее учетной политике. То есть в этом плане все в порядке.
А вот в отношении составных номеров с разделительной чертой и цифровым индексом, заметим, что они возможны для:
- обособленных подразделений;
- участников простого товарищества;
- доверительных управляющих.
Обоснование: подпункт «а» пункта 1 правил заполнения счета-фактуры, письма Минфина от 15 мая 2012 г. № 03-07-09/52, от 27 марта 2012 г. № 03-07-09/30.
Авансовые счета-фактуры нумеруются в общем хронологическом порядке вместе с обычными счетами-фактурами. Никого особого порядка для них не предусмотрено (см., например, письмо Минфина от 10 августа 2012 г. № 03-07-11/284).
Нужно ли исправлять ошибки в нумерации счетов-фактур
Согласно подпункту 1 пункта 5 статьи 169 НК РФ, счет-фактура должен содержать порядковый номер и дату его составления. О способе нумерации здесь ничего не сказано.
Следовательно, право на вычет НДС у плкупрателя не зависит от особенностей формирования порядковых номеров счетов-фактур продавцом.
Даже если нарушена хронология нумерации, это не препятствует принятию НДС к вычету (см. Постановление АС Поволжского округа от 2 ноября 2016 г. № Ф06-13869/2016).
Минфин считает, что ошибку в нумерации счетов-фактур можно не исправлять. Она не является критичной и не препятствует тому, чтобы заявить вычет по налогу (письмо от 11 октября 2013 г. № 03-07-09/42466).
Как бы ни нумеровал свои счета-фактуры продавец (пусть даже с нарушением установленных правил), это ничем не грозит его покупателям. Они вправе принимать к вычету НДС по таким счетам-фактурам. Любая неправильная нумерация счетов-фактур не может препятствовать налоговикам при проведении проверки идентифицировать продавца, покупателя, наименование товаров (работ, услуг), имущественных прав, их стоимость, а также налоговую ставку и сумму НДС.
Самому продавцу, выписавшему счет-фактуру с ошибочной нумерацией, тоже ничего не грозит. Для него главное правильно исчислить сумму налога к уплате в бюджет и в полном объеме отразить ее в поданной в инспекцию декларации.
Даже если продавец и допустил ошибку в нумерации счета-фактуры, наказывать его по нормам НК РФ не за что. Вместе с тем спокойнее будет, если в его налоговом учете соблюдается порядок.
Почему массивы начинаются с нуля
Самое очевидное объяснение: индекс — это смещение относительно начала массива. Так элементы массива легче адресовать в памяти.
Проверим это на C.
Array address: 0x7ffd7c514a6c
Array[0] = 0x7ffd7c514a6c
Array[1] = 0x7ffd7c514a70
Array[2] = 0x7ffd7c514a74
Как первый (нулевой) элемент, так и сам массив находятся по одному и тому же адресу, поскольку 0-й элемент удалён на 0 элементов от начала. Эта связь между указателями и массивами в C настолько тесная, что их даже можно рассматривать вместе.
Однако это ответ на вопрос «зачем», а не «почему». Нумеровать массивы с нуля стали не сразу. Удивительно, но развитие такого простого вопроса не умещается в предложении или абзаце.
Потому что так удобнее
К началу 1960-х годов сформировалось три подхода к организации структуры, которую сегодня мы называем статическим массивом:
-
Исчисление с 0. Нижняя граница массива начинается с нуля.
Непривычно для обывателя, если это не житель Германии, свыкшийся с нумерацией этажей в зданиях. Последний элемент массива из, скажем, 8 элементов имеет номер 7.
Не всё так однозначно. Единообразия даже у самых первых языков программирования не существовало:
- Нумерация с нуля: LISP 1.5, APL (допускает выбор при запуске программы).
- Нумерация с единицы: APL, Бейсик, ранний Фортран.
- Произвольные границы: Алгол-60, затем Фортран, CPL, SIMULA, CLU, PL/1, Кобол, Паскаль, Алгол-68, JOVIAL.
Конечно, это не самый сильный аргумент. Часто языки снабжались синтаксическим сахаром для нумерации с 1. К примеру, в Алголе массив V[0:3] начинается с 0, а массив V[3] — с 1.
Создатель языка APL Кеннет Айверсон в книге «A Programming Language» объясняет, почему далее по тексту он будет пользоваться нумерацией элементов массива с нуля. При этом язык допускает отсчёт как с единицы, так и с нуля. Айверсон приводит уже описанный выше аргумент о сдвигах в позиционной нумерации.
Тем не менее и в эпоху до C звучали предложения выбирать нумерацию с 0. Логично предположить, что это была историческая неизбежность, до которой оставалось несколько лет.
Потому что парусные регаты мешали вычислениям
В 1967 году Мартин Ричардс впервые реализует компилятор своего детища — BCPL (Basic Combined Programming Language). Этот язык программирования был призван исправить проблемы созданного в начале шестидесятых языка CPL путём отказа от технологий, затрудняющих компиляцию.
Первый компилятор BCPL был написан для операционной системы CTSS машины IBM 7094 Массачусетского технологического института. На тот момент компьютеры — это уже не целые комнаты и электронные лампы, но всё ещё огромные шкафы с транзисторами и консоли управления без экранов. Ресурсов серии 7090 хватило, чтобы запустить американца в космос. Но мощность измерялась в тысячах машинных слов, микросекундах тактов и килофлопсах, а цена — в миллионах долларов.
В пятидесятых и шестидесятых IBM выдавала институту щедрые скидки на свои научные компьютеры или даже предоставляла их бесплатно. В 1963 году в МТИ поставили IBM 7094. На компьютер уговор был такой: 8 часов в сутки получают специалисты института, 8 часов — другие колледжи и университеты Новой Англии, а третью смену отдавали самой IBM для личных нужд.
На этом особенности не кончались. Несколько раз в год IBM обсчитывала регаты: президент IBM соревновался в заплыве на больших яхтах в проливе Лонг-Айленд, и каждое из судов получало очки гандикапа по специальной сложной формуле. Когда в вычислительный центр приходило задание, операторам полагалось всё бросить и запустить вычисления этих очков.
Машинный зал с установленным компьютером IBM 7094 в Колумбийском университете США. Фотоархив
Вообще, и без этого был шанс не получить результат вычислений. Изначально 7094 работал в режиме пакетной обработки. Вспомогательная система на IBM 1401 загружала пакет задач с перфокарт на ленту, а затем запускала задачи одну за другой и записывала результаты для последующей печати. Для каждой задачи приводилась оценка времени. Если задача выходила за пределы отпущенного, её принудительно прерывали.
В итоге компиляция в BCPL была оптимизирована по максимуму. То есть и указатели на элементы массива должны максимально близко походить на машинный код, без необходимости вычитать единицу при указании на элемент массива. Хотя во время выполнения программы не играет роли схема организации массивов, нумерация с нуля могла появиться для оптимизации времени компиляции.
Впрочем, конкретно эта версия — лишь гипотеза Майка Хойе. Ей нет никаких подтверждений от собствено Ричардса или хотя бы упоминаний в литературе. Мартин Ричардс в переписке с Хойе лишь приводит общие соображения о том, что он хотел достичь близости к машинному коду, поэтому указатель p и p + 0 — это одна и та же переменная. Ни на какие яхты Ричардс не жалуется.
К тому же на момент появления первого компилятора BCPL уже была готова операционка Compatible Time-Sharing System. В ней на одной машине с разделением времени компьютер выполняет одну задачу за один раз, но с оптимизацией ввода и вывода, чтобы паузы одного пользователя заполнялись работой других. Это уже не былая пакетная обработка задач.
Точно известно, что в дальнейшем BCPL значительно повлиял на все современные языки программирования.
В 1969 году Кен Томпсон урезал функциональность BCPL до языка B. В дальнейшем, для развития операционной системы Unix, Деннис Ритчи улучшил B добавлением функций PDP-11, в результате чего и получился C. Полвека спустя список языков, на которые оказал влияние C, занимает в «Википедии» целую страницу.
В языке BCPL v!5 и 5!v совпадают, поскольку являются указателем на !(v+5) или !(5+v) . Аналогично в C v[5] эквивалентно 5[v] .
Потому что так предложил Дейкстра
В 1982 году Эдсгер Дейкстра опубликовал статью «Почему нумерация должна начинаться с нуля». В ней он низверг как нумерацию с единицы, так и произвольные границы индексов. Очевидно, что Дейкстра — не человек, который легко поддаётся влиянию C, но также он раскритиковал Алгол-60, своё собственное детище, и Паскаль.
Известно, что Дейкстра ближе к концу жизни всё больше писал от руки, а не набирал тексты на машинке. Архив рукописей Эдсгера Вибе Дейкстры
Если необходимо записать интервал натуральных чисел 2, 3, …, 12 без опухоли из точек, возможны четыре варианта:
- 2 ⩽ i < 13
- 1 < i ⩽ 12
- 2 ⩽ i ⩽ 12
- 1 < i < 13
Затем автор замечает, что для нижней границы предпочтителен знак «⩽», поскольку наименьшее натуральное число существует. В противном случае, если последовательность начинается с наименьшего натурального числа, нижняя граница не будет натуральным числом.
Аналогично для верхней границы Дейкстра рекомендует использовать «<», поскольку так удобнее для записи подпоследовательностей нулевого размера. Иначе верхняя граница рискует не оказаться натуральным числом.
Затем статья делает вывод, что из соображений простоты для последовательности из N членов предпочтительнее диапазон 0 ⩽ i < N , а не 1 ⩽ i < N+1 .
Куда менее известный документ — это полушуточная техническая заметка от 1 апреля 1980 года IEN 137 под названием «О священных войнах и призыв к миру» [On Holy Wars and a Plea for Peace].
В заметке Дэнни Коэн приводит интересный аргумент: в системе счисления с основанием b при отсчёте с нуля первые b ^ N неотрицательных чисел представляются ровно N цифрами. Например, если речь про двоичную запись, то 2 ^ 3 = 8 , и восьмой элемент массива будет иметь номер 1112, а не 10002. Понятно, что с такими преобразованиями легко бы мог справиться компилятор.
Потому что так более элегантно
Это объяснение может раздражать субъективностью. Соображения о красоте у каждого свои и совпадать не обязаны. Но авторы языков программирования — тоже люди со своими предпочтениями.
В конце восьмидесятых Гвидо ван Россум при создании Python как учёл свой предыдущий опыт с языком ABC, так и задумал привлечь аудиторию хакеров от мира Unix и C.
С 1983 года Гвидо работал в Центре математики и информатики в Амстердаме над реализацией языка ABC. Проект ставил целью создать язык программирования, пригодный для обычных людей, но не настолько ужасно реализованный, как Бейсик. Нумерация массивов в ABC начиналась с единицы. Такой же схемы придерживались другие знакомые Россуму языки — Алгол, Фортран и Паскаль.
Однако в вышедшем в 1991 году Python нумерация начинается с нуля, а не единицы. Получилось так в результате долгих размышлений.
Одна из причин — слайсы. Чаще всего при создании слайса используются операции «получить первые n элементов» и «начиная с i, получить следующие n элементов». При этом первый случай эквивалентен i == первый индекс . Гвидо посчитал, что лучше, если обе операции возможны без лишней головной боли в виде коррекции +1 и −1.
Если первый элемент имеет номер 1, то возможно указывать первый элемент и число элементов, которые нужно получить. Россум уже был знаком с подобным по ABC и вполне мог бы положиться на этот опыт.
Тем не менее автора Python очаровал синтаксис слайсов полуоткрытого интервала, если нумерация начинается с нуля: a[:n] (или a[0:n] ) и a[i:i+n] . К примеру, строку a легко разбить на три части a[:i] , a[i:j] и a[j:] .
Заметим, что в воспоминаниях Гвидо не приводит ни призывы гениев информатики, ни практики других языков, ни принципы, заложенные мастодонтами компьютерных вычислений шестидесятых. Зато слово «элегантность» в пяти абзацах его объяснения встречается 3 раза.
Списки в Python: что это такое и как с ними работать
Рассказали всё самое важное о списках для тех, кто только становится «змееустом».


Иллюстрация: Оля Ежак для Skillbox Media

Сегодня мы подробно поговорим о, пожалуй, самых важных объектах в Python — списках. Разберём, зачем они нужны, как их использовать и какие удобные функции есть для работы с ними.
В статье есть всё, что начинающим разработчикам нужно знать о списках в Python:
Что такое списки
Список (list) — это упорядоченный набор элементов, каждый из которых имеет свой номер, или индекс, позволяющий быстро получить к нему доступ. Нумерация элементов в списке начинается с 0: почему-то так сложилось в C, а C — это база. Теорий на этот счёт много — на «Хабре» даже вышло большое расследование 🙂

В одном списке одновременно могут лежать данные разных типов — например, и строки, и числа. А ещё в один список можно положить другой и ничего не сломается:

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

Когда мы создаём объект list, в памяти компьютера под него резервируется место. Нам не нужно переживать о том, сколько выделяется места и когда оно освобождается, — Python всё сделает сам. Например, когда мы добавляем новые элементы, он выделяет память, а когда удаляем старые — освобождает.
Под капотом списков в Python лежит структура данных под названием «массив». У массива есть два важных свойства: под каждый элемент он резервирует одинаковое количество памяти, а все элементы следуют друг за другом, без «пробелов».
Однако в списках Python можно хранить объекты разного размера и типа. Более того, размер массива ограничен, а размер списка в Python — нет. Но всё равно мы знаем, сколько у нас элементов, а значит, можем обратиться к любому из них с помощью индексов.
И тут есть небольшой трюк: списки в Python представляют собой массив ссылок. Да-да, решение очень элегантное — каждый элемент такого массива хранит не сами данные, а ссылку на их расположение в памяти компьютера!
Как создать список в Python
Чтобы создать объект list, в Python используют квадратные скобки — []. Внутри них перечисляют элементы через запятую:
Мы создали список a и поместили в него три числа, которые разделили запятыми. Давайте выведем его с помощью функции print():
Python выводит элементы в квадратных скобках, чтобы показать, что это list, а также ставит запятые между элементами.
Мы уже говорили, что списки могут хранить данные любого типа. В примере ниже объект b хранит: строку — cat, число — 123 и булево значение — True:
Также в Python можно создавать вложенные списки:
Мы получили объект, состоящий из двух чисел — 1 и 2 — и вложенного list с двумя элементами — [3, 4].
Операции со списками
Если просто хранить данные в списках, то от них будет мало толку. Поэтому давайте рассмотрим, какие операции они позволяют выполнить.
Индексация
Доступ к элементам списка получают по индексам, через квадратные скобки []:
Мы обратились ко второму элементу и вывели его с помощью print().
Здесь важно помнить две вещи:
- у каждого элемента есть свой индекс;
- индексы начинаются с 0.
Давайте ещё поиграем с индексами:
В последней строке мы обратились к несуществующему индексу, поэтому Python выдал ошибку.
Кроме того, Python поддерживает обращение к нескольким элементам сразу — через интервал. Делается это с помощью двоеточия — :.
Двоеточие позволяет получить срез списка. Полная форма оператора выглядит так: начальный_индекс:конечный_индекс:шаг.
Здесь мы указываем, с какого индекса начинается «срез», на каком заканчивается и с каким шагом берутся элементы — по умолчанию 1. Единственный нюанс с конечным индексом: хоть мы и можем подумать, что закончим именно на нём, на самом деле Python остановится на элементе с индексом конечный_индекс — 1. Почему создатели языка решили так сделать? Кто их знает.
В примере выше мы начали с индекса 0, а закончили на 1, потому что последний индекс не включается. Наш шаг был 1, то есть мы прошлись по каждому элементу.
Здесь мы шли по элементам с шагом 2. Начали с индекса 1 — это первое число внутри скобок, а закончили на индексе 6, не включая его. Двигались с шагом 2, то есть через один элемент, и получили [2, 4].
Протестируйте этот тип индексации сами, чтобы лучше понять, как работают срезы в Python.
Изменение элементов
Списки — это динамическая структура данных. А значит, мы можем менять их уже после создания.
Например, можно заменить один элемент на другой:
Мы обратились к элементу по индексу и заменили его на число 4. Всё прошло успешно, список изменился.
Но нужно быть осторожными, потому что может случиться такое:
Сначала мы создали список a с двумя элементами — 1 и 2. Затем объявили переменную b и присвоили ей содержимое a. Потом заменили первый элемент в a и… удивились, что он заменился и в b.
Проблема в том, что a — это ссылка на область в памяти компьютера, где хранится первый элемент списка, а также на следующий его элемент. Вот как всё это устроено в памяти компьютера:

Каждый элемент списка имеет четыре секции: свой адрес, данные, адрес следующего элемента и адрес предыдущего. Если мы получили доступ к какому-то элементу, мы без проблем можем двигаться вперёд-назад по этому списку и менять его данные.
Поэтому, когда мы присвоили списку b список a, то на самом деле присвоили ему ссылку на первый элемент — по сути, сделав их одним списком.
Объединение списков
Иногда полезно объединить два списка. Чтобы это сделать, используют оператор +:
Мы создали два списка — a и b. Затем переприсвоили a новым списком, который стал объединением старого a и b.
Разложение списка
Элементы списка можно присвоить отдельным переменным:
Здесь из списка a поочерёдно достаются элементы, начиная с индекса 0, и присваиваются переменным. И в отличие от присвоения одного списка другому, в этом случае Python создаст три отдельных целых числа, которые никак не будут связаны с элементами списка, и присвоит их трём переменным. Поэтому, если мы изменим, например, переменную d2, со списком a ничего не случится.
Перебор элементов
Мы можем перебирать элементы списка с помощью циклов for и while.
Так выглядит перебор через for:
Здесь мы перебираем каждый элемент списка и выводим их с помощью функции print().
А вот так выглядит перебор через цикл while:
Этот перебор чуть сложнее, потому что мы используем дополнительную переменную i, чтобы обращаться к элементам списка. Также мы использовали встроенную функцию len(), чтобы узнать размер нашего списка. А ещё в условии цикла while мы указали знак «меньше» (<), потому что индексация элементов идёт до значения количество элементов списка — 1. Как и в прошлом примере, все элементы по очереди выводятся с помощью функции print().
Сравнение списков
Python поддерживает сравнение списков. Два списка считаются равными, если они содержат одинаковые элементы. Функция возвращает булево значение — True или False:
Получили, что списки равны.
В некоторых языках равенство ещё проверяется и по тому, ссылаются ли переменные на один и тот же объект. Обычно это делается через оператор ===. В Python это можно сделать через оператор is, который проверяет, имеют ли две переменные один и тот же адрес в памяти:
Получили, что две переменные ссылаются на один и тот же адрес в памяти.
Встроенные функции для списков Python
В Python есть четыре функции, которые позволяют узнавать длину списка, сортировать его и возвращать максимальное и минимальное значение.
len()
Возвращает длину списка:
sorted()
Возвращает отсортированный список:
min() и max()
Возвращают наименьший и наибольший элемент списка:
Методы списков Python
Чтобы проще управлять элементами списка, в стандартной библиотеке Python есть набор популярных методов для списков. Разберём основные из них.
append()
Добавляет новый элемент в конец списка:
extend()
Добавляет набор элементов в конец списка:
Внутрь метода extend() нужно передать итерируемый объект — например, другой list или строку.
Вот так метод extend() добавит строку:
Заметьте, что строка добавилась посимвольно.
insert()
Добавляет новый элемент по индексу:
Сначала мы передаём индекс, по которому хотим вставить новый элемент, а затем сам элемент.
remove()
Удаляет элемент из списка:
Метод удаляет только первое вхождение элемента. Остальные остаются нетронутыми.
Если элемента нет в списке, Python вернёт ошибку и программа прервётся:
Ошибка говорит, что элемента нет в списке.
clear()
Удаляет все элементы из списка и делает его пустым:
index()
Возвращает индекс элемента списка в Python:
Если элемента нет в списке, выведется ошибка:
pop()
Удаляет элемент по индексу и возвращает его как результат:
Мы не передали индекс в метод, поэтому он удалил последний элемент списка. Если передать индекс, то получится так:
count()
Считает, сколько раз элемент повторяется в списке:
sort()
Если нам нужно отсортировать в обратном порядке — от большего к меньшему, — в методе есть дополнительный параметр reverse:
reverse()
Переставляет элементы в обратном порядке:
copy()
Для того чтобы быстро находить нужные методы во время работы, пользуйтесь этой шпаргалкой:
| Метод | Что делает |
|---|---|
| a.append(x) | Добавляет элемент x в конец списка a. Если x — список, то он появится в a как вложенный |
| a.extend(b) | Добавляет в конец a все элементы списка b |
| a.insert(i, x) | Вставляет элемент x на позицию i |
| a.remove(x) | Удаляет в a первый элемент, значение которого равно x |
| a.clear() | Удаляет все элементы из списка a и делает его пустым |
| a.index(x) | Возвращает индекс элемента списка |
| a.pop(i) | Удаляет элемент по индексу и возвращает его |
| a.count(x) | Считает, сколько раз элемент повторяется в списке |
| a.sort() | Сортирует список. Чтобы отсортировать элементы в обратном порядке, нужно установить дополнительный аргумент reverse=True |
| a.reverse() | Возвращает обратный итератор списка a |
| a.copy() | Создаёт поверхностную копию списка. Для создания глубокой копии используйте метод deepcopy из модуля copy |
Что запомнить
Лучше не учить это всё, а применять на практике. А ещё лучше — попытаться написать каждый метод самостоятельно, не используя никакие встроенные функции.
Сколько бы вы ни писали код на Python, всё равно придётся подсматривать в документацию и понимать, какой метод что делает. И для этого есть разные удобные сайты — например, полный список методов можно посмотреть на W3Schools.
Как ИП нумеровать документы и почему это важно
В процессе работы появляется много документов: договоры, счета, акты. Иногда они бывают нужны для банка или налоговой. Хорошо, если они в порядке, но часто на это нет времени. Важнее вести бизнес, чем разбираться с бумажками.
В статье — простые правила, как правильно нумеровать договоры и другие документы, чтобы поддерживать их в порядке и не тратить на это много времени.
Правила нумерации любых документов
Номер документа может состоять из букв и цифр. Нумеровать можно, как вам удобно, — главное, соблюдать простые правила:
- У каждого документа свой номер — нельзя присвоить счету и договору один номер, он должен отличаться хотя бы на один символ.
- Нумерация должна идти в порядке возрастания. Но можно обнулять ее каждый период, например раз в месяц, квартал или год. То есть каждый месяц можно начинать нумерацию с единицы. Но в таком случае придется вводить обозначение месяца.
Придумайте собственную структуру номера и зашифруйте в ней порядковый номер документа и все другие необходимые данные. Например, укажите тип документа, месяц или год его создания.

Как хранить
Для хранения и быстрого поиска документов используют учетные программы, например 1С или Контур. Их набор функций намного больше простого учета и хранения.
Если же у вас нет такой программы, проще всего завести таблицу в Экселе и записывать в нее номера договоров и ссылки на документы. Контрагентов можно также указать в таблице в отдельном столбце.
Если контрагентов немного, но вы часто совершаете друг с другом сделки, то создайте отдельный лист в таблице по каждому контрагенту. Главное, делать это системно: подписали акт или заключили договор — и сразу добавили в таблицу. И еще важно не забывать сохранять документ после каждой новой записи, тогда ничего не потеряется.
Лучше использовать облачные таблицы, например от Гугла, там все сохраняется автоматически, и можно посмотреть или дополнить таблицу с любого устройства. Даже если неожиданно отключат свет или интернет, все, что вы уже ввели, не потеряется.
В целях безопасности давайте доступ к таблице только по почте. Если открыть доступ по ссылке, то любой сможет посмотреть документ.

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

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