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