Как реализовать сопоставление номенклатуры и комплектующих со связью "один ко многим" в 1С?

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

Коллеги, сталкиваясь с задачей интеграции данных из различных подсистем, мы часто приходим к необходимости сопоставления элементов, которые ранее существовали обособленно. Представим ситуацию: у нас есть два ключевых справочника – "Номенклатура", содержащий товары для продажи, и "Комплектующие", описывающий компоненты, используемые в производстве или для сборки. Изначально они функционировали как два отдельных мира для разных подразделений. Однако теперь возникла острая потребность в их объединении, а точнее – в установлении соответствия между элементами этих справочников, чтобы, например, просматривать фактические остатки комплектующих, привязывая их к номенклатуре. Основная сложность заключается в том, что одному элементу из справочника "Номенклатура" может соответствовать несколько элементов из справочника "Комплектующие" (связь "один ко многим"). Как оптимально организовать хранение такого сопоставления и использовать его для формирования отчетов? Давайте разберем несколько подходов.

Подход 1: Использование независимого регистра сведений

Независимый регистр сведений является одним из наиболее гибких и мощных механизмов в 1С для хранения произвольных данных в разрезе нескольких измерений. Он идеально подходит для реализации связей "один ко многим" и "многие ко многим".

  1. Создание регистра сведений:

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

  2. Определение измерений:

    Ключевым моментом для реализации связи "один ко многим" является правильное определение измерений регистра. Мы создадим два измерения:

    • Номенклатура: Тип СправочникСсылка.Номенклатура. Это будет "родительский" элемент, для которого мы ищем соответствия.
    • Комплектующее: Тип СправочникСсылка.Комплектующие. Это будет один из "дочерних" элементов, соответствующий номенклатуре.

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

    • Запись 1: Номенклатура: "Саморез", Комплектующее: "Винт самонарезной 4мм"
    • Запись 2: Номенклатура: "Саморез", Комплектующее: "Винт самонарезной 6мм"

    Таким образом, одной номенклатуре ("Саморез") соответствует несколько комплектующих, что полностью удовлетворяет нашему требованию.

  3. Периодичность регистра (опционально):

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

  4. Заполнение регистра:

    Заполнять регистр можно различными способами:

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

    Пример записи в регистр сведений из кода:

    
    // Предположим, у нас есть ссылки на Номенклатуру и Комплектующее
    Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
    Комплектующее1 = Справочники.Комплектующие.НайтиПоКоду("К001");
    Комплектующее2 = Справочники.Комплектующие.НайтиПоКоду("К002");
    
    Если Номенклатура И Комплектующее1 Тогда
        НаборЗаписей = РегистрыСведений.СоответствиеНоменклатурыКомплектующих.СоздатьНаборЗаписей();
        НаборЗаписей.Отбор.Номенклатура.Установить(Номенклатура);
        НаборЗаписей.Отбор.Комплектующее.Установить(Комплектующее1); // Если нужно перезаписать только одну связь
                
        // Если нужно добавить несколько записей к одной номенклатуре
        // и при этом очистить старые, если это набор записей для одной номенклатуры
        // НаборЗаписей.Прочитать(); // Прочитаем текущие записи
        // НаборЗаписей.Очистить(); // Очистим их
        // Для каждой новой связи:
        Запись = НаборЗаписей.Добавить();
        Запись.Номенклатура = Номенклатура;
        Запись.Комплектующее = Комплектующее1;
        НаборЗаписей.Записать(); // Запись одной связи
    КонецЕсли;
    
    // Чтобы добавить несколько комплектующих к одной номенклатуре,
    // обычно делают набор записей без отбора по комплектующему
    // или используют менеджер записи для каждой отдельной записи.
    // Пример для добавления второй связи:
    Если Номенклатура И Комплектующее2 Тогда
        МенеджерЗаписи = РегистрыСведений.СоответствиеНоменклатурыКомплектующих.СоздатьМенеджерЗаписи();
        МенеджерЗаписи.Номенклатура = Номенклатура;
        МенеджерЗаписи.Комплектующее = Комплектующее2;
        Попытка
            МенеджерЗаписи.Записать();
        Исключение
            // Обработка ситуации, если запись уже существует
        КонецПопытки;
    КонецЕсли;
    

Подход 2: Добавление табличной части в справочник "Номенклатура"

Если связь "один ко многим" нужна для того, чтобы видеть список комплектующих непосредственно в карточке номенклатуры, и количество этих комплектующих не является слишком большим, можно использовать табличную часть в справочнике Номенклатура.

  1. Изменение структуры справочника:

    Мы открываем объект конфигурации Справочник.Номенклатура и добавляем новую табличную часть, например, СоответствующиеКомплектующие.

  2. Добавление реквизита в табличную часть:

    В созданную табличную часть добавляем единственный реквизит Комплектующее с типом СправочникСсылка.Комплектующие.

  3. Преимущества и недостатки:

    • Преимущества: Простота реализации и удобство ввода данных прямо в карточке номенклатуры. Данные всегда "под рукой" у пользователя, работающего с номенклатурой.
    • Недостатки: Менее гибкое решение по сравнению с регистром сведений. Сложнее обрабатывать изменения во времени (не поддерживает периодичность). Может привести к "раздуванию" таблицы справочника, если количество комплектующих для одной номенклатуры очень велико. Запросы к табличным частям справочников могут быть менее производительными по сравнению с регистрами сведений для аналитических задач.

