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