Как программно создать номенклатуру с типом «Набор» и заполнить ее состав в 1С:Управление торговлей 11?

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

В современных конфигурациях 1С, таких как 1С:Управление торговлей 11, 1С:ERP Управление предприятием и 1С:Комплексная автоматизация 2, часто возникает необходимость автоматизации складских процессов. Одной из интересных и востребованных бизнес-задач является программное создание номенклатуры с типом «Набор».

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

Поймем структуру хранения данных набора

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

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

  1. Проверить, включены ли в системе необходимые функциональные опции для работы с наборами.
  2. Найти или создать соответствующий Вид номенклатуры, у которого установлен тип «Набор».
  3. Создать саму карточку номенклатуры и обязательно записать ее, чтобы получить ссылку на объект.
  4. Создать элемент справочника ВариантыКомплектацииНоменклатуры, указав созданную номенклатуру в качестве владельца.
  5. Заполнить табличную часть Товары варианта комплектации списком комплектующих номенклатурных позиций.
  6. Записать вариант комплектации и установить его как основной.

Давайте подробно и пошагово разберем реализацию каждого этапа на языке программирования 1С.

Шаг 1. Проверка функциональных опций системы

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


Если Не ПолучитьФункциональнуюОпцию("ИспользоватьНаборыНоменклатуры") Тогда
    ВызватьИсключение "В системе отключена функциональная опция использования наборов номенклатуры! Программное создание невозможно.";
КонецЕсли;

Если проверка пройдена успешно, мы можем переходить к следующему этапу.

Шаг 2. Определение Вида номенклатуры

В 1С:УТ 11 тип номенклатуры жестко завязан на ее Вид. Нельзя просто создать элемент справочника Номенклатура и напрямую присвоить реквизиту ТипНоменклатуры значение из перечисления. Этот реквизит заполняется автоматически при выборе вида номенклатуры. Нам необходимо найти в справочнике ВидыНоменклатуры такой элемент, у которого тип равен Перечисления.ТипыНоменклатуры.Набор. Рассмотрим пример поиска:


Функция НайтиВидНоменклатурыНабор()
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
        |	ВидыНоменклатуры.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.ВидыНоменклатуры КАК ВидыНоменклатуры
        |ГДЕ
        |	ВидыНоменклатуры.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
        |	И НЕ ВидыНоменклатуры.ПометкаУдаления";
    
    РезультатЗапроса = Запрос.Выполнить();
    Если Не РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Ссылка;
    Иначе
        Возврат Справочники.ВидыНоменклатуры.ПустаяСсылка();
    EndЕсли;
    
КонецФункции

Если функция вернула пустую ссылку, вам потребуется предварительно создать вид номенклатуры с типом «Набор» вручную или также программно, заполнив его основные реквизиты.

Шаг 3. Создание и запись карточки номенклатуры-набора

Выясним причину частой ошибки начинающих разработчиков: «Значение поля "Номенклатура" не заполнено или заполнено неверно» при попытке добавить состав. Эта ошибка возникает потому, что программист пытается записать состав набора (подчиненный элемент), передавая в качестве владельца еще не сохраненный в базе данных объект (новый элемент справочника номенклатуры, у которого еще нет реальной ссылки в СУБД).

Поэтому сначала мы создаем карточку набора, заполняем ее базовые реквизиты, привязываем вид номенклатуры и производим запись в базу данных:


СсылкаНаВидНабора = НайтиВидНоменклатурыНабор();

Если СсылкаНаВидНабора.Пустая() Тогда
    ВызватьИсключение "Не найден вид номенклатуры с типом 'Набор'!";
КонецЕсли;

НовыйНабор = Справочники.Номенклатура.СоздатьЭлемент();
НовыйНабор.Наименование = "Подарочный набор косметический 'Весна'";
НовыйНабор.НаименованиеПолное = "Подарочный набор косметический 'Весна' (акционный)";
НовыйНабор.ВидНоменклатуры = СсылкаНаВидНабора;
НовыйНабор.ЕдиницаИзмерения = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию("шт"); // указываем базовую единицу

// Производим запись объекта для получения постоянной ссылки
НовыйНабор.Записать();
СсылкаНаСозданныйНабор = НовыйНабор.Ссылка;

Шаг 4. Создание варианта комплектации и заполнение состава

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

При заполнении карточки варианта комплектации важно настроить правила ценообразования и распределения стоимости. Рассмотрим ключевые реквизиты:

Рассмотрим подробный пример заполнения состава набора данными из некоторой таблицы комплектующих:


// Создаем новый вариант комплектации
ВариантСостава = Справочники.ВариантыКомплектацииНоменклатуры.СоздатьЭлемент();
ВариантСостава.Владелец = СсылкаНаСозданныйНабор;
ВариантСостава.Наименование = "Основной состав набора";
ВариантСостава.Основной = Истина;
ВариантСостава.Количество = 1; // Базовое количество набора для сборки

// Задаем настройки ценообразования и печати
ВариантСостава.ВариантРасчетаЦеныНабора = Перечисления.ВариантыРасчетаЦенНаборов.РассчитываетсяИзЦенКомплектующих;
ВариантСостава.ВариантПредставленияНабораВПечатныхФормах = Перечисления.ВариантыПредставленияНаборовВПечатныхФормах.НаборИКомплектующие;

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

// Записываем вариант комплектации в базу данных
Попытка
    ВариантСостава.Записать();
    Сообщить("Набор '" + НовыйНабор.Наименование + "' успешно создан со всем его составом!");
Исключение
    ИнформацияОбОшибке = ОписаниеОшибки();
    Сообщить("Не удалось записать состав набора по причине: " + ИнформацияОбОшибке);
КонецПопытки;

Важные нюансы и советы разработчику

Для того чтобы ваша обработка работала стабильно в реальных базах данных 1С, обязательно придерживайтесь следующих правил:

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

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

3. Использование характеристик. Если у ваших комплектующих или у самого набора включен учет по характеристикам, вы обязаны заполнять реквизит Характеристика в строках табличной части Товары варианта комплектации. Если характеристика не используется, оставляйте ее пустой (Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка()).

← На главную