В процессе разработки конфигурации для автоматизации работы почтового отделения часто возникает задача не просто хранить данные в документах, но и оперативно получать текущее состояние каждого отправления. Для этого в платформе 1С используются регистры. Разберем подробно, как спроектировать регистр, который будет отвечать за контроль доставки, способы получения посылок и финансовые взаиморасчеты.
Прежде чем приступить к созданию объекта в дереве конфигурации, проанализируем, какой тип регистра нам подходит. В 1С существует два основных типа регистров для таких задач:
Для нашей учебной задачи оптимальным будет создание Регистра сведений, так как основной упор идет на качественные характеристики (статус, способ доставки, факт оплаты).
Рассмотрим структуру регистра, основываясь на требованиях задачи. Чтобы регистр эффективно работал, нам нужно правильно разделить данные на «Измерения» (ключи, по которым мы ищем) и «Ресурсы» (значения, которые мы храним).
Измерения регистра:
Доставка (Тип: ДокументСсылка.Доставка) — это ключевое поле. По нему мы всегда сможем найти актуальную информацию по конкретной накладной.Ресурсы регистра:
Доставлено (Тип: Булево) — флаг, фиксирующий завершение процесса.СпособПолучения (Тип: ПеречислениеСсылка.СпособыПолучения) — здесь мы укажем значения: «На дом» или «Самовывоз».Оплачено (Тип: Булево) — признак внесения денежных средств.КтоОплатил (Тип: ПеречислениеСсылка.Плательщики) — значения: «Отправитель» или «Получатель».Проанализируем ситуацию: использование типа Булево удобно для простых проверок «Да/Нет», но для расширения системы (например, если появятся новые способы оплаты) лучше сразу использовать Перечисления.
Регистр не заполняется сам по себе. Данные в него должен поставлять документ. Разберем, как реализовать механизм движений. В модуле документа Доставка необходимо настроить процедуру ОбработкаПроведения. Посмотрим на пример кода, который будет записывать данные в наш новый регистр:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Очищаем старые движения по регистру, если они были
Движения.СтатусыДоставки.Записывать = Истина;
Движения.СтатусыДоставки.Очистить();
// Создаем новую запись в регистре
НоваяЗапись = Движения.СтатусыДоставки.Добавить();
// Заполняем измерения
НоваяЗапись.Доставка = ЭтотОбъект.Ссылка;
НоваяЗапись.Период = ЭтотОбъект.Дата;
// Заполняем ресурсы на основании реквизитов документа
НоваяЗапись.Доставлено = (ЭтотОбъект.Статус = Перечисления.СтатусыПосылок.Доставлено);
НоваяЗапись.СпособПолучения = ЭтотОбъект.СпособПолучения;
НоваяЗапись.Оплачено = ЭтотОбъект.ЗаплатилЛиКлиент;
// Логика определения плательщика
Если ЭтотОбъект.КтоПлатит = "Отправитель" Тогда
НоваяЗапись.КтоОплатил = Перечисления.Плательщики.Отправитель;
Иначе
НоваяЗапись.КтоОплатил = Перечисления.Плательщики.Получатель;
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой преподаватель настаивает именно на регистре. Проанализируем производительность: если в базе данных тысячи документов «Доставка», то при попытке построить отчет «Список всех неоплаченных посылок» по реквизитам документов, системе придется сканировать всю таблицу документов. Это долго.
Регистр сведений — это отдельная физическая таблица в базе данных, оптимизированная для быстрого поиска. Использование индексов в регистре позволяет мгновенно получать ответ на вопрос: «Был ли оплачен конкретный заказ?», не обращаясь к тяжелому объекту документа.
Если в будущем потребуется анализировать суммы, стоит добавить Регистр накопления (вид — Обороты). Рассмотрим ситуацию: нам нужно знать общую сумму оплат, принятых от получателей в пункте выдачи.
Для этого создадим регистр накопления ВзаиморасчетыСКлиентами:
Контрагент (Справочник.Получатели).СуммаОплаты (Число).При проведении документа, если стоит флаг «Самовывоз» и «Оплачено получателем», мы будем делать движение «Приход» в этот регистр. Это позволит в конце смены сформировать отчет о выручке одной кнопкой.
Рассмотрим моменты, на которых часто спотыкаются новички:
Доставка. Без этого программная запись Движения.СтатусыДоставки.Добавить() выдаст ошибку.Перечисления или Справочники. Это гарантирует отсутствие опечаток и строгую структуру данных.Период. Это важно для понимания того, когда именно произошла запись.Таким образом, создание регистра — это не просто дублирование данных из документа, а проектирование эффективной модели данных для быстрого получения ответов на вопросы бизнеса. Мы рассмотрели основные шаги: от выбора типа регистра до программной реализации его заполнения. Следуя этой логике, вы сможете реализовать любую систему учета в среде 1С.