Как реализовать ссылку на строку документа и придать продаже объектную сущность

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

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

Проблема "объектной сущности" строки

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

Разберем основные подходы к решению этой задачи, которые позволяют эффективно работать с большими реестрами данных.

Вариант 1. Использование уникальных идентификаторов (GUID)

Это наиболее гибкий технический подход. В табличную часть документа, куда загружается реестр продаж, добавляется скрытый реквизит, например, ИдентификаторСтроки с типом Строка (или УникальныйИдентификатор). Рассмотрим алгоритм реализации:

  1. При загрузке данных из внешней системы (DBF, Excel, JSON) для каждой строки генерируется новый GUID.
  2. Этот идентификатор сохраняется в документе-реестре.
  3. Все движения по регистрам (например, по счету 45 "Товары отгруженные") делаются с использованием этого идентификатора в качестве одного из измерений.

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


ПараметрыОтбора = Новый Структура("ИдентификаторСтроки", НужныйИдентификатор);
НайденныеСтроки = ОбъектДокумент.Товары.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда
    СтрокаДанных = НайденныеСтроки[0];
    // Работаем с данными строки
КонецЕсли;

Вариант 2. Хранение аналитики в регистре сведений

Если нам нужно хранить множество дополнительных параметров (время отгрузки, ФИО получателя, номер доверенности), загромождать ими основной документ-реестр не всегда правильно. Оптимальным решением будет использование непериодического регистра сведений.

Проанализируем структуру такого регистра:

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

Вариант 3. Служебный справочник "Ключи отгрузок"

В некоторых случаях (например, при работе с госконтрактами) требуется полноценная ссылочная целостность. Тогда мы создаем вспомогательный справочник. Каждый элемент этого справочника создается программно при проведении реестра и соответствует одной строке отгрузки по договору.

Рассмотрим преимущества этого метода:

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

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

Методика работы со счетом 45 и финальной реализацией

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

  1. Загрузка реестра: Документ (например, "Отчет о продажах") фиксирует все транзакции. Для "обычных" продаж он делает проводки Дт 90 - Кт 41. Для договорных — Дт 45 - Кт 41.
  2. Фиксация деталей: Одновременно с проводками данные по каждой "договорной" строке записываются в наш регистр сведений или создаются элементы служебного справочника.
  3. Закрытие месяца: В конце периода запускается обработка, которая анализирует остатки на 45 счете в разрезе нашего регистра/идентификаторов.
  4. Формирование РТУ: Создается документ Реализация отгруженных товаров. В его табличную часть подтягиваются сгруппированные данные, но при этом в каждой строке сохраняется связь с исходной отгрузкой через наш ИдентификаторСтроки.

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

Важные рекомендации по производительности

При работе с большими объемами данных в табличных частях (более 10 000 строк) стандартные методы работы с коллекциями могут замедляться. Рассмотрим несколько советов:

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

← На главную