Как программно добавить номенклатуру и цены в документ «Установка цен номенклатуры» в 1С:УТП

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

Программное создание или редактирование документов — одна из самых частых задач при интеграции 1С с внешними системами, например, при парсинге данных из JSON по API. Однако начинающие разработчики часто сталкиваются с тем, что документ не находится, цены не записываются, а база выдает ошибки типов данных. В этой статье мы подробно разберем, как правильно реализовать заполнение документа Установка цен номенклатуры в конфигурации Управление торговым предприятием для Казахстана, редакция 2.0.

Разбор первой ошибки: Почему документ не находится по номеру

Рассмотрим ситуацию, когда мы пытаемся найти документ методом НайтиПоНомеру. Часто разработчик пишет Документы.УстановкаЦенНоменклатуры.НайтиПоНомеру("00000000001") и получает ошибку «Элемент не выбран» при попытке получить объект. Проанализируем причины этой проблемы.

Во-первых, в системе 1С номера документов — это не просто числа, а строки определенной длины. Если в метаданных длина номера установлена как 11 символов, то поиск по строке "1" или "001" не даст результата. Нужно передавать строку в точном соответствии с длиной и префиксами. Во-вторых, в конфигурациях для Казахстана часто используются префиксы (например, «КЗ» или префиксы узлов распределенной информационной базы). Полный номер может выглядеть как "КЗ00-0000001".

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


// Правильный подход к поиску документа по номеру
НомерДока = "00000000001"; 
ДатаПоиска = '20231231'; // Конец года, в котором создан документ
ДокСсылка = Документы.УстановкаЦенНоменклатуры.НайтиПоНомеру(НомерДока, ДатаПоиска);

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

// Теперь можно безопасно получать объект
ОбъектДок = ДокСсылка.ПолучитьОбъект();

Заполнение табличной части: Ссылки против строк

Разберем вторую критическую ошибку. В сообщении форума автор пытался присвоить полю ТипЦен строковое значение "Розничная". В 1С:УТП это поле имеет тип СправочникСсылка.ТипыЦенНоменклатуры. Если записать туда строку, документ не проведется или данные будут потеряны.

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

  1. Поиск номенклатуры: Мы должны найти ссылку на товар по наименованию или артикулу.
  2. Поиск типа цен: Нам нужно получить ссылку на нужный тип цен (Закупочная, Розничная и т.д.).
  3. Установка единицы измерения: Цена в 1С всегда привязана к единице измерения (базовой или для цен).
  4. Преобразование цены: Данные из JSON приходят в виде строк, их нужно преобразовывать в число.

Рассмотрим пример кода, реализующий этот алгоритм:


// Предположим, у нас есть данные из API
ИмяТовара = "Смартфон Samsung";
ЦенаЧислом = 150000; // Уже преобразовано из JSON

// Ищем ссылки на справочники
СсылкаНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию(ИмяТовара);
СсылкаТипЦен = Справочники.ТипыЦенНоменклатуры.НайтиПоНаименованию("Розничная");

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

Работа с существующими записями и проведение

Проанализируем ситуацию, когда нам нужно не просто добавить новую строку, а обновить цену, если товар уже есть в документе. Чтобы избежать дублирования строк, рекомендуется сначала выполнить поиск по табличной части. Для этого можно использовать метод НайтиСтроки.

Важно помнить, что документ Установка цен номенклатуры является регистратором для регистра сведений Цены номенклатуры. Если вы просто выполните ОбъектДок.Записать(), цены в системе не обновятся. Документ обязательно должен быть проведен.


// Поиск существующей строки по Номенклатуре и Типу цен
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", СсылкаНоменклатура);
ПараметрыОтбора.Вставить("ТипЦен", СсылкаТипЦен);

НайденныеСтроки = ОбъектДок.Товары.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда
    СтрокаТовара = НайденныеСтроки[0]; // Обновляем существующую
Иначе
    СтрокаТовара = ОбъектДок.Товары.Добавить(); // Добавляем новую
КонецЕсли;

СтрокаТовара.Номенклатура = СсылкаНоменклатура;
СтрокаТовара.Цена = ЦенаЧислом;
// ... заполнение остальных полей ...

// Запись и ПРОВЕДЕНИЕ документа
Попытка
    ОбъектДок.Записать(РежимЗаписиДокумента.Проведение);
    Сообщить("Цены успешно обновлены в документе " + ОбъектДок.Номер);
Исключение
    Сообщить("Ошибка при проведении: " + ОписаниеОшибки());
КонецПопытки;

Оптимизация производительности (Для продвинутых)

Если вы парсите JSON с тысячами позиций, использование НайтиПоНаименованию внутри цикла будет работать крайне медленно. Рассмотрим более профессиональный подход — использование объекта Запрос.

Проанализируем алгоритм быстрой загрузки:

  1. Выгружаем все наименования из JSON в массив.
  2. Одним запросом получаем все ссылки на номенклатуру и сохраняем их во временную таблицу или Соответствие (кэш).
  3. Заполняем документ, используя данные из кэша.

Это позволит сократить количество обращений к базе данных с тысяч до одного-двух, что ускорит работу обработки в десятки раз. Также не забывайте про специфику Казахстана: в документе есть флаг Цены включают НДС. Убедитесь, что значение этого флага соответствует входящим ценам из вашего API, иначе при продажах налоги будут рассчитаны неверно.

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

← На главную