Программное создание документов в современных конфигурациях на базе 1С:ERP и 1С:Управление торговлей 11 (УТ 11) значительно отличается от старых редакций. Часто программисты сталкиваются с ситуацией, когда документ ПриобретениеТоваровУслуг создается, заполняется и даже проводится без ошибок, но фактического прихода товара на склад (движений по регистрам остатков) не происходит. Разберем детально, почему так происходит и как правильно написать код для корректного поступления товаров.
В УТ 11.5 документ может быть успешно проведен по бухгалтерскому учету или взаиморасчетам, но не изменить складские остатки. Проанализируем основные причины:
ПриобретениеТоваровУслуг фиксирует только финансовые обязательства перед поставщиком. Сам физический приход на склад в этом случае делает документ ПриходныйОрдерНаТовары.Товары есть скрытый реквизит КлючСвязи. Если он не заполнен (равен 0), система при проведении не может сопоставить строки товаров с другими табличными частями (например, ГТД или налоги), что может привести к отсутствию движений по регистрам накопления.Разберем по шагам, как правильно реализовать программное создание документа.
При создании объекта важно соблюдать последовательность: сначала заполняются основные реквизиты шапки (Организация, Партнер, Склад), а затем вызываются типовые процедуры для инициализации параметров, зависящих от этих реквизитов.
НовыйДок = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = Справочники.Организации.НайтиПоНаименованию("Наша организация");
НовыйДок.Партнер = МойКонтрагентСсылка.Партнер;
НовыйДок.Контрагент = МойКонтрагентСсылка;
НовыйДок.Склад = СсылкаНаСклад;
НовыйДок.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
НовыйДок.Валюта = Справочники.Валюты.НайтиПоКоду("643");
НовыйДок.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
Важный нюанс: Посмотрите на реквизит ВариантПриемкиТоваров. Рассмотрим вариант, когда приход должен происходить сразу. Для этого используем значение:
НовыйДок.ВариантПриемкиТоваров = Перечисления.ВариантыПриемкиТоваров.МожетПроисходитьБезЗаказовИНакладных;
Проанализируем процесс заполнения строк. Каждая строка должна иметь уникальный КлючСвязи. В типовых решениях это целое число (1, 2, 3...).
НомерСтрокиКода = 0;
Для Каждого СтрокаДанных Из МоиДанные Цикл
НомерСтрокиКода = НомерСтрокиКода + 1;
НоваяСтрока = НовыйДок.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрока.Количество = СтрокаДанных.Количество;
НоваяСтрока.КоличествоУпаковок = СтрокаДанных.Количество;
НоваяСтрока.Цена = СтрокаДанных.Цена;
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
// Заполняем КлючСвязи — это критически важно для движений!
НоваяСтрока.КлючСвязи = НомерСтрокиКода;
// Используем типовые механизмы для заполнения связанных колонок
НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");
НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 0.20;
НоваяСтрока.СуммаСНДС = НоваяСтрока.Сумма + НоваяСтрока.СуммаНДС;
КонецЦикла;
В УТ 11.5 крайне не рекомендуется просто присваивать значения. Лучше вызывать экспортные процедуры, которые имитируют интерактивный ввод. Это гарантирует заполнение всех скрытых реквизитов (например, ВидЗапасов, Подразделение в ТЧ и т.д.). Выясним, какие методы нам помогут:
Для каждой строки ТЧ рекомендуется вызвать процедуру из модуля ОбработкаТабличныхЧастей (если доступно в вашей версии):
ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабличнойЧасти(НоваяСтрока, НовыйДок);
Также перед записью стоит вызвать заполнение условий оплаты:
НовыйДок.ЗаполнитьУсловияОплаты(); // Чтобы сформировались графики платежей
Если после выполнения кода документ проведен, но остатков нет, выполним проверку склада. Проанализируем настройки склада: перейдите в Склады и магазины -> [Ваш склад] -> Ордерная схема и структура. Если стоит галочка "При поступлении", значит, ПриобретениеТоваровУслуг делает движения только по регистру Товары к поступлению. Чтобы товар появился в регистре Товары на складах (текущий остаток), нужно создать ПриходныйОрдерНаТовары на основании вашего документа.
Если вы хотите, чтобы приход был "прямым", используйте склад, у которого ордерная схема отключена.
Посмотрим на финальную стадию работы с документом. Записывать и проводить документ нужно только после того, как заполнены все табличные части. Порядок действий "Записал шапку -> Провел -> Добавил товары" является ошибочным, так как при добавлении товаров в уже проведенный документ движения не пересчитываются автоматически без повторного вызова метода Записать.
Попытка
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно создан: " + НовыйДок.Ссылка);
Исключение
Сообщить("Ошибка проведения: " + ОписаниеОшибки());
КонецПопытки;
Если вы сомневаетесь, сделал ли документ движения, не ограничивайтесь просмотром отчета "Остатки товаров". Рассмотрим более точный способ — запрос к регистрам. Проверьте два основных регистра:
Если данные есть во втором регистре, но нет в первом — значит, ваша проблема исключительно в ордерной схеме склада.
При программном создании документа в УТ 11.5 всегда ориентируйтесь на ручное создание эталонного документа. Создайте документ руками, проведите его и сравните в консоли запросов все реквизиты (включая скрытые) программного документа и эталонного. Особое внимание уделите реквизитам КлючСвязи, ХозяйственнаяОперация и настройкам Соглашения, так как именно они чаще всего блокируют движения по складу.