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

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

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

Разбираем причину ошибки «Значение поля Склад не может быть пустым»

Часто программисты сталкиваются с ситуацией, когда склад в шапке документа заполнен, но при попытке проведения возникает ошибка: «Запись не верна! Значение поля "Склад" не может быть пустым! (Регистр накопления: Свободные остатки)». Рассмотрим, почему это происходит.

В УТ 11 реализована возможность указывать склады как в шапке документа, так и в каждой строке табличной части. Даже если в интерфейсе вы видите склад только в шапке, механизмы проведения (особенно по регистру СвободныеОстатки) обращаются к реквизиту Склад внутри табличной части Товары. Проанализируем ситуацию: если в настройках документа включена опция «Склады в табличной части» или если код заполнения просто игнорирует этот реквизит в строках, движения по регистрам не смогут сформироваться корректно. Вывод: необходимо дублировать склад из шапки в каждую строку табличной части.

Особенности заполнения количества и упаковок

При программном заполнении строк документа недостаточно просто указать количество в реквизите Количество. В конфигурациях на базе УТ 11 за единицы измерения отвечают сразу несколько полей. Выясним основные правила их заполнения:

  1. Номенклатура: Основной ссылочный реквизит.
  2. КоличествоУпаковок: Это основное поле, которое видит пользователь в форме. Именно от него система часто отталкивается при расчете сумм.
  3. Количество: Количество в базовых единицах хранения.
  4. Упаковка: Ссылка на справочник упаковок. Если товар поступает в штуках, это поле может быть пустым, но коэффициент при этом должен быть равен 1.

Если вы заполните только Количество, но оставите пустым КоличествоУпаковок, встроенные методы БСП могут обнулить ваши данные при пересчете табличной части.

Использование методов БСП для пересчета ТЧ

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

Сначала необходимо подготовить Структуру действий. Это набор команд, которые сервер должен выполнить над строкой или всей таблицей. Рассмотрим пример такой структуры:


СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(НовыйДокумент);

СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСумму");
СтруктураДействий.Вставить("ОчиститьСуммуВзаиморасчетов");

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

Валюты и расчеты с поставщиками

Еще одна типичная ошибка: «Значение поля Валюта не может быть пустым! (Регистр накопления: Расчеты с поставщиками)». Проанализируем причину. Для складского учета достаточно номенклатуры и количества, но для финансового учета в УТ 11 критически важны поля валют. В документе их два:

Обязательно заполняйте оба этих поля, даже если они совпадают, иначе документ не сформирует движения по долгам.

Пример итогового кода создания документа

Рассмотрим консолидированный пример кода, который учитывает все вышеперечисленные исправления. Этот шаблон можно использовать в своих внешних обработках:


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

КонецПроцедуры

Подведем итоги

Для корректного программного создания документа «Приобретение товаров и услуг» в 1С:УТ 11 важно соблюдать следующие правила:

  1. Склад в строках: Всегда заполняйте реквизит Склад в табличной части Товары, даже если он есть в шапке.
  2. Упаковки и Количество: Заполняйте КоличествоУпаковок, так как на него завязаны алгоритмы расчета сумм.
  3. Валюты: Не забывайте про ВалютуВзаиморасчетов, она обязательна для проведения по финансовым регистрам.
  4. БСП: Используйте ОбработкаТабличнойЧастиСервер для автоматического расчета сумм и НДС — это гарантирует, что данные в документе будут соответствовать правилам конфигурации.
  5. Статус документа: Убедитесь, что установлен корректный статус (например, «Принято»), так как в статусе «Не подтвержден» документ может не делать складских движений.

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

← На главную