Перейти к содержимому

Odoo 19: открытые позиции в клиентском портале с отчётной датой и экспортом в PDF – модуль portal_open_items

5 ноября 2026 г. | Odoo 19 Community | Собственная разработка
5 ноября 2026 г. от
Odoo 19: открытые позиции в клиентском портале с отчётной датой и экспортом в PDF – модуль portal_open_items

Модуль Odoo 19 portal_open_items: список открытых позиций в клиентском портале с отчётной датой и экспортом в PDF

«Сколько мы вам на самом деле ещё должны?» Такой вопрос регулярно возникает у любой клиентской базы, чаще всего незадолго до конца квартала, перед аудитом годовой отчётности или когда бухгалтерия клиента готовит платежи. Кто не отвечает на него сам, получает его по электронной почте или по телефону, и кому-то приходится выгружать из бухгалтерии список открытых позиций (ведомость ОП) и отправлять его. В Odoo 19 Community само собой это не происходит: клиентский портал показывает отдельные счета, но не список открытых позиций всей компании, а тем более на произвольно выбранную дату.

Для этого мы написали модуль «Открытые позиции в клиентском портале» (portal_open_items) для Odoo 19. Клиенты с включённым доступом видят в портале список всех открытых счетов, кредитовых нот и ещё не распределённых платежей своей компании, могут выбрать отчётную дату, скачать список в формате PDF и сразу видят, как обстоит дело с их платёжной дисциплиной. Модуль является свободным ПО под лицензией AGPL-3 и размещён на GitHub:

github.com/Alex0176/odoo-portal-open-items

Мы установили модуль 5 ноября 2026 г. в нашей рабочей системе. Настройка там по умолчанию выключена и включается только по договорённости с отдельными клиентами. Опыт эксплуатации поэтому пока невелик; тестировали мы с помощью тринадцати автоматических тестов и тестовой базы данных с примерами клиентов. Тому, кто берёт модуль в работу, стоит прочитать разделы о расчёте на отчётную дату, о платёжной дисциплине и об ограничениях в этой статье.

Проблема: список ОП по запросу

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

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

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

Обзор решения

Модуль дополняет клиентский портал Odoo страницей Открытые позиции и плиткой в разделе Мой аккаунт. Функциональность:

  • Настройка для каждого контакта: «Показывать список открытых позиций в портале». Только если она включена, пользователь портала видит плитку и страницу. По умолчанию она выключена.
  • Вся компания: список содержит открытые позиции всех контактов компании, а не только вошедшего в систему пользователя.
  • Отчётная дата: клиент выбирает дату и видит, что было открыто в этот день.
  • Экспорт в PDF: список в PDF в макете вашей компании, с фирменным бланком, сальдо и суммой просроченных позиций.
  • Платёжная дисциплина: доля счетов, оплаченных вовремя, с небольшой просрочкой и поздно, самый давний открытый счёт и оценка хорошая или плохая, в портале и в PDF.
  • Просроченные позиции выделены цветом и показывают количество дней сверх срока оплаты.
  • Кредитовые ноты и авансы отображаются в списке с отрицательной суммой и уменьшают сальдо.
  • Ссылки: каждый счёт в списке ведёт к странице счёта в портале.
  • Многоязычность: интерфейс и PDF соответствуют языку пользователя, немецкий перевод прилагается.

Клиентский портал в Odoo 19 с плиткой «Открытые позиции» рядом с заказами и счетами

Плитка отображается на стартовой странице Мой аккаунт рядом с заказами и счетами. Тот, у кого нет этой настройки, её не видит.

Доступ для каждого контакта: настройка

Список ОП показывает коммерческие данные целой компании. Поэтому модуль включает его не для всех пользователей портала, а только там, где вы этого явно хотите. В форме контакта на вкладке Сайт находится флажок «Показывать список открытых позиций в портале». Он виден пользователям с правами на счета (группа account.group_account_invoice) и действует для этого одного контакта.

Форма контакта Odoo с настройкой «Показывать список открытых позиций в портале»

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

Список в клиентском портале

Щелчок по плитке открывает /my/open-items. На странице отображаются название компании, выбор отчётной даты и таблица с открытыми позициями:

Список открытых позиций в клиентском портале Odoo с просроченными счетами, кредитовой нотой, сальдо и суммой просроченных позиций

