В типовых конфигурациях 1С, таких как «Бухгалтерия предприятия 3.0», механизмы заполнения документов часто вынесены в модули менеджеров и используют механизмы временного хранилища. Это делается для обеспечения возможности работы в фоновом режиме (длительные операции). При попытке вызвать эти методы из внешней обработки начинающие разработчики часто сталкиваются с ошибками типизации или неправильной работы с адресами хранилища. В этой статье мы подробно разберем, как правильно инициализировать параметры и получить данные об остатках программно.
Основная проблема заключается в том, что экспортная процедура модуля менеджера ЗаполнитьПоОстаткам ожидает на вход не просто переменную, а корректный адрес во временном хранилище, в который она поместит результат своей работы (структуру с таблицей значений). Если передать туда пустую строку или просто сформированный УникальныйИдентификатор, система выдаст ошибку «Недопустимое значение параметра».
Вторая частая ошибка — попытка напрямую присвоить результат табличной части документа. Табличные части объектов типа ДокументОбъект требуют использования метода Загрузить() для вставки данных из таблицы значений.
Прежде чем вызывать процедуру заполнения остатков, необходимо создать сам объект документа и заполнить ключевые реквизиты, по которым будет строиться запрос к остаткам (Организация, Склад, Дата). Проанализируем пример кода для инициализации:
// Создаем новый документ
ДокИнвентаризация = Документы.ИнвентаризацияТоваровНаСкладе.СоздатьДокумент();
// Заполняем обязательные реквизиты шапки
ДокИнвентаризация.Дата = Объект.ДатаИнвентаризации;
ДокИнвентаризация.Организация = Объект.Организация;
ДокИнвентаризация.Склад = Объект.Склад;
// Документ необходимо записать, чтобы получить ссылку,
// так как процедура заполнения часто требует ссылку на объект
ДокИнвентаризация.Записать();
Процедура заполнения в типовых конфигурациях принимает структуру ПараметрыЗаполнения. Важно передать все ключи, которые ожидает логика модуля менеджера. Рассмотрим стандартный набор параметров:
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("НазваниеДействия", "Заполнить");
ПараметрыЗаполнения.Вставить("ВыполнитьКорректировкуСтоимости", Ложь);
ПараметрыЗаполнения.Вставить("ПараметрыКорректировкиСтоимости");
ПараметрыЗаполнения.Вставить("ИспользуетсяОтложенноеПроведение", Ложь);
ПараметрыЗаполнения.Вставить("Ссылка", ДокИнвентаризация.Ссылка);
ПараметрыЗаполнения.Вставить("Дата", ДокИнвентаризация.Дата);
ПараметрыЗаполнения.Вставить("Склад", ДокИнвентаризация.Склад);
ПараметрыЗаполнения.Вставить("Организация", ДокИнвентаризация.Организация);
ПараметрыЗаполнения.Вставить("ОтветственноеЛицо", Справочники.ФизическиеЛица.ПустаяСсылка());
Теперь выясним причину основной ошибки. Для работы с временным хранилищем необходимо сначала получить валидный адрес. Просто объявить переменную как строку недостаточно. Нам нужно использовать функцию ПоместитьВоВременноеХранилище, чтобы зарегистрировать адрес в текущем сеансе.
// Генерируем уникальный идентификатор для адреса хранилища
ИдентификаторХранилища = Новый УникальныйИдентификатор;
// Помещаем пустую структуру или Неопределено, чтобы получить валидный адрес
АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, ИдентификаторХранилища);
// Вызываем типовую процедуру из модуля менеджера
Документы.ИнвентаризацияТоваровНаСкладе.ЗаполнитьПоОстаткам(ПараметрыЗаполнения, АдресХранилища);
После выполнения процедуры ЗаполнитьПоОстаткам, данные по указанному адресу в хранилище будут обновлены. Обычно типовой механизм возвращает структуру, содержащую таблицу значений в ключе ТаблицаТовары. Проанализируем, как извлечь эти данные и поместить их в документ:
// Получаем результат заполнения из хранилища
РезультатЗаполнения = ПолучитьИзВременногоХранилища(АдресХранилища);
// Проверяем, что результат получен и содержит нужную нам таблицу
Если ТипЗнч(РезультатЗаполнения) = Тип("Структура") И РезультатЗаполнения.Свойство("ТаблицаТовары") Тогда
// Загружаем полученную таблицу в табличную часть документа
ДокИнвентаризация.Товары.Загрузить(РезультатЗаполнения.ТаблицаТовары);
// После загрузки таблицы остатков рекомендуется пересчитать суммы
// и проверить счета учета, если это необходимо для вашей конфигурации
Попытка
ДокИнвентаризация.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Документ успешно заполнен и записан: " + ДокИнвентаризация.Ссылка);
Исключение
Сообщить("Ошибка при записи документа: " + ОписаниеОшибки());
КонецПопытки;
Иначе
Сообщить("Не удалось получить данные об остатках из временного хранилища.");
КонецЕсли;
При использовании данного метода стоит обратить внимание на следующие важные моменты:
Товары, счета учета (например, СчетУчета, СчетДоходов) могут остаться пустыми. Мы рекомендуем вызывать типовые процедуры заполнения счетов, такие как ЗаполнитьСчетаУчетаВТабличнойЧасти, чтобы избежать ошибок при последующем проведении документов оприходования или списания, созданных на основании этой инвентаризации.ЗаполнитьПоОстаткам может инициировать фоновое задание. В этом случае работа с временным хранилищем усложняется: нужно дождаться завершения задания, периодически проверяя его статус через ДлительныеОперации.ЗаданиеВыполнено.Таким образом, мы рассмотрели полный цикл программного формирования документа инвентаризации. Использование типовых процедур позволяет сохранить логику конфигурации и гарантирует, что алгоритм расчета остатков будет идентичен тому, который использует пользователь при нажатии кнопки «Заполнить» в форме документа.