Как программно создать документ Приобретение товаров и услуг в 1С:УТ 11.5, чтобы товар поступил на склад?

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

Программное создание документов в современных конфигурациях на базе 1С:ERP и 1С:Управление торговлей 11 (УТ 11) значительно отличается от старых редакций. Часто программисты сталкиваются с ситуацией, когда документ ПриобретениеТоваровУслуг создается, заполняется и даже проводится без ошибок, но фактического прихода товара на склад (движений по регистрам остатков) не происходит. Разберем детально, почему так происходит и как правильно написать код для корректного поступления товаров.

Анализ проблемы: почему документ проводится, а прихода нет?

В УТ 11.5 документ может быть успешно проведен по бухгалтерскому учету или взаиморасчетам, но не изменить складские остатки. Проанализируем основные причины:

  1. Ордерная схема склада. Если в настройках склада включено использование ордерной схемы при поступлении, то документ ПриобретениеТоваровУслуг фиксирует только финансовые обязательства перед поставщиком. Сам физический приход на склад в этом случае делает документ ПриходныйОрдерНаТовары.
  2. Техническое поле КлючСвязи. В табличной части Товары есть скрытый реквизит КлючСвязи. Если он не заполнен (равен 0), система при проведении не может сопоставить строки товаров с другими табличными частями (например, ГТД или налоги), что может привести к отсутствию движений по регистрам накопления.
  3. Вариант приемки товаров. Если в документе или соглашении указано, что приемка разделена по документам, система ожидает оформления дополнительных актов или ордеров.
  4. Хозяйственная операция. Неверно указанная операция (например, закупка по импорту вместо обычной закупки) меняет логику проведения.

Разберем по шагам, как правильно реализовать программное создание документа.

Шаг 1. Инициализация и заполнение шапки документа

При создании объекта важно соблюдать последовательность: сначала заполняются основные реквизиты шапки (Организация, Партнер, Склад), а затем вызываются типовые процедуры для инициализации параметров, зависящих от этих реквизитов.


НовыйДок = Документы.ПриобретениеТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Организация = Справочники.Организации.НайтиПоНаименованию("Наша организация");
НовыйДок.Партнер = МойКонтрагентСсылка.Партнер;
НовыйДок.Контрагент = МойКонтрагентСсылка;
НовыйДок.Склад = СсылкаНаСклад;
НовыйДок.ХозяйственнаяОперация = Перечисления.ХозяйственныеОперации.ЗакупкаУПоставщика;
НовыйДок.Валюта = Справочники.Валюты.НайтиПоКоду("643");
НовыйДок.НалогообложениеНДС = Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;

Важный нюанс: Посмотрите на реквизит ВариантПриемкиТоваров. Рассмотрим вариант, когда приход должен происходить сразу. Для этого используем значение:

НовыйДок.ВариантПриемкиТоваров = Перечисления.ВариантыПриемкиТоваров.МожетПроисходитьБезЗаказовИНакладных;

Шаг 2. Заполнение табличной части и работа с Ключом связи

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


НомерСтрокиКода = 0;
Для Каждого СтрокаДанных Из МоиДанные Цикл
    НомерСтрокиКода = НомерСтрокиКода + 1;
    НоваяСтрока = НовыйДок.Товары.Добавить();
    НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
    НоваяСтрока.Количество = СтрокаДанных.Количество;
    НоваяСтрока.КоличествоУпаковок = СтрокаДанных.Количество;
    НоваяСтрока.Цена = СтрокаДанных.Цена;
    НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
    
    // Заполняем КлючСвязи — это критически важно для движений!
    НоваяСтрока.КлючСвязи = НомерСтрокиКода;
    
    // Используем типовые механизмы для заполнения связанных колонок
    НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");
    НоваяСтрока.СуммаНДС = НоваяСтрока.Сумма * 0.20;
    НоваяСтрока.СуммаСНДС = НоваяСтрока.Сумма + НоваяСтрока.СуммаНДС;
КонецЦикла;

Шаг 3. Использование типовых обработчиков для "умного" заполнения

В УТ 11.5 крайне не рекомендуется просто присваивать значения. Лучше вызывать экспортные процедуры, которые имитируют интерактивный ввод. Это гарантирует заполнение всех скрытых реквизитов (например, ВидЗапасов, Подразделение в ТЧ и т.д.). Выясним, какие методы нам помогут:

Для каждой строки ТЧ рекомендуется вызвать процедуру из модуля ОбработкаТабличныхЧастей (если доступно в вашей версии):

ОбработкаТабличныхЧастей.ПриИзмененииНоменклатурыТабличнойЧасти(НоваяСтрока, НовыйДок);

Также перед записью стоит вызвать заполнение условий оплаты:


НовыйДок.ЗаполнитьУсловияОплаты(); // Чтобы сформировались графики платежей

Шаг 4. Проверка ордерной схемы склада

Если после выполнения кода документ проведен, но остатков нет, выполним проверку склада. Проанализируем настройки склада: перейдите в Склады и магазины -> [Ваш склад] -> Ордерная схема и структура. Если стоит галочка "При поступлении", значит, ПриобретениеТоваровУслуг делает движения только по регистру Товары к поступлению. Чтобы товар появился в регистре Товары на складах (текущий остаток), нужно создать ПриходныйОрдерНаТовары на основании вашего документа.

Если вы хотите, чтобы приход был "прямым", используйте склад, у которого ордерная схема отключена.

Шаг 5. Запись и проведение документа

Посмотрим на финальную стадию работы с документом. Записывать и проводить документ нужно только после того, как заполнены все табличные части. Порядок действий "Записал шапку -> Провел -> Добавил товары" является ошибочным, так как при добавлении товаров в уже проведенный документ движения не пересчитываются автоматически без повторного вызова метода Записать.


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

Как проверить результат через Консоль запросов?

Если вы сомневаетесь, сделал ли документ движения, не ограничивайтесь просмотром отчета "Остатки товаров". Рассмотрим более точный способ — запрос к регистрам. Проверьте два основных регистра:

  1. ТоварыНаСкладах — здесь отражается физический остаток.
  2. ТоварыКПоступлению — здесь отражается товар, который "в пути" или ждет приемки по ордеру.

Если данные есть во втором регистре, но нет в первом — значит, ваша проблема исключительно в ордерной схеме склада.

Итоговые рекомендации

При программном создании документа в УТ 11.5 всегда ориентируйтесь на ручное создание эталонного документа. Создайте документ руками, проведите его и сравните в консоли запросов все реквизиты (включая скрытые) программного документа и эталонного. Особое внимание уделите реквизитам КлючСвязи, ХозяйственнаяОперация и настройкам Соглашения, так как именно они чаще всего блокируют движения по складу.

← На главную