Как программно добавить набор в табличную часть документа Заказ покупателя в 1С:УНФ

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

При автоматизации работы в конфигурации 1С:Управление нашей фирмой (УНФ) программисты часто сталкиваются с задачей программного заполнения документов. Одной из самых коварных операций является добавление наборов в документ Заказ покупателя. Трудность заключается в том, что в этой конфигурации набор — это не просто одна строка в табличной части, а сложная структура, распределенная по нескольким таблицам. Если заполнить только основные запасы, система не «увидит» в них набор, и печатные формы или отчеты могут отработать некорректно.

В этой статье мы подробно разберем, как устроена механика наборов в УНФ, какие табличные части задействованы и как написать код, который заставит систему правильно отображать и обрабатывать составные позиции.

Архитектура хранения наборов в 1С:УНФ

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

  1. Запасы — здесь хранятся физические составляющие набора (комплектующие). Каждая строка этой ТЧ содержит ссылку на конкретную номенклатуру, которая входит в состав.
  2. ДобавленныеНаборы — это служебная табличная часть. Она хранит информацию о самом «заголовке» набора: какая именно номенклатура-набор была выбрана и в каком общем количестве.

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

Ключевые реквизиты для связки данных

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

Алгоритм программного добавления набора

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

Шаг 1: Определение типа номенклатуры. Сначала выясним, является ли добавляемая позиция набором. В коде это проверяется через реквизит справочника Номенклатура.ЭтоНабор или проверкой состава.

Шаг 2: Добавление записи в «ДобавленныеНаборы». Создаем строку, которая будет отвечать за «целое». Здесь указывается цена набора (если она задана на весь набор) и общее количество.

Шаг 3: Цикл по составу набора. Получаем данные о комплектующих. Это можно сделать через запрос к регистру сведений или используя методы менеджера справочника Номенклатура.

Шаг 4: Добавление строк в «Запасы». Для каждого элемента состава добавляем строку в основную ТЧ документа. Очень важно рассчитать количество комплектующей как КоличествоНабора * КоличествоВСоставе.

Пример реализации кода

Посмотрим на практический пример кода, который объединяет эти шаги. Предположим, у нас есть объект НовыйДокумент и массив данных ДанныеExcel, который мы обрабатываем.


Для Каждого СтрокаДанных Из ДанныеExcel Цикл
    
    Если СтрокаДанных.ЭтоНабор Тогда
        
        // 1. Сначала добавляем "голову" набора в служебную ТЧ
        НоваяСтрокаНабор = НовыйДокумент.ДобавленныеНаборы.Добавить();
        НоваяСтрокаНабор.НоменклатураНабора = СтрокаДанных.Номенклатура;
        НоваяСтрокаНабор.Количество = СтрокаДанных.Количество;
        
        // Генерируем ключ связи (в простейшем случае - индекс или уникальное число)
        ТекущийКлюч = НовыйДокумент.Запасы.Количество() + 1; 
        НоваяСтрокаНабор.КлючСвязи = ТекущийКлюч;
        
        // 2. Получаем состав набора (предположим, у нас есть подготовленный СписокСостава)
        Для Каждого СтрокаСостава Из СписокСоставаНаборов Цикл
            
            Если СтрокаСостава.ВладелецНабор = СтрокаДанных.Номенклатура Тогда
                
                // Добавляем комплектующую в основные Запасы
                НоваяСтрокаТЧ = НовыйДокумент.Запасы.Добавить();
                НоваяСтрокаТЧ.Номенклатура = СтрокаСостава.Номенклатура;
                НоваяСтрокаТЧ.НоменклатураНабора = СтрокаДанных.Номенклатура; // Ссылка на владельца
                
                // Важно: количество комплектующей = кол-во наборов * кол-во в 1 наборе
                НоваяСтрокаТЧ.Количество = СтрокаДанных.Количество * СтрокаСостава.КоличествоВНаборе;
                
                // Связываем строку с "головой" через ключ
                НоваяСтрокаТЧ.КлючСвязи = ТекущийКлюч;
                
                // Заполняем остальные реквизиты (ед. изм, счета учета и т.д.)
                НоваяСтрокаТЧ.ЕдиницаИзмерения = СтрокаСостава.Номенклатура.ЕдиницаХраненияОстатков;
            КонецЕсли;
            
        КонецЦикла;
        
    Иначе
        // Обычная логика добавления товара
        НоваяСтрокаТЧ = НовыйДокумент.Запасы.Добавить();
        НоваяСтрокаТЧ.Номенклатура = СтрокаДанных.Номенклатура;
        НоваяСтрокаТЧ.Количество = СтрокаДанных.Количество;
    КонецЕсли;
    
КонецЦикла;

Нюансы ценообразования в наборах

Проанализируем ситуацию с ценами. В 1С:УНФ способ расчета цены набора может быть разным: либо цена задается на сам набор («за голову»), либо суммируется из комплектующих.

Если цена установлена на набор, то в ТЧ ДобавленныеНаборы должна стоять общая сумма, а в ТЧ Запасы у строк-комплектующих цены могут быть нулевыми (или распределяться пропорционально для целей учета себестоимости). Если же цена идет по составу, то мы должны заполнять Цена и Сумма непосредственно в строках ТЧ Запасы.

Выясним причину, почему иногда в интерфейсе «бред»: если вы не заполните НоменклатураНабора в ТЧ Запасы, программа не подсветит эти строки как составные части, и пользователь увидит просто список товаров без визуальной связи с набором.

Использование типовых механизмов

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

Например, существует метод ПолучитьСоставНабора. Проанализируем, как это помогает упростить код:

  1. Мы передаем в функцию ссылку на номенклатуру-набор и её характеристику.
  2. Функция возвращает таблицу значений с актуальным составом согласно регистру.
  3. Мы просто копируем эти данные в ТЧ документа.

Это защитит ваш код от ошибок, если в будущем логика хранения состава наборов в конфигурации изменится (например, при обновлении на новую версию платформы или конфигурации).

Рекомендации по отладке

Если после выполнения кода вы видите пустые строки или состав не сворачивается в форму набора, выполните следующие действия:

Следуя этой структуре и соблюдая правила связей между табличными частями Запасы и ДобавленныеНаборы, вы сможете корректно автоматизировать создание заказов любой сложности в 1С:УНФ.

← На главную