Программное создание документа Установка цен номенклатуры в современных конфигурациях, таких как 1С:Управление торговлей 11, 1С:ERP или 1С:Комплексная автоматизация 2, существенно отличается от аналогичной задачи в старых версиях (например, УТ 10.3), что особенно заметно при сквозном переносе истории цен между конфигурациями. Основная сложность заключается в изменении структуры метаданных и логики хранения цен. Теперь цены хранятся в разрезе видов цен, а сам документ имеет специфические табличные части, которые должны быть заполнены строго определенным образом для корректного проведения и отражения в регистре сведения ЦеныНоменклатуры — для предотвращения дублирования записей пригодится обработка удаления дублей в регистрах цен для УТ, КА, ERP.
В этой статье мы подробно разберем процесс программного формирования документа (поможет загрузка прайс-листов из Excel в УТ 11), проанализируем необходимые реквизиты и изучим примеры кода для автоматизации установки цен.
Прежде чем приступать к написанию кода, выясним причину сложности. В УТ 11 документ УстановкаЦенНоменклатуры выступает в роли регистратора для регистра сведений ЦеныНоменклатуры. Основные данные распределены по нескольким табличным частям:
Важно помнить, что в документе используется механизм "версионности" или среза цен на определенный момент времени. Если вы создаете документ задним числом, необходимо следить за актуальностью данных в регистре.
Рассмотрим процесс создания нового объекта. Нам необходимо инициализировать документ, установить дату и статус. Без установки статуса Согласован документ не будет делать движений по регистрам, а значит, цены не изменятся.
НовыйДокумент = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
НовыйДокумент.Ответственный = Пользователи.ТекущийПользователь();
НовыйДокумент.Комментарий = "Создано программно из внешней обработки " + ТекущаяДата();
Обратите внимание, что использование ТекущаяДата() подходит для оперативного ввода, но если вы загружаете исторические данные, следует передавать дату из источника.
Разберем, как добавить виды цен. Это критически важный этап: если вид цены не будет добавлен в таблицу ВидыЦен, то значения в основной таблице Товары для этого вида цены будут проигнорированы системой.
// Допустим, у нас есть ссылка на нужный Вид Цены
СсылкаНаВидЦены = Справочники.ВидыЦен.НайтиПоНаименованию("Оптовая");
НоваяСтрокаВид = НовыйДокумент.ВидыЦен.Добавить();
НоваяСтрокаВид.ВидЦены = СсылкаНаВидЦены;
Проанализируем ситуацию, когда видов цен несколько. В этом случае мы просто добавляем несколько строк в табличную часть ВидыЦен. Программа использует эти данные для построения динамической формы при визуальном открытии документа.
Перейдем к самой объемной части — заполнению таблицы Товары. Здесь нам нужно указать номенклатуру, характеристику (если ведется учет в разрезе характеристик) и саму цену.
// Пример заполнения строки товара
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;
НоваяСтрока.Характеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
НоваяСтрока.ВидЦены = СсылкаНаВидЦены;
НоваяСтрока.Цена = 1500; // Ваша цена
НоваяСтрока.Валюта = СсылкаНаВидЦены.ВалютаЦены; // Обычно берется из настроек вида цены
Если в системе используются упаковки, необходимо также заполнить поле Упаковка. Если учет ведется в базовых единицах измерения, поле можно оставить пустым или указать пустую ссылку.
Посмотрим на пример, когда одна и та же номенклатура имеет разные цены для разных характеристик. В этом случае для каждой пары "Номенклатура + Характеристика" создается отдельная строка в таблице Товары для каждого вида цены.
Для Каждого СтрокаДанных Из ТаблицаСИсходнымиЦеннами Цикл
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрока.Характеристика = СтрокаДанных.Характеристика;
НоваяСтрока.ВидЦены = СсылкаНаВидЦены;
НоваяСтрока.Цена = СтрокаДанных.ЗначениеЦены;
НоваяСтрока.Валюта = СсылкаНаВидЦены.ВалютаЦены;
КонецЦикла;
После того как все данные заполнены, документ необходимо записать и провести. Выясним причину, по которой иногда возникают ошибки при записи. В конфигурациях на базе УТ 11 часто используются подписки на события и сложные проверки в модуле объекта.
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно создан и проведен: " + НовыйДокумент.Ссылка);
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Ошибка при проведении документа: " + ПодробноеОписаниеОшибки(Инфо));
КонецПопытки;
Важный момент: если вы программно создаете большое количество документов, рекомендуется использовать транзакции или пакетную обработку данных для повышения производительности.
Рассмотрим подробнее несколько нюансов, которые помогут избежать распространенных ошибок:
&НаСервере), так как работа с объектами базы данных на клиенте невозможна.ИдентификаторСтроки в табличных частях. Обычно они генерируются автоматически, но при возникновении ошибок стоит обратить на них внимание.УстановкаЦенНоменклатуры может противоречить бизнес-логике. Для таких цен лучше использовать встроенные механизмы пересчета, вызывая процедуры из общего модуля ЦенообразованиеСервер, или использовать готовые решения для автоматического формирования цен по расписанию.Проанализировав ситуацию, можно сделать вывод, что программное управление ценами в 1С 8.3 — это гибкий инструмент, требующий однако четкого понимания структуры метаданных. Следуя приведенным шагам, вы сможете автоматизировать процесс обновления прайс-листов, например, используя готовые решения для загрузки из Excel, настроить интеграцию с интернет-магазинами или устанавливать цены на основании документов поступления — для этого подойдёт обработка установки цен по документам поступления.
Помните, что после программного проведения документа всегда стоит убедиться в результате, открыв регистр сведений Цены номенклатуры с фильтром по конкретной позиции товара. Это гарантирует, что ваши данные корректно попали в систему и будут использоваться в заказах и продажах.