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