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