Как реализовать перенос данных из Отчета комитенту в Поступление товаров и услуг с созданием счетов-фактур в КД 2.1

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

При настройке обмена между идентичными базами 1С:Бухгалтерия предприятия 3.0 с помощью конфигурации «Конвертация данных 2.1» (КД 2) часто возникают задачи, выходящие за рамки простого сопоставления реквизитов. Одной из таких сложных задач является трансформация документа Отчет комитенту о продажах в документ Поступление товаров и услуг. Сложность заключается в том, что один документ-источник должен породить несколько документов-приемников, а некоторые данные (например, номер и дата входящего счета-фактуры) отсутствуют в реквизитах объекта-приемника, так как хранятся в подчиненных сущностях.

В данной статье мы подробно разберем, как передать параметры, которых нет в структуре объекта, как программно генерировать счета-фактуры и как разделить один документ на два разных поступления (на товар и на вознаграждение).

Разбор задачи и анализ структуры данных

Рассмотрим исходную ситуацию. В документе-источнике Отчет комитенту данные распределены по двум табличным частям. Нижняя ТЧ содержит информацию о номенклатуре — она переносится в ТЧ «Товары» документа Поступление товаров и услуг стандартным образом. Однако верхняя ТЧ содержит реквизиты поставщика, включая Номер счета-фактуры и Дату счета-фактуры. В типовой конфигурации БП 3.0 эти поля в документе поступления являются реквизитами формы, а не самого объекта ДокументОбъект.ПоступлениеТоваровУслуг. Фактически они записываются в отдельный документ СчетФактураПолученный, связанный с поступлением.

Проанализируем шаги, необходимые для реализации корректного переноса:

  1. Извлечение данных из табличной части источника и их передача в приемник через параметры.
  2. Программное создание документа Счет-фактура полученный в базе-приемнике.
  3. Создание второго документа Поступление товаров и услуг для отражения суммы комиссионного вознаграждения.

Шаг 1: Передача номера и даты счета-фактуры через параметры

Так как в объекте ПоступлениеТоваровУслуг нет полей для номера и даты СФ, мы воспользуемся механизмом передачи дополнительных параметров в ПКО (Правила конвертации объектов).

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


// Пример кода в обработчике ПередВыгрузкой ПКО
Если Источник.Поставщики.Количество() > 0 Тогда
    // Берем данные из первой строки ТЧ Поставщики (или по логике поиска)
    СтрокаПоставщика = Источник.Поставщики[0];
    ВходящиеДанные = Новый Структура;
    ВходящиеДанные.Вставить("НомерВходящегоСФ", СтрокаПоставщика.НомерСчетаФактуры);
    ВходящиеДанные.Вставить("ДатаВходящегоСФ", СтрокаПоставщика.ДатаСчетаФактуры);
КонецЕсли;

Затем в ПКС (Правила конвертации свойств) мы создаем два искусственных свойства. В колонке «Источник» оставляем пустое значение, а в «Приемник» пишем произвольное имя, например, НомерСФ. Устанавливаем флаг «Передавать в параметры». Теперь эти данные будут доступны в базе-приемнике.

Шаг 2: Создание счета-фактуры в базе-приемнике

Теперь рассмотрим, как обработать полученные параметры в приемнике. В ПКО документа в обработчике ПослеЗагрузки мы напишем код, который проверит наличие переданных параметров и создаст подчиненный документ.

Рассмотрим программную реализацию в приемнике:


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

Важно помнить, что в БП 3.0 логика создания документов часто вынесена в общие модули, такие как УчетНДСЗаполнениеПрограммное. Использование типовых методов гарантирует правильное заполнение всех аналитик НДС.

Шаг 3: Разделение одного документа на два (Поступление на вознаграждение)

Согласно условию задачи, нам нужно создать второе поступление на сумму вознаграждения. Для этого мы применим метод ВыгрузитьПоПравилу. Этот метод позволяет запустить процесс конвертации программно, передав в него произвольные данные.

Разберем алгоритм действий:

  1. Создаем второе ПКО (например, ОтчетКомитенту_Вознаграждение_ПТУ), где источником является ОтчетКомитенту, а приемником — ПоступлениеТоваровУслуг.
  2. В основном ПКО (первого документа) в обработчике ПослеВыгрузки вызываем генерацию второго документа.

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

НоваяСтрока = ТЧУслуги.Добавить();
НоваяСтрока.Номенклатура = Источник.УслугаВознаграждения; // Если есть такой реквизит
НоваяСтрока.Количество = 1;
НоваяСтрока.Сумма = Источник.СуммаВознаграждения;
НоваяСтрока.Цена = Источник.СуммаВознаграждения;

ДанныеДляВыгрузки.Вставить("Товары", ТЧУслуги);

// Вызываем выгрузку по специальному правилу
ВыгрузитьПоПравилу(ДанныеДляВыгрузки, , , , "ОтчетКомитенту_Вознаграждение_ПТУ");

Обратите внимание: При использовании ВыгрузитьПоПравилу в качестве источника мы передаем не реальный объект базы, а Структуру. В ПКО-приемнике все обращения к Источник.ИмяРеквизита будут работать корректно, так как КД 2 умеет извлекать данные из ключей структуры.

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

Поскольку мы переносим данные в идентичные конфигурации, может возникнуть соблазн полагаться на автоматическое заполнение счетов. Однако при программной загрузке через КД 2 счета учета (60.01, 60.02, 90.03 и т.д.) могут не заполниться автоматически, так как они инициализируются в форме документа.

Проанализируем решение этой проблемы. Мы рекомендуем в обработчике ПриЗагрузке или ПослеЗагрузки в базе-приемнике явно вызывать процедуру заполнения счетов учета из типового функционала:


// Пример вызова типового заполнения счетов
Менеджер = Документы.ПоступлениеТоваровУслуг;
Объект.ЗаполнитьСчетаУчета(); // Если метод определен в модуле объекта

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

Резюме

Мы рассмотрели комплексный подход к конвертации документов в 1С. Основные инструменты, которые помогли нам решить задачу:

Для более глубокого изучения темы крайне полезно будет ознакомиться с курсами по КД 2.1 (например, Ильи Леонтьева), где подробно разбираются алгоритмы работы с коллекциями объектов и тонкости использования входящих и исходящих данных.

← На главную