Подход 3: Добавление реквизита-ссылки в справочник "Комплектующие"

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

  1. Добавление реквизита:

    Открываем объект конфигурации Справочник.Комплектующие и добавляем новый реквизит, например, ОсновнаяНоменклатура с типом СправочникСсылка.Номенклатура.

  2. Заполнение реквизита:

    При создании или редактировании элемента справочника Комплектующие пользователь будет указывать, к какой Номенклатуре относится данное комплектующее. Например, для "Винт самонарезной 4мм" и "Винт самонарезной 6мм" мы можем указать ОсновнаяНоменклатура: "Саморез".

  3. Преимущества и недостатки:

    • Преимущества: Крайне прост в реализации. Легко формировать отчеты, так как связь хранится непосредственно в элементе комплектующего. Каждое комплектующее явно привязано к одной номенклатуре.
    • Недостатки: Если одно и то же комплектующее может относиться к разным номенклатурным позициям (что является сценарием "многие ко многим"), этот подход не сработает. Он лучше всего подходит, когда отношение действительно "многие комплектующие к одному элементу номенклатуры".

Формирование отчетов на основе сопоставлений

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

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

  1. Запрос к регистру сведений и регистру накопления:

    Мы можем построить запрос, который объединит данные из нашего регистра сопоставлений с данными регистра остатков.

    
    ВЫБРАТЬ
        Соответствие.Номенклатура,
        Соответствие.Комплектующее,
        ОстаткиКомплектующих.ВНаличииОстаток КАК ОстатокКомплектующего
    ИЗ
        РегистрСведений.СоответствиеНоменклатурыКомплектующих КАК Соответствие
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки
        (
            &Период,
            Номенклатура = Соответствие.Комплектующее
        ) КАК ОстаткиКомплектующих
        ПО Соответствие.Комплектующее = ОстаткиКомплектующих.Номенклатура
    ГДЕ
        Соответствие.Номенклатура = &ВыбраннаяНоменклатура
    

    В этом запросе мы получаем список комплектующих, связанных с определенной &ВыбраннаяНоменклатура, и для каждого комплектующего находим его остаток.

  2. Агрегация данных:

    Если нам нужен общий остаток комплектующих по группе, соответствующей одной номенклатуре, мы можем сгруппировать результаты запроса:

    
    ВЫБРАТЬ
        Соответствие.Номенклатура,
        СУММА(ОстаткиКомплектующих.ВНаличииОстаток) КАК ОбщийОстатокКомплектующих
    ИЗ
        РегистрСведений.СоответствиеНоменклатурыКомплектующих КАК Соответствие
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки
        (
            &Период,
            Номенклатура = Соответствие.Комплектующее
        ) КАК ОстаткиКомплектующих
        ПО Соответствие.Комплектующее = ОстаткиКомплектующих.Номенклатура
    СГРУППИРОВАТЬ ПО
        Соответствие.Номенклатура
    

    Этот запрос позволит нам увидеть суммарный остаток всех комплектующих, привязанных к каждой номенклатурной позиции. Аналогичные запросы можно строить и при использовании других подходов к хранению связей, например, связывая Справочник.Номенклатура с его табличной частью или Справочник.Комплектующие по реквизиту-ссылке.

Автоматизация сопоставления

Ввод сопоставлений вручную может быть трудоемким процессом, особенно если справочники содержат тысячи позиций. Для ускорения и повышения точности процесса можно использовать автоматическое сопоставление.

  1. Поиск по наименованию (точное и неточное совпадение):

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

    • Поиск по подстроке: Искать комплектующие, чьи наименования содержат слова из наименования номенклатуры.
    • Использование алгоритмов "нечеткого" поиска (fuzzy search): Специальные алгоритмы могут находить похожие строки, даже если есть опечатки или слова записаны в другом порядке.
    • "Словари синонимов": Предварительно составленный список синонимов или эквивалентов может значительно улучшить качество автоматического сопоставления.

    Пример простого поиска по подстроке:

    
    // Предположим, ищем комплектующие для "Саморез"
    ИскомоеНаименованиеНоменклатуры = "Саморез";
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    Комплектующие.Ссылка
        |ИЗ
        |    Справочник.Комплектующие КАК Комплектующие
        |ГДЕ
        |    Комплектующие.Наименование ПОДОБНО &НаименованиеПоиска";
            
    Запрос.УстановитьПараметр("НаименованиеПоиска", "%" + ИскомоеНаименованиеНоменклатуры + "%");
    // Или более сложный поиск:
    // Запрос.УстановитьПараметр("НаименованиеПоиска", "%винт%самонарезной%");
    
    Результат = Запрос.Выполнить().Выгрузить();
    
    Для Каждого СтрокаРезультата Из Результат Цикл
        // Предложить пользователю или записать в регистр
        Сообщить("Найдено комплектующее: " + СтрокаРезультата.Ссылка.Наименование);
    КонецЦикла;
    
  2. Использование дополнительных реквизитов для поиска:

    Можно добавить дополнительные реквизиты к справочникам (например, "КлючевыеСловаДляПоиска") и заполнять их вручную или полуавтоматически, чтобы затем использовать эти реквизиты для более точного поиска.

  3. Машинное обучение и внешние сервисы:

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

Комплектация номенклатуры как альтернативный подход

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

  1. Документ "Комплектация номенклатуры":

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

  2. Преимущества:

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

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

В завершение, выбор конкретного механизма для сопоставления номенклатуры и комплектующих зависит от ваших специфических требований, объема данных, частоты изменений связей и необходимой детализации отчетов. Независимый регистр сведений предлагает максимальную гибкость и является наиболее универсальным решением для организации связей "один ко многим". Он позволяет не только хранить сопоставления, но и эффективно использовать их для построения разнообразных аналитических отчетов по остаткам и другим показателям.

← На главную