Как создать регистр для учета доставки, статусов и оплаты почтовых отправлений в 1С

Программист 1С v8.3 (Управляемые формы) Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

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

Выбор типа регистра: Сведения или Накопления?

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

  1. Регистр сведений: Предназначен для хранения состояния (статусов). Он идеально подходит, если нам нужно знать, доставлена посылка на текущий момент или нет, а также кто за нее платил. Если нам важна история изменений (когда посылка сменила статус с «В пути» на «Доставлена»), мы выберем периодический регистр сведений.
  2. Регистр накопления: Необходим, если задача подразумевает количественный или денежный учет. Например, если нам нужно строить отчет по общей выручке за месяц или видеть остатки посылок на складе, которые еще не выданы.

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

Проектирование структуры регистра сведений

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

Измерения регистра:

Ресурсы регистра:

Проанализируем ситуацию: использование типа Булево удобно для простых проверок «Да/Нет», но для расширения системы (например, если появятся новые способы оплаты) лучше сразу использовать Перечисления.

Реализация логики в документе «Доставка»

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


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // Очищаем старые движения по регистру, если они были
    Движения.СтатусыДоставки.Записывать = Истина;
    Движения.СтатусыДоставки.Очистить();
    
    // Создаем новую запись в регистре
    НоваяЗапись = Движения.СтатусыДоставки.Добавить();
    
    // Заполняем измерения
    НоваяЗапись.Доставка = ЭтотОбъект.Ссылка;
    НоваяЗапись.Период = ЭтотОбъект.Дата;
    
    // Заполняем ресурсы на основании реквизитов документа
    НоваяЗапись.Доставлено = (ЭтотОбъект.Статус = Перечисления.СтатусыПосылок.Доставлено);
    НоваяЗапись.СпособПолучения = ЭтотОбъект.СпособПолучения;
    НоваяЗапись.Оплачено = ЭтотОбъект.ЗаплатилЛиКлиент;
    
    // Логика определения плательщика
    Если ЭтотОбъект.КтоПлатит = "Отправитель" Тогда
        НоваяЗапись.КтоОплатил = Перечисления.Плательщики.Отправитель;
    Иначе
        НоваяЗапись.КтоОплатил = Перечисления.Плательщики.Получатель;
    КонецЕсли;

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

Почему нельзя просто хранить данные в документе?

Выясним причину, по которой преподаватель настаивает именно на регистре. Проанализируем производительность: если в базе данных тысячи документов «Доставка», то при попытке построить отчет «Список всех неоплаченных посылок» по реквизитам документов, системе придется сканировать всю таблицу документов. Это долго.

Регистр сведений — это отдельная физическая таблица в базе данных, оптимизированная для быстрого поиска. Использование индексов в регистре позволяет мгновенно получать ответ на вопрос: «Был ли оплачен конкретный заказ?», не обращаясь к тяжелому объекту документа.

Расширение задачи: учет денежных средств

Если в будущем потребуется анализировать суммы, стоит добавить Регистр накопления (вид — Обороты). Рассмотрим ситуацию: нам нужно знать общую сумму оплат, принятых от получателей в пункте выдачи.

Для этого создадим регистр накопления ВзаиморасчетыСКлиентами:

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

Типичные ошибки начинающих

Рассмотрим моменты, на которых часто спотыкаются новички:

  1. Забывают включить документ в состав регистраторов: В окне редактирования регистра на закладке «Регистраторы» обязательно должна стоять галочка напротив документа Доставка. Без этого программная запись Движения.СтатусыДоставки.Добавить() выдаст ошибку.
  2. Использование строк вместо ссылок: Не записывайте статус текстом "Доставлено". Всегда используйте Перечисления или Справочники. Это гарантирует отсутствие опечаток и строгую структуру данных.
  3. Игнорирование периода: Даже если регистр непериодический, документ-регистратор всегда передает свою дату в поле Период. Это важно для понимания того, когда именно произошла запись.

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

← На главную