СтолбецСодержание
ДокументНомер счёта или кредитовой ноты со ссылкой на страницу счёта в портале; ниже указана ссылка на основание, если она есть
ДатаДата счёта или дата проводки соответственно
Срок оплатыСрок оплаты; у просроченных позиций ниже красным цветом указано «просрочено на n дн.»
СуммаПервоначальная сумма позиции
ОткрытоОстающаяся неоплаченной сумма (после частичных оплат)

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

Открытые позиции на отчётную дату

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

Открытые позиции на отчётную дату 02.11.2026 в клиентском портале Odoo

Как рассчитывается отчётная дата

Для каждой позиции действует правило: открыто на отчётную дату = сумма счёта минус все платежи, сверенные по отчётную дату включительно. Позиция попадает в список, если на отчётную дату она уже была проведена и по ней оставался остаток. Счёт от 7 сентября на 1.250,50 € с частичной оплатой 500,00 € 20 октября и оплатой остатка 5 ноября, таким образом, при отчётной дате 2 ноября попадает в список с суммой 750,50 €, а при отчётной дате 5 ноября в списке уже не значится.

Временная шкала: счёт, частичная оплата, отчётная дата и оплата остатка, а также расчёт открытой суммы на отчётную дату

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

Что здесь означает «дата платежа»

Определяющей является дата, когда счёт и платёж были в Odoo сверены друг с другом (большая из двух дат проводок), а не дата счёта. Это обычный случай: платёж проводится в день поступления и сопоставляется со счётом. Кто сопоставляет платежи лишь спустя несколько дней, увидит счёт открытым соответственно дольше. Раздел ограничениях подробнее рассматривает этот вопрос.

Экспорт в PDF

По кнопке Скачать PDF модуль формирует список в виде PDF-файла на выбранную отчётную дату. Кнопка Печать открывает тот же список в диалоге печати браузера. PDF использует макет документов вашей компании в Odoo (логотип, адрес, нижний колонтитул из настроек) и европейский формат бумаги:

PDF «Открытые позиции на отчётную дату» с фирменным бланком, таблицей, сальдо и суммой просроченных позиций

  • Заголовок с отчётной датой: «Открытые позиции на отчётную дату 02.11.2026», даже если отчётная дата — сегодня. Если открытых позиций нет, там написано «Открытых позиций нет».
  • Адрес клиента в адресном поле макета компании, чтобы список и в распечатанном виде соответствовал делу.
  • Просроченные позиции выделены жирным шрифтом, чтобы они были заметны и при чёрно-белой печати.
  • Сальдо и сумма просроченных позиций в конце таблицы, при нескольких валютах отдельно по каждой валюте.
  • Имя файла с названием компании и датой, например Open_items_Muster_Handels_GmbH_2026-11-02.pdf.

Платёжная дисциплина: оценка с первого взгляда

Начиная с версии 19.0.1.1.0 над таблицей показывается краткая сводка о том, насколько вовремя компания оплачивает свои счета. Та же сводка есть и в PDF. Клиент сам видит, как обстоят дела, и вам не нужно объяснять это ему отдельно.

Страница открытых позиций в клиентском портале Odoo со сводкой по платёжной дисциплине зелёным, оранжевым и красным цветом и оценкой «плохая»

  • Зелёный: «47 % оплачены в течение срока оплаты.» Имеются в виду счета, оплаченные в день наступления срока оплаты или раньше.
  • Оранжевый: «29 % оплачены в течение недели после истечения срока оплаты.» Это платежи, поступившие через один–семь дней после наступления срока.
  • Красный: «24 % оплачены позже, в среднем через 39 дней (через 25 дней после истечения срока оплаты).» Первое число отсчитывается от даты счёта, число в скобках — от срока оплаты. Строка появляется только при наличии таких счетов.
  • «Счета остаются открытыми до 60 дней.» Это возраст самого старого счёта, который на отчётную дату ещё открыт, считая от даты счёта.

Ниже указана оценка платёжной дисциплины: хорошая или плохая, а в конце страницы (в PDF — в конце листа) стоит примечание «Клиенты с плохой платёжной дисциплиной переводятся на предоплату.» В PDF те же строки показаны в макете с фирменным бланком:

PDF «Открытые позиции на отчётную дату» 05.10.2026 с платёжной дисциплиной, оценкой «хорошая» и примечанием о предоплате

