В практике автоматизации торговых операций часто возникает сложная задача: система получает сводный отчет о продажах (например, из фронт-офиса или сторонней программы), где в одном документе перемешаны обычные розничные продажи ("продали и забыли") и отгрузки по договорам. Особенность последних в том, что право собственности переходит не сразу, а в конце месяца при выставлении сводных документов. При этом нам критически важно сохранить детализацию по каждой такой отгрузке: кто, когда, на какой точке и по какой цене забрал товар. Рассмотрим, как правильно реализовать архитектуру такого учета в 1С, чтобы не "раздувать" базу тысячами документов и сохранить связь с каждой строкой исходного реестра.
В платформе 1С:Предприятие 8 стандартная ссылка может указывать только на объект целиком (справочник, документ). Ссылки на конкретную строку табличной части "из коробки" не существует. Если мы просто запишем номер строки, то при любой пересортировке или удалении строк в документе-источнике наша связь разорвется. Проанализируем ситуацию: автору темы необходимо не просто хранить данные, а иметь возможность ссылаться на факт отгрузки из других объектов системы. Для этого строке нужно придать так называемую объектную сущность.
Разберем основные подходы к решению этой задачи, которые позволяют эффективно работать с большими реестрами данных.
Это наиболее гибкий технический подход. В табличную часть документа, куда загружается реестр продаж, добавляется скрытый реквизит, например, ИдентификаторСтроки с типом Строка (или УникальныйИдентификатор). Рассмотрим алгоритм реализации:
Выясним причину, почему это удобно: имея GUID, мы всегда можем программно найти нужную строку в документе, используя метод НайтиСтроки(). Посмотрим на пример кода для поиска:
ПараметрыОтбора = Новый Структура("ИдентификаторСтроки", НужныйИдентификатор);
НайденныеСтроки = ОбъектДокумент.Товары.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
СтрокаДанных = НайденныеСтроки[0];
// Работаем с данными строки
КонецЕсли;
Если нам нужно хранить множество дополнительных параметров (время отгрузки, ФИО получателя, номер доверенности), загромождать ими основной документ-реестр не всегда правильно. Оптимальным решением будет использование непериодического регистра сведений.
Проанализируем структуру такого регистра:
ДокументРеестр (Ссылка на документ загрузки), ИдентификаторСтроки (Тот самый GUID).ДатаОтгрузки, Время, ЦенаОтгрузки, Получатель, ТорговаяТочка.Такая архитектура позволяет быстро извлекать данные запросом, не обращаясь к тяжелому объекту документа. Это особенно важно, если документ-реестр содержит тысячи строк.
В некоторых случаях (например, при работе с госконтрактами) требуется полноценная ссылочная целостность. Тогда мы создаем вспомогательный справочник. Каждый элемент этого справочника создается программно при проведении реестра и соответствует одной строке отгрузки по договору.
Рассмотрим преимущества этого метода:
СправочникСсылка.Однако помните, что создание тысяч элементов справочника ежедневно может значительно увеличить объем информационной базы.
Разберем по шагам, как организовать цепочку документов для отгрузок без перехода права собственности, о которых упоминалось в обсуждении:
Дт 90 - Кт 41. Для договорных — Дт 45 - Кт 41.Реализация отгруженных товаров. В его табличную часть подтягиваются сгруппированные данные, но при этом в каждой строке сохраняется связь с исходной отгрузкой через наш ИдентификаторСтроки.Такой подход позволяет избежать создания сотен документов Реализация товаров и услуг ежедневно, сохраняя при этом детальный учет, необходимый для выполнения требований контрактов.
При работе с большими объемами данных в табличных частях (более 10 000 строк) стандартные методы работы с коллекциями могут замедляться. Рассмотрим несколько советов:
ИдентификаторуСтроки в табличной части, помните, что в 1С 8.3 для табличных частей нельзя явно задать индексы, как для таблиц БД. Однако использование Индексировать у реквизита ТЧ в свойствах объекта может помочь в некоторых типовых решениях.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеестрТовары.Номенклатура,
| РеестрТовары.Количество,
| РеестрТовары.ИдентификаторСтроки
|ИЗ
| Документ.РеестрПродаж.Товары КАК РеестрТовары
|ГДЕ
| РеестрТовары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Результат = Запрос.Выполнить().Выгрузить();
Используя предложенные методы, мы превращаем безликую строку отчета в полноценный объект учета, который можно отслеживать, анализировать и включать в цепочки бизнес-процессов любой сложности.