Как программно заполнить документ на основании другого документа в 1С, если стандартные методы не срабатывают?

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

При разработке сложных обработок в системе «1С:Предприятие» программисты часто сталкиваются с необходимостью автоматизировать создание цепочек документов. Типичная ситуация: на основании «Реализации товаров и услуг» нужно программно сформировать «Электронный акт выполненных работ» (ЭАВР). Однако стандартный подход с использованием метода ЗаполнитьПоДокументуОснования может вызывать ошибку «Метод объекта не обнаружен».

В этой статье мы подробно разберем, почему возникает эта ошибка, как правильно использовать универсальный метод Заполнить() и на что обратить внимание в модуле объекта при написании кода. Проанализируем ситуацию на примере создания ЭАВР в конфигурациях для Казахстана, где взаимодействие с ИС ЭСФ накладывает свои технические ограничения.

Разбор проблемы: Почему метод не найден?

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

Проанализируем фрагмент ошибочного кода:


ДокументЭлектронныйАктВыполненныхРабот = Документы.ЭлектронныйАктВыполненныхРабот.СоздатьДокумент();
// ОШИБКА: Метод не обнаружен
ДокументЭлектронныйАктВыполненныхРабот.ЗаполнитьПоДокументуОснования(СтрокаТЗ.Реализация); 

Для решения этой задачи нам необходимо перейти к использованию стандартного механизма заполнения.

Шаг 1. Переход к использованию метода Заполнить()

Метод Заполнить() — это штатный инструмент платформы, который инициирует событие ОбработкаЗаполнения в модуле объекта создаваемого документа. Рассмотрим правильный синтаксис вызова:

Вариант А: Передача ссылки

Если логика документа проста, достаточно передать ссылку на документ-основание:

НовыйДокумент.Заполнить(СсылкаНаОснование);

Вариант Б: Передача структуры (рекомендуется)

В сложных конфигурациях (например, Бухгалтерия для Казахстана или ERP) документ часто ожидает не просто ссылку, а структуру параметров. Это позволяет передать дополнительные данные, такие как склад, дата или специфические признаки.

Шаг 2. Исследование процедуры ОбработкаЗаполнения

Чтобы понять, что именно передавать в метод Заполнить(), нам необходимо заглянуть «под капот» документа. Откроем конфигуратор, найдем документ ЭлектронныйАктВыполненныхРабот и перейдем в его Модуль объекта. Нас интересует процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка).

Рассмотрим пример кода, который часто встречается в типовых решениях:


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

Выясним причину неудачи автора из сообщения №10. Автор пытался написать: ДокументЭлектронныйАктВыполненныхРабот.Заполнить(Документы.РеализацияТоваровУслуг). Здесь кроется фундаментальная ошибка: Документы.РеализацияТоваровУслуг — это менеджер типа документов, а не конкретный экземпляр (ссылка). Система не знает, из какой именно реализации нужно взять данные.

Шаг 3. Реализация корректного программного кода

Теперь, объединив все знания, подготовим правильный алгоритм создания документа ЭАВР на основании реализации. Мы будем использовать структуру, так как это наиболее гибкий и безопасный способ для современных конфигураций.


// Создаем новый объект документа
НовыйЭАВР = Документы.ЭлектронныйАктВыполненныхРабот.СоздатьДокумент();
НовыйЭАВР.Дата = ТекущаяДата();

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

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

Шаг 4. Особенности работы с ЭАВР и ИС ЭСФ

Проанализируем ситуацию глубже. Документ «Электронный акт выполненных работ» в Казахстане — это не просто учетный документ, а сущность, предназначенная для выгрузки в государственную информационную систему (ИС ЭСФ). При его программном заполнении важно учитывать следующие нюансы:

  1. Идентификаторы товаров: Метод Заполнить() может не подтянуть специфические ID товаров из ИС ЭСФ, если они хранятся во внешних регистрах. Проверьте, заполнены ли табличные части после вызова метода.
  2. Проверка на дубли: Перед созданием нового ЭАВР программно, всегда проверяйте, нет ли уже созданного акта для этой реализации. В типовых базах это можно проверить через запрос к реквизиту ДокументОснование самого ЭАВР.
  3. Использование API конфигурации: В современных версиях «Бухгалтерии для Казахстана» существуют общие модули, которые делают всю работу за вас. Вместо ручного создания объекта, поищите функции вида ЭлектронныеДокументыЭСФСервер.СоздатьЭлектронныйАктВыполненныхРабот(Основание). Это гарантирует, что документ будет создан по всем правилам учетной политики.

Шаг 5. Практические советы по отладке

Если вы вызываете метод Заполнить(), ошибок не возникает, но документ остается пустым, воспользуйтесь следующими советами:

Резюме: Для успешного создания документа на основании в 1С 8.3 забудьте о самописных методах типа ЗаполнитьПоДокументуОснования, если они не описаны явно. Используйте универсальный метод Заполнить(), передавая в него правильно сформированную Структуру с данными. Всегда анализируйте содержимое ОбработкаЗаполнения, чтобы понимать, какие ключи и типы данных ожидает система.

← На главную