Что учитывается

  • Оцениваются счета, выставленные клиенту и проведённые. Кредитовые ноты и черновики не учитываются. При оплате в рассрочку каждый платёж учитывается отдельно.
  • Период: счета за последние двенадцать месяцев и все счета, которые ещё открыты, даже если они старше.
  • День оплаты — это дата последней сверки с платежом, так же, как при отчётной дате.
  • Открытые счета: если счёт на отчётную дату просрочен, он учитывается так, как если бы был оплачен в отчётную дату, то есть как оранжевый или красный. Открытый счёт, срок оплаты которого ещё не наступил, не оценивается.
  • При отчётной дате в прошлом действует состояние на тот день: платежи после отчётной даты пока не учитываются.
  • Если оценивать нечего, там стоит «Нет счетов за последние 12 месяцев для оценки.», и оценки нет.

Когда платёжная дисциплина «хорошая»?

Оценка хорошая, если не менее 70 % счетов зелёные или оранжевые (оплачены вовремя или с просрочкой не более недели) и ни один открытый счёт не просрочен более чем на 30 дней. В остальных случаях она плохая. Пороговые значения (7 дней, 70 %, 30 дней, 12 месяцев) заданы константами в начале файла models/res_partner.py и могут быть там изменены.

Важно: модуль никого не переводит на предоплату. Примечание в нижнем колонтитуле — это фиксированный текст, который показывает клиентам с плохой оценкой, что из этого может последовать. Принимать ли такое решение и когда — остаётся на ваше усмотрение. Если эта фраза вам не подходит, измените её в обоих шаблонах (страница портала и отчёт) или в переводе.

Кто что может видеть? Модель доступа

Открытые позиции — это конфиденциальные данные, поэтому для нас доступ был важнее любой дополнительной функции. Модель намеренно простая:

Модель доступа: контакт с настройкой, без настройки, контакт другой компании, адрес PDF и сотрудник

  • Только при включённой настройке. Без флажка у контакта плитки нет, а обращение к /my/open-items перенаправляет на Мой аккаунт.
  • Всегда собственная компания. Компания определяется по вошедшему в систему пользователю, а не по параметру в адресе. Запросить чужую компанию через адресную строку невозможно.
  • Та же проверка для PDF. Odoo в принципе предоставляет PDF-отчёты и через общий адрес. Поэтому модуль ещё раз проверяет права непосредственно в отчёте: PDF получают только пользователи с правами на бухгалтерию или пользователи портала с включённой настройкой для своей компании, все остальные получают ошибку доступа.
  • Только проведённые позиции. Черновики и отменённые документы никогда не отображаются.
  • Только собственные бухгалтерские контуры: учитываются только проводки тех компаний, к которым у пользователя есть доступ.

Техническая реализация

Модуль зависит только от account и portal, то есть от компонентов Odoo Community. Он добавляет к контакту единственное поле, а в остальном состоит из контроллера, класса отчёта и шаблонов.

КомпонентНазначение
Поле portal_open_items у res.partnerЛогическая настройка «Показывать список открытых позиций в портале», не копируется, по умолчанию выключена.
_open_items_data()Ищет проведённые, ещё не сверенные строки дебиторской задолженности компании и рассчитывает для каждой строки остаток, просрочку и дни. Возвращает строки, итоги по валютам и отчётную дату.
_payment_morale()Оценивает счета за последние двенадцать месяцев и все открытые счета на отчётную дату: доли оплаченных вовремя, с просрочкой до семи дней и позже, среднюю длительность, самый давний открытый счёт и оценку «хорошая» или «плохая».
_open_items_residual()Остаток строки на отчётную дату: сумма минус все частичные сверки с датой не позднее отчётной, в валюте счёта.
Контроллер /my/open-itemsПоказывает страницу, обрабатывает отчётную дату (пустая, недопустимая или в будущем = сегодня) и при отсутствии настройки перенаправляет на Мой аккаунт.
Контроллер /my/open-items/pdfФормирует PDF с той же отчётной датой и отдаёт его с именем файла.
Отчёт report_open_itemsШаблон QWeb в макете компании (web.external_layout) с собственной проверкой прав.
Шаблоны порталаПлитка в Мой аккаунт, навигационная цепочка, страница с формой даты и таблицей.
Форма контактаНастройка в разделе Сайт, видна только группе account.group_account_invoice.
ПереводНемецкий перевод (de.po) и шаблон (.pot) прилагаются.

