Как программно заполнить документ «Инвентаризация товаров на складе» из внешней обработки?

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

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

Анализ задачи и типичные ошибки

Основная проблема заключается в том, что экспортная процедура модуля менеджера ЗаполнитьПоОстаткам ожидает на вход не просто переменную, а корректный адрес во временном хранилище, в который она поместит результат своей работы (структуру с таблицей значений). Если передать туда пустую строку или просто сформированный УникальныйИдентификатор, система выдаст ошибку «Недопустимое значение параметра».

Вторая частая ошибка — попытка напрямую присвоить результат табличной части документа. Табличные части объектов типа ДокументОбъект требуют использования метода Загрузить() для вставки данных из таблицы значений.

Шаг 1: Подготовка объекта документа и заполнение «шапки»

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


// Создаем новый документ
ДокИнвентаризация = Документы.ИнвентаризацияТоваровНаСкладе.СоздатьДокумент();

// Заполняем обязательные реквизиты шапки
ДокИнвентаризация.Дата = Объект.ДатаИнвентаризации;
ДокИнвентаризация.Организация = Объект.Организация;
ДокИнвентаризация.Склад = Объект.Склад;

// Документ необходимо записать, чтобы получить ссылку, 
// так как процедура заполнения часто требует ссылку на объект
ДокИнвентаризация.Записать();

Шаг 2: Подготовка параметров заполнения

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


ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("НазваниеДействия", "Заполнить");
ПараметрыЗаполнения.Вставить("ВыполнитьКорректировкуСтоимости", Ложь);
ПараметрыЗаполнения.Вставить("ПараметрыКорректировкиСтоимости");
ПараметрыЗаполнения.Вставить("ИспользуетсяОтложенноеПроведение", Ложь);
ПараметрыЗаполнения.Вставить("Ссылка", ДокИнвентаризация.Ссылка);
ПараметрыЗаполнения.Вставить("Дата", ДокИнвентаризация.Дата);
ПараметрыЗаполнения.Вставить("Склад", ДокИнвентаризация.Склад);
ПараметрыЗаполнения.Вставить("Организация", ДокИнвентаризация.Организация);
ПараметрыЗаполнения.Вставить("ОтветственноеЛицо", Справочники.ФизическиеЛица.ПустаяСсылка());

Шаг 3: Работа с временным хранилищем

Теперь выясним причину основной ошибки. Для работы с временным хранилищем необходимо сначала получить валидный адрес. Просто объявить переменную как строку недостаточно. Нам нужно использовать функцию ПоместитьВоВременноеХранилище, чтобы зарегистрировать адрес в текущем сеансе.


// Генерируем уникальный идентификатор для адреса хранилища
ИдентификаторХранилища = Новый УникальныйИдентификатор;
// Помещаем пустую структуру или Неопределено, чтобы получить валидный адрес
АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторХранилища);

// Вызываем типовую процедуру из модуля менеджера
Документы.ИнвентаризацияТоваровНаСкладе.ЗаполнитьПоОстаткам(ПараметрыЗаполнения, АдресХранилища);

Шаг 4: Получение результата и загрузка в документ

После выполнения процедуры ЗаполнитьПоОстаткам, данные по указанному адресу в хранилище будут обновлены. Обычно типовой механизм возвращает структуру, содержащую таблицу значений в ключе ТаблицаТовары. Проанализируем, как извлечь эти данные и поместить их в документ:


// Получаем результат заполнения из хранилища
РезультатЗаполнения = ПолучитьИзВременногоХранилища(АдресХранилища);

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

Дополнительные рекомендации

При использовании данного метода стоит обратить внимание на следующие важные моменты:

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

Таким образом, мы рассмотрели полный цикл программного формирования документа инвентаризации. Использование типовых процедур позволяет сохранить логику конфигурации и гарантирует, что алгоритм расчета остатков будет идентичен тому, который использует пользователь при нажатии кнопки «Заполнить» в форме документа.

← На главную