Здравствуйте! Мы вместе разберем, как корректно программно создать новый элемент справочника Номенклатура и одновременно установить для него цену и ставку НДС с помощью документа УстановкаЦенНоменклатуры в конфигурации 1С:Бухгалтерия 3.0. Мы выясним, почему ваш первоначальный код не работал так, как ожидалось, и предложим подробное решение.
Давайте внимательно рассмотрим ваш код. Основная сложность, с которой вы столкнулись, заключалась в том, что вы пытались присвоить значения цена и НДС непосредственно самому документу УстановкаЦенНоменклатуры:
НовыйДок.цена = 899;
НовыйДок.НДС = Перечисления.СтавкиНДС.НДС20;
Проблема в том, что документ УстановкаЦенНоменклатуры в 1С:Бухгалтерии 3.0 (как и большинство документов, работающих со списком товаров или услуг) не имеет таких реквизитов напрямую в своей шапке. Все позиции номенклатуры, их цены и ставки НДС хранятся в специальной структуре, называемой табличной частью документа.
Чтобы корректно установить цену и НДС, нам необходимо добавить строку в табличную часть документа и уже в этой строке указать все необходимые данные для конкретной номенклатурной позиции.
Мы разберем процесс по шагам, чтобы вы могли полностью понять логику и применить ее в своих проектах. Для наглядности, мы сначала создадим номенклатуру, а затем, используя ссылку на нее, заполним документ установки цен.
Создание элемента справочника "Номенклатура":
Этот шаг у вас был реализован почти верно. Мы создаем новый элемент справочника Номенклатура и заполняем его основные реквизиты. Обратите внимание на рекомендации по именованию переменных и проверке найденных ссылок, чтобы сделать код более надежным и читаемым.
&НаСервере
Процедура УстановитьЦенуНоменклатурыНаСервере()
// 1. Создание нового элемента справочника "Номенклатура"
НовыйЭлементНоменклатуры = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлементНоменклатуры.Наименование = "Тестовый Товар 1";
НовыйЭлементНоменклатуры.НаименованиеПолное = "Тестовый Товар для примера установки цен";
// Найдем родителя по наименованию. Рекомендуем использовать УИД или предопределенные элементы, если возможно
НовыйЭлементНоменклатуры.Родитель = Справочники.Номенклатура.НайтиПоНаименованию("ТестоваяГруппа");
// Проверим, найден ли родитель, чтобы избежать ошибок
Если НовыйЭлементНоменклатуры.Родитель.Пустая() Тогда
Сообщить("Внимание: Группа 'ТестоваяГруппа' не найдена. Создадим элемент без группы.");
НовыйЭлементНоменклатуры.Родитель = Справочники.Номенклатура.ПустаяСсылка();
КонецЕсли;
НовыйЭлементНоменклатуры.ЕдиницаИзмерения = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796"); // код для "шт"
Если НовыйЭлементНоменклатуры.ЕдиницаИзмерения.Пустая() Тогда
Сообщить("Внимание: Единица измерения с кодом '796' не найдена. Проверьте классификатор.");
// Можно установить единицу по умолчанию или прервать операцию
Возврат;
КонецЕсли;
НовыйЭлементНоменклатуры.Артикул = "А-12345";
НовыйЭлементНоменклатуры.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товары");
Если НовыйЭлементНоменклатуры.ВидНоменклатуры.Пустая() Тогда
Сообщить("Внимание: Вид номенклатуры 'Товары' не найден. Проверьте справочник 'Виды номенклатуры'.");
Возврат;
КонецЕсли;
НовыйЭлементНоменклатуры.Комментарий = "Создано программно для примера установки цен";
НовыйЭлементНоменклатуры.Записать();
Сообщить("Номенклатура '" + НовыйЭлементНоменклатуры.Наименование + "' успешно создана.");
// Получаем ссылку на созданную номенклатуру для использования в документе установки цен
СсылкаНаНоменклатуру = НовыйЭлементНоменклатуры.Ссылка;
// Вызываем процедуру установки цен, передавая ей ссылку на созданную номенклатуру
УстановитьЦенуДляНоменклатуры(СсылкаНаНоменклатуру, 899, Перечисления.СтавкиНДС.НДС20, "Розничная");
КонецПроцедуры
Важный момент: Мы выделили создание номенклатуры в отдельный блок и получили ее ссылку. Это позволит нам использовать этот элемент в документе установки цен. Также мы добавили проверки на пустые ссылки после использования метода НайтиПоНаименованию или НайтиПоКоду. Это очень важно для стабильности кода, так как если элемент не будет найден, попытка использовать пустую ссылку приведет к ошибке.
Создание и заполнение документа "Установка цен номенклатуры":
Теперь, когда у нас есть ссылка на номенклатуру, мы можем приступить к созданию и заполнению документа. Мы создадим отдельную процедуру для этой логики, чтобы разделить ответственность и улучшить читаемость кода.
&НаСервере
Процедура УстановитьЦенуДляНоменклатуры(СсылкаНоменклатуры, НоваяЦена, СтавкаНДС, НаименованиеВидаЦены)
Если СсылкаНоменклатуры.Пустая() Тогда
Сообщить("Ошибка: Невозможно установить цену для пустой номенклатуры.");
Возврат;
КонецЕсли;
// 2. Создание нового документа "Установка цен номенклатуры"
НовыйДокументУстановкаЦен = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокументУстановкаЦен.Дата = ТекущаяДата();
// Найдем вид цен по наименованию
ВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию(НаименованиеВидаЦены);
Если ВидЦены.Пустая() Тогда
Сообщить("Ошибка: Вид цен '" + НаименованиеВидаЦены + "' не найден. Проверьте справочник 'Виды цен'.");
Возврат;
КонецЕсли;
НовыйДокументУстановкаЦен.ВидыЦен = ВидЦены; // Присваиваем найденный вид цен
// 3. Работа с табличной частью документа "Товары"
// Добавляем новую строку в табличную часть "Товары"
НоваяСтрокаТабличнойЧасти = НовыйДокументУстановкаЦен.Товары.Добавить();
// Заполняем поля этой строки
НоваяСтрокаТабличнойЧасти.Номенклатура = СсылкаНоменклатуры; // Ссылка на созданный элемент номенклатуры
НоваяСтрокаТабличнойЧасти.Цена = НоваяЦена;
НоваяСтрокаТабличнойЧасти.СтавкаНДС = СтавкаНДС;
// 4. Запись и проведение документа
Попытка
НовыйДокументУстановкаЦен.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ 'Установка цен номенклатуры' №" + НовыйДокументУстановкаЦен.Номер + " от "
+ Формат(НовыйДокументУстановкаЦен.Дата, "ДФ=dd.MM.yyyy")
+ " успешно создан и проведен. Установлена цена " + НоваяЦена
+ " для номенклатуры '" + СсылкаНоменклатуры.Наименование + "'.");
Исключение
Сообщить("Ошибка при записи или проведении документа 'Установка цен номенклатуры': " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
В этой процедуре мы используем следующие объекты и методы:
Документы.УстановкаЦенНоменклатуры.СоздатьДокумент(): для создания нового экземпляра документа.НовыйДокументУстановкаЦен.Дата: для установки даты документа.Справочники.ВидыЦен.НайтиПоНаименованию("Розничная"): для поиска нужного вида цен.НовыйДокументУстановкаЦен.Товары.Добавить(): для добавления новой строки в табличную часть Товары.НоваяСтрокаТабличнойЧасти.Номенклатура, НоваяСтрокаТабличнойЧасти.Цена, НоваяСтрокаТабличнойЧасти.СтавкаНДС: для заполнения реквизитов строки табличной части.НовыйДокументУстановкаЦен.Записать(РежимЗаписиДокумента.Проведение): для записи и проведения документа, что фиксирует цены в системе.Давайте проанализируем ситуацию в целом и дадим несколько полезных советов для вашей дальнейшей работы:
Разделение логики: Мы уже применили этот принцип, разделив создание номенклатуры и установку цен на отдельные процедуры. Это делает код более модульным, понятным и удобным для отладки и повторного использования.
Осмысленные наименования: Всегда используйте понятные и описывающие наименования для переменных, процедур, функций и элементов справочников. Например, НовыйДокументУстановкаЦен вместо НовыйДок, УстановитьЦенуНоменклатурыНаСервере вместо кнопкаНаСервере.
Проверка найденных ссылок: Как мы показали в примерах, после использования методов типа НайтиПоНаименованию или НайтиПоКоду всегда проверяйте, что найденный элемент не является пустой ссылкой (.Пустая()). Это предотвратит ошибки выполнения, если элемент с указанным наименованием/кодом не существует в базе.
Типы цен: В 1С:Бухгалтерии 3.0 цены хранятся в разрезе ВидовЦен (например, "Розничная", "Оптовая", "Закупочная"). Документ УстановкаЦенНоменклатуры позволяет фиксировать цены для конкретного вида цен на определенную дату. Для управления этими видами цен используется справочник ВидыЦен.
Ставка НДС: Ставка НДС, указанная в документе УстановкаЦенНоменклатуры, определяет, какой НДС будет применяться к этой цене при дальнейших продажах. В карточке номенклатуры также есть реквизит "% НДС", который служит для предустановки ставки НДС в документах поступления/реализации, но в документе установки цен НДС указывается явно для каждой позиции.
Актуальность цен: Цена, установленная документом УстановкаЦенНоменклатуры, действует с даты документа и до момента создания новой установки цен для той же номенклатуры и того же вида цен.
Просмотр установленных цен: Чтобы убедиться в корректности установки цен, вы можете посмотреть информацию в регистре сведений "Цены номенклатуры" (через "Все функции" или отчеты по ценам).
Надеемся, что это подробное объяснение поможет вам разобраться с программной работой по установке цен в 1С:Бухгалтерии 3.0 и применять полученные знания в вашей практике!
← К списку