Открытые позиции считываются из строк проводок, а не из счетов. Это важно: только так в списке появляются кредитовые ноты и ещё не сопоставленные платежи, и только так состояние на более раннюю дату можно восстановить по сверкам (account.partial.reconcile). Запрос выполняется для всей компании (commercial_partner_id) с повышенными правами, а проверка того, вправе ли пользователь их видеть, выполняется до него.

Тесты

В комплекте идут тринадцать автоматических тестов, которые у нас проходят успешно:

  • доступ только при включённой настройке, иначе перенаправление на Мой аккаунт,
  • список содержит позиции всей компании, но никогда не содержит позиций другой компании,
  • настройка действует для каждого контакта, а не для всех пользователей компании,
  • кредитовые ноты отображаются в списке с отрицательной суммой и уменьшают сальдо,
  • отчётная дата: счёт, оплаченный позже, до оплаты есть в списке, после — нет,
  • страница с датой в будущем и с недопустимой датой,
  • адрес PDF возвращает PDF-файл,
  • отчёт в формате HTML и проверка доступа в отчёте,
  • открытая сумма на отчётную дату после частичных платежей до и после отчётной даты,
  • платёжная дисциплина: разбивка на оплаченные вовремя, с просрочкой до недели и позже, со средними значениями, в том числе для отчётной даты в прошлом,
  • платёжная дисциплина с открытыми счетами и оценка «хорошая» или «плохая»,
  • платёжная дисциплина без счетов и никогда с данными другой компании,
  • платёжная дисциплина на странице портала и в PDF.

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

Установка и настройка

git clone https://github.com/Alex0176/odoo-portal-open-items.git
ln -s /pfad/odoo-portal-open-items/portal_open_items /pfad/addons/
odoo-bin -c odoo.conf -d <datenbank> -i portal_open_items --stop-after-init

Зависимости: account и portal. После установки службу Odoo необходимо перезапустить, так как модуль содержит код на Python. Тем, кто эксплуатирует рабочую систему, следует сначала установить модуль на копию базы данных. Затем:

  1. открыть контакт, который должен видеть список (человек с доступом к порталу),
  2. в форме установить флажок Показывать список открытых позиций в портале и сохранить,
  3. войти в портал под этим пользователем или проверить вместе с клиентом: плитку, список, отчётную дату и PDF.

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

Ограничения и примечания

  • Актуальное состояние проведённых документов. Отчётная дата рассчитывается на основе проводок в том виде, в каком они находятся в системе сейчас. Если после отчётной даты счёт был сторнирован или возвращён в черновик, список его не показывает. Неизменяемым снимком «как он был напечатан тогда» это не является.
  • Платежи учитываются с даты сверки. Если платёж сопоставляется лишь спустя несколько дней после поступления, до этого момента счёт значится в списке как открытый. Тому, кто хочет получать точные данные на отчётную дату, следует сопоставлять платежи своевременно. Банковская сверка со счетами в Odoo Community не входит; для этого мы используем наш модуль Bank-Statement-Matcher.
  • Платёжная дисциплина настолько хороша, насколько хороша ваша сверка. Учитывается, когда платёж был сопоставлен со счётом. Платежи, которые долго не сверялись, делают клиента хуже, чем он есть. Проверьте оценку у ваших клиентов, прежде чем делать из неё какие-либо выводы.
  • Оценка видна клиенту. Тот, у кого включена настройка, видит также результат и примечание о предоплате. При этом модуль ничего не меняет в условиях оплаты.
  • Только дебиторская задолженность. Модуль показывает, сколько клиент должен вам, а не ваши обязательства перед клиентом.
  • Без уровней напоминаний и ссылки на оплату в списке. Клиент может открыть счёт из списка и оплатить его там, как это допускает ваш портал в остальных случаях.
  • PDF и многопроцессный режим. Для формирования PDF-отчётов Odoo внутренне обращается к собственному веб-адресу. Если ваша система работает только с одним рабочим процессом, это может привести к блокировке. Это касается всех PDF-отчётов в портале, а не только этого модуля. После установки один раз проверьте кнопку PDF в реальных условиях.
  • Протестировано только на Odoo 19.0 Community. Для других версий мы модуль не проверяли.
  • Не заменяет работу с просроченной задолженностью и выписку по счёту. Список не заменяет ни бухгалтерскую выписку по счёту, ни ваши процессы напоминаний об оплате, он лишь делает состояние прозрачным.

