Как в КД 2 объединить несколько документов источника в один документ приемника

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

При переносе данных и реорганизации учета нередко возникает задача, когда данные из нескольких документов конфигурации-источника (например, несколько документов СписаниеТоваров по разным складам в «Комплексной автоматизации») требуется объединить в один итоговый документ в конфигурации-приемнике (например, документ ВводНачальныхОстатков в «Бухгалтерии предприятия 3.0»).

Разберем основные подходы к решению этой задачи в «1С:Конвертация данных 2.1» (КД 2), проанализируем частые ошибки при настройке полей поиска и рассмотрим особенности заполнения документа ввода остатков в БП 3.0.

Архитектурно правильный способ: выгрузка через ПВД без источника

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

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

Разберем по шагам алгоритм настройки правила выгрузки данных (ПВД):

  1. Создаем ПВД с типом выгрузки Произвольный алгоритм (без указания стандартного объекта источника).
  2. В правиле конвертации объектов (ПКО) указываем только объект приемника — ДокументСсылка.ВводНачальныхОстатков, оставляя объект источника пустым.
  3. В обработчике ПВД ПередОбработкойПравила или ОбработчикВыгрузки пишем запрос к движениям документов списания или вызываем штатные функции конфигурации-источника для получения себестоимости.
  4. Формируем структуру будущего документа приемника, куда помещаем заполненную таблицу значений для табличной части НоменклатураНаСкладе.
  5. Вызываем программную выгрузку объекта с помощью стандартной функции ВыгрузитьПоПравилу.

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


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

// ТаблицаТоваров получена запросом по регистрам списаний
СтруктураДокумента.Вставить("НоменклатураНаСкладе", ТаблицаТоваров);

// Выгружаем один итоговый документ в файл обмена
ВыгрузитьПоПравилу(СтруктураДокумента, , , , "ВводНачальныхОстатков");

Преимущество этого способа заключается в том, что в XML-файл сразу попадает ровно один готовый документ, а приемник загружает его штатно без необходимости дозаписи строк.

Способ с дозаписью строк и поиском по реквизитам шапки в приемнике

Если выгрузка уже построена на базе стандартного ПКО из документа СписаниеТоваров в ВводНачальныхОстатков, и требуется объединить загружаемые строки в существующий документ приемника, используют механизм поиска по ключевым полям и программное дополнение табличной части.

Проанализируем настройку сопоставления объектов:

  1. В ПКО снимаем флаг Искать объект приемника по внутреннему идентификатору.
  2. В правилах конвертации свойств (ПКС) для полей поиска (например, Номер, Дата, Организация) устанавливаем флаг Поиск.
  3. Если номер и дата документа в приемнике фиксированы (документ уже создан вручную), в обработчике ПередВыгрузкой для ПКС номера задаем точное значение:

Значение = "УА00-000001";

По умолчанию при загрузке каждого следующего документа табличная часть приемника будет перезаписываться данными из последнего загруженного файла. Чтобы объединить товары из всех списаний, необходимо в обработчике ПослеЗагрузки ПКО прочитать уже существующие строки из базы данных и добавить к ним новые.

Разберем пример обработчика ПослеЗагрузки:


// Заполняем реквизиты строк, специфичные для приемника
Для каждого СтрокаТЧ Из Объект.НоменклатураНаСкладе Цикл
    СтрокаТЧ.Партия                     = Документы.ПередачаТоваров.НайтиПоНомеру("УА00-000006", '20150101000000');
    СтрокаТЧ.СтатусыОплатыРасходовУСН = Перечисления.СтатусыРасходовУСН.НеСписано;
    СтрокаТЧ.ОтражениеВУСН             = Перечисления.ОтражениеВУСН.Принимаются;
    СтрокаТЧ.НДСВключенВстоимость     = Истина;
КонецЦикла;

Добавлено = Объект.НоменклатураНаСкладе.Количество();

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

Сообщить("Документ '" + СокрЛП(Объект) + "' " + ?(ОбъектНайден, "", "не ") + "найден, добавлено: " + Добавлено + " товаров, всего: " + Объект.НоменклатураНаСкладе.Количество(), СтатусСообщения.Информация);

Особенности заполнения документа «Ввод начальных остатков» в БП 3.0

При переносе остатков номенклатуры в «1С:Бухгалтерию предприятия 3.0» необходимо учитывать несколько важных прикладных нюансов:

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