Часто задаваемые вопросы

Что такое список открытых позиций (ведомость ОП)?

Перечень всех счетов, которые ещё не оплачены или оплачены не полностью, с датой счёта, сроком оплаты и открытой суммой. Его также называют «открытыми счетами», «карточкой клиента» или «оборотно-сальдовой ведомостью», хотя оборотно-сальдовая ведомость в узком смысле означает сальдо по всем счетам.

Почему портал Odoo не показывает список ОП из коробки?

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

Видят ли список все пользователи портала одной компании?

Нет. Только контакты с включённой настройкой. Однако отображаемый список охватывает всю компанию, а не только счета этого одного контакта.

Могу ли я выбрать отчётную дату в прошлом, например 31.12. прошлого года?

Да, любую дату вплоть до сегодняшней. Список тогда показывает позиции, которые были проведены на этот день и ещё не оплачены. Учитывайте примечания к расчёту: определяющей является день сверки платежа.

Поддерживается ли отчётная дата в будущем?

Нет. Будущие даты обрабатываются как сегодняшняя, чтобы список не показывал состояние, которого ещё не существует.

Появляются ли в списке кредитовые ноты и авансовые платежи?

Да. Кредитовые ноты и платежи, которые ещё не сопоставлены со счётом, отображаются в списке с отрицательной суммой и уменьшают сальдо. Пояснение под таблицей объясняет это клиенту.

Как определяются просроченные позиции?

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

Есть ли PDF на других языках?

Да, интерфейс и PDF соответствуют языку пользователя. В комплекте идёт немецкий перевод; для других языков достаточно файла .po или перевода через интерфейс Odoo.

Может ли клиент увидеть список другой компании, если изменит адрес?

Нет. Компания всегда определяется по вошедшему в систему пользователю. Адрес содержит только отчётную дату. Адрес PDF-отчёта Odoo также ещё раз проверяется непосредственно в отчёте.

Как рассчитывается платёжная дисциплина?

По проведённым счетам клиентов за последние двенадцать месяцев и по всем открытым счетам. Для каждого счёта учитывается, через сколько дней после срока оплаты он был оплачен: не позднее дня наступления срока (зелёный), до семи дней после него (оранжевый) или позже (красный). Оценка хорошая, если не менее 70 % счетов зелёные или оранжевые и нет открытого счёта, просроченного более чем на 30 дней. Подробности приведены в разделе платёжной дисциплине.

Переводит ли модуль клиентов с плохой платёжной дисциплиной на предоплату?

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

Отправляет ли модуль электронные письма или напоминания?

Нет. Он лишь предоставляет страницу и PDF. Он не создаёт сообщений, уведомлений или действий.

Работает ли модуль с Odoo Enterprise?

Он зависит только от account и portal, которые есть в обеих редакциях. Тестировали мы его только на редакции Community для Odoo 19.

Под какой лицензией распространяется модуль?

Под AGPL-3. Вы можете использовать, изменять и распространять его при соблюдении условий лицензии. Об ошибках и предложениях по улучшению просим сообщать в виде Issue в репозитории GitHub — мы будем рады.

Поддержка от Biricon IT Services

Мы сопровождаем установки Odoo для малых и средних предприятий: от внедрения через доработки и миграции до текущей эксплуатации. Если вы хотите предоставить своим клиентам в портале открытые позиции, счета и заявки, расширить бухгалтерию в Odoo Community или безопасно внедрить модуль в свою рабочую систему, мы с радостью поможем. Другие наши собственные разработки: Архивирование компании вместе с пользователями портала, Коммерческий реестр и проверка адресов для австрийских клиентов, Номера документов из префикса, года и счётчика и Наборы товаров в коммерческом предложении как раздел.

Связаться с нами

По состоянию на 6 ноября 2026 г. Версия модуля 19.0.1.1.1. Изменения с момента первой версии от 5 ноября: платёжная дисциплина (19.0.1.1.0) и исправление открытой суммы на отчётную дату после частичных платежей (19.0.1.1.1). Все имена, номера документов и суммы на иллюстрациях вымышлены.